diff --git a/komorebi/src/window_manager_event.rs b/komorebi/src/window_manager_event.rs index 98b1bd0e..14e721de 100644 --- a/komorebi/src/window_manager_event.rs +++ b/komorebi/src/window_manager_event.rs @@ -3,6 +3,7 @@ use std::fmt::Formatter; use crate::window::Window; use crate::winevent::WinEvent; +use crate::OBJECT_NAME_CHANGE_ON_LAUNCH; #[derive(Debug, Copy, Clone)] pub enum WindowManagerEvent { @@ -68,24 +69,42 @@ impl WindowManagerEvent { } } - pub const fn from_win_event(winevent: WinEvent, window: Window) -> Option { + pub fn from_win_event(winevent: WinEvent, window: Window) -> Option { match winevent { - WinEvent::ObjectDestroy => Some(Self::Destroy(winevent, window)), + WinEvent::ObjectDestroy => Option::from(Self::Destroy(winevent, window)), - WinEvent::ObjectCloaked | WinEvent::ObjectHide => Some(Self::Hide(winevent, window)), + WinEvent::ObjectCloaked | WinEvent::ObjectHide => { + Option::from(Self::Hide(winevent, window)) + } - WinEvent::SystemMinimizeStart => Some(Self::Minimize(winevent, window)), + WinEvent::SystemMinimizeStart => Option::from(Self::Minimize(winevent, window)), WinEvent::ObjectShow | WinEvent::ObjectUncloaked | WinEvent::SystemMinimizeEnd => { - Some(Self::Show(winevent, window)) + Option::from(Self::Show(winevent, window)) } WinEvent::ObjectFocus | WinEvent::SystemForeground => { - Some(Self::FocusChange(winevent, window)) + Option::from(Self::FocusChange(winevent, window)) } - WinEvent::SystemMoveSizeEnd => Some(Self::MoveResizeEnd(winevent, window)), + WinEvent::SystemMoveSizeEnd => Option::from(Self::MoveResizeEnd(winevent, window)), WinEvent::SystemCaptureStart | WinEvent::SystemCaptureEnd => { - Some(Self::MouseCapture(winevent, window)) + Option::from(Self::MouseCapture(winevent, window)) + } + WinEvent::ObjectNameChange => { + // Some apps like Firefox don't send ObjectCreate or ObjectShow on launch + // This spams the message queue, but I don't know what else to do. On launch + // it only sends the following WinEvents :/ + // + // [yatta\src\windows_event.rs:110] event = 32780 ObjectNameChange + // [yatta\src\windows_event.rs:110] event = 32779 ObjectLocationChange + + let object_name_change_on_launch = OBJECT_NAME_CHANGE_ON_LAUNCH.lock(); + + if object_name_change_on_launch.contains(&window.exe().ok()?) { + Option::from(Self::Show(winevent, window)) + } else { + None + } } _ => None, } diff --git a/komorebi/src/windows_callbacks.rs b/komorebi/src/windows_callbacks.rs index 89daa5a2..fbc7ae4d 100644 --- a/komorebi/src/windows_callbacks.rs +++ b/komorebi/src/windows_callbacks.rs @@ -14,9 +14,7 @@ use crate::ring::Ring; use crate::window::Window; use crate::window_manager_event::WindowManagerEvent; use crate::windows_api::WindowsApi; -use crate::winevent::WinEvent; use crate::winevent_listener::WINEVENT_CALLBACK_CHANNEL; -use crate::OBJECT_NAME_CHANGE_ON_LAUNCH; pub extern "system" fn enum_display_monitor( hmonitor: HMONITOR, @@ -71,30 +69,9 @@ pub extern "system" fn win_event_hook( let window = Window { hwnd: hwnd.0 }; let winevent = unsafe { ::std::mem::transmute(event) }; - let event_type = if let Some(event) = WindowManagerEvent::from_win_event(winevent, window) { - event - } else { - // Some apps like Firefox don't send ObjectCreate or ObjectShow on launch - // This spams the message queue, but I don't know what else to do. On launch - // it only sends the following WinEvents :/ - // - // [yatta\src\windows_event.rs:110] event = 32780 ObjectNameChange - // [yatta\src\windows_event.rs:110] event = 32779 ObjectLocationChange - let object_name_change_on_launch = OBJECT_NAME_CHANGE_ON_LAUNCH.lock(); - - if let Ok(exe) = window.exe() { - if winevent == WinEvent::ObjectNameChange { - if object_name_change_on_launch.contains(&exe) { - WindowManagerEvent::Show(winevent, window) - } else { - return; - } - } else { - return; - } - } else { - return; - } + let event_type = match WindowManagerEvent::from_win_event(winevent, window) { + None => return, + Some(event) => event, }; if let Ok(should_manage) = window.should_manage(Option::from(event_type)) {