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