Vitaliy Margolen : winex11.drv: Send scan code when adjusting modifier key states.

Alexandre Julliard julliard at winehq.org
Mon Apr 14 07:14:19 CDT 2008


Module: wine
Branch: master
Commit: a3b21209b2c07d8d972bf12958792118d2570373
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a3b21209b2c07d8d972bf12958792118d2570373

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Sun Apr 13 09:16:02 2008 -0600

winex11.drv: Send scan code when adjusting modifier key states.

---

 dlls/winex11.drv/keyboard.c |   43 ++++++++++++++++++++-----------------------
 1 files changed, 20 insertions(+), 23 deletions(-)

diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
index 882b98c..6aa613f 100644
--- a/dlls/winex11.drv/keyboard.c
+++ b/dlls/winex11.drv/keyboard.c
@@ -1242,23 +1242,22 @@ void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD event_flags, DWORD
  * Updates internal state for <vkey>, depending on key <state> under X
  *
  */
-static inline void KEYBOARD_UpdateOneState ( int vkey, int state, DWORD time )
+static inline void KEYBOARD_UpdateOneState ( WORD vkey, WORD scan, int state, DWORD time )
 {
     /* Do something if internal table state != X state for keycode */
-    if (((key_state_table[vkey] & 0x80)!=0) != state)
+    if (((key_state_table[vkey & 0xff] & 0x80)!=0) != state)
     {
-        DWORD flags = 0;
+        DWORD flags = vkey & 0x100 ? KEYEVENTF_EXTENDEDKEY : 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]);
+              vkey, key_state_table[vkey & 0xff]);
 
         /* Fake key being pressed inside wine */
-        X11DRV_send_keyboard_input( vkey, 0, flags, time, 0, 0 );
+        X11DRV_send_keyboard_input( vkey & 0xff, scan & 0xff, flags, time, 0, 0 );
 
-        TRACE("State after %#.2x\n",key_state_table[vkey]);
+        TRACE("State after %#.2x\n", key_state_table[vkey & 0xff]);
     }
 }
 
@@ -1273,7 +1272,7 @@ static inline void KEYBOARD_UpdateOneState ( int vkey, int state, DWORD time )
  */
 void X11DRV_KeymapNotify( HWND hwnd, XEvent *event )
 {
-    int i, j, alt_r = 0, alt_l = 0, control_r = 0, control_l = 0, shift_r = 0, shift_l = 0;
+    int i, j;
     DWORD time = GetCurrentTime();
 
     /* the minimum keycode is always greater or equal to 8, so we can
@@ -1281,27 +1280,25 @@ void X11DRV_KeymapNotify( HWND hwnd, XEvent *event )
      */
     for (i = 1; i < 32; i++)
     {
-        if (!event->xkeymap.key_vector[i]) continue;
         for (j = 0; j < 8; j++)
         {
-            if (!(event->xkeymap.key_vector[i] & (1<<j))) continue;
-            switch(keyc2vkey[(i * 8) + j] & 0xff)
+            WORD vkey = keyc2vkey[(i * 8) + j];
+            WORD scan = keyc2scan[(i * 8) + j];
+            int state = (event->xkeymap.key_vector[i] & (1<<j)) != 0;
+
+            switch(vkey & 0xff)
             {
-            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;
+            case VK_LMENU:
+            case VK_RMENU:
+            case VK_LCONTROL:
+            case VK_RCONTROL:
+            case VK_LSHIFT:
+            case VK_RSHIFT:
+                KEYBOARD_UpdateOneState( vkey, scan, state, time );
+                break;
             }
         }
     }
-    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)




More information about the wine-cvs mailing list