X11: fix extraneous (undefined) event state bits
- Restrict FL_BUTTONS mask to only three valic mouse buttons. Pseudo mouse buttons 4-7 are used for FL_MOUSEWHEEL events and are no longer reflected in Fl::event_buttons(). - Return only state of mouse buttons 1-3 in Fl::event_buttons(). Buttons 4-7 are not "sticky" (used for FL_MOUSEWHEEL). - Keep undefined keyboard related bits in Fl::event_state() for backwards compatibility and transparency. These bits may be masked out in a later release. - Document Fl::event_state() bits for X11 in src/Fl_x.cxx. Note: this is a bug fix for X11 only, Wayland and other platforms are not affected.
This commit is contained in:
parent
2252ba9839
commit
317e06e5a3
@ -562,8 +562,8 @@ enum Fl_Callback_Reason {
|
||||
|
||||
/**@{*/ // group: Event States
|
||||
|
||||
// FIXME: it would be nice to have the modifiers in the upper 8 bit so that
|
||||
// a unicode key (24bit) can be sent as an unsigned with the modifiers.
|
||||
// FIXME: it would be nice to have the modifiers in the upper 8 bits so that
|
||||
// a unicode key (21 bits) can be sent as an unsigned with the modifiers.
|
||||
|
||||
#define FL_SHIFT 0x00010000 ///< One of the shift keys is down
|
||||
#define FL_CAPS_LOCK 0x00020000 ///< The caps lock is on
|
||||
@ -575,14 +575,14 @@ enum Fl_Callback_Reason {
|
||||
// correct for XFree86
|
||||
#define FL_SCROLL_LOCK 0x00800000 ///< The scroll lock is on
|
||||
// correct for XFree86
|
||||
#define FL_BUTTON1 0x01000000 ///< Mouse button 1 is pushed
|
||||
#define FL_BUTTON2 0x02000000 ///< Mouse button 2 is pushed
|
||||
#define FL_BUTTON3 0x04000000 ///< Mouse button 3 is pushed
|
||||
#define FL_BUTTONS 0x7f000000 ///< Any mouse button is pushed
|
||||
#define FL_BUTTON(n) (0x00800000<<(n)) ///< Mouse button n (n > 0) is pushed
|
||||
#define FL_BUTTON1 0x01000000 ///< Mouse button 1 is pushed (L)
|
||||
#define FL_BUTTON2 0x02000000 ///< Mouse button 2 is pushed (M)
|
||||
#define FL_BUTTON3 0x04000000 ///< Mouse button 3 is pushed (R)
|
||||
#define FL_BUTTONS 0x07000000 ///< Any mouse button (1-3) is pushed
|
||||
#define FL_BUTTON(n) (0x00800000<<(n)) ///< Mouse button n (n > 0) is pushed
|
||||
|
||||
#define FL_KEY_MASK 0x0000ffff ///< All keys are 16 bit for now
|
||||
// FIXME: Unicode needs 24 bits!
|
||||
#define FL_KEY_MASK 0x0000ffff ///< All keys are 16 bit for now
|
||||
// FIXME: Unicode needs 21 bits!
|
||||
|
||||
/**@}*/ // group: Event States
|
||||
|
||||
|
||||
8
FL/Fl.H
8
FL/Fl.H
@ -1263,22 +1263,22 @@ public:
|
||||
caused an FL_RELEASE event, you can use Fl::event_button() instead.
|
||||
\return a bit mask value like { [FL_BUTTON1] | [FL_BUTTON2] | [FL_BUTTON3] }
|
||||
*/
|
||||
static int event_buttons() {return e_state&0x7f000000;}
|
||||
static int event_buttons() {return e_state & FL_BUTTONS;}
|
||||
/**
|
||||
Returns non-zero if mouse button 1 is currently held down.
|
||||
For more details, see Fl::event_buttons().
|
||||
*/
|
||||
static int event_button1() {return e_state&FL_BUTTON1;}
|
||||
static int event_button1() {return e_state & FL_BUTTON1;}
|
||||
/**
|
||||
Returns non-zero if button 2 is currently held down.
|
||||
For more details, see Fl::event_buttons().
|
||||
*/
|
||||
static int event_button2() {return e_state&FL_BUTTON2;}
|
||||
static int event_button2() {return e_state & FL_BUTTON2;}
|
||||
/**
|
||||
Returns non-zero if button 3 is currently held down.
|
||||
For more details, see Fl::event_buttons().
|
||||
*/
|
||||
static int event_button3() {return e_state&FL_BUTTON3;}
|
||||
static int event_button3() {return e_state & FL_BUTTON3;}
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
|
||||
22
src/Fl_x.cxx
22
src/Fl_x.cxx
@ -972,6 +972,28 @@ char fl_key_vector[32]; // used by Fl::get_key()
|
||||
static int px, py;
|
||||
static ulong ptime;
|
||||
|
||||
// Citation from XButtonEvent and XKeyEvent docs:
|
||||
// "The state member is set to indicate the logical state of the pointer buttons
|
||||
// and modifier keys just prior to the event, which is the bitwise inclusive OR
|
||||
// of one or more of the button or modifier key masks:
|
||||
// Button1Mask, Button2Mask, Button3Mask, Button4Mask, Button5Mask,
|
||||
// ShiftMask, LockMask, ControlMask,
|
||||
// Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, and Mod5Mask."
|
||||
//
|
||||
// Actual values in Debian Bookworm as of July 2024 (pseudo code):
|
||||
// static int states[] = {
|
||||
// ShiftMask, LockMask, ControlMask, // 1<<0 .. 1<<2
|
||||
// Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask, // 1<<3 .. 1<<7
|
||||
// Button1Mask, Button2Mask, Button3Mask, Button4Mask, Button5Mask // 1<<8 .. 1<<12
|
||||
// };
|
||||
//
|
||||
// Note: some more (undefined?) state bits *can* be set if the user uses a keyboard
|
||||
// other than the primary one (the top-most in keyboard settings). Therefore we must
|
||||
// take care not to use these undefined bits. These undefined bits will be set in
|
||||
// Fl::event_state() though: for backwards compatibility and transparency.
|
||||
// See definition of FL_BUTTONS in FL/Enumerations.H: only three "sticky" mouse
|
||||
// buttons as of July 2024.
|
||||
|
||||
static void set_event_xy(Fl_Window *win) {
|
||||
# if FLTK_CONSOLIDATE_MOTION
|
||||
send_motion = 0;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user