tkho@ucla.edu wrote:
A couple of suggestions about coding style:
+struct transition_s {
- BYTE wVk;
It would be more logical to use WORD for VK codes as everywhere else.
- BYTE before_state;
- BYTE _todo_wine;
+};
Same for _todo_wine, it should be BOOL.
+struct sendinput_test_s {
- WORD wVk;
- DWORD dwFlags;
- struct transition_s expected_transitions[MAXKEYEVENTS+1];
- UINT expected_messages[MAXKEYMESSAGES+1];
+} sendinput_test[] = {
- /* test ALT+F */
- {VK_LMENU, 0, {{0x12, 0x00, 0}, {0xa4, 0x00, 0}, {0}}, {0x104, 0}},
- {'F', 0, {{0x46, 0x00, 0}, {0}}, {0x104, 0x106, 0x112, 0}},
- {'F', KEYEVENTF_KEYUP, {{0x46, 0x80, 0}, {0}}, {0x105, 0}},
- {VK_LMENU, KEYEVENTF_KEYUP, {{0x12, 0x80, 0}, {0xa4, 0x80, 0}, {0}},
{0x101, 0}},
Please use VK names and symbolic message names in the above arrays to make them more readable.
/***********************************************************************
X11DRV_send_keyboard_input
@@ -1128,14 +1141,16 @@ { message = WM_KEYUP; if ((key_state_table[VK_MENU] & 0x80) &&
((wVk == VK_MENU) || (wVk == VK_CONTROL) || !(key_state_table[VK_CONTROL] & 0x80)))
((VkStripLR(wVk) == VK_MENU) || (VkStripLR(wVk) == VK_CONTROL)
|| !(key_state_table[VK_CONTROL] & 0x80))) { if( TrackSysKey == VK_MENU || /* <ALT>-down/<ALT>-up sequence */
(wVk != VK_MENU)) /* <ALT>-down...<something else>-up */
(VkStripLR(wVk) != VK_MENU)) /* <ALT>-down...<something else>-up */ message = WM_SYSKEYUP; TrackSysKey = 0; } key_state_table[wVk] &= ~0x80;
}key_state_table[VkStripLR(wVk)] &= ~0x80; keylp.lp1.previous = 1; keylp.lp1.transition = 1;
@@ -1145,12 +1160,13 @@ keylp.lp1.transition = 0; if (!(key_state_table[wVk] & 0x80)) key_state_table[wVk] ^= 0x01; key_state_table[wVk] |= 0xc0;
key_state_table[VkStripLR(wVk)] |= 0xc0; message = WM_KEYDOWN; if ((key_state_table[VK_MENU] & 0x80) && !(key_state_table[VK_CONTROL] & 0x80)) { message = WM_SYSKEYDOWN;
TrackSysKey = wVk;
TrackSysKey = VkStripLR(wVk);
It would be much simpler to call VkStripLR() only once and use the result for further processing.