Skip to content

Commit 13156cd

Browse files
fix(shell): prevent activating the window
1 parent 4478175 commit 13156cd

File tree

5 files changed

+30
-17
lines changed

5 files changed

+30
-17
lines changed

src/shell/contextmenu/hooks.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ void mb_shell::context_menu_hooks::install_common_hook() {
5656
auto hook = SetWindowsHookExW(
5757
WH_KEYBOARD,
5858
[](int nCode, WPARAM wParam, LPARAM lParam) -> LRESULT {
59-
std::println("Keyboard hook called: nCode={}, wParam={}", nCode,
60-
wParam);
6159
if (nCode == HC_ACTION) {
6260
PostMessageW(window, lParam == WM_KEYDOWN ? WM_KEYDOWN : WM_KEYUP,
6361
wParam, lParam);
@@ -66,6 +64,10 @@ void mb_shell::context_menu_hooks::install_common_hook() {
6664
return CallNextHookEx(NULL, nCode, wParam, lParam);
6765
},
6866
NULL, thread_id_orig);
67+
68+
SetWindowLongPtrW(window, GWL_EXSTYLE,
69+
GetWindowLongPtrW(window, GWL_EXSTYLE) |
70+
WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);
6971

7072
menu_render.rt->start_loop();
7173
UnhookWindowsHookEx(hook);

src/shell/contextmenu/menu_render.cc

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@ menu_render menu_render::create(int x, int y, menu menu) {
2121
}
2222

2323
static auto rt = []() {
24+
static window_proc_hook glfw_proc_hook;
2425
auto rt = std::make_shared<ui::render_target>();
2526
rt->transparent = true;
2627
rt->no_activate = true;
2728
rt->capture_all_input = true;
2829
rt->decorated = false;
29-
rt->topmost = false;
30+
rt->topmost = true;
3031
rt->vsync = config::current->context_menu.vsync;
3132

3233
if (config::current->avoid_resize_ui) {
@@ -39,6 +40,18 @@ menu_render menu_render::create(int x, int y, menu menu) {
3940
MB_ICONERROR);
4041
}
4142

43+
glfw_proc_hook.install(rt->hwnd());
44+
SetCapture((HWND)rt->hwnd());
45+
glfw_proc_hook.hooks.push_back([](void *hwnd, void *original_proc,
46+
size_t msg, size_t wparam,
47+
size_t lparam) -> std::optional<int> {
48+
if (msg == WM_MOUSEACTIVATE) {
49+
return MA_NOACTIVATE;
50+
}
51+
52+
return std::nullopt;
53+
});
54+
4255
nvgCreateFont(rt->nvg, "main",
4356
config::current->font_path_main.string().c_str());
4457
nvgCreateFont(rt->nvg, "fallback",
@@ -65,17 +78,15 @@ menu_render menu_render::create(int x, int y, menu menu) {
6578
monitor_info.rcMonitor.top, monitor_info.rcMonitor.right,
6679
monitor_info.rcMonitor.bottom);
6780

68-
rt->set_position(monitor_info.rcMonitor.left + 1, monitor_info.rcMonitor.top + 1);
81+
rt->set_position(monitor_info.rcMonitor.left + 1,
82+
monitor_info.rcMonitor.top + 1);
6983
if (!config::current->avoid_resize_ui)
70-
rt->resize(
71-
monitor_info.rcMonitor.right - monitor_info.rcMonitor.left - 2,
72-
monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top - 2);
84+
rt->resize(monitor_info.rcMonitor.right - monitor_info.rcMonitor.left - 2,
85+
monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top - 2);
7386

7487
glfwMakeContextCurrent(rt->window);
7588
glfwSwapInterval(config::current->context_menu.vsync ? 1 : 0);
7689

77-
78-
7990
rt->show();
8091
auto menu_wid = std::make_shared<mouse_menu_widget_main>(
8192
menu,
@@ -89,7 +100,7 @@ menu_render menu_render::create(int x, int y, menu menu) {
89100
js::js_menu_context::$from_window(menu.parent_window));
90101
})
91102
.get();
92-
103+
93104
js::menu_info_basic_js menu_info{
94105
.menu = std::make_shared<js::menu_controller>(menu_wid->menu_wid),
95106
.context = current_js_context};

src/shell/window_proc_hook.cc

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ void window_proc_hook::install(void *hwnd) {
1818
SetWindowLongPtrW((HWND)hwnd, GWLP_WNDPROC,
1919
(LONG_PTR)this->original_proc);
2020

21-
bool callOriginal = true;
21+
std::optional<int> callOriginal = std::nullopt;
2222
for (auto &f : this->hooks) {
23-
callOriginal =
24-
callOriginal && f(hwnd, this->original_proc, msg, wp, lp);
23+
if (!callOriginal)
24+
callOriginal = f(hwnd, this->original_proc, msg, wp, lp);
2525
}
2626

2727
while (!this->tasks.empty()) {
@@ -32,8 +32,9 @@ void window_proc_hook::install(void *hwnd) {
3232
SetWindowLongPtrW((HWND)hwnd, GWLP_WNDPROC,
3333
(LONG_PTR)this->hooked_proc);
3434

35-
return callOriginal &&
36-
CallWindowProcW((WNDPROC)this->original_proc, hwnd, msg, wp, lp);
35+
return callOriginal ? *callOriginal
36+
: CallWindowProcW((WNDPROC)this->original_proc,
37+
hwnd, msg, wp, lp);
3738
});
3839

3940
SetWindowLongPtrW((HWND)hwnd, GWLP_WNDPROC, (LONG_PTR)this->hooked_proc);

src/shell/window_proc_hook.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace mb_shell {
1212
void* hooked_proc = nullptr;
1313
bool installed = false;
1414

15-
std::vector<std::function<bool(void*, void*, size_t, size_t, size_t)>> hooks;
15+
std::vector<std::function<std::optional<int>(void*, void*, size_t, size_t, size_t)>> hooks;
1616
std::queue<std::function<void()>> tasks;
1717

1818
void send_null();

src/ui/ui.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ std::expected<bool, std::string> render_target::init() {
131131
if (capture_all_input) {
132132
// retrieve all mouse messages
133133
SetCapture(h);
134-
SetFocus(h);
135134
}
136135

137136
if (topmost) {

0 commit comments

Comments
 (0)