From 621d682b3db6f73c292fca8f93710d8ac194a1e9 Mon Sep 17 00:00:00 2001 From: fredkiefer Date: Sun, 25 Jul 2010 19:39:18 +0000 Subject: [PATCH] Submit X11 shift key handling patch by Derek Fawcus . git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@31025 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 39 ++++++++++++++++++++++++-------------- Source/x11/XGServerEvent.m | 33 +++++++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index bb35615..2ae04cf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,31 +1,42 @@ -2010-07-06 Eric Wasylishen +2010-07-25 Fred Kiefer + + * Source/x11/XGServerEvent.m: + Treat Shift modifiers in the same manner as other modifiers. + This fixes the value of the shift bit (NSShiftKeyMask) in + the modifierFlags passed to a -flagsChanged: method call. + Without it the shift bit is inverted, as explained in + the source comments, as X reports the modifier bits in + force before the key was pressed/released. + Patch by Derek Fawcus . + +2010-07-25 Eric Wasylishen * Source/win32/WIN32Server.m: When ordering out a window, use the SWP_NOACTIVATE flag on SetWindowPos so Windows doesn't activate/deactivate any windows when hiding a window. - + This fixes the bug where when a tooltip disappeared, it would deactivate the window the tooltip was over. -2010-07-06 Eric Wasylishen +2010-07-07 Eric Wasylishen - * Source/win32/WIN32Server.m: - * Source/win32/w32_movesize.m: - Fix for bug #29709: Windows: Maximize button in a window title bar is - always grayed out + * Source/win32/WIN32Server.m: + * Source/win32/w32_movesize.m: + Fix for bug #29709: Windows: Maximize button in a window title bar is + always grayed out 2010-07-06 Eric Wasylishen * Source/win32/WIN32Server.m: Tweak the conditions for incrementing the clickCount when handling mouse clicks: (i.e. double click detection) - - Require a click to be within a distance (retrieved from Windows) + - Require a click to be within a distance (retrieved from Windows) of the last click to count (previously there was no proximity check) - - Allow clicks separated by the Windows double click time interval - to count (e.g. if the Windows double click time interval is n, - clicking at times 0, n, 2n, 3n would produce events with click counts - 1, 2, 3, and 4. This matches OS X behaviour. Previously, all clicks - had to be within the windows double click time interval to count as - one group.) + - Allow clicks separated by the Windows double click time interval + to count (e.g. if the Windows double click time interval is n, + clicking at times 0, n, 2n, 3n would produce events with click counts + 1, 2, 3, and 4. This matches OS X behaviour. Previously, all clicks + had to be within the windows double click time interval to count as + one group.) 2010-06-23 Quentin Mathe diff --git a/Source/x11/XGServerEvent.m b/Source/x11/XGServerEvent.m index 0697437..36ab035 100644 --- a/Source/x11/XGServerEvent.m +++ b/Source/x11/XGServerEvent.m @@ -71,6 +71,7 @@ // NumLock's mask (it depends on the keyboard mapping) static unsigned int _num_lock_mask; // Modifier state +static char _shift_pressed = 0; static char _control_pressed = 0; static char _command_pressed = 0; static char _alt_pressed = 0; @@ -1198,6 +1199,17 @@ posixFileDescriptor: (NSPosixFileDescriptor*)fileDescriptor NSDebugLLog(@"NSEvent", @"%d KeymapNotify\n", xEvent.xkeymap.window); + // Check if shift is pressed + _shift_pressed = 0; + if (check_modifier (&xEvent, XK_Shift_L)) + { + _shift_pressed |= 1; + } + if (check_modifier (&xEvent, XK_Shift_R)) + { + _shift_pressed |= 2; + } + // Check if control is pressed _control_pressed = 0; if ((_control_keysyms[0] != NoSymbol) @@ -1969,8 +1981,6 @@ keysym_is_X_modifier (KeySym keysym) switch (keysym) { case XK_Num_Lock: - case XK_Shift_L: - case XK_Shift_R: case XK_Caps_Lock: case XK_Shift_Lock: return YES; @@ -1993,6 +2003,7 @@ process_key_event (XEvent* xEvent, XGServer* context, NSEventType eventType, NSEvent *event = nil; NSEventType originalType; gswindow_device_t *window; + int shift_key = 0; int control_key = 0; int command_key = 0; int alt_key = 0; @@ -2033,7 +2044,15 @@ process_key_event (XEvent* xEvent, XGServer* context, NSEventType eventType, XLookupKeysym((XKeyEvent *)xEvent, 0) : keysym; if (modKeysym != NoSymbol) { - if (modKeysym == _control_keysyms[0]) + if (modKeysym == XK_Shift_L) + { + shift_key = 1; + } + else if (modKeysym == XK_Shift_R) + { + shift_key = 2; + } + else if (modKeysym == _control_keysyms[0]) { control_key = 1; } @@ -2068,11 +2087,13 @@ process_key_event (XEvent* xEvent, XGServer* context, NSEventType eventType, } originalType = eventType; - if (control_key || command_key || alt_key || help_key) + if (shift_key || control_key || command_key || alt_key || help_key) { eventType = NSFlagsChanged; if (xEvent->xkey.type == KeyPress) { + if (shift_key) + _shift_pressed |= shift_key; if (control_key) _control_pressed |= control_key; if (command_key) @@ -2084,6 +2105,8 @@ process_key_event (XEvent* xEvent, XGServer* context, NSEventType eventType, } else if (xEvent->xkey.type == KeyRelease) { + if (shift_key) + _shift_pressed &= ~shift_key; if (control_key) _control_pressed &= ~control_key; if (command_key) @@ -2374,7 +2397,7 @@ process_modifier_flags(unsigned int state) { unsigned int eventModifierFlags = 0; - if (state & ShiftMask) + if (_shift_pressed != 0) eventModifierFlags = eventModifierFlags | NSShiftKeyMask; if (state & LockMask)