[6/6] user32: Skip menu loop for empty popup menus.

Vincent Povirk madewokherd at gmail.com
Thu Mar 6 17:08:43 CST 2014


-------------- next part --------------
From f3beab6fe140bad8e5da85b0ffd5b5d2b63ebef1 Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Thu, 6 Mar 2014 16:10:54 -0600
Subject: [PATCH 6/6] user32: Skip menu loop for empty popup menus.

---
 dlls/user32/menu.c       |  6 ++++++
 dlls/user32/tests/menu.c | 14 +++++++-------
 dlls/user32/tests/msg.c  |  4 ++--
 3 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 9b80a2b..5492ce5 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -3035,6 +3035,12 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y,
     capture_win = mt.hOwnerWnd;
     set_capture_window( capture_win, GUI_INMENUMODE | ((wFlags & TPM_POPUPMENU) ? GUI_POPUPMENUMODE : 0), NULL );
 
+    if (wFlags & TPM_POPUPMENU && menu->nItems == 0)
+    {
+        set_capture_window( 0, GUI_INMENUMODE, NULL );
+        return FALSE;
+    }
+
     __TRY while (!fEndMenu)
     {
 	menu = MENU_GetMenu( mt.hCurrentMenu );
diff --git a/dlls/user32/tests/menu.c b/dlls/user32/tests/menu.c
index 7cab0a0..377b70d 100644
--- a/dlls/user32/tests/menu.c
+++ b/dlls/user32/tests/menu.c
@@ -3586,25 +3586,25 @@ static void test_emptypopup(void)
     ok(gflag_initmenupopup == 1, "got %i\n", gflag_initmenupopup);
     ok(gflag_entermenuloop == 1, "got %i\n", gflag_entermenuloop);
     ok(gflag_initmenu == 1, "got %i\n", gflag_initmenu);
-    todo_wine ok(gflag_enteridle == 0, "got %i\n", gflag_initmenu);
+    ok(gflag_enteridle == 0, "got %i\n", gflag_initmenu);
 
-    todo_wine ok(selectitem_wp == 0xdeadbeef, "got %lx\n", selectitem_wp);
-    todo_wine ok(selectitem_lp == 0xdeadbeef, "got %lx\n", selectitem_lp);
+    ok(selectitem_wp == 0xdeadbeef, "got %lx\n", selectitem_wp);
+    ok(selectitem_lp == 0xdeadbeef, "got %lx\n", selectitem_lp);
 
     gflag_initmenupopup = gflag_entermenuloop = gflag_initmenu = gflag_enteridle = 0;
     selectitem_wp = 0xdeadbeef;
     selectitem_lp = 0xdeadbeef;
 
     ret = TrackPopupMenu( hmenu, 0, 100,100, 0, hwnd, NULL);
-    todo_wine ok(ret == 0, "got %i\n", ret);
+    ok(ret == 0, "got %i\n", ret);
 
     ok(gflag_initmenupopup == 1, "got %i\n", gflag_initmenupopup);
     ok(gflag_entermenuloop == 1, "got %i\n", gflag_entermenuloop);
     ok(gflag_initmenu == 1, "got %i\n", gflag_initmenu);
-    todo_wine ok(gflag_enteridle == 0, "got %i\n", gflag_initmenu);
+    ok(gflag_enteridle == 0, "got %i\n", gflag_initmenu);
 
-    todo_wine ok(selectitem_wp == 0xdeadbeef, "got %lx\n", selectitem_wp);
-    todo_wine ok(selectitem_lp == 0xdeadbeef, "got %lx\n", selectitem_lp);
+    ok(selectitem_wp == 0xdeadbeef, "got %lx\n", selectitem_wp);
+    ok(selectitem_lp == 0xdeadbeef, "got %lx\n", selectitem_lp);
 
     SetWindowLongPtrA( hwnd, GWLP_WNDPROC, (LONG_PTR)menu_fill_in_init);
 
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 56fa2b8..7f54b4e 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -14359,8 +14359,8 @@ static void test_TrackPopupMenuEmpty(void)
     flush_events();
     flush_sequence();
     ret = TrackPopupMenu(hpopupmenu, 0, 100,100, 0, hwnd, NULL);
-    ok_sequence(WmTrackPopupMenuEmpty, "TrackPopupMenuEmpty", TRUE);
-    todo_wine ok(ret == 0, "TrackPopupMenu succeeded\n");
+    ok_sequence(WmTrackPopupMenuEmpty, "TrackPopupMenuEmpty", FALSE);
+    ok(ret == 0, "TrackPopupMenu succeeded\n");
 
     DestroyMenu(hpopupmenu);
     DestroyWindow(hwnd);
-- 
1.8.3.2



More information about the wine-patches mailing list