Skip to content

Commit 3cbee12

Browse files
author
Shimi Dudkin
committed
fix(desktop): menu clicks not processing on Windows hidden window
The eframe update loop wasn't running reliably when the main window is hidden (with_visible(false)) on Windows. Menu events were sent to the channel but never processed because request_repaint_after(200ms) doesn't wake hidden windows on Windows. Fix by calling ctx.request_repaint() from the menu event handler to force an immediate update cycle. Applied to all desktop clients (Windows, Linux, Mac) for consistency.
1 parent c47e50c commit 3cbee12

3 files changed

Lines changed: 9 additions & 8 deletions

File tree

linux/src/tray.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,15 @@ impl TrayApp {
254254

255255
let (menu_event_tx, menu_event_rx) = std_mpsc::channel::<MenuEvent>();
256256
let ws_cmd_tx_for_handler = ws_cmd_tx.clone();
257+
let repaint_ctx = _cc.egui_ctx.clone();
257258
MenuEvent::set_event_handler(Some(move |event: MenuEvent| {
258259
if event.id == quit_id {
259260
info!("menu: quit clicked");
260261
let _ = ws_cmd_tx_for_handler.try_send(WsCommand::Shutdown);
261262
std::process::exit(0);
262263
}
263264
let _ = menu_event_tx.send(event);
265+
repaint_ctx.request_repaint();
264266
}));
265267

266268
// Auto-open login window if not signed in

mac/src/tray.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,15 @@ impl TrayApp {
254254

255255
let (menu_event_tx, menu_event_rx) = std_mpsc::channel::<MenuEvent>();
256256
let ws_cmd_tx_for_handler = ws_cmd_tx.clone();
257+
let repaint_ctx = _cc.egui_ctx.clone();
257258
MenuEvent::set_event_handler(Some(move |event: MenuEvent| {
258259
if event.id == quit_id {
259260
info!("menu: quit clicked");
260261
let _ = ws_cmd_tx_for_handler.try_send(WsCommand::Shutdown);
261262
std::process::exit(0);
262263
}
263264
let _ = menu_event_tx.send(event);
265+
repaint_ctx.request_repaint();
264266
}));
265267

266268
// Auto-open login window if not signed in

windows/src/tray.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -254,17 +254,17 @@ impl TrayApp {
254254

255255
let (menu_event_tx, menu_event_rx) = std_mpsc::channel::<MenuEvent>();
256256
let ws_cmd_tx_for_handler = ws_cmd_tx.clone();
257+
let repaint_ctx = _cc.egui_ctx.clone();
257258
MenuEvent::set_event_handler(Some(move |event: MenuEvent| {
258259
if event.id == quit_id {
259260
info!("menu: quit clicked");
260261
let _ = ws_cmd_tx_for_handler.try_send(WsCommand::Shutdown);
261262
std::process::exit(0);
262263
}
263-
info!("menu event handler: received event id={:?}", event.id);
264-
match menu_event_tx.send(event) {
265-
Ok(()) => info!("menu event handler: sent to channel ok"),
266-
Err(e) => error!("menu event handler: channel send failed: {e}"),
267-
}
264+
let _ = menu_event_tx.send(event);
265+
// Wake up the eframe event loop immediately so menu events are processed
266+
// without delay (hidden windows on Windows don't repaint reliably)
267+
repaint_ctx.request_repaint();
268268
}));
269269

270270
// Auto-open login window if not signed in
@@ -318,10 +318,7 @@ impl TrayApp {
318318
}
319319

320320
fn handle_menu_events(&mut self) {
321-
let mut event_count = 0u32;
322321
while let Ok(event) = self.menu_event_rx.try_recv() {
323-
event_count += 1;
324-
info!("handle_menu_events: processing event id={:?} (#{event_count})", event.id());
325322
let items = match &self.menu_items {
326323
Some(items) => items,
327324
None => continue,

0 commit comments

Comments
 (0)