Alexandre Julliard : server: Set the message code for keyboard input on the server side.

Alexandre Julliard julliard at winehq.org
Wed Mar 2 12:23:46 CST 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Mar  2 11:34:59 2011 +0100

server: Set the message code for keyboard input on the server side.

---

 server/queue.c |   49 +++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/server/queue.c b/server/queue.c
index 1353b00..19532e2 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -1361,8 +1361,7 @@ static void queue_mouse_message( struct desktop *desktop, user_handle_t win, uns
 }
 
 /* queue a hardware message for a keyboard event */
-static void queue_keyboard_message( struct desktop *desktop, user_handle_t win, unsigned int message,
-                                    const hw_input_t *input )
+static void queue_keyboard_message( struct desktop *desktop, user_handle_t win, const hw_input_t *input )
 {
     struct hardware_msg_data *msg_data;
     struct message *msg;
@@ -1378,7 +1377,6 @@ static void queue_keyboard_message( struct desktop *desktop, user_handle_t win,
 
     msg->type      = MSG_HARDWARE;
     msg->win       = get_user_full_handle( win );
-    msg->msg       = message;
     msg->lparam    = (input->kbd.scan << 16) | 1; /* repeat count */
     msg->time      = input->kbd.time;
     msg->result    = NULL;
@@ -1419,6 +1417,49 @@ static void queue_keyboard_message( struct desktop *desktop, user_handle_t win,
         msg->wparam = vkey;
     }
 
+    msg->msg = (input->kbd.flags & KEYEVENTF_KEYUP) ? WM_KEYUP : WM_KEYDOWN;
+
+    switch (vkey)
+    {
+    case VK_LMENU:
+    case VK_RMENU:
+        if (input->kbd.flags & KEYEVENTF_KEYUP)
+        {
+            /* send WM_SYSKEYUP if Alt still pressed and no other key in between */
+            /* we use 0x02 as a flag to track if some other SYSKEYUP was sent already */
+            if ((desktop->keystate[VK_MENU] & 0x82) != 0x82) break;
+            msg->msg = WM_SYSKEYUP;
+            desktop->keystate[VK_MENU] &= ~0x02;
+        }
+        else
+        {
+            /* send WM_SYSKEYDOWN for Alt except with Ctrl */
+            if (desktop->keystate[VK_CONTROL] & 0x80) break;
+            msg->msg = WM_SYSKEYDOWN;
+            desktop->keystate[VK_MENU] |= 0x02;
+        }
+        break;
+
+    case VK_LCONTROL:
+    case VK_RCONTROL:
+        /* send WM_SYSKEYUP on release if Alt still pressed */
+        if (!(input->kbd.flags & KEYEVENTF_KEYUP)) break;
+        if (!(desktop->keystate[VK_MENU] & 0x80)) break;
+        msg->msg = WM_SYSKEYUP;
+        desktop->keystate[VK_MENU] &= ~0x02;
+        break;
+
+    default:
+        /* send WM_SYSKEY for Alt-anykey and for F10 */
+        if (desktop->keystate[VK_CONTROL] & 0x80) break;
+        if (!(desktop->keystate[VK_MENU] & 0x80)) break;
+        /* fall through */
+    case VK_F10:
+        msg->msg = (input->kbd.flags & KEYEVENTF_KEYUP) ? WM_SYSKEYUP : WM_SYSKEYDOWN;
+        desktop->keystate[VK_MENU] &= ~0x02;
+        break;
+    }
+
     queue_hardware_message( desktop, msg );
 }
 
@@ -1879,7 +1920,7 @@ DECL_HANDLER(send_hardware_message)
         queue_mouse_message( desktop, req->win, req->msg, &req->input );
         break;
     case INPUT_KEYBOARD:
-        queue_keyboard_message( desktop, req->win, req->msg, &req->input );
+        queue_keyboard_message( desktop, req->win, &req->input );
         break;
     case INPUT_HARDWARE:
         queue_custom_hardware_message( desktop, req->win, &req->input );




More information about the wine-cvs mailing list