user32: Handle F10 key correctly.
Kusanagi Kouichi
slash at ma.neweb.ne.jp
Fri Mar 13 02:24:45 CDT 2009
When F10 key is pressed or released,
WM_SYSKEYDOWN or WM_SYSKEYUP message should be posted respectively.
When F10 key is released, The menu bar should be activated.
When SHIFT+F10 is typed, A shortcut menu should be opened.
---
dlls/user32/defwnd.c | 8 ++++----
dlls/user32/menu.c | 1 +
dlls/user32/tests/input.c | 33 +++++++++++++++++++++++++++++++++
dlls/winex11.drv/keyboard.c | 8 ++++++++
4 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c
index 38d8def..24a24e0 100644
--- a/dlls/user32/defwnd.c
+++ b/dlls/user32/defwnd.c
@@ -532,10 +532,6 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
case WM_SYSCOMMAND:
return NC_HandleSysCommand( hwnd, wParam, lParam );
- case WM_KEYDOWN:
- if(wParam == VK_F10) iF10Key = VK_F10;
- break;
-
case WM_SYSKEYDOWN:
if( HIWORD(lParam) & KEYDATA_ALT )
{
@@ -556,7 +552,11 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
}
}
else if( wParam == VK_F10 )
+ {
+ if (GetKeyState(VK_SHIFT) & 0x8000)
+ SendMessageW( hwnd, WM_CONTEXTMENU, (WPARAM)hwnd, MAKELPARAM(-1, -1) );
iF10Key = 1;
+ }
else if( wParam == VK_ESCAPE && (GetKeyState(VK_SHIFT) & 0x8000))
SendMessageW( hwnd, WM_SYSCOMMAND, SC_KEYMENU, ' ' );
break;
diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index fc6f981..ab03322 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -3181,6 +3181,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y,
switch(msg.wParam)
{
case VK_MENU:
+ case VK_F10:
fEndMenu = TRUE;
break;
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index e4ad1de..f624461 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -650,6 +650,39 @@ struct sendinput_test_s {
{{WM_KEYUP, hook|wparam, VK_LSHIFT},
{WM_KEYUP, wparam|lparam, VK_SHIFT, KF_UP}, {0}}},
+ /* test F10 */
+ /* 52 */
+ {VK_F10, 0, 0,
+ {{VK_F10, 0x00}, {0}},
+ {{WM_SYSKEYDOWN, hook|wparam|lparam, VK_F10, 0},
+ {WM_SYSKEYDOWN, wparam|lparam, VK_F10, 0}, {0}}},
+ {VK_F10, KEYEVENTF_KEYUP, 0,
+ {{VK_F10, 0x80}, {0}},
+ {{WM_SYSKEYUP, hook|wparam, VK_F10},
+ {WM_SYSKEYUP, wparam|lparam, VK_F10, KF_UP},
+ {WM_SYSCOMMAND, wparam|lparam, SC_KEYMENU, 0}, {0}}},
+
+ /* test SHIFT+F10 */
+ /* 54 */
+ {VK_LSHIFT, 0, 0,
+ {{VK_SHIFT, 0x00}, {VK_LSHIFT, 0x00}, {0}},
+ {{WM_KEYDOWN, hook|wparam|lparam, VK_LSHIFT, 0},
+ {WM_KEYDOWN, wparam|lparam, VK_SHIFT, 0}, {0}}},
+ {VK_F10, 0, 0,
+ {{VK_F10, 0x00}, {0}},
+ {{WM_SYSKEYDOWN, hook|wparam|lparam, VK_F10, 0},
+ {WM_SYSKEYDOWN, wparam|lparam, VK_F10, 0},
+ {WM_CONTEXTMENU}, {0}}},
+ {VK_F10, KEYEVENTF_KEYUP, 0,
+ {{VK_F10, 0x80}, {0}},
+ {{WM_SYSKEYUP, hook|wparam, VK_F10},
+ {WM_SYSKEYUP, wparam|lparam, VK_F10, KF_UP},
+ {WM_SYSCOMMAND, wparam|lparam, SC_KEYMENU, 0}, {0}}},
+ {VK_LSHIFT, KEYEVENTF_KEYUP, 0,
+ {{VK_SHIFT, 0x80}, {VK_LSHIFT, 0x80}, {0}},
+ {{WM_KEYUP, hook|wparam, VK_LSHIFT},
+ {WM_KEYUP, wparam|lparam, VK_SHIFT, KF_UP}, {0}}},
+
{0, 0, 0, {{0}}, {{0}}} /* end */
};
diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
index 542e5a8..6d59686 100644
--- a/dlls/winex11.drv/keyboard.c
+++ b/dlls/winex11.drv/keyboard.c
@@ -1204,6 +1204,10 @@ void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD event_flags, DWORD
message = WM_SYSKEYUP;
TrackSysKey = 0;
}
+ else if (key_state_table[VK_F10] & 0x80 || wVkStripped == VK_F10)
+ {
+ message = WM_SYSKEYUP;
+ }
flags |= KF_REPEAT | KF_UP;
}
else
@@ -1215,6 +1219,10 @@ void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD event_flags, DWORD
message = WM_SYSKEYDOWN;
TrackSysKey = wVkStripped;
}
+ else if (key_state_table[VK_F10] & 0x80 || wVkStripped == VK_F10)
+ {
+ message = WM_SYSKEYDOWN;
+ }
if (key_state_table[wVk] & 0x80) flags |= KF_REPEAT;
}
--
1.6.2
More information about the wine-patches
mailing list