Dmitry Timoshkov : winex11.drv: On KeymapNotify event also sychronize WinKey state.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jul 14 09:42:25 CDT 2015


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

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Mon Jul 13 14:39:25 2015 +0800

winex11.drv: On KeymapNotify event also sychronize WinKey state.

---

 dlls/winex11.drv/keyboard.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
index b0f5b95..bd24961 100644
--- a/dlls/winex11.drv/keyboard.c
+++ b/dlls/winex11.drv/keyboard.c
@@ -1233,6 +1233,7 @@ void X11DRV_KeymapNotify( HWND hwnd, XEvent *event )
         WORD vkey;
         BOOL pressed;
     } modifiers[6]; /* VK_LSHIFT through VK_RMENU are contiguous */
+    BOOL lwin_pressed = FALSE, rwin_pressed = FALSE;
 
     if (!get_async_key_state( keystate )) return;
 
@@ -1264,6 +1265,12 @@ void X11DRV_KeymapNotify( HWND hwnd, XEvent *event )
                 if (!modifiers[m].vkey) modifiers[m].vkey = vkey;
                 if (event->xkeymap.key_vector[i] & (1<<j)) modifiers[m].pressed = TRUE;
                 break;
+            case VK_LWIN:
+                if (event->xkeymap.key_vector[i] & (1<<j)) lwin_pressed = TRUE;
+                break;
+            case VK_RWIN:
+                if (event->xkeymap.key_vector[i] & (1<<j)) rwin_pressed = TRUE;
+                break;
             }
         }
     }
@@ -1281,12 +1288,27 @@ void X11DRV_KeymapNotify( HWND hwnd, XEvent *event )
         }
     }
 
+    if (!(keystate[VK_LWIN] & 0x80) != !lwin_pressed)
+    {
+        TRACE( "Adjusting state for VK_LWIN. State before %#.2x\n", keystate[VK_LWIN]);
+        update_key_state( keystate, VK_LWIN, lwin_pressed );
+        changed = TRUE;
+    }
+    if (!(keystate[VK_RWIN] & 0x80) != !rwin_pressed)
+    {
+        TRACE( "Adjusting state for VK_RWIN. State before %#.2x\n", keystate[VK_RWIN]);
+        update_key_state( keystate, VK_RWIN, rwin_pressed );
+        changed = TRUE;
+    }
+
     LeaveCriticalSection( &kbd_section );
     if (!changed) return;
 
     update_key_state( keystate, VK_CONTROL, (keystate[VK_LCONTROL] | keystate[VK_RCONTROL]) & 0x80 );
     update_key_state( keystate, VK_MENU, (keystate[VK_LMENU] | keystate[VK_RMENU]) & 0x80 );
     update_key_state( keystate, VK_SHIFT, (keystate[VK_LSHIFT] | keystate[VK_RSHIFT]) & 0x80 );
+    update_key_state( keystate, VK_LWIN, keystate[VK_LWIN] & 0x80 );
+    update_key_state( keystate, VK_RWIN, keystate[VK_RWIN] & 0x80 );
     set_async_key_state( keystate );
 }
 




More information about the wine-cvs mailing list