[PATCH resend] user32: Also remove WM_CHAR from queue when a menu gets VK_ESCAPE and add tests
Fabian Maurer
dark.shadow4 at web.de
Tue Jan 24 21:04:55 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