mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-30 04:48:36 +00:00
server: Fix handling of KEYEVENTF_UNICODE inputs with a non-zero vkey.
This commit is contained in:
parent
d18bd43ba2
commit
85f1ad64c4
|
@ -1163,9 +1163,9 @@ static void test_SendInput_keyboard_messages( WORD vkey, WORD scan, WCHAR wch, W
|
|||
struct send_input_keyboard_test unicode_vkey[] =
|
||||
{
|
||||
{.scan = 0x3c0, .vkey = vkey, .flags = KEYEVENTF_UNICODE, .expect_state = {/*[vkey] = 0x80*/},
|
||||
.expect = {KEY_HOOK(WM_KEYDOWN, 0xc0, vkey, .todo_value = TRUE), KEY_MSG(WM_KEYDOWN, 0xc0, vkey, .todo_value = TRUE), WIN_MSG(WM_CHAR, wch, MAKELONG(1, 0xc0), .todo_value = TRUE), {0}}},
|
||||
.expect = {KEY_HOOK(WM_KEYDOWN, 0xc0, vkey), KEY_MSG(WM_KEYDOWN, 0xc0, vkey), WIN_MSG(WM_CHAR, wch, MAKELONG(1, 0xc0)), {0}}},
|
||||
{.scan = 0x3c0, .vkey = vkey, .flags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP,
|
||||
.expect = {KEY_HOOK(WM_KEYUP, 0xc0, vkey, .todo_value = TRUE), KEY_MSG(WM_KEYUP, 0xc0, vkey, .todo_value = TRUE), {0}}},
|
||||
.expect = {KEY_HOOK(WM_KEYUP, 0xc0, vkey), KEY_MSG(WM_KEYUP, 0xc0, vkey), {0}}},
|
||||
{0},
|
||||
};
|
||||
|
||||
|
|
|
@ -2098,6 +2098,7 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c
|
|||
unsigned char vkey = input->kbd.vkey, hook_vkey = vkey;
|
||||
unsigned int message_code, time;
|
||||
lparam_t lparam = input->kbd.scan << 16;
|
||||
unsigned int flags = 0;
|
||||
int wait;
|
||||
|
||||
if (!(time = input->kbd.time)) time = get_tick_count();
|
||||
|
@ -2213,29 +2214,25 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c
|
|||
|
||||
msg->win = get_user_full_handle( win );
|
||||
msg->msg = message_code;
|
||||
msg->lparam = lparam | 1u; /* repeat count */
|
||||
if (origin == IMO_INJECTED) msg_data->flags = LLKHF_INJECTED;
|
||||
|
||||
if (input->kbd.flags & KEYEVENTF_UNICODE && !vkey)
|
||||
{
|
||||
msg->wparam = VK_PACKET;
|
||||
vkey = hook_vkey = VK_PACKET;
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int flags = 0;
|
||||
if (input->kbd.flags & KEYEVENTF_EXTENDEDKEY) flags |= KF_EXTENDED;
|
||||
/* FIXME: set KF_DLGMODE and KF_MENUMODE when needed */
|
||||
if (input->kbd.flags & KEYEVENTF_KEYUP) flags |= KF_REPEAT | KF_UP;
|
||||
else if (desktop->keystate[vkey] & 0x80) flags |= KF_REPEAT;
|
||||
|
||||
msg->wparam = vkey;
|
||||
msg->lparam |= flags << 16;
|
||||
lparam &= 0xff0000; /* mask off scan code high bits for non-unicode input */
|
||||
msg_data->flags |= (flags & (KF_EXTENDED | KF_ALTDOWN | KF_UP)) >> 8;
|
||||
}
|
||||
|
||||
/* TODO: The following is incorrect (we also need to check for not !vkey),
|
||||
* but we do it to temporarily retain existing behavior */
|
||||
if (input->kbd.flags & KEYEVENTF_UNICODE) hook_vkey = VK_PACKET;
|
||||
msg->wparam = vkey;
|
||||
msg->lparam = (flags << 16) | lparam | 1u /* repeat count */;
|
||||
|
||||
if (!(wait = send_hook_ll_message( desktop, msg, WH_KEYBOARD_LL, lparam | hook_vkey, sender )))
|
||||
queue_hardware_message( desktop, msg, 1 );
|
||||
|
|
Loading…
Reference in a new issue