Module: wine Branch: master Commit: dc1ee0d1429722d88c98f6111f5b38d4ed99e72b URL: http://source.winehq.org/git/wine.git/?a=commit;h=dc1ee0d1429722d88c98f6111f...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Apr 9 16:25:15 2008 +0200
winex11: Fix KeymapNotify handler to take left/right modifiers into account.
---
dlls/winex11.drv/keyboard.c | 28 +++++++++++++++++++--------- 1 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c index 4be6336..587ff2a 100644 --- a/dlls/winex11.drv/keyboard.c +++ b/dlls/winex11.drv/keyboard.c @@ -1274,11 +1274,16 @@ static inline void KEYBOARD_UpdateOneState ( int vkey, int state, DWORD time ) /* Do something if internal table state != X state for keycode */ if (((key_state_table[vkey] & 0x80)!=0) != state) { + DWORD flags = 0; + + if (!state) flags |= KEYEVENTF_KEYUP; + if (vkey == VK_RSHIFT || vkey == VK_RCONTROL || vkey == VK_RMENU) flags |= KEYEVENTF_EXTENDEDKEY; + TRACE("Adjusting state for vkey %#.2x. State before %#.2x\n", vkey, key_state_table[vkey]);
/* Fake key being pressed inside wine */ - X11DRV_send_keyboard_input( vkey, 0, state? 0 : KEYEVENTF_KEYUP, time, 0, 0 ); + X11DRV_send_keyboard_input( vkey, 0, flags, time, 0, 0 );
TRACE("State after %#.2x\n",key_state_table[vkey]); } @@ -1295,10 +1300,9 @@ static inline void KEYBOARD_UpdateOneState ( int vkey, int state, DWORD time ) */ void X11DRV_KeymapNotify( HWND hwnd, XEvent *event ) { - int i, j, alt, control, shift; + int i, j, alt_r = 0, alt_l = 0, control_r = 0, control_l = 0, shift_r = 0, shift_l = 0; DWORD time = GetCurrentTime();
- alt = control = shift = 0; /* the minimum keycode is always greater or equal to 8, so we can * skip the first 8 values, hence start at 1 */ @@ -1310,15 +1314,21 @@ void X11DRV_KeymapNotify( HWND hwnd, XEvent *event ) if (!(event->xkeymap.key_vector[i] & (1<<j))) continue; switch(keyc2vkey[(i * 8) + j] & 0xff) { - case VK_MENU: alt = 1; break; - case VK_CONTROL: control = 1; break; - case VK_SHIFT: shift = 1; break; + case VK_LMENU: alt_l = 1; break; + case VK_RMENU: alt_r = 1; break; + case VK_LCONTROL: control_l = 1; break; + case VK_RCONTROL: control_r = 1; break; + case VK_LSHIFT: shift_l = 1; break; + case VK_RSHIFT: shift_r = 1; break; } } } - KEYBOARD_UpdateOneState( VK_MENU, alt, time ); - KEYBOARD_UpdateOneState( VK_CONTROL, control, time ); - KEYBOARD_UpdateOneState( VK_SHIFT, shift, time ); + KEYBOARD_UpdateOneState( VK_LMENU, alt_l, time ); + KEYBOARD_UpdateOneState( VK_RMENU, alt_r, time ); + KEYBOARD_UpdateOneState( VK_LCONTROL, control_l, time ); + KEYBOARD_UpdateOneState( VK_RCONTROL, control_r, time ); + KEYBOARD_UpdateOneState( VK_LSHIFT, shift_l, time ); + KEYBOARD_UpdateOneState( VK_RSHIFT, shift_r, time ); }
static void update_lock_state(BYTE vkey, WORD scan, DWORD time)