From 87fe7187541e0f679bc66dbb6bedf3deb0cdaa93 Mon Sep 17 00:00:00 2001 From: LGUG2Z Date: Mon, 23 Aug 2021 14:08:02 -0700 Subject: [PATCH] feat(wm): add toggle-focus-follows-mouse cmd Decided there should be a quick way to toggle the native ffm functionality, it gets especially annoying when trying to click drop downs from the system tray etc. re #7 --- README.md | 89 ++++++++-------- komorebi-core/src/lib.rs | 1 + komorebi.sample.with.lib.ahk | 11 +- komorebi/src/process_command.rs | 7 ++ komorebi/src/windows_api.rs | 14 +++ komorebic.lib.sample.ahk | 174 ++++++++++++++++---------------- komorebic/src/main.rs | 7 +- 7 files changed, 170 insertions(+), 133 deletions(-) diff --git a/README.md b/README.md index 2584119a..ec252593 100644 --- a/README.md +++ b/README.md @@ -171,50 +171,51 @@ keybindings with. You can run `komorebic.exe --help` to get a full exp each command. ``` -start Start komorebi.exe as a background process -stop Stop the komorebi.exe process and restore all hidden windows -state Show a JSON representation of the current window manager state -log Tail komorebi.exe's process logs (cancel with Ctrl-C) -focus Change focus to the window in the specified direction -move Move the focused window in the specified direction -stack Stack the focused window in the specified direction -resize Resize the focused window in the specified direction -unstack Unstack the focused window -cycle-stack Cycle the focused stack in the specified cycle direction -move-to-monitor Move the focused window to the specified monitor -move-to-workspace Move the focused window to the specified workspace -focus-monitor Focus the specified monitor -focus-workspace Focus the specified workspace on the focused monitor -new-workspace Create and append a new workspace on the focused monitor -adjust-container-padding Adjust container padding on the focused workspace -adjust-workspace-padding Adjust workspace padding on the focused workspace -change-layout Set the layout on the focused workspace -flip-layout Flip the layout on the focused workspace (BSP only) -promote Promote the focused window to the top of the tree -retile Force the retiling of all managed windows -ensure-workspaces Create at least this many workspaces for the specified monitor -container-padding Set the container padding for the specified workspace -workspace-padding Set the workspace padding for the specified workspace -workspace-layout Set the layout for the specified workspace -workspace-tiling Enable or disable window tiling for the specified workspace -workspace-name Set the workspace name for the specified workspace -toggle-pause Toggle the window manager on and off across all monitors -toggle-tiling Toggle window tiling on the focused workspace -toggle-float Toggle floating mode for the focused window -toggle-monocle Toggle monocle mode for the focused container -toggle-maximize Toggle native maximization for the focused window -restore-windows Restore all hidden windows (debugging command) -manage Force komorebi to manage the focused window -unmanage Unmanage a window that was forcibly managed -reload-configuration Reload ~/komorebi.ahk (if it exists) -watch-configuration Toggle the automatic reloading of ~/komorebi.ahk (if it exists) -float-rule Add a rule to always float the specified application -manage-rule Add a rule to always manage the specified application -workspace-rule Add a rule to associate an application with a workspace -identify-tray-application Identify an application that closes to the system tray -focus-follows-mouse Enable or disable focus follows mouse for the operating system -ahk-library Generate a library of AutoHotKey helper functions -help Print this message or the help of the given subcommand(s) +start Start komorebi.exe as a background process +stop Stop the komorebi.exe process and restore all hidden windows +state Show a JSON representation of the current window manager state +log Tail komorebi.exe's process logs (cancel with Ctrl-C) +focus Change focus to the window in the specified direction +move Move the focused window in the specified direction +stack Stack the focused window in the specified direction +resize Resize the focused window in the specified direction +unstack Unstack the focused window +cycle-stack Cycle the focused stack in the specified cycle direction +move-to-monitor Move the focused window to the specified monitor +move-to-workspace Move the focused window to the specified workspace +focus-monitor Focus the specified monitor +focus-workspace Focus the specified workspace on the focused monitor +new-workspace Create and append a new workspace on the focused monitor +adjust-container-padding Adjust container padding on the focused workspace +adjust-workspace-padding Adjust workspace padding on the focused workspace +change-layout Set the layout on the focused workspace +flip-layout Flip the layout on the focused workspace (BSP only) +promote Promote the focused window to the top of the tree +retile Force the retiling of all managed windows +ensure-workspaces Create at least this many workspaces for the specified monitor +container-padding Set the container padding for the specified workspace +workspace-padding Set the workspace padding for the specified workspace +workspace-layout Set the layout for the specified workspace +workspace-tiling Enable or disable window tiling for the specified workspace +workspace-name Set the workspace name for the specified workspace +toggle-pause Toggle the window manager on and off across all monitors +toggle-tiling Toggle window tiling on the focused workspace +toggle-float Toggle floating mode for the focused window +toggle-monocle Toggle monocle mode for the focused container +toggle-maximize Toggle native maximization for the focused window +restore-windows Restore all hidden windows (debugging command) +manage Force komorebi to manage the focused window +unmanage Unmanage a window that was forcibly managed +reload-configuration Reload ~/komorebi.ahk (if it exists) +watch-configuration Enable or disable watching of ~/komorebi.ahk (if it exists) +float-rule Add a rule to always float the specified application +manage-rule Add a rule to always manage the specified application +workspace-rule Add a rule to associate an application with a workspace +identify-tray-application Identify an application that closes to the system tray +focus-follows-mouse Enable or disable focus follows mouse for the operating system +toggle-focus-follows-mouse Toggle focus follows mouse for the operating system +ahk-library Generate a library of AutoHotKey helper functions +help Print this message or the help of the given subcommand(s) ``` ### AutoHotKey Helper Library for `komorebic` diff --git a/komorebi-core/src/lib.rs b/komorebi-core/src/lib.rs index d40091b5..cbc33653 100644 --- a/komorebi-core/src/lib.rs +++ b/komorebi-core/src/lib.rs @@ -66,6 +66,7 @@ pub enum SocketMessage { IdentifyTrayApplication(ApplicationIdentifier, String), State, FocusFollowsMouse(bool), + ToggleFocusFollowsMouse, } impl SocketMessage { diff --git a/komorebi.sample.with.lib.ahk b/komorebi.sample.with.lib.ahk index 3217fd9b..5646577a 100644 --- a/komorebi.sample.with.lib.ahk +++ b/komorebi.sample.with.lib.ahk @@ -4,9 +4,6 @@ ; Enable hot reloading of changes to this file WatchConfiguration("enable") -; Enable focus follows mouse -FocusFollowsMouse("enable") - ; Ensure there are 5 workspaces created on monitor 0 EnsureWorkspaces(0, 5) @@ -41,6 +38,9 @@ FloatRule("exe", "wincompose.exe") FloatRule("exe", "1Password.exe") FloatRule("exe", "Wox.exe") +; Identify Minimize-to-Tray Applications +IdentifyTrayApplication("exe", "Discord.exe") + ; Change the focused window, Alt + Vim direction keys !h:: Focus("left") @@ -170,6 +170,11 @@ return TogglePause() return +; Toggle focus follows mouse +!0:: +ToggleFocusFollowsMouse() +return + ; Switch to workspace !1:: Send ! diff --git a/komorebi/src/process_command.rs b/komorebi/src/process_command.rs index 05637490..b231715c 100644 --- a/komorebi/src/process_command.rs +++ b/komorebi/src/process_command.rs @@ -179,6 +179,13 @@ impl WindowManager { WindowsApi::disable_focus_follows_mouse()?; } } + SocketMessage::ToggleFocusFollowsMouse => { + if WindowsApi::focus_follows_mouse()? { + WindowsApi::disable_focus_follows_mouse()?; + } else { + WindowsApi::enable_focus_follows_mouse()?; + } + } SocketMessage::ReloadConfiguration => { Self::reload_configuration(); } diff --git a/komorebi/src/windows_api.rs b/komorebi/src/windows_api.rs index 4ba32713..abed190c 100644 --- a/komorebi/src/windows_api.rs +++ b/komorebi/src/windows_api.rs @@ -67,6 +67,7 @@ use bindings::Windows::Win32::UI::WindowsAndMessaging::HWND_TOPMOST; use bindings::Windows::Win32::UI::WindowsAndMessaging::SET_WINDOW_POS_FLAGS; use bindings::Windows::Win32::UI::WindowsAndMessaging::SHOW_WINDOW_CMD; use bindings::Windows::Win32::UI::WindowsAndMessaging::SPIF_SENDCHANGE; +use bindings::Windows::Win32::UI::WindowsAndMessaging::SPI_GETACTIVEWINDOWTRACKING; use bindings::Windows::Win32::UI::WindowsAndMessaging::SPI_SETACTIVEWINDOWTRACKING; use bindings::Windows::Win32::UI::WindowsAndMessaging::SW_HIDE; use bindings::Windows::Win32::UI::WindowsAndMessaging::SW_MAXIMIZE; @@ -557,6 +558,19 @@ impl WindowsApi { })) } + pub fn focus_follows_mouse() -> Result { + let mut is_enabled: BOOL = unsafe { std::mem::zeroed() }; + + Self::system_parameters_info_w( + SPI_GETACTIVEWINDOWTRACKING, + 0, + (&mut is_enabled as *mut BOOL).cast(), + SPIF_SENDCHANGE, + )?; + + Ok(is_enabled.into()) + } + pub fn enable_focus_follows_mouse() -> Result<()> { Self::system_parameters_info_w( SPI_SETACTIVEWINDOWTRACKING, diff --git a/komorebic.lib.sample.ahk b/komorebic.lib.sample.ahk index ef92a352..4181f63e 100644 --- a/komorebic.lib.sample.ahk +++ b/komorebic.lib.sample.ahk @@ -1,173 +1,177 @@ ; Generated by komorebic.exe -Start() { - Run, komorebic.exe start, , Hide +Start() { + Run, komorebic.exe start, , Hide } -Stop() { - Run, komorebic.exe stop, , Hide +Stop() { + Run, komorebic.exe stop, , Hide } -State() { - Run, komorebic.exe state, , Hide +State() { + Run, komorebic.exe state, , Hide } -Log() { - Run, komorebic.exe log, , Hide +Log() { + Run, komorebic.exe log, , Hide } -Focus(operation_direction) { - Run, komorebic.exe focus %operation_direction%, , Hide +Focus(operation_direction) { + Run, komorebic.exe focus %operation_direction%, , Hide } -Move(operation_direction) { - Run, komorebic.exe move %operation_direction%, , Hide +Move(operation_direction) { + Run, komorebic.exe move %operation_direction%, , Hide } -Stack(operation_direction) { - Run, komorebic.exe stack %operation_direction%, , Hide +Stack(operation_direction) { + Run, komorebic.exe stack %operation_direction%, , Hide } -Resize(edge, sizing) { - Run, komorebic.exe resize %edge% %sizing%, , Hide +Resize(edge, sizing) { + Run, komorebic.exe resize %edge% %sizing%, , Hide } -Unstack() { - Run, komorebic.exe unstack, , Hide +Unstack() { + Run, komorebic.exe unstack, , Hide } -CycleStack(cycle_direction) { - Run, komorebic.exe cycle-stack %cycle_direction%, , Hide +CycleStack(cycle_direction) { + Run, komorebic.exe cycle-stack %cycle_direction%, , Hide } -MoveToMonitor(target) { - Run, komorebic.exe move-to-monitor %target%, , Hide +MoveToMonitor(target) { + Run, komorebic.exe move-to-monitor %target%, , Hide } -MoveToWorkspace(target) { - Run, komorebic.exe move-to-workspace %target%, , Hide +MoveToWorkspace(target) { + Run, komorebic.exe move-to-workspace %target%, , Hide } -FocusMonitor(target) { - Run, komorebic.exe focus-monitor %target%, , Hide +FocusMonitor(target) { + Run, komorebic.exe focus-monitor %target%, , Hide } -FocusWorkspace(target) { - Run, komorebic.exe focus-workspace %target%, , Hide +FocusWorkspace(target) { + Run, komorebic.exe focus-workspace %target%, , Hide } -NewWorkspace() { - Run, komorebic.exe new-workspace, , Hide +NewWorkspace() { + Run, komorebic.exe new-workspace, , Hide } -AdjustContainerPadding(sizing, adjustment) { - Run, komorebic.exe adjust-container-padding %sizing% %adjustment%, , Hide +AdjustContainerPadding(sizing, adjustment) { + Run, komorebic.exe adjust-container-padding %sizing% %adjustment%, , Hide } -AdjustWorkspacePadding(sizing, adjustment) { - Run, komorebic.exe adjust-workspace-padding %sizing% %adjustment%, , Hide +AdjustWorkspacePadding(sizing, adjustment) { + Run, komorebic.exe adjust-workspace-padding %sizing% %adjustment%, , Hide } -ChangeLayout(layout) { - Run, komorebic.exe change-layout %layout%, , Hide +ChangeLayout(layout) { + Run, komorebic.exe change-layout %layout%, , Hide } -FlipLayout(flip) { - Run, komorebic.exe flip-layout %flip%, , Hide +FlipLayout(flip) { + Run, komorebic.exe flip-layout %flip%, , Hide } -Promote() { - Run, komorebic.exe promote, , Hide +Promote() { + Run, komorebic.exe promote, , Hide } -Retile() { - Run, komorebic.exe retile, , Hide +Retile() { + Run, komorebic.exe retile, , Hide } -EnsureWorkspaces(monitor, workspace_count) { - Run, komorebic.exe ensure-workspaces %monitor% %workspace_count%, , Hide +EnsureWorkspaces(monitor, workspace_count) { + Run, komorebic.exe ensure-workspaces %monitor% %workspace_count%, , Hide } -ContainerPadding(monitor, workspace, size) { - Run, komorebic.exe container-padding %monitor% %workspace% %size%, , Hide +ContainerPadding(monitor, workspace, size) { + Run, komorebic.exe container-padding %monitor% %workspace% %size%, , Hide } -WorkspacePadding(monitor, workspace, size) { - Run, komorebic.exe workspace-padding %monitor% %workspace% %size%, , Hide +WorkspacePadding(monitor, workspace, size) { + Run, komorebic.exe workspace-padding %monitor% %workspace% %size%, , Hide } -WorkspaceLayout(monitor, workspace, value) { - Run, komorebic.exe workspace-layout %monitor% %workspace% %value%, , Hide +WorkspaceLayout(monitor, workspace, value) { + Run, komorebic.exe workspace-layout %monitor% %workspace% %value%, , Hide } -WorkspaceTiling(monitor, workspace, value) { - Run, komorebic.exe workspace-tiling %monitor% %workspace% %value%, , Hide +WorkspaceTiling(monitor, workspace, value) { + Run, komorebic.exe workspace-tiling %monitor% %workspace% %value%, , Hide } -WorkspaceName(monitor, workspace, value) { - Run, komorebic.exe workspace-name %monitor% %workspace% %value%, , Hide +WorkspaceName(monitor, workspace, value) { + Run, komorebic.exe workspace-name %monitor% %workspace% %value%, , Hide } -TogglePause() { - Run, komorebic.exe toggle-pause, , Hide +TogglePause() { + Run, komorebic.exe toggle-pause, , Hide } -ToggleTiling() { - Run, komorebic.exe toggle-tiling, , Hide +ToggleTiling() { + Run, komorebic.exe toggle-tiling, , Hide } -ToggleFloat() { - Run, komorebic.exe toggle-float, , Hide +ToggleFloat() { + Run, komorebic.exe toggle-float, , Hide } -ToggleMonocle() { - Run, komorebic.exe toggle-monocle, , Hide +ToggleMonocle() { + Run, komorebic.exe toggle-monocle, , Hide } -ToggleMaximize() { - Run, komorebic.exe toggle-maximize, , Hide +ToggleMaximize() { + Run, komorebic.exe toggle-maximize, , Hide } -RestoreWindows() { - Run, komorebic.exe restore-windows, , Hide +RestoreWindows() { + Run, komorebic.exe restore-windows, , Hide } -Manage() { - Run, komorebic.exe manage, , Hide +Manage() { + Run, komorebic.exe manage, , Hide } -Unmanage() { - Run, komorebic.exe unmanage, , Hide +Unmanage() { + Run, komorebic.exe unmanage, , Hide } -ReloadConfiguration() { - Run, komorebic.exe reload-configuration, , Hide +ReloadConfiguration() { + Run, komorebic.exe reload-configuration, , Hide } -WatchConfiguration(boolean_state) { - Run, komorebic.exe watch-configuration %boolean_state%, , Hide +WatchConfiguration(boolean_state) { + Run, komorebic.exe watch-configuration %boolean_state%, , Hide } -FloatRule(identifier, id) { - Run, komorebic.exe float-rule %identifier% %id%, , Hide +FloatRule(identifier, id) { + Run, komorebic.exe float-rule %identifier% %id%, , Hide } -ManageRule(identifier, id) { - Run, komorebic.exe manage-rule %identifier% %id%, , Hide +ManageRule(identifier, id) { + Run, komorebic.exe manage-rule %identifier% %id%, , Hide } -WorkspaceRule(identifier, id, monitor, workspace) { - Run, komorebic.exe workspace-rule %identifier% %id% %monitor% %workspace%, , Hide +WorkspaceRule(identifier, id, monitor, workspace) { + Run, komorebic.exe workspace-rule %identifier% %id% %monitor% %workspace%, , Hide } -IdentifyTrayApplication(identifier, id) { - Run, komorebic.exe identify-tray-application %identifier% %id%, , Hide +IdentifyTrayApplication(identifier, id) { + Run, komorebic.exe identify-tray-application %identifier% %id%, , Hide } -FocusFollowsMouse(boolean_state) { - Run, komorebic.exe focus-follows-mouse %boolean_state%, , Hide +FocusFollowsMouse(boolean_state) { + Run, komorebic.exe focus-follows-mouse %boolean_state%, , Hide +} + +ToggleFocusFollowsMouse() { + Run, komorebic.exe toggle-focus-follows-mouse, , Hide } AhkLibrary() { Run, komorebic.exe ahk-library, , Hide -} \ No newline at end of file +} diff --git a/komorebic/src/main.rs b/komorebic/src/main.rs index 37936368..b0b3fd1e 100644 --- a/komorebic/src/main.rs +++ b/komorebic/src/main.rs @@ -328,7 +328,7 @@ enum SubCommand { Unmanage, /// Reload ~/komorebi.ahk (if it exists) ReloadConfiguration, - /// Toggle the automatic reloading of ~/komorebi.ahk (if it exists) + /// Enable or disable watching of ~/komorebi.ahk (if it exists) #[clap(setting = AppSettings::ArgRequiredElseHelp)] WatchConfiguration(WatchConfiguration), /// Add a rule to always float the specified application @@ -345,6 +345,8 @@ enum SubCommand { IdentifyTrayApplication(IdentifyTrayApplication), /// Enable or disable focus follows mouse for the operating system FocusFollowsMouse(FocusFollowsMouse), + /// Toggle focus follows mouse for the operating system + ToggleFocusFollowsMouse, /// Generate a library of AutoHotKey helper functions AhkLibrary, } @@ -439,6 +441,9 @@ fn main() -> Result<()> { &*SocketMessage::AdjustContainerPadding(arg.sizing, arg.adjustment).as_bytes()?, )?; } + SubCommand::ToggleFocusFollowsMouse => { + send_message(&*SocketMessage::ToggleFocusFollowsMouse.as_bytes()?)?; + } SubCommand::ToggleTiling => { send_message(&*SocketMessage::ToggleTiling.as_bytes()?)?; }