From e5cf042ea9f5e660e15e16acf7a0a2e13dbf175c Mon Sep 17 00:00:00 2001 From: James Tucker Date: Mon, 26 Feb 2024 00:24:48 -0800 Subject: [PATCH] fix(komorebi): fix unsound use of transmute This was causing a crash in release mode when moving a window around by titlebar. --- komorebi/src/windows_callbacks.rs | 6 +- komorebi/src/winevent.rs | 95 +++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) diff --git a/komorebi/src/windows_callbacks.rs b/komorebi/src/windows_callbacks.rs index 0c95ed4d..b56030d0 100644 --- a/komorebi/src/windows_callbacks.rs +++ b/komorebi/src/windows_callbacks.rs @@ -39,6 +39,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; use crate::BORDER_COLOUR_CURRENT; use crate::BORDER_RECT; @@ -186,7 +187,10 @@ pub extern "system" fn win_event_hook( let window = Window { hwnd: hwnd.0 }; - let winevent = unsafe { ::std::mem::transmute(event) }; + let winevent = match WinEvent::try_from(event) { + Ok(event) => event, + Err(_) => return, + }; let event_type = match WindowManagerEvent::from_win_event(winevent, window) { None => return, Some(event) => event, diff --git a/komorebi/src/winevent.rs b/komorebi/src/winevent.rs index d3f9c948..53eb3505 100644 --- a/komorebi/src/winevent.rs +++ b/komorebi/src/winevent.rs @@ -178,3 +178,98 @@ pub enum WinEvent { UiaPropIdSEnd = EVENT_UIA_PROPID_END, UiaPropIdStart = EVENT_UIA_PROPID_START, } + +impl TryFrom for WinEvent { + type Error = (); + + fn try_from(value: u32) -> Result { + match value { + EVENT_AIA_END => Ok(Self::AiaEnd), + EVENT_AIA_START => Ok(Self::AiaStart), + EVENT_CONSOLE_CARET => Ok(Self::ConsoleCaret), + EVENT_CONSOLE_END => Ok(Self::ConsoleEnd), + EVENT_CONSOLE_END_APPLICATION => Ok(Self::ConsoleEndApplication), + EVENT_CONSOLE_LAYOUT => Ok(Self::ConsoleLayout), + EVENT_CONSOLE_START_APPLICATION => Ok(Self::ConsoleStartApplication), + EVENT_CONSOLE_UPDATE_REGION => Ok(Self::ConsoleUpdateRegion), + EVENT_CONSOLE_UPDATE_SCROLL => Ok(Self::ConsoleUpdateScroll), + EVENT_CONSOLE_UPDATE_SIMPLE => Ok(Self::ConsoleUpdateSimple), + EVENT_OBJECT_ACCELERATORCHANGE => Ok(Self::ObjectAcceleratorChange), + EVENT_OBJECT_CLOAKED => Ok(Self::ObjectCloaked), + EVENT_OBJECT_CONTENTSCROLLED => Ok(Self::ObjectContentScrolled), + EVENT_OBJECT_CREATE => Ok(Self::ObjectCreate), + EVENT_OBJECT_DEFACTIONCHANGE => Ok(Self::ObjectDefActionChange), + EVENT_OBJECT_DESCRIPTIONCHANGE => Ok(Self::ObjectDescriptionChange), + EVENT_OBJECT_DESTROY => Ok(Self::ObjectDestroy), + EVENT_OBJECT_DRAGCANCEL => Ok(Self::ObjectDragCancel), + EVENT_OBJECT_DRAGCOMPLETE => Ok(Self::ObjectDragComplete), + EVENT_OBJECT_DRAGDROPPED => Ok(Self::ObjectDragDropped), + EVENT_OBJECT_DRAGENTER => Ok(Self::ObjectDragEnter), + EVENT_OBJECT_DRAGLEAVE => Ok(Self::ObjectDragLeave), + EVENT_OBJECT_DRAGSTART => Ok(Self::ObjectDragStart), + EVENT_OBJECT_END => Ok(Self::ObjectEnd), + EVENT_OBJECT_FOCUS => Ok(Self::ObjectFocus), + EVENT_OBJECT_HELPCHANGE => Ok(Self::ObjectHelpChange), + EVENT_OBJECT_HIDE => Ok(Self::ObjectHide), + EVENT_OBJECT_HOSTEDOBJECTSINVALIDATED => Ok(Self::ObjectHostedObjectsInvalidated), + EVENT_OBJECT_IME_CHANGE => Ok(Self::ObjectImeChange), + EVENT_OBJECT_IME_HIDE => Ok(Self::ObjectImeHide), + EVENT_OBJECT_IME_SHOW => Ok(Self::ObjectImeShow), + EVENT_OBJECT_INVOKED => Ok(Self::ObjectInvoked), + EVENT_OBJECT_LIVEREGIONCHANGED => Ok(Self::ObjectLiveRegionChanged), + EVENT_OBJECT_LOCATIONCHANGE => Ok(Self::ObjectLocationChange), + EVENT_OBJECT_NAMECHANGE => Ok(Self::ObjectNameChange), + EVENT_OBJECT_PARENTCHANGE => Ok(Self::ObjectParentChange), + EVENT_OBJECT_REORDER => Ok(Self::ObjectReorder), + EVENT_OBJECT_SELECTION => Ok(Self::ObjectSelection), + EVENT_OBJECT_SELECTIONADD => Ok(Self::ObjectSelectionAdd), + EVENT_OBJECT_SELECTIONREMOVE => Ok(Self::ObjectSelectionRemove), + EVENT_OBJECT_SELECTIONWITHIN => Ok(Self::ObjectSelectionWithin), + EVENT_OBJECT_SHOW => Ok(Self::ObjectShow), + EVENT_OBJECT_STATECHANGE => Ok(Self::ObjectStateChange), + EVENT_OBJECT_TEXTEDIT_CONVERSIONTARGETCHANGED => Ok(Self::ObjectTextEditConversionTargetChanged), + EVENT_OBJECT_TEXTSELECTIONCHANGED => Ok(Self::ObjectTextSelectionChanged), + EVENT_OBJECT_UNCLOAKED => Ok(Self::ObjectUncloaked), + EVENT_OBJECT_VALUECHANGE => Ok(Self::ObjectValueChange), + EVENT_OEM_DEFINED_END => Ok(Self::OemDefinedEnd), + EVENT_OEM_DEFINED_START => Ok(Self::OemDefinedStart), + EVENT_SYSTEM_ALERT => Ok(Self::SystemAlert), + EVENT_SYSTEM_ARRANGMENTPREVIEW => Ok(Self::SystemArrangementPreview), + EVENT_SYSTEM_CAPTUREEND => Ok(Self::SystemCaptureEnd), + EVENT_SYSTEM_CAPTURESTART => Ok(Self::SystemCaptureStart), + EVENT_SYSTEM_CONTEXTHELPEND => Ok(Self::SystemContextHelpEnd), + EVENT_SYSTEM_CONTEXTHELPSTART => Ok(Self::SystemContextHelpStart), + EVENT_SYSTEM_DESKTOPSWITCH => Ok(Self::SystemDesktopSwitch), + EVENT_SYSTEM_DIALOGEND => Ok(Self::SystemDialogEnd), + EVENT_SYSTEM_DIALOGSTART => Ok(Self::SystemDialogStart), + EVENT_SYSTEM_DRAGDROPEND => Ok(Self::SystemDragDropEnd), + EVENT_SYSTEM_DRAGDROPSTART => Ok(Self::SystemDragDropStart), + EVENT_SYSTEM_END => Ok(Self::SystemEnd), + EVENT_SYSTEM_FOREGROUND => Ok(Self::SystemForeground), + EVENT_SYSTEM_IME_KEY_NOTIFICATION => Ok(Self::SystemImeKeyNotification), + EVENT_SYSTEM_MENUEND => Ok(Self::SystemMenuEnd), + EVENT_SYSTEM_MENUPOPUPEND => Ok(Self::SystemMenuPopupEnd), + EVENT_SYSTEM_MENUPOPUPSTART => Ok(Self::SystemMenuPopupStart), + EVENT_SYSTEM_MENUSTART => Ok(Self::SystemMenuStart), + EVENT_SYSTEM_MINIMIZEEND => Ok(Self::SystemMinimizeEnd), + EVENT_SYSTEM_MINIMIZESTART => Ok(Self::SystemMinimizeStart), + EVENT_SYSTEM_MOVESIZEEND => Ok(Self::SystemMoveSizeEnd), + EVENT_SYSTEM_MOVESIZESTART => Ok(Self::SystemMoveSizeStart), + EVENT_SYSTEM_SCROLLINGEND => Ok(Self::SystemScrollingEnd), + EVENT_SYSTEM_SCROLLINGSTART => Ok(Self::SystemScrollingStart), + EVENT_SYSTEM_SOUND => Ok(Self::SystemSound), + EVENT_SYSTEM_SWITCHEND => Ok(Self::SystemSwitchEnd), + EVENT_SYSTEM_SWITCHER_APPDROPPED => Ok(Self::SystemSwitcherAppDropped), + EVENT_SYSTEM_SWITCHER_APPGRABBED => Ok(Self::SystemSwitcherAppGrabbed), + EVENT_SYSTEM_SWITCHER_APPOVERTARGET => Ok(Self::SystemSwitcherAppOverTarget), + EVENT_SYSTEM_SWITCHER_CANCELLED => Ok(Self::SystemSwitcherCancelled), + EVENT_SYSTEM_SWITCHSTART => Ok(Self::SystemSwitchStart), + EVENT_UIA_EVENTID_END => Ok(Self::UiaEventIdSEnd), + EVENT_UIA_EVENTID_START => Ok(Self::UiaEventIdStart), + EVENT_UIA_PROPID_END => Ok(Self::UiaPropIdSEnd), + EVENT_UIA_PROPID_START => Ok(Self::UiaPropIdStart), + + _ => Err(()), + } + } +} \ No newline at end of file