[5/6] explorer: Make separate thread for start menu.

Vincent Povirk madewokherd at gmail.com
Tue Dec 10 15:11:37 CST 2013


I thought running potentially-blocking operations (like reading shell
folders and eventually extracting icons) on the main thread of
explorer could be a bad idea.
-------------- next part --------------
From 7c7f275f6f32a5299ac35956c02deebd2dd49776 Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Fri, 6 Dec 2013 15:46:12 -0600
Subject: [PATCH 5/6] explorer: Make separate thread for start menu.

---
 programs/explorer/startmenu.c | 37 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/programs/explorer/startmenu.c b/programs/explorer/startmenu.c
index b0cc702..5730b39 100644
--- a/programs/explorer/startmenu.c
+++ b/programs/explorer/startmenu.c
@@ -55,6 +55,10 @@ static struct menu_item user_startmenu = {{0}};
 static ATOM menu_parent_class;
 static HWND menu_parent;
 
+DWORD menu_thread_id;
+
+#define WM_POPUP_MENU WM_USER
+
 static ULONG copy_pidls(struct menu_item* item, LPITEMIDLIST dest)
 {
     ULONG item_size;
@@ -362,7 +366,7 @@ LRESULT CALLBACK menu_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
     return DefWindowProcW(hwnd, msg, wparam, lparam);
 }
 
-void do_startmenu(HWND hwnd)
+void popup_startmenu(HWND hwnd)
 {
     LPITEMIDLIST pidl;
     MENUINFO mi;
@@ -445,3 +449,34 @@ void do_startmenu(HWND hwnd)
     }
 }
 
+DWORD CALLBACK menu_thread_proc(void* user_data)
+{
+    HWND parent = user_data;
+    MSG msg;
+
+    popup_startmenu(parent);
+
+    while(GetMessageW(&msg, NULL, 0, 0) != 0)
+    {
+        if (msg.hwnd == NULL && msg.message == WM_POPUP_MENU)
+        {
+            popup_startmenu((HWND)msg.lParam);
+        }
+        else
+        {
+            TranslateMessage(&msg);
+            DispatchMessageW(&msg);
+        }
+    }
+
+    return 0;
+}
+
+void do_startmenu(HWND hwnd)
+{
+    if (menu_thread_id)
+        PostThreadMessageW(menu_thread_id, WM_POPUP_MENU, 0, (LPARAM)hwnd);
+    else
+        CreateThread(NULL, 0, menu_thread_proc, hwnd, 0, &menu_thread_id);
+}
+
-- 
1.8.1.2


More information about the wine-patches mailing list