Alexandre Julliard : winex11: Replace the keyboard flags bitfield by the official flag definitions.

Alexandre Julliard julliard at winehq.org
Fri Apr 11 06:27:37 CDT 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Apr 10 17:59:06 2008 +0200

winex11: Replace the keyboard flags bitfield by the official flag definitions.

---

 dlls/winex11.drv/keyboard.c |   79 ++++++++++++++-----------------------------
 1 files changed, 26 insertions(+), 53 deletions(-)

diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
index 587ff2a..882b98c 100644
--- a/dlls/winex11.drv/keyboard.c
+++ b/dlls/winex11.drv/keyboard.c
@@ -53,27 +53,6 @@
 WINE_DEFAULT_DEBUG_CHANNEL(keyboard);
 WINE_DECLARE_DEBUG_CHANNEL(key);
 
-typedef union
-{
-    struct
-    {
-#ifndef BITFIELDS_BIGENDIAN
-        unsigned long count : 16;
-#endif
-        unsigned long code : 8;
-        unsigned long extended : 1;
-        unsigned long unused : 2;
-        unsigned long win_internal : 2;
-        unsigned long context : 1;
-        unsigned long previous : 1;
-        unsigned long transition : 1;
-#ifdef BITFIELDS_BIGENDIAN
-        unsigned long count : 16;
-#endif
-    } lp1;
-    unsigned long lp2;
-} KEYLP;
-
 /* key state table bits:
   0x80 -> key is pressed
   0x40 -> key got pressed since last time
@@ -1143,44 +1122,42 @@ static WORD EVENT_event_to_vkey( XIC xic, XKeyEvent *e)
 /***********************************************************************
  *           X11DRV_send_keyboard_input
  */
-void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time,
+void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD event_flags, DWORD time,
                                  DWORD dwExtraInfo, UINT injected_flags )
 {
     UINT message;
-    KEYLP keylp;
     KBDLLHOOKSTRUCT hook;
-    WORD wVkStripped, wVkL, wVkR, vk_hook = wVk;
+    WORD flags, wVkStripped, wVkL, wVkR, vk_hook = wVk;
 
     wVk = LOBYTE(wVk);
+    flags = LOBYTE(wScan);
 
-    keylp.lp2 = 0;
-    keylp.lp1.count = 1;
-    keylp.lp1.code = wScan;
-    keylp.lp1.extended = (dwFlags & KEYEVENTF_EXTENDEDKEY) != 0;
-    keylp.lp1.win_internal = 0; /* this has something to do with dialogs,
-                                * don't remember where I read it - AK */
-                                /* it's '1' under windows, when a dialog box appears
-                                 * and you press one of the underlined keys - DF*/
+    if (event_flags & KEYEVENTF_EXTENDEDKEY) flags |= KF_EXTENDED;
+    /* FIXME: set KF_DLGMODE and KF_MENUMODE when needed */
 
     /* strip left/right for menu, control, shift */
     switch (wVk)
     {
-    case VK_MENU: case VK_LMENU: case VK_RMENU:
-        wVk = keylp.lp1.extended ? VK_RMENU : VK_LMENU;
+    case VK_MENU:
+    case VK_LMENU:
+    case VK_RMENU:
+        wVk = (event_flags & KEYEVENTF_EXTENDEDKEY) ? VK_RMENU : VK_LMENU;
         wVkStripped = VK_MENU;
         wVkL = VK_LMENU;
         wVkR = VK_RMENU;
         break;
-
-    case VK_CONTROL: case VK_LCONTROL: case VK_RCONTROL:
-        wVk = keylp.lp1.extended ? VK_RCONTROL : VK_LCONTROL;
+    case VK_CONTROL:
+    case VK_LCONTROL:
+    case VK_RCONTROL:
+        wVk = (event_flags & KEYEVENTF_EXTENDEDKEY) ? VK_RCONTROL : VK_LCONTROL;
         wVkStripped = VK_CONTROL;
         wVkL = VK_LCONTROL;
         wVkR = VK_RCONTROL;
         break;
-
-    case VK_SHIFT: case VK_LSHIFT: case VK_RSHIFT:
-        wVk = keylp.lp1.extended ? VK_RSHIFT : VK_LSHIFT;
+    case VK_SHIFT:
+    case VK_LSHIFT:
+    case VK_RSHIFT:
+        wVk = (event_flags & KEYEVENTF_EXTENDEDKEY) ? VK_RSHIFT : VK_LSHIFT;
         wVkStripped = VK_SHIFT;
         wVkL = VK_LSHIFT;
         wVkR = VK_RSHIFT;
@@ -1189,8 +1166,7 @@ void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time
         wVkStripped = wVkL = wVkR = wVk;
     }
 
-    /* note that there is a test for all this */
-    if (dwFlags & KEYEVENTF_KEYUP )
+    if (event_flags & KEYEVENTF_KEYUP)
     {
         message = WM_KEYUP;
         if ((key_state_table[VK_MENU] & 0x80) &&
@@ -1202,14 +1178,10 @@ void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time
                 message = WM_SYSKEYUP;
             TrackSysKey = 0;
         }
-        keylp.lp1.previous = 1;
-        keylp.lp1.transition = 1;
+        flags |= KF_REPEAT | KF_UP;
     }
     else
     {
-        keylp.lp1.previous = (key_state_table[wVk] & 0x80) != 0;
-        keylp.lp1.transition = 0;
-
         message = WM_KEYDOWN;
         if ((key_state_table[VK_MENU] & 0x80 || wVkStripped == VK_MENU) &&
             !(key_state_table[VK_CONTROL] & 0x80 || wVkStripped == VK_CONTROL))
@@ -1217,20 +1189,21 @@ void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time
             message = WM_SYSKEYDOWN;
             TrackSysKey = wVkStripped;
         }
+        if (key_state_table[wVk] & 0x80) flags |= KF_REPEAT;
     }
 
     TRACE_(key)(" wParam=%04x, lParam=%08lx, InputKeyState=%x\n",
-                wVk, keylp.lp2, key_state_table[wVk] );
+                wVk, MAKELPARAM( 1, flags ), key_state_table[wVk] );
 
     /* Hook gets whatever key was sent. */
     hook.vkCode      = vk_hook;
     hook.scanCode    = wScan;
-    hook.flags       = (keylp.lp2 >> 24) | injected_flags;
+    hook.flags       = (flags >> 8) | injected_flags;
     hook.time        = time;
     hook.dwExtraInfo = dwExtraInfo;
     if (HOOK_CallHooks( WH_KEYBOARD_LL, HC_ACTION, message, (LPARAM)&hook, TRUE )) return;
 
-    if (dwFlags & KEYEVENTF_KEYUP )
+    if (event_flags & KEYEVENTF_KEYUP)
     {
         key_state_table[wVk] &= ~0x80;
         key_state_table[wVkStripped] = key_state_table[wVkL] | key_state_table[wVkR];
@@ -1242,9 +1215,9 @@ void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time
         key_state_table[wVkStripped] = key_state_table[wVkL] | key_state_table[wVkR];
     }
 
-    keylp.lp1.context = (key_state_table[VK_MENU] & 0x80) != 0; /* 1 if alt */
+    if (key_state_table[VK_MENU] & 0x80) flags |= KF_ALTDOWN;
 
-    if (wVkStripped == VK_SHIFT) keylp.lp1.extended = 0;
+    if (wVkStripped == VK_SHIFT) flags &= ~KF_EXTENDED;
 
     SERVER_START_REQ( send_hardware_message )
     {
@@ -1252,7 +1225,7 @@ void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time
         req->win      = 0;
         req->msg      = message;
         req->wparam   = wVk;
-        req->lparam   = keylp.lp2;
+        req->lparam   = MAKELPARAM( 1 /* repeat count */, flags );
         req->x        = cursor_pos.x;
         req->y        = cursor_pos.y;
         req->time     = time;




More information about the wine-cvs mailing list