22#include " ../config.h"
33#include " contextmenu.h"
44#include " menu_render.h"
5+ #include " ../script/quickjspp.hpp"
6+ #include " ../entry.h"
57
68#include " blook/blook.h"
79#include < atlcomcli.h>
810#include < shobjidl_core.h>
11+ #include < thread>
912
1013#define NOMINMAX
1114#define WIN32_LEAN_AND_MEAN
1215#include " Windows.h"
1316#include " shlobj_core.h"
1417
18+
1519std::atomic_bool mb_shell::context_menu_hooks::has_active_menu = false ;
1620
1721void mb_shell::context_menu_hooks::install_common_hook () {
@@ -22,6 +26,8 @@ void mb_shell::context_menu_hooks::install_common_hook() {
2226 auto NtUserTrackPopupMenu = win32u.value ()->exports (" NtUserTrackPopupMenuEx" );
2327 static auto NtUserTrackHook = NtUserTrackPopupMenu->inline_hook ();
2428
29+ static auto renderer = task_queue{};
30+
2531 NtUserTrackHook->install (+[](HMENU hMenu, int64_t uFlags, int64_t x,
2632 int64_t y, HWND hWnd, int64_t lptpm) {
2733 if (GetPropW (hWnd, L" COwnerDrawPopupMenu_This" ) &&
@@ -30,24 +36,38 @@ void mb_shell::context_menu_hooks::install_common_hook() {
3036 hWnd, lptpm);
3137 }
3238
39+ entry::main_window_loop_hook.install (hWnd);
3340 has_active_menu = true ;
3441
3542 perf_counter perf (" TrackPopupMenuEx" );
3643 menu menu = menu::construct_with_hmenu (hMenu, hWnd);
3744 perf.end (" construct_with_hmenu" );
38- auto menu_render = menu_render::create (x, y, menu);
39- menu_render.rt ->last_time = menu_render.rt ->clock .now ();
40- perf.end (" menu_render::create" );
41- menu_render.rt ->start_loop ();
45+
46+ auto selected_menu_future = renderer
47+ .add_task ([&]() {
48+ auto menu_render = menu_render::create (x, y, menu);
49+ menu_render.rt ->last_time = menu_render.rt ->clock .now ();
50+
51+ perf.end (" menu_render::create" );
52+ menu_render.rt ->start_loop ();
53+
54+ return menu_render.selected_menu ;
55+ });
56+
57+ qjs::wait_with_msgloop ([&]() {
58+ selected_menu_future.wait ();
59+ });
60+
61+ auto selected_menu = selected_menu_future.get ();
4262
4363 has_active_menu = false ;
4464
45- if (menu_render. selected_menu && !(uFlags & TPM_NONOTIFY)) {
46- PostMessageW (hWnd, WM_COMMAND, *menu_render. selected_menu , 0 );
65+ if (selected_menu && !(uFlags & TPM_NONOTIFY)) {
66+ PostMessageW (hWnd, WM_COMMAND, *selected_menu, 0 );
4767 PostMessageW (hWnd, WM_NULL, 0 , 0 );
4868 }
4969
50- return (int32_t )menu_render. selected_menu .value_or (0 );
70+ return (int32_t )selected_menu.value_or (0 );
5171 });
5272}
5373
@@ -115,7 +135,7 @@ void mb_shell::context_menu_hooks::install_SHCreateDefaultContextMenu_hook() {
115135 int pcmType = 0 ;
116136 UpgradeContextMenu (pdcm, reinterpret_cast <void **>(&pcm2), &pcmType);
117137
118- IContextMenu* pCM (pcm2);
138+ IContextMenu * pCM (pcm2);
119139
120140 HMENU hmenu = CreatePopupMenu ();
121141 pCM->QueryContextMenu (hmenu, 0 , 1 , 0x7FFF , CMF_EXPLORE | CMF_CANRENAME);
0 commit comments