[PATCH] user32: Also remove WM_CHAR from queue when a menu gets VK_ESCAPE and add tests

Fabian Maurer dark.shadow4 at web.de
Wed Jan 18 15:40:02 CST 2017


Fixes https://bugs.winehq.org/show_bug.cgi?id=41489

Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
 dlls/user32/menu.c       |  6 +++++-
 dlls/user32/tests/menu.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 59fcd9c488..d8b36a5460 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -3186,8 +3186,12 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y,
 		    break;
 
 		case VK_ESCAPE:
+                {
+                    MSG msg_dummy;
                     fEndMenu = MENU_KeyEscape(&mt, wFlags);
-		    break;
+                    PeekMessageW(&msg_dummy, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
+                    break;
+                }
 
 		case VK_F1:
 		    {
diff --git a/dlls/user32/tests/menu.c b/dlls/user32/tests/menu.c
index a42bc1c639..71f8620773 100644
--- a/dlls/user32/tests/menu.c
+++ b/dlls/user32/tests/menu.c
@@ -3322,6 +3322,53 @@ static void test_menu_setmenuinfo(void)
     return;
 }
 
+/* Test handling of VK_ESCAPE to close the menu */
+static LRESULT WINAPI esc_test_wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+    if(msg == WM_SHOWWINDOW)
+    {
+        PostMessageW(hwnd, WM_KEYDOWN, VK_ESCAPE, 0);
+        HMENU hPopupMenu = CreatePopupMenu();
+        InsertMenuA(hPopupMenu, 0, MF_STRING, 10, "test");
+        TrackPopupMenu(hPopupMenu, 0, 0, 0, 0, hwnd, NULL);
+        PostQuitMessage(0);
+    }
+
+    if(msg == WM_CHAR || msg == WM_KEYDOWN)
+        ok(0, "Wrong VK_ESCAPE press detected.\n");
+
+    return DefWindowProcA(hwnd, msg, wparam, lparam);
+}
+
+static void test_menu_close(void)
+{
+    MSG msg;
+    WNDCLASSA  wclass = {0};
+    HINSTANCE hInstance = GetModuleHandleA( NULL );
+    HANDLE hWnd;
+    ATOM aclass;
+    BOOL ret;
+
+    wclass.lpszClassName = "MenuTestCloseClass";
+    wclass.lpfnWndProc   = esc_test_wnd_proc;
+    wclass.hInstance     = hInstance;
+
+    aclass = RegisterClassA( &wclass );
+    ok (aclass, "MenuTest class not created\n");
+    if (!aclass) return;
+    hWnd = CreateWindowA(wclass.lpszClassName, "MenuTest", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0,
+                         400, 200, NULL, NULL, hInstance, NULL);
+    ok (hWnd != NULL, "MenuTest window not created\n");
+
+    ShowWindow(hWnd, SW_SHOW);
+
+    while( (ret = GetMessageW( &msg, NULL, 0, 0 )) != 0)
+    {
+        TranslateMessage(&msg);
+        DispatchMessageW(&msg);
+    }
+}
+
 /* little func to easy switch either TrackPopupMenu() or TrackPopupMenuEx() */
 static DWORD MyTrackPopupMenu( int ex, HMENU hmenu, UINT flags, INT x, INT y, HWND hwnd, LPTPMPARAMS ptpm)
 {
@@ -4326,6 +4373,7 @@ START_TEST(menu)
     test_menu_flags();
 
     test_menu_hilitemenuitem();
+    test_menu_close();
     test_menu_trackpopupmenu();
     test_menu_trackagain();
     test_menu_cancelmode();
-- 
2.11.0




More information about the wine-patches mailing list