From 7b36f736e63a244433b681500a48534fcadc80e7 Mon Sep 17 00:00:00 2001 From: eythaann Date: Fri, 28 Jun 2024 20:47:41 -0500 Subject: [PATCH] Fix deadlock on change workspaces --- src/background/hook.rs | 32 +++++++++++++++++-------------- src/background/seelen_wm/cli.rs | 17 ++++++---------- src/background/windows_api/mod.rs | 4 ++++ 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/background/hook.rs b/src/background/hook.rs index 74cdf2a5..718ddf88 100644 --- a/src/background/hook.rs +++ b/src/background/hook.rs @@ -243,20 +243,24 @@ pub extern "system" fn win_event_hook( pub fn register_win_hook() -> Result<()> { log::trace!("Registering Windows and Virtual Desktop Hooks"); - std::thread::spawn(move || unsafe { - SetWinEventHook(EVENT_MIN, EVENT_MAX, None, Some(win_event_hook), 0, 0, 0); - - let mut msg: MSG = MSG::default(); - loop { - if !GetMessageW(&mut msg, HWND(0), 0, 0).as_bool() { - log::info!("windows event processing shutdown"); - break; - }; - let _ = TranslateMessage(&msg); - DispatchMessageW(&msg); - std::thread::sleep(Duration::from_millis(10)); - } - }); + let stack_size = 5 * 1024 * 1024; // 5 MB + std::thread::Builder::new() + .name("win_event_hook".into()) + .stack_size(stack_size) + .spawn(move || unsafe { + SetWinEventHook(EVENT_MIN, EVENT_MAX, None, Some(win_event_hook), 0, 0, 0); + + let mut msg: MSG = MSG::default(); + loop { + if !GetMessageW(&mut msg, HWND(0), 0, 0).as_bool() { + log::info!("windows event processing shutdown"); + break; + }; + let _ = TranslateMessage(&msg); + DispatchMessageW(&msg); + std::thread::sleep(Duration::from_millis(10)); + } + })?; // Todo search why virtual desktop events are not working on windows 10 if is_windows_11() { diff --git a/src/background/seelen_wm/cli.rs b/src/background/seelen_wm/cli.rs index f6d4252d..f4dd1b90 100644 --- a/src/background/seelen_wm/cli.rs +++ b/src/background/seelen_wm/cli.rs @@ -4,7 +4,6 @@ use windows::Win32::Foundation::HWND; use crate::error_handler::Result; use crate::seelen::SEELEN; -use crate::utils::sleep_millis; use crate::utils::virtual_desktop::VirtualDesktopManager; use crate::windows_api::WindowsApi; use crate::{get_subcommands, trace_lock}; @@ -99,9 +98,9 @@ impl WindowManager { Some(_) => { self.pseudo_pause()?; winvd::switch_desktop(index as u32)?; - sleep_millis(35); // to ensure avoid any artifacts + /* sleep_millis(35); // to ensure avoid any artifacts */ if let Some(next) = Self::get_next_by_order(HWND(0)) { - WindowsApi::force_set_foreground(next)?; + WindowsApi::async_force_set_foreground(next); } self.pseudo_resume()?; } @@ -116,14 +115,10 @@ impl WindowManager { if self.is_managed(to_move) && !self.is_floating(to_move) { self.emit_send_to_workspace(to_move, desktop.id())?; } - let guid = desktop.guid(); - std::thread::spawn(move || -> Result<()> { - winvd::move_window_to_desktop(guid, &to_move)?; - if let Some(next) = Self::get_next_by_order(to_move) { - WindowsApi::force_set_foreground(next)?; - } - Ok(()) - }); + winvd::move_window_to_desktop(desktop.guid(), &to_move)?; + if let Some(next) = Self::get_next_by_order(to_move) { + WindowsApi::async_force_set_foreground(next); + } } None => log::error!("Invalid workspace index: {}", index), } diff --git a/src/background/windows_api/mod.rs b/src/background/windows_api/mod.rs index d9d906c9..4b8a7e3d 100644 --- a/src/background/windows_api/mod.rs +++ b/src/background/windows_api/mod.rs @@ -279,6 +279,10 @@ impl WindowsApi { Ok(()) } + pub fn async_force_set_foreground(hwnd: HWND) { + std::thread::spawn(move || log_error!(Self::force_set_foreground(hwnd))); + } + pub fn force_set_foreground(hwnd: HWND) -> Result<()> { Self::set_minimize_animation(false)?;