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 => {