[4/6] explorer: Create a separate parent window for the start menu.

Vincent Povirk madewokherd at gmail.com
Tue Dec 10 15:09:58 CST 2013


This helps encapsulation and makes the next patch possible.
-------------- next part --------------
From c16a7817b27db1d2fa8307f26eb75d4ac6940168 Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Fri, 6 Dec 2013 15:14:21 -0600
Subject: [PATCH 4/6] explorer: Create a separate parent window for the start
 menu.

---
 programs/explorer/explorer_private.h |  1 -
 programs/explorer/startmenu.c        | 34 +++++++++++++++++++++++++++++++---
 programs/explorer/systray.c          |  4 ----
 3 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/programs/explorer/explorer_private.h b/programs/explorer/explorer_private.h
index 108a3ab..c407a61 100644
--- a/programs/explorer/explorer_private.h
+++ b/programs/explorer/explorer_private.h
@@ -25,6 +25,5 @@ extern void manage_desktop( WCHAR *arg );
 extern void initialize_systray( HMODULE graphics_driver, BOOL using_root );
 extern void initialize_appbar(void);
 extern void do_startmenu( HWND owner );
-extern LRESULT CALLBACK menu_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
 
 #endif  /* __WINE_EXPLORER_PRIVATE_H */
diff --git a/programs/explorer/startmenu.c b/programs/explorer/startmenu.c
index 6fcca46..b0cc702 100644
--- a/programs/explorer/startmenu.c
+++ b/programs/explorer/startmenu.c
@@ -52,6 +52,9 @@ static struct menu_item root_menu = {{0}};
 static struct menu_item public_startmenu = {{0}};
 static struct menu_item user_startmenu = {{0}};
 
+static ATOM menu_parent_class;
+static HWND menu_parent;
+
 static ULONG copy_pidls(struct menu_item* item, LPITEMIDLIST dest)
 {
     ULONG item_size;
@@ -365,6 +368,33 @@ void do_startmenu(HWND hwnd)
     MENUINFO mi;
     RECT rc={0,0,0,0};
     TPMPARAMS tpm;
+    WNDCLASSEXW class;
+    static const WCHAR classname[] = {'W','i','n','e','M','e','n','u','P','a','r','e','n','t',0};
+
+    if (!menu_parent_class)
+    {
+        memset(&class, 0, sizeof(class));
+        class.cbSize = sizeof(class);
+        class.lpfnWndProc = menu_wndproc;
+        class.lpszClassName = classname;
+        menu_parent_class = RegisterClassExW(&class);
+        if (!menu_parent_class)
+        {
+            WINE_ERR("Could not register menu parent class\n");
+            return;
+        }
+    }
+
+    if (!menu_parent)
+    {
+        menu_parent = CreateWindowExW(0, classname, NULL, WS_POPUP, 0, 0, 1, 1,
+                                      hwnd, NULL, NULL, NULL);
+        if (!menu_parent)
+        {
+            WINE_ERR("Could not create menu parent window\n");
+            return;
+        }
+    }
 
     destroy_menus();
 
@@ -372,9 +402,7 @@ void do_startmenu(HWND hwnd)
 
     root_menu.menuhandle = public_startmenu.menuhandle = user_startmenu.menuhandle = CreatePopupMenu();
     if (!root_menu.menuhandle)
-    {
         return;
-    }
 
     user_startmenu.parent = public_startmenu.parent = &root_menu;
     user_startmenu.base = &public_startmenu;
@@ -411,7 +439,7 @@ void do_startmenu(HWND hwnd)
 
     if (!TrackPopupMenuEx(root_menu.menuhandle,
         TPM_LEFTALIGN|TPM_BOTTOMALIGN|TPM_VERTICAL,
-        rc.left, rc.top, hwnd, &tpm))
+        rc.left, rc.top, menu_parent, &tpm))
     {
         WINE_ERR("couldn't display menu\n");
     }
diff --git a/programs/explorer/systray.c b/programs/explorer/systray.c
index f263205..e7f5f73 100644
--- a/programs/explorer/systray.c
+++ b/programs/explorer/systray.c
@@ -626,10 +626,6 @@ static LRESULT WINAPI tray_wndproc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM l
             do_startmenu(hwnd);
         break;
 
-    case WM_INITMENUPOPUP:
-    case WM_MENUCOMMAND:
-        return menu_wndproc(hwnd, msg, wparam, lparam);
-
     default:
         return DefWindowProcW( hwnd, msg, wparam, lparam );
     }
-- 
1.8.1.2


More information about the wine-patches mailing list