Commit 55736136 authored by Andrew Eikum's avatar Andrew Eikum Committed by Alexandre Julliard

winex11: Support KEYEVENTF_UNICODE in SendInput.

parent dad00cce
......@@ -1370,7 +1370,7 @@ static const char * const VK_KeyNames[SPY_MAX_VKKEYSNUM + 1] =
"VK_ICO_00", /* 0xE4 */
"VK_PROCESSKEY", /* 0xE5 */
NULL, /* 0xE6 */
NULL, /* 0xE7 */
"VK_PACKET", /* 0xE7 */
NULL, /* 0xE8 */
NULL, /* 0xE9 */
NULL, /* 0xEA */
......
......@@ -1155,6 +1155,7 @@ void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD event_flags, DWORD
UINT message;
KBDLLHOOKSTRUCT hook;
WORD flags, wVkStripped, wVkL, wVkR, vk_hook = wVk;
LPARAM lParam = 0;
wVk = LOBYTE(wVk);
flags = LOBYTE(wScan);
......@@ -1216,11 +1217,16 @@ void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD event_flags, DWORD
message = WM_SYSKEYDOWN;
TrackSysKey = wVkStripped;
}
if (key_state_table[wVk] & 0x80) flags |= KF_REPEAT;
if (!(event_flags & KEYEVENTF_UNICODE) && key_state_table[wVk] & 0x80) flags |= KF_REPEAT;
}
TRACE_(key)(" wParam=%04x, lParam=%08lx, InputKeyState=%x\n",
wVk, MAKELPARAM( 1, flags ), key_state_table[wVk] );
if (event_flags & KEYEVENTF_UNICODE)
{
vk_hook = wVk = VK_PACKET;
lParam = MAKELPARAM(1 /* repeat count */, wScan);
TRACE_(key)(" message=0x%04x wParam=0x%04x lParam=0x%08lx\n",
message, wVk, lParam);
}
/* Hook gets whatever key was sent. */
hook.vkCode = vk_hook;
......@@ -1230,21 +1236,29 @@ void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD event_flags, DWORD
hook.dwExtraInfo = dwExtraInfo;
if (HOOK_CallHooks( WH_KEYBOARD_LL, HC_ACTION, message, (LPARAM)&hook, TRUE )) return;
if (event_flags & KEYEVENTF_KEYUP)
if (!(event_flags & KEYEVENTF_UNICODE))
{
key_state_table[wVk] &= ~0x80;
key_state_table[wVkStripped] = key_state_table[wVkL] | key_state_table[wVkR];
}
else
{
if (!(key_state_table[wVk] & 0x80)) key_state_table[wVk] ^= 0x01;
key_state_table[wVk] |= 0xc0;
key_state_table[wVkStripped] = key_state_table[wVkL] | key_state_table[wVkR];
}
if (event_flags & KEYEVENTF_KEYUP)
{
key_state_table[wVk] &= ~0x80;
key_state_table[wVkStripped] = key_state_table[wVkL] | key_state_table[wVkR];
}
else
{
if (!(key_state_table[wVk] & 0x80)) key_state_table[wVk] ^= 0x01;
key_state_table[wVk] |= 0xc0;
key_state_table[wVkStripped] = key_state_table[wVkL] | key_state_table[wVkR];
}
if (key_state_table[VK_MENU] & 0x80) flags |= KF_ALTDOWN;
if (key_state_table[VK_MENU] & 0x80) flags |= KF_ALTDOWN;
if (wVkStripped == VK_SHIFT) flags &= ~KF_EXTENDED;
if (wVkStripped == VK_SHIFT) flags &= ~KF_EXTENDED;
lParam = MAKELPARAM(1 /* repeat count */, flags);
TRACE_(key)(" message=0x%04x wParam=0x%04x, lParam=0x%08lx, InputKeyState=0x%x\n",
message, wVk, lParam, key_state_table[wVk]);
}
SERVER_START_REQ( send_hardware_message )
{
......@@ -1252,7 +1266,7 @@ void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD event_flags, DWORD
req->win = 0;
req->msg = message;
req->wparam = wVk;
req->lparam = MAKELPARAM( 1 /* repeat count */, flags );
req->lparam = lParam;
req->x = cursor_pos.x;
req->y = cursor_pos.y;
req->time = time;
......
......@@ -2822,6 +2822,8 @@ typedef struct tagCBTACTIVATESTRUCT
/* keybd_event flags */
#define KEYEVENTF_EXTENDEDKEY 0x0001
#define KEYEVENTF_KEYUP 0x0002
#define KEYEVENTF_UNICODE 0x0004
#define KEYEVENTF_SCANCODE 0x0008
/* mouse_event flags */
#define MOUSEEVENTF_MOVE 0x0001
......@@ -3813,7 +3815,8 @@ typedef struct tagCOMPAREITEMSTRUCT
#define VK_PROCESSKEY 0xE5
/* 0xE6 OEM specific */
/* 0xE7-0xE8 Unassigned */
#define VK_PACKET 0xE7
/* 0xE8 Unassigned */
/* 0xE9-0xF5 OEM specific */
#define VK_ATTN 0xF6
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment