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