From 4686d5e346f3cf13fbea91ac643d12203a9d74ca Mon Sep 17 00:00:00 2001 From: LGUG2Z Date: Wed, 30 Mar 2022 11:04:38 -0700 Subject: [PATCH] feat(wm): add cmd to id layered apps Users on Discord noted that Microsoft Office applications were not being handled correctly by the wm. After some investigation it was clear that this was because the application windows had WS_EX_LAYERED set. This had only been seen once before with Steam, and so a whitelist for layered applications was previously added to the codebase with steam.exe hard-coded, but this had not been exposed via the cli. This commit adds a command to allow users to specify layered applications which should be managed, and also renames the whitelist to reflect that classes can also be used to identify applications on the whitelist. A section has been added to the README to guide Microsoft Office users to guide Microsoft Office users in configuring komorebi to correctly handle Office applications with Word given as an example. This commit also renames the identify-border-overflow command to identify-border-overflow-application for consistency, while retaining the previous command as an alias to maintain compatibility with existing user configurations. It should be noted however, that those like me who are using the generated komorebic AHK library, will have to update any AHK function calls to use IdentifyBorderOverflowApplication(). resolve #124 --- Cargo.lock | 79 +++++++++++---------------------- README.md | 21 ++++++++- komorebi-core/src/lib.rs | 3 +- komorebi/src/main.rs | 2 +- komorebi/src/process_command.rs | 9 +++- komorebi/src/window.rs | 6 +-- komorebi/src/window_manager.rs | 6 +-- komorebic.lib.sample.ahk | 8 +++- komorebic/src/main.rs | 20 +++++++-- 9 files changed, 84 insertions(+), 70 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ed330bb4..63326c9b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -266,9 +266,9 @@ dependencies = [ [[package]] name = "fixedbitset" -version = "0.2.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" +checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" [[package]] name = "fs-tail" @@ -388,9 +388,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" dependencies = [ "autocfg", "hashbrown", @@ -535,10 +535,11 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] @@ -758,9 +759,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37" dependencies = [ "backtrace", "cfg-if 1.0.0", @@ -769,7 +770,7 @@ dependencies = [ "redox_syscall", "smallvec", "thread-id", - "windows-sys 0.32.0", + "windows-sys 0.34.0", ] [[package]] @@ -780,9 +781,9 @@ checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" [[package]] name = "petgraph" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" +checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f" dependencies = [ "fixedbitset", "indexmap", @@ -942,18 +943,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae183fc1b06c149f0c1793e1eb447c8b04bfe46d48e9e48bfb8d2d7ed64ecf0" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7776223e2696f1aa4c6b0170e83212f47296a00424305117d013dfe86fb0fe55" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", "redox_syscall", @@ -1166,9 +1167,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.23.5" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07fa4c84a5305909b0eedfcc8d1f2fafdbede645bb700a45ecaafe681a0ac5d6" +checksum = "5f3c0db8e08e06cfd352a043bd0143498fb7d42783a6e941da83b55464eb27d2" dependencies = [ "cfg-if 1.0.0", "core-foundation-sys", @@ -1478,15 +1479,15 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825" dependencies = [ - "windows_aarch64_msvc 0.32.0", - "windows_i686_gnu 0.32.0", - "windows_i686_msvc 0.32.0", - "windows_x86_64_gnu 0.32.0", - "windows_x86_64_msvc 0.32.0", + "windows_aarch64_msvc 0.34.0", + "windows_i686_gnu 0.34.0", + "windows_i686_msvc 0.34.0", + "windows_x86_64_gnu 0.34.0", + "windows_x86_64_msvc 0.34.0", ] [[package]] @@ -1495,12 +1496,6 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52695a41e536859d5308cc613b4a022261a274390b25bd29dfff4bf08505f3c2" -[[package]] -name = "windows_aarch64_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" - [[package]] name = "windows_aarch64_msvc" version = "0.34.0" @@ -1513,12 +1508,6 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f54725ac23affef038fecb177de6c9bf065787c2f432f79e3c373da92f3e1d8a" -[[package]] -name = "windows_i686_gnu" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" - [[package]] name = "windows_i686_gnu" version = "0.34.0" @@ -1531,12 +1520,6 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d5158a43cc43623c0729d1ad6647e62fa384a3d135fd15108d37c683461f64" -[[package]] -name = "windows_i686_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" - [[package]] name = "windows_i686_msvc" version = "0.34.0" @@ -1549,12 +1532,6 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc31f409f565611535130cfe7ee8e6655d3fa99c1c61013981e491921b5ce954" -[[package]] -name = "windows_x86_64_gnu" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" - [[package]] name = "windows_x86_64_gnu" version = "0.34.0" @@ -1567,12 +1544,6 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f2b8c7cbd3bfdddd9ab98769f9746a7fad1bca236554cd032b78d768bc0e89f" -[[package]] -name = "windows_x86_64_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" - [[package]] name = "windows_x86_64_msvc" version = "0.34.0" diff --git a/README.md b/README.md index 92449bac..f79a6007 100644 --- a/README.md +++ b/README.md @@ -201,6 +201,24 @@ komorebic.exe identify-tray-application exe Discord.exe # komorebic.exe identify-tray-application title [TITLE] ``` +#### Microsoft Office Applications + +Microsoft Office applications such as Word and Excel require certain configuration options to be set in order to be +managed correctly. Below is an example of configuring Microsoft Word to be managed correctly by _komorebi_. + +```powershell +# This only needs to be added once +komorebic.exe float-rule class _WwB + +# Repeat these for other office applications such as EXCEL.EXE etc +# Note that the capitalised EXE is important here- double check the +# exact case for the name and the file extension in Task Manager or +# the AHK Window Spy + +komorebic.exe identify-layered-application exe WINWORD.EXE +komorebic.exe identify-border-overflow-application exe WINWORD.EXE +``` + #### Focus Follows Mouse `komorebi` supports two focus-follows-mouse implementations; the native Windows Xmouse implementation, which treats the @@ -409,7 +427,8 @@ manage-rule Add a rule to always manage the speci workspace-rule Add a rule to associate an application with a workspace identify-object-name-change-application Identify an application that sends EVENT_OBJECT_NAMECHANGE on launch identify-tray-application Identify an application that closes to the system tray -identify-border-overflow Identify an application that has overflowing borders +identify-layered-application Identify an application that has WS_EX_LAYERED, but should still be managed +identify-border-overflow-application Identify an application that has overflowing borders 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 mouse-follows-focus Enable or disable mouse follows focus on all workspaces diff --git a/komorebi-core/src/lib.rs b/komorebi-core/src/lib.rs index cd983b2d..085d3cd2 100644 --- a/komorebi-core/src/lib.rs +++ b/komorebi-core/src/lib.rs @@ -100,7 +100,8 @@ pub enum SocketMessage { ManageRule(ApplicationIdentifier, String), IdentifyObjectNameChangeApplication(ApplicationIdentifier, String), IdentifyTrayApplication(ApplicationIdentifier, String), - IdentifyBorderOverflow(ApplicationIdentifier, String), + IdentifyLayeredApplication(ApplicationIdentifier, String), + IdentifyBorderOverflowApplication(ApplicationIdentifier, String), State, Query(StateQuery), FocusFollowsMouse(FocusFollowsMouseImplementation, bool), diff --git a/komorebi/src/main.rs b/komorebi/src/main.rs index 10d0ab1a..10d5c5a4 100644 --- a/komorebi/src/main.rs +++ b/komorebi/src/main.rs @@ -68,7 +68,7 @@ mod workspace; lazy_static! { static ref HIDDEN_HWNDS: Arc>> = Arc::new(Mutex::new(vec![])); - static ref LAYERED_EXE_WHITELIST: Arc>> = + static ref LAYERED_WHITELIST: Arc>> = Arc::new(Mutex::new(vec!["steam.exe".to_string()])); static ref TRAY_AND_MULTI_WINDOW_IDENTIFIERS: Arc>> = Arc::new(Mutex::new(vec![ diff --git a/komorebi/src/process_command.rs b/komorebi/src/process_command.rs index 2cd5cd0f..a8ceffd0 100644 --- a/komorebi/src/process_command.rs +++ b/komorebi/src/process_command.rs @@ -39,6 +39,7 @@ use crate::CUSTOM_FFM; use crate::FLOAT_IDENTIFIERS; use crate::HIDING_BEHAVIOUR; use crate::HOME_DIR; +use crate::LAYERED_WHITELIST; use crate::MANAGE_IDENTIFIERS; use crate::OBJECT_NAME_CHANGE_ON_LAUNCH; use crate::SUBSCRIPTION_PIPES; @@ -550,7 +551,7 @@ impl WindowManager { SocketMessage::WatchConfiguration(enable) => { self.watch_configuration(enable)?; } - SocketMessage::IdentifyBorderOverflow(_, id) => { + SocketMessage::IdentifyBorderOverflowApplication(_, id) => { let mut identifiers = BORDER_OVERFLOW_IDENTIFIERS.lock(); if !identifiers.contains(&id) { identifiers.push(id); @@ -568,6 +569,12 @@ impl WindowManager { identifiers.push(id); } } + SocketMessage::IdentifyLayeredApplication(_, id) => { + let mut identifiers = LAYERED_WHITELIST.lock(); + if !identifiers.contains(&id) { + identifiers.push(id); + } + } SocketMessage::ManageFocusedWindow => { self.manage_focused_window()?; } diff --git a/komorebi/src/window.rs b/komorebi/src/window.rs index 4df86a68..4ecab9c1 100644 --- a/komorebi/src/window.rs +++ b/komorebi/src/window.rs @@ -22,7 +22,7 @@ use crate::BORDER_OVERFLOW_IDENTIFIERS; use crate::FLOAT_IDENTIFIERS; use crate::HIDDEN_HWNDS; use crate::HIDING_BEHAVIOUR; -use crate::LAYERED_EXE_WHITELIST; +use crate::LAYERED_WHITELIST; use crate::MANAGE_IDENTIFIERS; use crate::WSL2_UI_PROCESSES; @@ -295,8 +295,8 @@ impl Window { }; let allow_layered = { - let layered_exe_whitelist = LAYERED_EXE_WHITELIST.lock(); - layered_exe_whitelist.contains(&exe_name) + let layered_whitelist = LAYERED_WHITELIST.lock(); + layered_whitelist.contains(&exe_name) || layered_whitelist.contains(&class) }; let allow_wsl2_gui = { diff --git a/komorebi/src/window_manager.rs b/komorebi/src/window_manager.rs index 327d557e..f773eb91 100644 --- a/komorebi/src/window_manager.rs +++ b/komorebi/src/window_manager.rs @@ -40,7 +40,7 @@ use crate::workspace::Workspace; use crate::BORDER_OVERFLOW_IDENTIFIERS; use crate::FLOAT_IDENTIFIERS; use crate::HOME_DIR; -use crate::LAYERED_EXE_WHITELIST; +use crate::LAYERED_WHITELIST; use crate::MANAGE_IDENTIFIERS; use crate::OBJECT_NAME_CHANGE_ON_LAUNCH; use crate::TRAY_AND_MULTI_WINDOW_IDENTIFIERS; @@ -77,7 +77,7 @@ pub struct State { pub has_pending_raise_op: bool, pub float_identifiers: Vec, pub manage_identifiers: Vec, - pub layered_exe_whitelist: Vec, + pub layered_whitelist: Vec, pub tray_and_multi_window_identifiers: Vec, pub border_overflow_identifiers: Vec, pub name_change_on_launch_identifiers: Vec, @@ -103,7 +103,7 @@ impl From<&WindowManager> for State { has_pending_raise_op: wm.has_pending_raise_op, float_identifiers: FLOAT_IDENTIFIERS.lock().clone(), manage_identifiers: MANAGE_IDENTIFIERS.lock().clone(), - layered_exe_whitelist: LAYERED_EXE_WHITELIST.lock().clone(), + layered_whitelist: LAYERED_WHITELIST.lock().clone(), tray_and_multi_window_identifiers: TRAY_AND_MULTI_WINDOW_IDENTIFIERS.lock().clone(), border_overflow_identifiers: BORDER_OVERFLOW_IDENTIFIERS.lock().clone(), name_change_on_launch_identifiers: OBJECT_NAME_CHANGE_ON_LAUNCH.lock().clone(), diff --git a/komorebic.lib.sample.ahk b/komorebic.lib.sample.ahk index ed72f11f..77838a16 100644 --- a/komorebic.lib.sample.ahk +++ b/komorebic.lib.sample.ahk @@ -276,8 +276,12 @@ IdentifyTrayApplication(identifier, id) { Run, komorebic.exe identify-tray-application %identifier% %id%, , Hide } -IdentifyBorderOverflow(identifier, id) { - Run, komorebic.exe identify-border-overflow %identifier% %id%, , Hide +IdentifyLayeredApplication(identifier, id) { + Run, komorebic.exe identify-layered-application %identifier% %id%, , Hide +} + +IdentifyBorderOverflowApplication(identifier, id) { + Run, komorebic.exe identify-border-overflow-application %identifier% %id%, , Hide } FocusFollowsMouse(boolean_state, implementation) { diff --git a/komorebic/src/main.rs b/komorebic/src/main.rs index 4c231b6b..61e329e8 100644 --- a/komorebic/src/main.rs +++ b/komorebic/src/main.rs @@ -352,8 +352,9 @@ gen_application_target_subcommand_args! { FloatRule, ManageRule, IdentifyTrayApplication, + IdentifyLayeredApplication, IdentifyObjectNameChangeApplication, - IdentifyBorderOverflow, + IdentifyBorderOverflowApplication, } #[derive(Parser, AhkFunction)] @@ -620,9 +621,13 @@ enum SubCommand { /// Identify an application that closes to the system tray #[clap(arg_required_else_help = true)] IdentifyTrayApplication(IdentifyTrayApplication), + /// Identify an application that has WS_EX_LAYERED, but should still be managed + #[clap(arg_required_else_help = true)] + IdentifyLayeredApplication(IdentifyLayeredApplication), /// Identify an application that has overflowing borders #[clap(arg_required_else_help = true)] - IdentifyBorderOverflow(IdentifyBorderOverflow), + #[clap(alias = "identify-border-overflow")] + IdentifyBorderOverflowApplication(IdentifyBorderOverflowApplication), /// Enable or disable focus follows mouse for the operating system #[clap(arg_required_else_help = true)] FocusFollowsMouse(FocusFollowsMouse), @@ -1079,9 +1084,16 @@ fn main() -> Result<()> { .as_bytes()?, )?; } - SubCommand::IdentifyBorderOverflow(target) => { + SubCommand::IdentifyLayeredApplication(target) => { send_message( - &*SocketMessage::IdentifyBorderOverflow(target.identifier, target.id).as_bytes()?, + &*SocketMessage::IdentifyLayeredApplication(target.identifier, target.id) + .as_bytes()?, + )?; + } + SubCommand::IdentifyBorderOverflowApplication(target) => { + send_message( + &*SocketMessage::IdentifyBorderOverflowApplication(target.identifier, target.id) + .as_bytes()?, )?; } SubCommand::Manage => {