mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-02-16 18:27:42 +01:00
Compare commits
47 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
096729c2bd | ||
|
|
de5efd9b35 | ||
|
|
294c14e6a6 | ||
|
|
4d26cdee32 | ||
|
|
6748d7e4a9 | ||
|
|
7f350341bb | ||
|
|
33dcadfce3 | ||
|
|
52236679a5 | ||
|
|
9431bac4ad | ||
|
|
e4a9719f4f | ||
|
|
e044a5a16f | ||
|
|
60d3ecd8aa | ||
|
|
27e0758089 | ||
|
|
7d1aef8203 | ||
|
|
b273617f44 | ||
|
|
4306a7bafe | ||
|
|
b647fdf01a | ||
|
|
9f16cb91a9 | ||
|
|
2520c4abe1 | ||
|
|
d32661ec2d | ||
|
|
9df99f28cf | ||
|
|
7327bb9a70 | ||
|
|
b9a9d20c66 | ||
|
|
f89224c5d4 | ||
|
|
e68cf6fa91 | ||
|
|
b50326ed27 | ||
|
|
66f2395840 | ||
|
|
7828c403ba | ||
|
|
366cd4ff91 | ||
|
|
a3ee513003 | ||
|
|
0de3fa62f0 | ||
|
|
aadf80f3be | ||
|
|
0a3f27d5ad | ||
|
|
9c5b380412 | ||
|
|
587c5a2636 | ||
|
|
b5ca0bfd45 | ||
|
|
30fc1ef538 | ||
|
|
76d0a38165 | ||
|
|
34d65dddba | ||
|
|
a8e7f02b0a | ||
|
|
1a59b3a2e3 | ||
|
|
cd7606540a | ||
|
|
f41e8c151e | ||
|
|
8ce49f5868 | ||
|
|
72d20d5745 | ||
|
|
38686a1167 | ||
|
|
d9648ddd0c |
14
.github/ISSUE_TEMPLATE/bug_report.md
vendored
14
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -32,6 +32,20 @@ OS Name: Microsoft Windows 11 Pro
|
||||
OS Version: 10.0.22000 N/A Build 22000
|
||||
```
|
||||
|
||||
**`komorebic check` Output**
|
||||
Provide the output of `komorebic check`
|
||||
|
||||
For example:
|
||||
```
|
||||
No KOMOREBI_CONFIG_HOME detected, defaulting to C:\Users\LGUG2Z
|
||||
|
||||
Looking for configuration files in C:\Users\LGUG2Z
|
||||
|
||||
No komorebi configuration found in C:\Users\LGUG2Z
|
||||
|
||||
If running 'komorebic start --await-configuration', you will manually have to call the following command to begin tiling: komorebic complete-configuration
|
||||
```
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
|
||||
713
Cargo.lock
generated
713
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
49
README.md
49
README.md
@@ -183,7 +183,7 @@ iwr https://raw.githubusercontent.com/LGUG2Z/komorebi/master/komorebi.sample.ps1
|
||||
mkdir $Env:USERPROFILE\.config -ea 0
|
||||
|
||||
# save the sample whkdrc file with key bindings to ~/.config/whkdrc
|
||||
iwr https://raw.githubusercontent.com/LGUG2Z/komorebi/master/whkdrc -OutFile $Env:USERPROFILE\whkdrc
|
||||
iwr https://raw.githubusercontent.com/LGUG2Z/komorebi/master/whkdrc.sample -OutFile $Env:USERPROFILE\.config\whkdrc
|
||||
|
||||
# start komorebi
|
||||
komorebic start --await-configuration
|
||||
@@ -192,6 +192,31 @@ komorebic start --await-configuration
|
||||
Thanks to [@sitiom](https://github.com/sitiom) for getting _komorebi_ added to both the popular Scoop Extras bucket and
|
||||
to WinGet.
|
||||
|
||||
You can watch a walkthrough video of this quickstart below on YouTube.
|
||||
|
||||
[](https://www.youtube.com/watch?v=cBnLIwMtv8g)
|
||||
|
||||
#### Using Autohotkey
|
||||
|
||||
If you would like to use Autohotkey, please make sure you have AutoHotKey v2 installed.
|
||||
|
||||
Generally, users who opt for AHK will have specific needs that can only be addressed by the advanced functionality of AHK,
|
||||
and so they are assumed to be able to craft their own configuration files.
|
||||
|
||||
If you would like to try out AHK, a simple sample configuration powered by `komorebic.lib.ahk` is provided as a starting
|
||||
point.
|
||||
|
||||
```powershell
|
||||
# save the latest generated komorebic library to ~/komorebic.lib.ahk
|
||||
iwr https://raw.githubusercontent.com/LGUG2Z/komorebi/master/komorebic.lib.ahk -OutFile $Env:USERPROFILE\komorebic.lib.ahk
|
||||
|
||||
# save the latest generated app-specific config tweaks and fixes to ~/komorebi.generated.ahk
|
||||
iwr https://raw.githubusercontent.com/LGUG2Z/komorebi/master/komorebi.generated.ahk -OutFile $Env:USERPROFILE\komorebi.generated.ahk
|
||||
|
||||
# save the sample komorebi configuration file to ~/komorebi.ahk
|
||||
iwr https://raw.githubusercontent.com/LGUG2Z/komorebi/master/komorebi.sample.ahk -OutFile $Env:USERPROFILE\komorebi.ahk
|
||||
```
|
||||
|
||||
### GitHub Releases
|
||||
|
||||
Prebuilt binaries are available on the [releases page](https://github.com/LGUG2Z/komorebi/releases) in a `zip` archive.
|
||||
@@ -255,6 +280,9 @@ key combinations in the `whkdrc` file.
|
||||
Additionally, you may run `komorebic.exe ahk-library` to generate a helper library for AutoHotKey which wraps
|
||||
every `komorebic` command in a native AHK function.
|
||||
|
||||
The output of this command is in AHKv1 syntax. It must be manually converted to AHKv2 syntax
|
||||
using [this tool](https://github.com/mmikeww/AHK-v2-script-converter) or something similar.
|
||||
|
||||
If you include the generated library at the top of your `~/komorebi.ahk` configuration file, you will be able to call
|
||||
any of the functions that it contains.
|
||||
|
||||
@@ -262,13 +290,11 @@ any of the functions that it contains.
|
||||
|
||||
❗️**NOTE**: This section is only relevant for people who wish to use AutoHotKey instead of [`whkd`](https://github.com/LGUG2Z/whkd).
|
||||
|
||||
The generated helper library for AutoHotKey currently only supports AutoHotKey v1.1.
|
||||
|
||||
The preferred way to install AutoHotKey for use with `komorebi` is to install it via `scoop`:
|
||||
|
||||
```powershell
|
||||
scoop bucket add versions
|
||||
scoop install autohotkey1.1
|
||||
scoop install autohotkey
|
||||
```
|
||||
|
||||
If you install AutoHotKey using a different method, the name of the executable file may differ from the name given by
|
||||
@@ -359,10 +385,15 @@ komorebic.exe active-window-border-colour [R G B] --window-kind single
|
||||
|
||||
# optionally, if you want a different colour for stacks of windows
|
||||
komorebic.exe active-window-border-colour [R G B] --window-kind stack
|
||||
|
||||
# optionally, if you want a different colour for windows in monocle mode
|
||||
komorebic.exe active-window-border-colour [R G B] --window-kind monocle
|
||||
```
|
||||
|
||||
It is important to note that the active window border will only apply to windows managed by `komorebi`.
|
||||
|
||||
[](https://www.youtube.com/watch?v=ywiAvoMV_gE)
|
||||
|
||||
#### Removing Gaps
|
||||
|
||||
If you would like to remove all gaps from a given workspace, both between windows themselves, and between the monitor edges and the windows, you can set the following two configuration options to `0` for the desired monitors and workspaces:
|
||||
@@ -372,6 +403,8 @@ komorebic.exe container-padding <MONITOR_INDEX> <WORKSPACE_INDEX> 0
|
||||
komorebic.exe workspace-padding <MONITOR_INDEX> <WORKSPACE_INDEX> 0
|
||||
```
|
||||
|
||||
[](https://www.youtube.com/watch?v=eGr07mymgWE)
|
||||
|
||||
#### Multiple Layout Changes on Startup
|
||||
|
||||
❗️**NOTE**: If you followed the quickstart and are using the sample configurations, this is already the default behaviour.
|
||||
@@ -478,10 +511,12 @@ By default, the mouse will move to the center of the window when the focus is ch
|
||||
behaviour is know is 'mouse follows focus'. To disable this behaviour across all workspaces, add the following command
|
||||
to your configuration file:
|
||||
|
||||
```ahk
|
||||
Run, komorebic.exe toggle-mouse-follows-focus, , Hide
|
||||
```powershell
|
||||
komorebic.exe mouse-follows-focus disable
|
||||
```
|
||||
|
||||
[](https://www.youtube.com/watch?v=LBoyXQiNINc)
|
||||
|
||||
#### Saving and Loading Resized Layouts
|
||||
|
||||
If you create a BSP layout through various resize adjustments that you want to be able to restore easily in the future,
|
||||
@@ -553,6 +588,8 @@ YAML
|
||||
configuration: Horizontal
|
||||
```
|
||||
|
||||
[](https://www.youtube.com/watch?v=SgmBHKEOcQ4)
|
||||
|
||||
#### Dynamically Changing Layouts Based on Number of Visible Window Containers
|
||||
|
||||
With `komorebi` it is possible to define rules to automatically change the layout on a specified workspace when a
|
||||
|
||||
6
justfile
6
justfile
@@ -22,7 +22,11 @@ install-komorebi:
|
||||
install:
|
||||
just install-komorebic
|
||||
just install-komorebi
|
||||
cat '~/.config/komorebi/komorebi.generated.ps1' > komorebi.generated.ps1
|
||||
komorebic ahk-asc '~/komorebi-application-specific-configuration/applications.yaml'
|
||||
komorebic pwsh-asc '~/komorebi-application-specific-configuration/applications.yaml'
|
||||
cat '~/.config/komorebi/komorebi.generated.ps1' >komorebi.generated.ps1
|
||||
cat '~/.config/komorebi/komorebi.generated.ahk' >komorebi.generated.ahk
|
||||
cat '~/.config/komorebi/komorebic.lib_newV2.ahk' >komorebic.lib.ahk
|
||||
|
||||
run:
|
||||
just install-komorebic
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "komorebi-core"
|
||||
version = "0.1.15"
|
||||
version = "0.1.16"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
@@ -15,7 +15,7 @@ strum = { version = "0.24", features = ["derive"] }
|
||||
schemars = "0.8"
|
||||
|
||||
[dependencies.windows]
|
||||
version = "0.44"
|
||||
version = "0.48"
|
||||
features = [
|
||||
"Win32_Foundation",
|
||||
]
|
||||
|
||||
@@ -56,7 +56,7 @@ impl ApplicationOptions {
|
||||
#[must_use]
|
||||
pub fn cfgen(&self, kind: &ApplicationIdentifier, id: &str) -> String {
|
||||
format!(
|
||||
"Run, {}, , Hide",
|
||||
"RunWait('{}', , \"Hide\")",
|
||||
ApplicationOptions::raw_cfgen(self, kind, id)
|
||||
)
|
||||
}
|
||||
@@ -184,12 +184,7 @@ impl ApplicationConfigurationGenerator {
|
||||
|
||||
cfgen.sort_by(|a, b| a.name.cmp(&b.name));
|
||||
|
||||
let mut lines = vec![
|
||||
String::from("; Generated by komorebic.exe"),
|
||||
String::from("; To use this file, add the line below to the top of your komorebi.ahk configuration file"),
|
||||
String::from("; #Include %A_ScriptDir%\\komorebi.generated.ahk"),
|
||||
String::new()
|
||||
];
|
||||
let mut lines = vec![String::from("; Generated by komorebic.exe"), String::new()];
|
||||
|
||||
let mut float_rules = vec![];
|
||||
|
||||
@@ -208,7 +203,7 @@ impl ApplicationConfigurationGenerator {
|
||||
if let Some(float_identifiers) = app.float_identifiers {
|
||||
for float in float_identifiers {
|
||||
let float_rule = format!(
|
||||
"Run, komorebic.exe float-rule {} \"{}\", , Hide",
|
||||
"RunWait('komorebic.exe float-rule {} \"{}\"', , \"Hide\")",
|
||||
float.kind, float.id
|
||||
);
|
||||
|
||||
|
||||
@@ -46,10 +46,12 @@ pub enum SocketMessage {
|
||||
UnstackWindow,
|
||||
CycleStack(CycleDirection),
|
||||
MoveContainerToMonitorNumber(usize),
|
||||
CycleMoveContainerToMonitor(CycleDirection),
|
||||
MoveContainerToWorkspaceNumber(usize),
|
||||
MoveContainerToNamedWorkspace(String),
|
||||
CycleMoveContainerToWorkspace(CycleDirection),
|
||||
SendContainerToMonitorNumber(usize),
|
||||
CycleSendContainerToMonitor(CycleDirection),
|
||||
SendContainerToWorkspaceNumber(usize),
|
||||
CycleSendContainerToWorkspace(CycleDirection),
|
||||
SendContainerToMonitorWorkspaceNumber(usize, usize),
|
||||
@@ -125,6 +127,8 @@ pub enum SocketMessage {
|
||||
WorkAreaOffset(Rect),
|
||||
MonitorWorkAreaOffset(usize, Rect),
|
||||
ResizeDelta(i32),
|
||||
InitialWorkspaceRule(ApplicationIdentifier, String, usize, usize),
|
||||
InitialNamedWorkspaceRule(ApplicationIdentifier, String, String),
|
||||
WorkspaceRule(ApplicationIdentifier, String, usize, usize),
|
||||
NamedWorkspaceRule(ApplicationIdentifier, String, String),
|
||||
FloatRule(ApplicationIdentifier, String),
|
||||
@@ -166,6 +170,7 @@ impl FromStr for SocketMessage {
|
||||
pub enum WindowKind {
|
||||
Single,
|
||||
Stack,
|
||||
Monocle,
|
||||
}
|
||||
|
||||
#[derive(
|
||||
|
||||
499
komorebi.generated.ahk
Normal file
499
komorebi.generated.ahk
Normal file
@@ -0,0 +1,499 @@
|
||||
; Generated by komorebic.exe
|
||||
|
||||
; 1Password
|
||||
RunWait('komorebic.exe float-rule exe "1Password.exe"', , "Hide")
|
||||
|
||||
; Ableton Live
|
||||
; Targets VST2 windows
|
||||
RunWait('komorebic.exe float-rule class "AbletonVstPlugClass"', , "Hide")
|
||||
; Targets VST3 windows
|
||||
RunWait('komorebic.exe float-rule class "Vst3PlugWindow"', , "Hide")
|
||||
|
||||
; Adobe Creative Cloud
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application class "CreativeCloudDesktopWindowClass"', , "Hide")
|
||||
|
||||
; Adobe Photoshop
|
||||
RunWait('komorebic.exe identify-border-overflow-application class "Photoshop"', , "Hide")
|
||||
|
||||
; Akiflow
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "Akiflow.exe"', , "Hide")
|
||||
|
||||
; ArmCord
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "ArmCord.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "ArmCord.exe"', , "Hide")
|
||||
|
||||
; AutoHotkey
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "AutoHotkeyU64.exe"', , "Hide")
|
||||
RunWait('komorebic.exe float-rule title "Window Spy"', , "Hide")
|
||||
|
||||
; Beeper
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Beeper.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "Beeper.exe"', , "Hide")
|
||||
|
||||
; Bitwarden
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "Bitwarden.exe"', , "Hide")
|
||||
|
||||
; Bloxstrap
|
||||
RunWait('komorebic.exe float-rule exe "Bloxstrap.exe"', , "Hide")
|
||||
|
||||
; Calculator
|
||||
RunWait('komorebic.exe float-rule title "Calculator"', , "Hide")
|
||||
|
||||
; Credential Manager UI Host
|
||||
; Targets the Windows popup prompting you for a PIN instead of a password on 1Password etc.
|
||||
RunWait('komorebic.exe float-rule exe "CredentialUIBroker.exe"', , "Hide")
|
||||
|
||||
; Cron
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Cron.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "Cron.exe"', , "Hide")
|
||||
|
||||
; Delphi applications
|
||||
; Target hidden window spawned by Delphi applications
|
||||
RunWait('komorebic.exe float-rule class "TApplication"', , "Hide")
|
||||
; Target Inno Setup installers
|
||||
RunWait('komorebic.exe float-rule class "TWizardForm"', , "Hide")
|
||||
|
||||
; Discord
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Discord.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "Discord.exe"', , "Hide")
|
||||
|
||||
; DiscordCanary
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "DiscordCanary.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "DiscordCanary.exe"', , "Hide")
|
||||
|
||||
; DiscordDevelopment
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "DiscordDevelopment.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "DiscordDevelopment.exe"', , "Hide")
|
||||
|
||||
; DiscordPTB
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "DiscordPTB.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "DiscordPTB.exe"', , "Hide")
|
||||
|
||||
; Dropbox
|
||||
RunWait('komorebic.exe float-rule exe "Dropbox.exe"', , "Hide")
|
||||
|
||||
; ElectronMail
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "ElectronMail.exe"', , "Hide")
|
||||
|
||||
; Element
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "Element.exe"', , "Hide")
|
||||
|
||||
; Elephicon
|
||||
RunWait('komorebic.exe float-rule exe "Elephicon.exe"', , "Hide")
|
||||
|
||||
; ElevenClock
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "ElevenClock.exe"', , "Hide")
|
||||
|
||||
; Elgato Camera Hub
|
||||
RunWait('komorebic.exe float-rule exe "Camera Hub.exe"', , "Hide")
|
||||
|
||||
; Elgato Control Center
|
||||
RunWait('komorebic.exe float-rule exe "ControlCenter.exe"', , "Hide")
|
||||
|
||||
; Elgato Wave Link
|
||||
RunWait('komorebic.exe float-rule exe "WaveLink.exe"', , "Hide")
|
||||
|
||||
; Epic Games Launcher
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "EpicGamesLauncher.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "EpicGamesLauncher.exe"', , "Hide")
|
||||
|
||||
; Flow Launcher
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Flow.Launcher.exe"', , "Hide")
|
||||
|
||||
; GOG Galaxy
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "GalaxyClient.exe"', , "Hide")
|
||||
RunWait('komorebic.exe manage-rule exe "GalaxyClient.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "GalaxyClient.exe"', , "Hide")
|
||||
; Targets a hidden window spawned by GOG Galaxy
|
||||
RunWait('komorebic.exe float-rule class "Chrome_RenderWidgetHostHWND"', , "Hide")
|
||||
|
||||
; GoPro Webcam
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application class "GoPro Webcam"', , "Hide")
|
||||
|
||||
; Godot Manager
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "GodotManager.exe"', , "Hide")
|
||||
RunWait('komorebic.exe manage-rule exe "GodotManager.exe"', , "Hide")
|
||||
RunWait('komorebic.exe identify-object-name-change-application exe "GodotManager.exe"', , "Hide")
|
||||
|
||||
; Google Chrome
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "chrome.exe"', , "Hide")
|
||||
|
||||
; Google Drive
|
||||
RunWait('komorebic.exe float-rule exe "GoogleDriveFS.exe"', , "Hide")
|
||||
|
||||
; Houdoku
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Houdoku.exe"', , "Hide")
|
||||
|
||||
; IntelliJ IDEA
|
||||
RunWait('komorebic.exe identify-object-name-change-application exe "idea64.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "idea64.exe"', , "Hide")
|
||||
; Targets JetBrains IDE popups and floating windows
|
||||
RunWait('komorebic.exe float-rule class "SunAwtDialog"', , "Hide")
|
||||
|
||||
; Itch.io
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "itch.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "itch.exe"', , "Hide")
|
||||
|
||||
; Keyviz
|
||||
RunWait('komorebic.exe float-rule exe "keyviz.exe"', , "Hide")
|
||||
|
||||
; Kleopatra
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "kleopatra.exe"', , "Hide")
|
||||
|
||||
; Kotatogram
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Kotatogram.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "Kotatogram.exe"', , "Hide")
|
||||
|
||||
; LocalSend
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "localsend_app.exe"', , "Hide")
|
||||
|
||||
; Logi Bolt
|
||||
RunWait('komorebic.exe float-rule exe "LogiBolt.exe"', , "Hide")
|
||||
|
||||
; LogiTune
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "LogiTune.exe"', , "Hide")
|
||||
RunWait('komorebic.exe float-rule exe "LogiTune.exe"', , "Hide")
|
||||
|
||||
; Logitech G HUB
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "lghub.exe"', , "Hide")
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "lghub.exe"', , "Hide")
|
||||
|
||||
; Logitech Options
|
||||
RunWait('komorebic.exe float-rule exe "LogiOptionsUI.exe"', , "Hide")
|
||||
|
||||
; Mailspring
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "mailspring.exe"', , "Hide")
|
||||
|
||||
; ManyCam
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "ManyCam.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "ManyCam.exe"', , "Hide")
|
||||
|
||||
; Mica For Everyone
|
||||
|
||||
; Microsoft Excel
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "EXCEL.EXE"', , "Hide")
|
||||
RunWait('komorebic.exe identify-layered-application exe "EXCEL.EXE"', , "Hide")
|
||||
; Targets a hidden window spawned by Microsoft Office applications
|
||||
RunWait('komorebic.exe float-rule class "_WwB"', , "Hide")
|
||||
|
||||
; Microsoft Outlook
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "OUTLOOK.EXE"', , "Hide")
|
||||
RunWait('komorebic.exe identify-layered-application exe "OUTLOOK.EXE"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "OUTLOOK.EXE"', , "Hide")
|
||||
|
||||
; Microsoft PC Manager
|
||||
RunWait('komorebic.exe float-rule exe "MSPCManager.exe"', , "Hide")
|
||||
|
||||
; Microsoft PowerPoint
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "POWERPNT.EXE"', , "Hide")
|
||||
RunWait('komorebic.exe identify-layered-application exe "POWERPNT.EXE"', , "Hide")
|
||||
|
||||
; Microsoft Teams
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Teams.exe"', , "Hide")
|
||||
; Target Teams pop-up notification windows
|
||||
RunWait('komorebic.exe float-rule title "Microsoft Teams Notification"', , "Hide")
|
||||
; Target Teams call in progress windows
|
||||
RunWait('komorebic.exe float-rule title "Microsoft Teams Call"', , "Hide")
|
||||
|
||||
; Microsoft Word
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "WINWORD.EXE"', , "Hide")
|
||||
RunWait('komorebic.exe identify-layered-application exe "WINWORD.EXE"', , "Hide")
|
||||
|
||||
; Modern Flyouts
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "ModernFlyoutsHost.exe"', , "Hide")
|
||||
|
||||
; Mozilla Firefox
|
||||
RunWait('komorebic.exe identify-object-name-change-application exe "firefox.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "firefox.exe"', , "Hide")
|
||||
; Targets invisible windows spawned by Firefox to show tab previews in the taskbar
|
||||
RunWait('komorebic.exe float-rule class "MozillaTaskbarPreviewClass"', , "Hide")
|
||||
|
||||
; NVIDIA GeForce Experience
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "NVIDIA GeForce Experience.exe"', , "Hide")
|
||||
|
||||
; NZXT CAM
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "NZXT CAM.exe"', , "Hide")
|
||||
|
||||
; NiceHash Miner
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "nhm_app.exe"', , "Hide")
|
||||
RunWait('komorebic.exe manage-rule exe "nhm_app.exe"', , "Hide")
|
||||
|
||||
; NohBoard
|
||||
RunWait('komorebic.exe float-rule exe "NohBoard.exe"', , "Hide")
|
||||
|
||||
; Notion Enhanced
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Notion Enhanced.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "Notion Enhanced.exe"', , "Hide")
|
||||
|
||||
; OBS Studio (32-bit)
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "obs32.exe"', , "Hide")
|
||||
|
||||
; OBS Studio (64-bit)
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "obs64.exe"', , "Hide")
|
||||
|
||||
; ONLYOFFICE Editors
|
||||
RunWait('komorebic.exe identify-border-overflow-application class "DocEditorsWindowClass"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application class "DocEditorsWindowClass"', , "Hide")
|
||||
|
||||
; Obsidian
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Obsidian.exe"', , "Hide")
|
||||
RunWait('komorebic.exe manage-rule exe "Obsidian.exe"', , "Hide")
|
||||
|
||||
; OpenRGB
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "OpenRGB.exe"', , "Hide")
|
||||
|
||||
; Paradox Launcher
|
||||
RunWait('komorebic.exe float-rule exe "Paradox Launcher.exe"', , "Hide")
|
||||
|
||||
; Plexamp
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Plexamp.exe"', , "Hide")
|
||||
|
||||
; PowerToys
|
||||
; Target color picker dialog
|
||||
RunWait('komorebic.exe float-rule exe "PowerToys.ColorPickerUI.exe"', , "Hide")
|
||||
; Target image resizer dialog
|
||||
RunWait('komorebic.exe float-rule exe "PowerToys.ImageResizer.exe"', , "Hide")
|
||||
|
||||
; Process Hacker
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "ProcessHacker.exe"', , "Hide")
|
||||
RunWait('komorebic.exe float-rule exe "ProcessHacker.exe"', , "Hide")
|
||||
|
||||
; ProtonVPN
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "ProtonVPN.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "ProtonVPN.exe"', , "Hide")
|
||||
|
||||
; PyCharm
|
||||
RunWait('komorebic.exe identify-object-name-change-application exe "pycharm64.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "pycharm64.exe"', , "Hide")
|
||||
|
||||
; QtScrcpy
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "QtScrcpy.exe"', , "Hide")
|
||||
|
||||
; QuickLook
|
||||
RunWait('komorebic.exe float-rule exe "QuickLook.exe"', , "Hide")
|
||||
|
||||
; RepoZ
|
||||
RunWait('komorebic.exe float-rule exe "RepoZ.exe"', , "Hide")
|
||||
|
||||
; Rider
|
||||
RunWait('komorebic.exe identify-object-name-change-application exe "rider64.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "rider64.exe"', , "Hide")
|
||||
|
||||
; Roblox FPS Unlocker
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "rbxfpsunlocker.exe"', , "Hide")
|
||||
|
||||
; RoundedTB
|
||||
RunWait('komorebic.exe float-rule exe "RoundedTB.exe"', , "Hide")
|
||||
|
||||
; RoundedTB
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "RoundedTB.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "RoundedTB.exe"', , "Hide")
|
||||
|
||||
; ShareX
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "ShareX.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "ShareX.exe"', , "Hide")
|
||||
|
||||
; Sideloadly
|
||||
RunWait('komorebic.exe float-rule exe "sideloadly.exe"', , "Hide")
|
||||
|
||||
; Signal
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "signal.exe"', , "Hide")
|
||||
|
||||
; SiriKali
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "sirikali.exe"', , "Hide")
|
||||
|
||||
; Slack
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Slack.exe"', , "Hide")
|
||||
RunWait('komorebic.exe manage-rule exe "Slack.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "Slack.exe"', , "Hide")
|
||||
|
||||
; Slack
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "slack.exe"', , "Hide")
|
||||
RunWait('komorebic.exe manage-rule exe "slack.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "slack.exe"', , "Hide")
|
||||
|
||||
; Smart Install Maker
|
||||
; Target hidden window spawned by installer
|
||||
RunWait('komorebic.exe float-rule class "obj_App"', , "Hide")
|
||||
; Target installer
|
||||
RunWait('komorebic.exe float-rule class "obj_Form"', , "Hide")
|
||||
|
||||
; SoulseekQt
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "SoulseekQt.exe"', , "Hide")
|
||||
|
||||
; Spotify
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Spotify.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "Spotify.exe"', , "Hide")
|
||||
|
||||
; Steam
|
||||
RunWait('komorebic.exe identify-border-overflow-application class "vguiPopupWindow"', , "Hide")
|
||||
|
||||
; Steam Beta
|
||||
RunWait('komorebic.exe identify-border-overflow-application class "SDL_app"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application class "SDL_app"', , "Hide")
|
||||
|
||||
; Stremio
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "stremio.exe"', , "Hide")
|
||||
|
||||
; System Informer
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "SystemInformer.exe"', , "Hide")
|
||||
RunWait('komorebic.exe float-rule exe "SystemInformer.exe"', , "Hide")
|
||||
|
||||
; SystemSettings
|
||||
RunWait('komorebic.exe float-rule class "Shell_Dialog"', , "Hide")
|
||||
|
||||
; Task Manager
|
||||
RunWait('komorebic.exe float-rule class "TaskManagerWindow"', , "Hide")
|
||||
|
||||
; Telegram
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Telegram.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "Telegram.exe"', , "Hide")
|
||||
|
||||
; TickTick
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "TickTick.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "TickTick.exe"', , "Hide")
|
||||
|
||||
; TouchCursor
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "tcconfig.exe"', , "Hide")
|
||||
RunWait('komorebic.exe float-rule exe "tcconfig.exe"', , "Hide")
|
||||
|
||||
; TranslucentTB
|
||||
RunWait('komorebic.exe float-rule exe "TranslucentTB.exe"', , "Hide")
|
||||
|
||||
; TranslucentTB
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "TranslucentTB.exe"', , "Hide")
|
||||
|
||||
; Unreal Editor
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "UnrealEditor.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "UnrealEditor.exe"', , "Hide")
|
||||
|
||||
; VRCX
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "VRCX.exe"', , "Hide")
|
||||
|
||||
; Visual Studio
|
||||
RunWait('komorebic.exe identify-object-name-change-application exe "devenv.exe"', , "Hide")
|
||||
|
||||
; Visual Studio Code
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "Code.exe"', , "Hide")
|
||||
|
||||
; Voice.ai
|
||||
RunWait('komorebic.exe identify-border-overflow-application exe "VoiceAI.exe"', , "Hide")
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "VoiceAI.exe"', , "Hide")
|
||||
|
||||
; WebTorrent Desktop
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "WebTorrent.exe"', , "Hide")
|
||||
|
||||
; WinZip (32-bit)
|
||||
RunWait('komorebic.exe float-rule exe "winzip32.exe"', , "Hide")
|
||||
|
||||
; WinZip (64-bit)
|
||||
RunWait('komorebic.exe float-rule exe "winzip64.exe"', , "Hide")
|
||||
|
||||
; Windows Console (conhost.exe)
|
||||
RunWait('komorebic.exe manage-rule class "ConsoleWindowClass"', , "Hide")
|
||||
|
||||
; Windows Explorer
|
||||
; Targets copy/move operation windows
|
||||
RunWait('komorebic.exe float-rule class "OperationStatusWindow"', , "Hide")
|
||||
RunWait('komorebic.exe float-rule title "Control Panel"', , "Hide")
|
||||
|
||||
; Windows Installer
|
||||
RunWait('komorebic.exe float-rule exe "msiexec.exe"', , "Hide")
|
||||
|
||||
; WingetUI
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "WingetUI.exe"', , "Hide")
|
||||
|
||||
; WingetUI
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "wingetui.exe"', , "Hide")
|
||||
|
||||
; Wox
|
||||
; Targets a hidden window spawned by Wox
|
||||
RunWait('komorebic.exe float-rule title "Hotkey sink"', , "Hide")
|
||||
|
||||
; XAMPP Control Panel
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "xampp-control.exe"', , "Hide")
|
||||
|
||||
; Zoom
|
||||
RunWait('komorebic.exe float-rule exe "Zoom.exe"', , "Hide")
|
||||
|
||||
; mpv.net
|
||||
RunWait('komorebic.exe identify-object-name-change-application exe "mpvnet.exe"', , "Hide")
|
||||
|
||||
; paint.net
|
||||
RunWait('komorebic.exe float-rule exe "paintdotnet.exe"', , "Hide")
|
||||
|
||||
; pinentry
|
||||
RunWait('komorebic.exe float-rule exe "pinentry.exe"', , "Hide")
|
||||
|
||||
; qBittorrent
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "qbittorrent.exe"', , "Hide")
|
||||
|
||||
; ueli
|
||||
; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
RunWait('komorebic.exe identify-tray-application exe "ueli.exe"', , "Hide")
|
||||
RunWait('komorebic.exe float-rule exe "ueli.exe"', , "Hide")
|
||||
@@ -16,6 +16,10 @@ komorebic.exe identify-tray-application class "CreativeCloudDesktopWindowClass"
|
||||
# Adobe Photoshop
|
||||
komorebic.exe identify-border-overflow-application class "Photoshop"
|
||||
|
||||
# Akiflow
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application exe "Akiflow.exe"
|
||||
|
||||
# ArmCord
|
||||
komorebic.exe identify-border-overflow-application exe "ArmCord.exe"
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
@@ -76,6 +80,9 @@ komorebic.exe identify-border-overflow-application exe "DiscordPTB.exe"
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application exe "DiscordPTB.exe"
|
||||
|
||||
# Dropbox
|
||||
komorebic.exe float-rule exe "Dropbox.exe"
|
||||
|
||||
# ElectronMail
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application exe "ElectronMail.exe"
|
||||
@@ -84,6 +91,9 @@ komorebic.exe identify-tray-application exe "ElectronMail.exe"
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application exe "Element.exe"
|
||||
|
||||
# Elephicon
|
||||
komorebic.exe float-rule exe "Elephicon.exe"
|
||||
|
||||
# ElevenClock
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application exe "ElevenClock.exe"
|
||||
@@ -127,8 +137,7 @@ komorebic.exe identify-object-name-change-application exe "GodotManager.exe"
|
||||
komorebic.exe identify-tray-application exe "chrome.exe"
|
||||
|
||||
# Google Drive
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application exe "GoogleDriveFS.exe"
|
||||
komorebic.exe float-rule exe "GoogleDriveFS.exe"
|
||||
|
||||
# Houdoku
|
||||
komorebic.exe identify-border-overflow-application exe "Houdoku.exe"
|
||||
@@ -232,6 +241,10 @@ komorebic.exe float-rule class "MozillaTaskbarPreviewClass"
|
||||
# NVIDIA GeForce Experience
|
||||
komorebic.exe identify-border-overflow-application exe "NVIDIA GeForce Experience.exe"
|
||||
|
||||
# NZXT CAM
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application exe "NZXT CAM.exe"
|
||||
|
||||
# NiceHash Miner
|
||||
komorebic.exe identify-border-overflow-application exe "nhm_app.exe"
|
||||
komorebic.exe manage-rule exe "nhm_app.exe"
|
||||
@@ -365,6 +378,11 @@ komorebic.exe identify-tray-application exe "Spotify.exe"
|
||||
# Steam
|
||||
komorebic.exe identify-border-overflow-application class "vguiPopupWindow"
|
||||
|
||||
# Steam Beta
|
||||
komorebic.exe identify-border-overflow-application class "SDL_app"
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application class "SDL_app"
|
||||
|
||||
# Stremio
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application exe "stremio.exe"
|
||||
@@ -385,6 +403,11 @@ komorebic.exe identify-border-overflow-application exe "Telegram.exe"
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application exe "Telegram.exe"
|
||||
|
||||
# TickTick
|
||||
komorebic.exe identify-border-overflow-application exe "TickTick.exe"
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application exe "TickTick.exe"
|
||||
|
||||
# TouchCursor
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application exe "tcconfig.exe"
|
||||
@@ -421,6 +444,12 @@ komorebic.exe identify-tray-application exe "VoiceAI.exe"
|
||||
# If you have disabled minimize/close to tray for this application, you can delete/comment out the next line
|
||||
komorebic.exe identify-tray-application exe "WebTorrent.exe"
|
||||
|
||||
# WinZip (32-bit)
|
||||
komorebic.exe float-rule exe "winzip32.exe"
|
||||
|
||||
# WinZip (64-bit)
|
||||
komorebic.exe float-rule exe "winzip64.exe"
|
||||
|
||||
# Windows Console (conhost.exe)
|
||||
komorebic.exe manage-rule class "ConsoleWindowClass"
|
||||
|
||||
|
||||
93
komorebi.sample.ahk
Normal file
93
komorebi.sample.ahk
Normal file
@@ -0,0 +1,93 @@
|
||||
#SingleInstance Force
|
||||
|
||||
; Load library
|
||||
#Include komorebic.lib.ahk
|
||||
; Load configuration
|
||||
#Include komorebi.generated.ahk
|
||||
|
||||
; Send the ALT key whenever changing focus to force focus changes
|
||||
AltFocusHack("enable")
|
||||
; Default to cloaking windows when switching workspaces
|
||||
WindowHidingBehaviour("cloak")
|
||||
; Set cross-monitor move behaviour to insert instead of swap
|
||||
CrossMonitorMoveBehaviour("Insert")
|
||||
; Enable hot reloading of changes to this file
|
||||
WatchConfiguration("enable")
|
||||
|
||||
; Create named workspaces I-V on monitor 0
|
||||
EnsureNamedWorkspaces(0, "I II III IV V")
|
||||
; You can do the same thing for secondary monitors too
|
||||
; EnsureNamedWorkspaces(1, "A B C D E F")
|
||||
|
||||
; Assign layouts to workspaces, possible values: bsp, columns, rows, vertical-stack, horizontal-stack, ultrawide-vertical-stack
|
||||
NamedWorkspaceLayout("I", "bsp")
|
||||
|
||||
; Set the gaps around the edge of the screen for a workspace
|
||||
NamedWorkspacePadding("I", 20)
|
||||
; Set the gaps between the containers for a workspace
|
||||
NamedWorkspaceContainerPadding("I", 20)
|
||||
|
||||
; You can assign specific apps to named workspaces
|
||||
; NamedWorkspaceRule("exe", "Firefox.exe", "III")
|
||||
|
||||
; Configure the invisible border dimensions
|
||||
InvisibleBorders(7, 0, 14, 7)
|
||||
|
||||
; Uncomment the next lines if you want a visual border around the active window
|
||||
; ActiveWindowBorderColour(66, 165, 245, "single")
|
||||
; ActiveWindowBorderColour(256, 165, 66, "stack")
|
||||
; ActiveWindowBorderColour(255, 51, 153, "monocle")
|
||||
|
||||
CompleteConfiguration()
|
||||
|
||||
; Focus windows
|
||||
!h::Focus("left")
|
||||
!j::Focus("down")
|
||||
!k::Focus("up")
|
||||
!l::Focus("right")
|
||||
!+[::CycleFocus("previous")
|
||||
!+]::CycleFocus("next")
|
||||
|
||||
; Move windows
|
||||
!+h::Move("left")
|
||||
!+j::Move("down")
|
||||
!+k::Move("up")
|
||||
!+l::Move("right")
|
||||
!+Enter::Promote()
|
||||
|
||||
; Stack windows
|
||||
!Left::Stack("left")
|
||||
!Right::Stack("right")
|
||||
!Up::Stack("up")
|
||||
!Down::Stack("down")
|
||||
!;::Unstack()
|
||||
![::CycleStack("previous")
|
||||
!]::CycleStack("next")
|
||||
|
||||
; Resize
|
||||
!=::ResizeAxis("horizontal", "increase")
|
||||
!-::ResizeAxis("horizontal", "decrease")
|
||||
!+=::ResizeAxis("vertical", "increase")
|
||||
!+-::ResizeAxis("vertical", "decrease")
|
||||
|
||||
; Manipulate windows
|
||||
!t::ToggleFloat()
|
||||
!+f::ToggleMonocle()
|
||||
|
||||
; Window manager options
|
||||
!+r::Retile()
|
||||
!p::TogglePause()
|
||||
|
||||
; Layouts
|
||||
!x::FlipLayout("horizontal")
|
||||
!y::FlipLayout("vertical")
|
||||
|
||||
; Workspaces
|
||||
!1::FocusWorkspace(0)
|
||||
!2::FocusWorkspace(1)
|
||||
!3::FocusWorkspace(2)
|
||||
|
||||
; Move windows across workspaces
|
||||
!+1::MoveToWorkspace(0)
|
||||
!+2::MoveToWorkspace(1)
|
||||
!+3::MoveToWorkspace(2)
|
||||
@@ -7,28 +7,27 @@ if (!(Get-Process whkd -ErrorAction SilentlyContinue))
|
||||
|
||||
# Send the ALT key whenever changing focus to force focus changes
|
||||
komorebic alt-focus-hack enable
|
||||
# Default to minimizing windows when switching workspaces
|
||||
# Default to cloaking windows when switching workspaces
|
||||
komorebic window-hiding-behaviour cloak
|
||||
# Set cross-monitor move behaviour to insert instead of swap
|
||||
komorebic cross-monitor-move-behaviour insert
|
||||
# Enable hot reloading of changes to this file
|
||||
komorebic watch-configuration enable
|
||||
|
||||
# create named workspaces I-V on monitor 0
|
||||
# Create named workspaces I-V on monitor 0
|
||||
komorebic ensure-named-workspaces 0 I II III IV V
|
||||
# you can do the same thing for secondary monitors too
|
||||
# You can do the same thing for secondary monitors too
|
||||
# komorebic ensure-named-workspaces 1 A B C D E F
|
||||
|
||||
# assign layouts to workspaces, possible values: bsp, columns, rows, vertical-stack, horizontal-stack, ultrawide-vertical-stack
|
||||
# Assign layouts to workspaces, possible values: bsp, columns, rows, vertical-stack, horizontal-stack, ultrawide-vertical-stack
|
||||
komorebic named-workspace-layout I bsp
|
||||
|
||||
# set the gaps around the edge of the screen for a workspace
|
||||
# Set the gaps around the edge of the screen for a workspace
|
||||
komorebic named-workspace-padding I 20
|
||||
|
||||
# set the gaps between the containers for a workspace
|
||||
# Set the gaps between the containers for a workspace
|
||||
komorebic named-workspace-container-padding I 20
|
||||
|
||||
# you can assign specific apps to named workspaces
|
||||
# You can assign specific apps to named workspaces
|
||||
# komorebic named-workspace-rule exe "Firefox.exe" III
|
||||
|
||||
# Configure the invisible border dimensions
|
||||
@@ -37,6 +36,7 @@ komorebic invisible-borders 7 0 14 7
|
||||
# Uncomment the next lines if you want a visual border around the active window
|
||||
# komorebic active-window-border-colour 66 165 245 --window-kind single
|
||||
# komorebic active-window-border-colour 256 165 66 --window-kind stack
|
||||
# komorebic active-window-border-colour 255 51 153 --window-kind monocle
|
||||
# komorebic active-window-border enable
|
||||
|
||||
komorebic complete-configuration
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "komorebi"
|
||||
version = "0.1.15"
|
||||
version = "0.1.16"
|
||||
authors = ["Jade Iqbal <jadeiqbal@fastmail.com>"]
|
||||
description = "A tiling window manager for Windows"
|
||||
categories = ["tiling-window-manager", "windows"]
|
||||
@@ -13,38 +13,38 @@ edition = "2021"
|
||||
[dependencies]
|
||||
komorebi-core = { path = "../komorebi-core" }
|
||||
|
||||
bitflags = "1"
|
||||
bitflags = "2"
|
||||
clap = { version = "4", features = ["derive"] }
|
||||
color-eyre = "0.6"
|
||||
crossbeam-channel = "0.5"
|
||||
crossbeam-utils = "0.8"
|
||||
ctrlc = "3"
|
||||
dirs = "4"
|
||||
dirs = "5"
|
||||
getset = "0.1"
|
||||
hotwatch = "0.4"
|
||||
lazy_static = "1"
|
||||
miow = "0.5"
|
||||
nanoid = "0.4"
|
||||
net2 = "0.2"
|
||||
os_info = "3.6"
|
||||
os_info = "3.7"
|
||||
parking_lot = { version = "0.12", features = ["deadlock_detection"] }
|
||||
paste = "1"
|
||||
schemars = "0.8"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
strum = { version = "0.24", features = ["derive"] }
|
||||
sysinfo = "0.27"
|
||||
sysinfo = "0.29"
|
||||
tracing = "0.1"
|
||||
tracing-appender = "0.2"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
uds_windows = "1"
|
||||
which = "4"
|
||||
winput = "0.2"
|
||||
winreg = "0.10"
|
||||
windows-interface = { version = "0.44" }
|
||||
windows-implement = { version = "0.44" }
|
||||
winreg = "0.50"
|
||||
windows-interface = { version = "0.48" }
|
||||
windows-implement = { version = "0.48" }
|
||||
[dependencies.windows]
|
||||
version = "0.44"
|
||||
version = "0.48"
|
||||
features = [
|
||||
"implement",
|
||||
"Win32_System_Com",
|
||||
|
||||
@@ -10,8 +10,8 @@ use interfaces::IServiceProvider;
|
||||
|
||||
use std::ffi::c_void;
|
||||
|
||||
use windows::core::ComInterface;
|
||||
use windows::core::Interface;
|
||||
use windows::core::Vtable;
|
||||
use windows::Win32::Foundation::HWND;
|
||||
use windows::Win32::System::Com::CoCreateInstance;
|
||||
use windows::Win32::System::Com::CoInitializeEx;
|
||||
|
||||
@@ -94,7 +94,7 @@ lazy_static! {
|
||||
]));
|
||||
static ref MONITOR_INDEX_PREFERENCES: Arc<Mutex<HashMap<usize, Rect>>> =
|
||||
Arc::new(Mutex::new(HashMap::new()));
|
||||
static ref WORKSPACE_RULES: Arc<Mutex<HashMap<String, (usize, usize)>>> =
|
||||
static ref WORKSPACE_RULES: Arc<Mutex<HashMap<String, (usize, usize, bool)>>> =
|
||||
Arc::new(Mutex::new(HashMap::new()));
|
||||
static ref MANAGE_IDENTIFIERS: Arc<Mutex<Vec<String>>> = Arc::new(Mutex::new(vec![]));
|
||||
static ref FLOAT_IDENTIFIERS: Arc<Mutex<Vec<String>>> = Arc::new(Mutex::new(vec![
|
||||
@@ -163,6 +163,7 @@ pub static BORDER_HWND: AtomicIsize = AtomicIsize::new(0);
|
||||
pub static BORDER_HIDDEN: AtomicBool = AtomicBool::new(false);
|
||||
pub static BORDER_COLOUR_SINGLE: AtomicU32 = AtomicU32::new(0);
|
||||
pub static BORDER_COLOUR_STACK: AtomicU32 = AtomicU32::new(0);
|
||||
pub static BORDER_COLOUR_MONOCLE: AtomicU32 = AtomicU32::new(0);
|
||||
pub static BORDER_COLOUR_CURRENT: AtomicU32 = AtomicU32::new(0);
|
||||
pub static BORDER_WIDTH: AtomicI32 = AtomicI32::new(20);
|
||||
// 0 0 0 aka pure black, I doubt anyone will want this as a border colour
|
||||
@@ -239,7 +240,7 @@ pub fn load_configuration() -> Result<()> {
|
||||
let mut config_pwsh = home.clone();
|
||||
config_pwsh.push("komorebi.ps1");
|
||||
|
||||
let mut config_ahk = home.clone();
|
||||
let mut config_ahk = home;
|
||||
config_ahk.push("komorebi.ahk");
|
||||
|
||||
if config_pwsh.exists() {
|
||||
@@ -277,6 +278,7 @@ pub fn load_configuration() -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn current_virtual_desktop() -> Option<Vec<u8>> {
|
||||
let hkcu = RegKey::predef(HKEY_CURRENT_USER);
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ use crate::Notification;
|
||||
use crate::NotificationEvent;
|
||||
use crate::ALT_FOCUS_HACK;
|
||||
use crate::BORDER_COLOUR_CURRENT;
|
||||
use crate::BORDER_COLOUR_MONOCLE;
|
||||
use crate::BORDER_COLOUR_SINGLE;
|
||||
use crate::BORDER_COLOUR_STACK;
|
||||
use crate::BORDER_ENABLED;
|
||||
@@ -214,24 +215,24 @@ impl WindowManager {
|
||||
self.set_workspace_padding(monitor_idx, workspace_idx, size)?;
|
||||
}
|
||||
}
|
||||
SocketMessage::WorkspaceRule(_, ref id, monitor_idx, workspace_idx) => {
|
||||
SocketMessage::InitialWorkspaceRule(_, ref id, monitor_idx, workspace_idx) => {
|
||||
self.handle_initial_workspace_rules(id, monitor_idx, workspace_idx)?;
|
||||
}
|
||||
SocketMessage::InitialNamedWorkspaceRule(_, ref id, ref workspace) => {
|
||||
if let Some((monitor_idx, workspace_idx)) =
|
||||
self.monitor_workspace_index_by_name(workspace)
|
||||
{
|
||||
let mut workspace_rules = WORKSPACE_RULES.lock();
|
||||
workspace_rules.insert(id.to_string(), (monitor_idx, workspace_idx));
|
||||
self.handle_initial_workspace_rules(id, monitor_idx, workspace_idx)?;
|
||||
}
|
||||
|
||||
self.enforce_workspace_rules()?;
|
||||
}
|
||||
SocketMessage::WorkspaceRule(_, ref id, monitor_idx, workspace_idx) => {
|
||||
self.handle_definitive_workspace_rules(id, monitor_idx, workspace_idx)?;
|
||||
}
|
||||
SocketMessage::NamedWorkspaceRule(_, ref id, ref workspace) => {
|
||||
if let Some((monitor_idx, workspace_idx)) =
|
||||
self.monitor_workspace_index_by_name(workspace)
|
||||
{
|
||||
{
|
||||
let mut workspace_rules = WORKSPACE_RULES.lock();
|
||||
workspace_rules.insert(id.to_string(), (monitor_idx, workspace_idx));
|
||||
}
|
||||
|
||||
self.enforce_workspace_rules()?;
|
||||
self.handle_definitive_workspace_rules(id, monitor_idx, workspace_idx)?;
|
||||
}
|
||||
}
|
||||
SocketMessage::ManageRule(_, ref id) => {
|
||||
@@ -321,6 +322,15 @@ impl WindowManager {
|
||||
SocketMessage::MoveContainerToMonitorNumber(monitor_idx) => {
|
||||
self.move_container_to_monitor(monitor_idx, None, true)?;
|
||||
}
|
||||
SocketMessage::CycleMoveContainerToMonitor(direction) => {
|
||||
let monitor_idx = direction.next_idx(
|
||||
self.focused_monitor_idx(),
|
||||
NonZeroUsize::new(self.monitors().len())
|
||||
.ok_or_else(|| anyhow!("there must be at least one monitor"))?,
|
||||
);
|
||||
|
||||
self.move_container_to_monitor(monitor_idx, None, true)?;
|
||||
}
|
||||
SocketMessage::SendContainerToWorkspaceNumber(workspace_idx) => {
|
||||
self.move_container_to_workspace(workspace_idx, false)?;
|
||||
}
|
||||
@@ -343,6 +353,15 @@ impl WindowManager {
|
||||
SocketMessage::SendContainerToMonitorNumber(monitor_idx) => {
|
||||
self.move_container_to_monitor(monitor_idx, None, false)?;
|
||||
}
|
||||
SocketMessage::CycleSendContainerToMonitor(direction) => {
|
||||
let monitor_idx = direction.next_idx(
|
||||
self.focused_monitor_idx(),
|
||||
NonZeroUsize::new(self.monitors().len())
|
||||
.ok_or_else(|| anyhow!("there must be at least one monitor"))?,
|
||||
);
|
||||
|
||||
self.move_container_to_monitor(monitor_idx, None, false)?;
|
||||
}
|
||||
SocketMessage::SendContainerToMonitorWorkspaceNumber(monitor_idx, workspace_idx) => {
|
||||
self.move_container_to_monitor(monitor_idx, Option::from(workspace_idx), false)?;
|
||||
}
|
||||
@@ -1009,6 +1028,9 @@ impl WindowManager {
|
||||
WindowKind::Stack => {
|
||||
BORDER_COLOUR_STACK.store(r | (g << 8) | (b << 16), Ordering::SeqCst);
|
||||
}
|
||||
WindowKind::Monocle => {
|
||||
BORDER_COLOUR_MONOCLE.store(r | (g << 8) | (b << 16), Ordering::SeqCst);
|
||||
}
|
||||
}
|
||||
|
||||
WindowsApi::invalidate_border_rect()?;
|
||||
@@ -1056,6 +1078,41 @@ impl WindowManager {
|
||||
}
|
||||
};
|
||||
|
||||
match message {
|
||||
SocketMessage::ToggleMonocle => {
|
||||
let current = BORDER_COLOUR_CURRENT.load(Ordering::SeqCst);
|
||||
let monocle = BORDER_COLOUR_MONOCLE.load(Ordering::SeqCst);
|
||||
|
||||
if monocle != 0 {
|
||||
if current == monocle {
|
||||
BORDER_COLOUR_CURRENT.store(
|
||||
BORDER_COLOUR_SINGLE.load(Ordering::SeqCst),
|
||||
Ordering::SeqCst,
|
||||
);
|
||||
} else {
|
||||
BORDER_COLOUR_CURRENT.store(
|
||||
BORDER_COLOUR_MONOCLE.load(Ordering::SeqCst),
|
||||
Ordering::SeqCst,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
SocketMessage::StackWindow(_) => {
|
||||
let stack = BORDER_COLOUR_STACK.load(Ordering::SeqCst);
|
||||
if stack != 0 {
|
||||
BORDER_COLOUR_CURRENT
|
||||
.store(BORDER_COLOUR_STACK.load(Ordering::SeqCst), Ordering::SeqCst);
|
||||
}
|
||||
}
|
||||
SocketMessage::UnstackWindow => {
|
||||
BORDER_COLOUR_CURRENT.store(
|
||||
BORDER_COLOUR_SINGLE.load(Ordering::SeqCst),
|
||||
Ordering::SeqCst,
|
||||
);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
match message {
|
||||
SocketMessage::ChangeLayout(_)
|
||||
| SocketMessage::ChangeLayoutCustom(_)
|
||||
@@ -1071,6 +1128,8 @@ impl WindowManager {
|
||||
| SocketMessage::ToggleMaximize
|
||||
| SocketMessage::Promote
|
||||
| SocketMessage::PromoteFocus
|
||||
| SocketMessage::StackWindow(_)
|
||||
| SocketMessage::UnstackWindow
|
||||
| SocketMessage::Retile
|
||||
// Adding this one so that changes can be seen instantly after
|
||||
// modifying the active window border offset
|
||||
@@ -1121,6 +1180,51 @@ impl WindowManager {
|
||||
tracing::info!("processed");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(self))]
|
||||
fn handle_initial_workspace_rules(
|
||||
&mut self,
|
||||
id: &String,
|
||||
monitor_idx: usize,
|
||||
workspace_idx: usize,
|
||||
) -> Result<()> {
|
||||
self.handle_workspace_rules(id, monitor_idx, workspace_idx, true)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(self))]
|
||||
fn handle_definitive_workspace_rules(
|
||||
&mut self,
|
||||
id: &String,
|
||||
monitor_idx: usize,
|
||||
workspace_idx: usize,
|
||||
) -> Result<()> {
|
||||
self.handle_workspace_rules(id, monitor_idx, workspace_idx, false)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(self))]
|
||||
fn handle_workspace_rules(
|
||||
&mut self,
|
||||
id: &String,
|
||||
monitor_idx: usize,
|
||||
workspace_idx: usize,
|
||||
initial_workspace_rule: bool,
|
||||
) -> Result<()> {
|
||||
{
|
||||
let mut workspace_rules = WORKSPACE_RULES.lock();
|
||||
workspace_rules.insert(
|
||||
id.to_string(),
|
||||
(monitor_idx, workspace_idx, initial_workspace_rule),
|
||||
);
|
||||
}
|
||||
|
||||
self.enforce_workspace_rules()?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn read_commands_uds(wm: &Arc<Mutex<WindowManager>>, stream: UnixStream) -> Result<()> {
|
||||
|
||||
@@ -21,6 +21,7 @@ use crate::windows_api::WindowsApi;
|
||||
use crate::Notification;
|
||||
use crate::NotificationEvent;
|
||||
use crate::BORDER_COLOUR_CURRENT;
|
||||
use crate::BORDER_COLOUR_MONOCLE;
|
||||
use crate::BORDER_COLOUR_SINGLE;
|
||||
use crate::BORDER_COLOUR_STACK;
|
||||
use crate::BORDER_ENABLED;
|
||||
@@ -149,6 +150,10 @@ impl WindowManager {
|
||||
WindowManagerEvent::Destroy(_, window) | WindowManagerEvent::Unmanage(window) => {
|
||||
self.focused_workspace_mut()?.remove_window(window.hwnd)?;
|
||||
self.update_focused_workspace(false)?;
|
||||
|
||||
let mut already_moved_window_handles = self.already_moved_window_handles.lock();
|
||||
|
||||
already_moved_window_handles.remove(&window.hwnd);
|
||||
}
|
||||
WindowManagerEvent::Minimize(_, window) => {
|
||||
let mut hide = false;
|
||||
@@ -192,6 +197,10 @@ impl WindowManager {
|
||||
self.focused_workspace_mut()?.remove_window(window.hwnd)?;
|
||||
self.update_focused_workspace(false)?;
|
||||
}
|
||||
|
||||
let mut already_moved_window_handles = self.already_moved_window_handles.lock();
|
||||
|
||||
already_moved_window_handles.remove(&window.hwnd);
|
||||
}
|
||||
WindowManagerEvent::FocusChange(_, window) => {
|
||||
let workspace = self.focused_workspace_mut()?;
|
||||
@@ -510,6 +519,7 @@ impl WindowManager {
|
||||
| WindowManagerEvent::Minimize(_, window) => {
|
||||
let border = Border::from(BORDER_HWND.load(Ordering::SeqCst));
|
||||
let mut target_window = None;
|
||||
let mut target_window_is_monocle = false;
|
||||
if self
|
||||
.focused_workspace()?
|
||||
.floating_windows()
|
||||
@@ -523,6 +533,7 @@ impl WindowManager {
|
||||
if let Some(monocle_container) = self.focused_workspace()?.monocle_container() {
|
||||
if let Some(window) = monocle_container.focused_window() {
|
||||
target_window = Option::from(*window);
|
||||
target_window_is_monocle = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -539,7 +550,12 @@ impl WindowManager {
|
||||
let container_size = self.focused_container()?.windows().len();
|
||||
target_window = Option::from(*self.focused_window()?);
|
||||
|
||||
if container_size > 1 {
|
||||
if target_window_is_monocle {
|
||||
BORDER_COLOUR_CURRENT.store(
|
||||
BORDER_COLOUR_MONOCLE.load(Ordering::SeqCst),
|
||||
Ordering::SeqCst,
|
||||
);
|
||||
} else if container_size > 1 {
|
||||
BORDER_COLOUR_CURRENT.store(
|
||||
BORDER_COLOUR_STACK.load(Ordering::SeqCst),
|
||||
Ordering::SeqCst,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
use std::collections::HashMap;
|
||||
use std::collections::HashSet;
|
||||
use std::collections::VecDeque;
|
||||
use std::io::ErrorKind;
|
||||
use std::num::NonZeroUsize;
|
||||
@@ -71,6 +72,7 @@ pub struct WindowManager {
|
||||
pub virtual_desktop_id: Option<Vec<u8>>,
|
||||
pub has_pending_raise_op: bool,
|
||||
pub pending_move_op: Option<(usize, usize, usize)>,
|
||||
pub already_moved_window_handles: Arc<Mutex<HashSet<isize>>>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, JsonSchema)]
|
||||
@@ -189,6 +191,7 @@ impl WindowManager {
|
||||
hotwatch: Hotwatch::new()?,
|
||||
has_pending_raise_op: false,
|
||||
pending_move_op: None,
|
||||
already_moved_window_handles: Arc::new(Mutex::new(HashSet::new())),
|
||||
})
|
||||
}
|
||||
|
||||
@@ -233,7 +236,7 @@ impl WindowManager {
|
||||
let mut config_pwsh = home.clone();
|
||||
config_pwsh.push("komorebi.ps1");
|
||||
|
||||
let mut config_ahk = home.clone();
|
||||
let mut config_ahk = home;
|
||||
config_ahk.push("komorebi.ahk");
|
||||
|
||||
if config_pwsh.exists() {
|
||||
@@ -477,6 +480,34 @@ impl WindowManager {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(self))]
|
||||
fn add_window_handle_to_move_based_on_workspace_rule(
|
||||
&self,
|
||||
window_title: &String,
|
||||
hwnd: isize,
|
||||
origin_monitor_idx: usize,
|
||||
origin_workspace_idx: usize,
|
||||
target_monitor_idx: usize,
|
||||
target_workspace_idx: usize,
|
||||
to_move: &mut Vec<EnforceWorkspaceRuleOp>,
|
||||
) -> () {
|
||||
tracing::info!(
|
||||
"{} should be on monitor {}, workspace {}",
|
||||
window_title,
|
||||
target_monitor_idx,
|
||||
target_workspace_idx
|
||||
);
|
||||
|
||||
// Create an operation outline and save it for later in the fn
|
||||
to_move.push(EnforceWorkspaceRuleOp {
|
||||
hwnd,
|
||||
origin_monitor_idx,
|
||||
origin_workspace_idx,
|
||||
target_monitor_idx,
|
||||
target_workspace_idx,
|
||||
});
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(self))]
|
||||
pub fn enforce_workspace_rules(&mut self) -> Result<()> {
|
||||
let mut to_move = vec![];
|
||||
@@ -494,41 +525,43 @@ impl WindowManager {
|
||||
for (j, workspace) in monitor.workspaces().iter().enumerate() {
|
||||
// And all the visible windows (at the top of a container)
|
||||
for window in workspace.visible_windows().into_iter().flatten() {
|
||||
let mut already_moved_window_handles = self.already_moved_window_handles.lock();
|
||||
|
||||
let mut found_workspace_rule = workspace_rules.get(&window.exe()?);
|
||||
|
||||
if found_workspace_rule.is_none() {
|
||||
found_workspace_rule = workspace_rules.get(&window.title()?);
|
||||
}
|
||||
|
||||
// If the executable names or titles of any of those windows are in our rules map
|
||||
if let Some((monitor_idx, workspace_idx)) = workspace_rules.get(&window.exe()?)
|
||||
if let Some((monitor_idx, workspace_idx, apply_on_first_show_only)) =
|
||||
found_workspace_rule
|
||||
{
|
||||
tracing::info!(
|
||||
"{} should be on monitor {}, workspace {}",
|
||||
window.title()?,
|
||||
*monitor_idx,
|
||||
*workspace_idx
|
||||
);
|
||||
if *apply_on_first_show_only {
|
||||
if !already_moved_window_handles.contains(&window.hwnd) {
|
||||
already_moved_window_handles.insert(window.hwnd);
|
||||
|
||||
// Create an operation outline and save it for later in the fn
|
||||
to_move.push(EnforceWorkspaceRuleOp {
|
||||
hwnd: window.hwnd,
|
||||
origin_monitor_idx: i,
|
||||
origin_workspace_idx: j,
|
||||
target_monitor_idx: *monitor_idx,
|
||||
target_workspace_idx: *workspace_idx,
|
||||
});
|
||||
} else if let Some((monitor_idx, workspace_idx)) =
|
||||
workspace_rules.get(&window.title()?)
|
||||
{
|
||||
tracing::info!(
|
||||
"{} should be on monitor {}, workspace {}",
|
||||
window.title()?,
|
||||
*monitor_idx,
|
||||
*workspace_idx
|
||||
);
|
||||
|
||||
to_move.push(EnforceWorkspaceRuleOp {
|
||||
hwnd: window.hwnd,
|
||||
origin_monitor_idx: i,
|
||||
origin_workspace_idx: j,
|
||||
target_monitor_idx: *monitor_idx,
|
||||
target_workspace_idx: *workspace_idx,
|
||||
});
|
||||
self.add_window_handle_to_move_based_on_workspace_rule(
|
||||
&window.title()?,
|
||||
window.hwnd,
|
||||
i,
|
||||
j,
|
||||
*monitor_idx,
|
||||
*workspace_idx,
|
||||
&mut to_move,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
self.add_window_handle_to_move_based_on_workspace_rule(
|
||||
&window.title()?,
|
||||
window.hwnd,
|
||||
i,
|
||||
j,
|
||||
*monitor_idx,
|
||||
*workspace_idx,
|
||||
&mut to_move,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ use windows::core::PWSTR;
|
||||
use windows::Win32::Foundation::BOOL;
|
||||
use windows::Win32::Foundation::COLORREF;
|
||||
use windows::Win32::Foundation::HANDLE;
|
||||
use windows::Win32::Foundation::HINSTANCE;
|
||||
use windows::Win32::Foundation::HMODULE;
|
||||
use windows::Win32::Foundation::HWND;
|
||||
use windows::Win32::Foundation::LPARAM;
|
||||
use windows::Win32::Foundation::POINT;
|
||||
@@ -671,7 +671,7 @@ impl WindowsApi {
|
||||
pub fn system_parameters_info_w(
|
||||
action: SYSTEM_PARAMETERS_INFO_ACTION,
|
||||
ui_param: u32,
|
||||
pv_param: *const c_void,
|
||||
pv_param: *mut c_void,
|
||||
update_flags: SYSTEM_PARAMETERS_INFO_UPDATE_FLAGS,
|
||||
) -> Result<()> {
|
||||
unsafe { SystemParametersInfoW(action, ui_param, Option::from(pv_param), update_flags) }
|
||||
@@ -681,12 +681,12 @@ impl WindowsApi {
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn focus_follows_mouse() -> Result<bool> {
|
||||
let is_enabled: BOOL = unsafe { std::mem::zeroed() };
|
||||
let mut is_enabled: BOOL = unsafe { std::mem::zeroed() };
|
||||
|
||||
Self::system_parameters_info_w(
|
||||
SPI_GETACTIVEWINDOWTRACKING,
|
||||
0,
|
||||
std::ptr::addr_of!(is_enabled).cast(),
|
||||
std::ptr::addr_of_mut!(is_enabled).cast(),
|
||||
SPIF_SENDCHANGE,
|
||||
)?;
|
||||
|
||||
@@ -698,7 +698,7 @@ impl WindowsApi {
|
||||
Self::system_parameters_info_w(
|
||||
SPI_SETACTIVEWINDOWTRACKING,
|
||||
0,
|
||||
1 as *const c_void,
|
||||
1 as *mut c_void,
|
||||
SPIF_SENDCHANGE,
|
||||
)
|
||||
}
|
||||
@@ -708,12 +708,12 @@ impl WindowsApi {
|
||||
Self::system_parameters_info_w(
|
||||
SPI_SETACTIVEWINDOWTRACKING,
|
||||
0,
|
||||
std::ptr::null::<c_void>(),
|
||||
std::ptr::null_mut::<c_void>(),
|
||||
SPIF_SENDCHANGE,
|
||||
)
|
||||
}
|
||||
|
||||
pub fn module_handle_w() -> Result<HINSTANCE> {
|
||||
pub fn module_handle_w() -> Result<HMODULE> {
|
||||
unsafe { GetModuleHandleW(None) }.process()
|
||||
}
|
||||
|
||||
@@ -750,7 +750,7 @@ impl WindowsApi {
|
||||
.process()
|
||||
}
|
||||
|
||||
pub fn create_border_window(name: PCSTR, instance: HINSTANCE) -> Result<isize> {
|
||||
pub fn create_border_window(name: PCSTR, instance: HMODULE) -> Result<isize> {
|
||||
unsafe {
|
||||
let hwnd = CreateWindowExA(
|
||||
WS_EX_TOOLWINDOW | WS_EX_LAYERED,
|
||||
@@ -782,7 +782,7 @@ impl WindowsApi {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_hidden_window(name: PCSTR, instance: HINSTANCE) -> Result<isize> {
|
||||
pub fn create_hidden_window(name: PCSTR, instance: HMODULE) -> Result<isize> {
|
||||
unsafe {
|
||||
CreateWindowExA(
|
||||
WS_EX_NOACTIVATE,
|
||||
|
||||
@@ -18,10 +18,10 @@ use windows::Win32::Graphics::Gdi::HDC;
|
||||
use windows::Win32::Graphics::Gdi::HMONITOR;
|
||||
use windows::Win32::Graphics::Gdi::PAINTSTRUCT;
|
||||
use windows::Win32::Graphics::Gdi::PS_SOLID;
|
||||
use windows::Win32::System::SystemServices::DBT_DEVNODES_CHANGED;
|
||||
use windows::Win32::UI::Accessibility::HWINEVENTHOOK;
|
||||
use windows::Win32::UI::WindowsAndMessaging::DefWindowProcW;
|
||||
use windows::Win32::UI::WindowsAndMessaging::PostQuitMessage;
|
||||
use windows::Win32::UI::WindowsAndMessaging::DBT_DEVNODES_CHANGED;
|
||||
use windows::Win32::UI::WindowsAndMessaging::SPI_ICONVERTICALSPACING;
|
||||
use windows::Win32::UI::WindowsAndMessaging::SPI_SETWORKAREA;
|
||||
use windows::Win32::UI::WindowsAndMessaging::WM_DESTROY;
|
||||
|
||||
453
komorebic.lib.ahk
Normal file
453
komorebic.lib.ahk
Normal file
@@ -0,0 +1,453 @@
|
||||
; Generated by komorebic.exe
|
||||
|
||||
Start(ffm, await_configuration, tcp_port) {
|
||||
RunWait("komorebic.exe start " ffm " --await-configuration " await_configuration " --tcp-port " tcp_port, , "Hide")
|
||||
}
|
||||
|
||||
Stop() {
|
||||
RunWait("komorebic.exe stop", , "Hide")
|
||||
}
|
||||
|
||||
State() {
|
||||
RunWait("komorebic.exe state", , "Hide")
|
||||
}
|
||||
|
||||
Query(state_query) {
|
||||
RunWait("komorebic.exe query " state_query, , "Hide")
|
||||
}
|
||||
|
||||
Subscribe(named_pipe) {
|
||||
RunWait("komorebic.exe subscribe " named_pipe, , "Hide")
|
||||
}
|
||||
|
||||
Unsubscribe(named_pipe) {
|
||||
RunWait("komorebic.exe unsubscribe " named_pipe, , "Hide")
|
||||
}
|
||||
|
||||
Log() {
|
||||
RunWait("komorebic.exe log", , "Hide")
|
||||
}
|
||||
|
||||
QuickSaveResize() {
|
||||
RunWait("komorebic.exe quick-save-resize", , "Hide")
|
||||
}
|
||||
|
||||
QuickLoadResize() {
|
||||
RunWait("komorebic.exe quick-load-resize", , "Hide")
|
||||
}
|
||||
|
||||
SaveResize(path) {
|
||||
RunWait("komorebic.exe save-resize " path, , "Hide")
|
||||
}
|
||||
|
||||
LoadResize(path) {
|
||||
RunWait("komorebic.exe load-resize " path, , "Hide")
|
||||
}
|
||||
|
||||
Focus(operation_direction) {
|
||||
RunWait("komorebic.exe focus " operation_direction, , "Hide")
|
||||
}
|
||||
|
||||
Move(operation_direction) {
|
||||
RunWait("komorebic.exe move " operation_direction, , "Hide")
|
||||
}
|
||||
|
||||
Minimize() {
|
||||
RunWait("komorebic.exe minimize", , "Hide")
|
||||
}
|
||||
|
||||
Close() {
|
||||
RunWait("komorebic.exe close", , "Hide")
|
||||
}
|
||||
|
||||
ForceFocus() {
|
||||
RunWait("komorebic.exe force-focus", , "Hide")
|
||||
}
|
||||
|
||||
CycleFocus(cycle_direction) {
|
||||
RunWait("komorebic.exe cycle-focus " cycle_direction, , "Hide")
|
||||
}
|
||||
|
||||
CycleMove(cycle_direction) {
|
||||
RunWait("komorebic.exe cycle-move " cycle_direction, , "Hide")
|
||||
}
|
||||
|
||||
Stack(operation_direction) {
|
||||
RunWait("komorebic.exe stack " operation_direction, , "Hide")
|
||||
}
|
||||
|
||||
Resize(edge, sizing) {
|
||||
RunWait("komorebic.exe resize " edge " " sizing, , "Hide")
|
||||
}
|
||||
|
||||
ResizeAxis(axis, sizing) {
|
||||
RunWait("komorebic.exe resize-axis " axis " " sizing, , "Hide")
|
||||
}
|
||||
|
||||
Unstack() {
|
||||
RunWait("komorebic.exe unstack", , "Hide")
|
||||
}
|
||||
|
||||
CycleStack(cycle_direction) {
|
||||
RunWait("komorebic.exe cycle-stack " cycle_direction, , "Hide")
|
||||
}
|
||||
|
||||
MoveToMonitor(target) {
|
||||
RunWait("komorebic.exe move-to-monitor " target, , "Hide")
|
||||
}
|
||||
|
||||
CycleMoveToMonitor(cycle_direction) {
|
||||
RunWait("komorebic.exe cycle-move-to-monitor " cycle_direction, , "Hide")
|
||||
}
|
||||
|
||||
MoveToWorkspace(target) {
|
||||
RunWait("komorebic.exe move-to-workspace " target, , "Hide")
|
||||
}
|
||||
|
||||
MoveToNamedWorkspace(workspace) {
|
||||
RunWait("komorebic.exe move-to-named-workspace " workspace, , "Hide")
|
||||
}
|
||||
|
||||
CycleMoveToWorkspace(cycle_direction) {
|
||||
RunWait("komorebic.exe cycle-move-to-workspace " cycle_direction, , "Hide")
|
||||
}
|
||||
|
||||
SendToMonitor(target) {
|
||||
RunWait("komorebic.exe send-to-monitor " target, , "Hide")
|
||||
}
|
||||
|
||||
CycleSendToMonitor(cycle_direction) {
|
||||
RunWait("komorebic.exe cycle-send-to-monitor " cycle_direction, , "Hide")
|
||||
}
|
||||
|
||||
SendToWorkspace(target) {
|
||||
RunWait("komorebic.exe send-to-workspace " target, , "Hide")
|
||||
}
|
||||
|
||||
SendToNamedWorkspace(workspace) {
|
||||
RunWait("komorebic.exe send-to-named-workspace " workspace, , "Hide")
|
||||
}
|
||||
|
||||
CycleSendToWorkspace(cycle_direction) {
|
||||
RunWait("komorebic.exe cycle-send-to-workspace " cycle_direction, , "Hide")
|
||||
}
|
||||
|
||||
SendToMonitorWorkspace(target_monitor, target_workspace) {
|
||||
RunWait("komorebic.exe send-to-monitor-workspace " target_monitor " " target_workspace, , "Hide")
|
||||
}
|
||||
|
||||
FocusMonitor(target) {
|
||||
RunWait("komorebic.exe focus-monitor " target, , "Hide")
|
||||
}
|
||||
|
||||
FocusWorkspace(target) {
|
||||
RunWait("komorebic.exe focus-workspace " target, , "Hide")
|
||||
}
|
||||
|
||||
FocusMonitorWorkspace(target_monitor, target_workspace) {
|
||||
RunWait("komorebic.exe focus-monitor-workspace " target_monitor " " target_workspace, , "Hide")
|
||||
}
|
||||
|
||||
FocusNamedWorkspace(workspace) {
|
||||
RunWait("komorebic.exe focus-named-workspace " workspace, , "Hide")
|
||||
}
|
||||
|
||||
CycleMonitor(cycle_direction) {
|
||||
RunWait("komorebic.exe cycle-monitor " cycle_direction, , "Hide")
|
||||
}
|
||||
|
||||
CycleWorkspace(cycle_direction) {
|
||||
RunWait("komorebic.exe cycle-workspace " cycle_direction, , "Hide")
|
||||
}
|
||||
|
||||
MoveWorkspaceToMonitor(target) {
|
||||
RunWait("komorebic.exe move-workspace-to-monitor " target, , "Hide")
|
||||
}
|
||||
|
||||
NewWorkspace() {
|
||||
RunWait("komorebic.exe new-workspace", , "Hide")
|
||||
}
|
||||
|
||||
ResizeDelta(pixels) {
|
||||
RunWait("komorebic.exe resize-delta " pixels, , "Hide")
|
||||
}
|
||||
|
||||
InvisibleBorders(left, top, right, bottom) {
|
||||
RunWait("komorebic.exe invisible-borders " left " " top " " right " " bottom, , "Hide")
|
||||
}
|
||||
|
||||
GlobalWorkAreaOffset(left, top, right, bottom) {
|
||||
RunWait("komorebic.exe global-work-area-offset " left " " top " " right " " bottom, , "Hide")
|
||||
}
|
||||
|
||||
MonitorWorkAreaOffset(monitor, left, top, right, bottom) {
|
||||
RunWait("komorebic.exe monitor-work-area-offset " monitor " " left " " top " " right " " bottom, , "Hide")
|
||||
}
|
||||
|
||||
AdjustContainerPadding(sizing, adjustment) {
|
||||
RunWait("komorebic.exe adjust-container-padding " sizing " " adjustment, , "Hide")
|
||||
}
|
||||
|
||||
AdjustWorkspacePadding(sizing, adjustment) {
|
||||
RunWait("komorebic.exe adjust-workspace-padding " sizing " " adjustment, , "Hide")
|
||||
}
|
||||
|
||||
ChangeLayout(default_layout) {
|
||||
RunWait("komorebic.exe change-layout " default_layout, , "Hide")
|
||||
}
|
||||
|
||||
LoadCustomLayout(path) {
|
||||
RunWait("komorebic.exe load-custom-layout " path, , "Hide")
|
||||
}
|
||||
|
||||
FlipLayout(axis) {
|
||||
RunWait("komorebic.exe flip-layout " axis, , "Hide")
|
||||
}
|
||||
|
||||
Promote() {
|
||||
RunWait("komorebic.exe promote", , "Hide")
|
||||
}
|
||||
|
||||
PromoteFocus() {
|
||||
RunWait("komorebic.exe promote-focus", , "Hide")
|
||||
}
|
||||
|
||||
Retile() {
|
||||
RunWait("komorebic.exe retile", , "Hide")
|
||||
}
|
||||
|
||||
MonitorIndexPreference(index_preference, left, top, right, bottom) {
|
||||
RunWait("komorebic.exe monitor-index-preference " index_preference " " left " " top " " right " " bottom, , "Hide")
|
||||
}
|
||||
|
||||
EnsureWorkspaces(monitor, workspace_count) {
|
||||
RunWait("komorebic.exe ensure-workspaces " monitor " " workspace_count, , "Hide")
|
||||
}
|
||||
|
||||
EnsureNamedWorkspaces(monitor, names) {
|
||||
RunWait("komorebic.exe ensure-named-workspaces " monitor " " names, , "Hide")
|
||||
}
|
||||
|
||||
ContainerPadding(monitor, workspace, size) {
|
||||
RunWait("komorebic.exe container-padding " monitor " " workspace " " size, , "Hide")
|
||||
}
|
||||
|
||||
NamedWorkspaceContainerPadding(workspace, size) {
|
||||
RunWait("komorebic.exe named-workspace-container-padding " workspace " " size, , "Hide")
|
||||
}
|
||||
|
||||
WorkspacePadding(monitor, workspace, size) {
|
||||
RunWait("komorebic.exe workspace-padding " monitor " " workspace " " size, , "Hide")
|
||||
}
|
||||
|
||||
NamedWorkspacePadding(workspace, size) {
|
||||
RunWait("komorebic.exe named-workspace-padding " workspace " " size, , "Hide")
|
||||
}
|
||||
|
||||
WorkspaceLayout(monitor, workspace, value) {
|
||||
RunWait("komorebic.exe workspace-layout " monitor " " workspace " " value, , "Hide")
|
||||
}
|
||||
|
||||
NamedWorkspaceLayout(workspace, value) {
|
||||
RunWait("komorebic.exe named-workspace-layout " workspace " " value, , "Hide")
|
||||
}
|
||||
|
||||
WorkspaceCustomLayout(monitor, workspace, path) {
|
||||
RunWait("komorebic.exe workspace-custom-layout " monitor " " workspace " " path, , "Hide")
|
||||
}
|
||||
|
||||
NamedWorkspaceCustomLayout(workspace, path) {
|
||||
RunWait("komorebic.exe named-workspace-custom-layout " workspace " " path, , "Hide")
|
||||
}
|
||||
|
||||
WorkspaceLayoutRule(monitor, workspace, at_container_count, layout) {
|
||||
RunWait("komorebic.exe workspace-layout-rule " monitor " " workspace " " at_container_count " " layout, , "Hide")
|
||||
}
|
||||
|
||||
NamedWorkspaceLayoutRule(workspace, at_container_count, layout) {
|
||||
RunWait("komorebic.exe named-workspace-layout-rule " workspace " " at_container_count " " layout, , "Hide")
|
||||
}
|
||||
|
||||
WorkspaceCustomLayoutRule(monitor, workspace, at_container_count, path) {
|
||||
RunWait("komorebic.exe workspace-custom-layout-rule " monitor " " workspace " " at_container_count " " path, , "Hide")
|
||||
}
|
||||
|
||||
NamedWorkspaceCustomLayoutRule(workspace, at_container_count, path) {
|
||||
RunWait("komorebic.exe named-workspace-custom-layout-rule " workspace " " at_container_count " " path, , "Hide")
|
||||
}
|
||||
|
||||
ClearWorkspaceLayoutRules(monitor, workspace) {
|
||||
RunWait("komorebic.exe clear-workspace-layout-rules " monitor " " workspace, , "Hide")
|
||||
}
|
||||
|
||||
ClearNamedWorkspaceLayoutRules(workspace) {
|
||||
RunWait("komorebic.exe clear-named-workspace-layout-rules " workspace, , "Hide")
|
||||
}
|
||||
|
||||
WorkspaceTiling(monitor, workspace, value) {
|
||||
RunWait("komorebic.exe workspace-tiling " monitor " " workspace " " value, , "Hide")
|
||||
}
|
||||
|
||||
NamedWorkspaceTiling(workspace, value) {
|
||||
RunWait("komorebic.exe named-workspace-tiling " workspace " " value, , "Hide")
|
||||
}
|
||||
|
||||
WorkspaceName(monitor, workspace, value) {
|
||||
RunWait("komorebic.exe workspace-name " monitor " " workspace " " value, , "Hide")
|
||||
}
|
||||
|
||||
ToggleWindowContainerBehaviour() {
|
||||
RunWait("komorebic.exe toggle-window-container-behaviour", , "Hide")
|
||||
}
|
||||
|
||||
TogglePause() {
|
||||
RunWait("komorebic.exe toggle-pause", , "Hide")
|
||||
}
|
||||
|
||||
ToggleTiling() {
|
||||
RunWait("komorebic.exe toggle-tiling", , "Hide")
|
||||
}
|
||||
|
||||
ToggleFloat() {
|
||||
RunWait("komorebic.exe toggle-float", , "Hide")
|
||||
}
|
||||
|
||||
ToggleMonocle() {
|
||||
RunWait("komorebic.exe toggle-monocle", , "Hide")
|
||||
}
|
||||
|
||||
ToggleMaximize() {
|
||||
RunWait("komorebic.exe toggle-maximize", , "Hide")
|
||||
}
|
||||
|
||||
RestoreWindows() {
|
||||
RunWait("komorebic.exe restore-windows", , "Hide")
|
||||
}
|
||||
|
||||
Manage() {
|
||||
RunWait("komorebic.exe manage", , "Hide")
|
||||
}
|
||||
|
||||
Unmanage() {
|
||||
RunWait("komorebic.exe unmanage", , "Hide")
|
||||
}
|
||||
|
||||
ReloadConfiguration() {
|
||||
RunWait("komorebic.exe reload-configuration", , "Hide")
|
||||
}
|
||||
|
||||
WatchConfiguration(boolean_state) {
|
||||
RunWait("komorebic.exe watch-configuration " boolean_state, , "Hide")
|
||||
}
|
||||
|
||||
CompleteConfiguration() {
|
||||
RunWait("komorebic.exe complete-configuration", , "Hide")
|
||||
}
|
||||
|
||||
AltFocusHack(boolean_state) {
|
||||
RunWait("komorebic.exe alt-focus-hack " boolean_state, , "Hide")
|
||||
}
|
||||
|
||||
WindowHidingBehaviour(hiding_behaviour) {
|
||||
RunWait("komorebic.exe window-hiding-behaviour " hiding_behaviour, , "Hide")
|
||||
}
|
||||
|
||||
CrossMonitorMoveBehaviour(move_behaviour) {
|
||||
RunWait("komorebic.exe cross-monitor-move-behaviour " move_behaviour, , "Hide")
|
||||
}
|
||||
|
||||
ToggleCrossMonitorMoveBehaviour() {
|
||||
RunWait("komorebic.exe toggle-cross-monitor-move-behaviour", , "Hide")
|
||||
}
|
||||
|
||||
UnmanagedWindowOperationBehaviour(operation_behaviour) {
|
||||
RunWait("komorebic.exe unmanaged-window-operation-behaviour " operation_behaviour, , "Hide")
|
||||
}
|
||||
|
||||
FloatRule(identifier, id) {
|
||||
RunWait("komorebic.exe float-rule " identifier " `"" id "`"", , "Hide")
|
||||
}
|
||||
|
||||
ManageRule(identifier, id) {
|
||||
RunWait("komorebic.exe manage-rule " identifier " `"" id "`"", , "Hide")
|
||||
}
|
||||
|
||||
WorkspaceRule(identifier, id, monitor, workspace) {
|
||||
RunWait("komorebic.exe workspace-rule " identifier " `"" id "`" " monitor " " workspace, , "Hide")
|
||||
}
|
||||
|
||||
NamedWorkspaceRule(identifier, id, workspace) {
|
||||
RunWait("komorebic.exe named-workspace-rule " identifier " `"" id "`" " workspace, , "Hide")
|
||||
}
|
||||
|
||||
IdentifyObjectNameChangeApplication(identifier, id) {
|
||||
RunWait("komorebic.exe identify-object-name-change-application " identifier " `"" id "`"", , "Hide")
|
||||
}
|
||||
|
||||
IdentifyTrayApplication(identifier, id) {
|
||||
RunWait("komorebic.exe identify-tray-application " identifier " `"" id "`"", , "Hide")
|
||||
}
|
||||
|
||||
IdentifyLayeredApplication(identifier, id) {
|
||||
RunWait("komorebic.exe identify-layered-application " identifier " `"" id "`"", , "Hide")
|
||||
}
|
||||
|
||||
IdentifyBorderOverflowApplication(identifier, id) {
|
||||
RunWait("komorebic.exe identify-border-overflow-application " identifier " `"" id "`"", , "Hide")
|
||||
}
|
||||
|
||||
ActiveWindowBorder(boolean_state) {
|
||||
RunWait("komorebic.exe active-window-border " boolean_state, , "Hide")
|
||||
}
|
||||
|
||||
ActiveWindowBorderColour(r, g, b, window_kind) {
|
||||
RunWait("komorebic.exe active-window-border-colour " r " " g " " b " --window-kind " window_kind, , "Hide")
|
||||
}
|
||||
|
||||
ActiveWindowBorderWidth(width) {
|
||||
RunWait("komorebic.exe active-window-border-width " width, , "Hide")
|
||||
}
|
||||
|
||||
ActiveWindowBorderOffset(offset) {
|
||||
RunWait("komorebic.exe active-window-border-offset " offset, , "Hide")
|
||||
}
|
||||
|
||||
FocusFollowsMouse(boolean_state, implementation) {
|
||||
RunWait("komorebic.exe focus-follows-mouse " boolean_state " --implementation " implementation, , "Hide")
|
||||
}
|
||||
|
||||
ToggleFocusFollowsMouse(implementation) {
|
||||
RunWait("komorebic.exe toggle-focus-follows-mouse --implementation " implementation, , "Hide")
|
||||
}
|
||||
|
||||
MouseFollowsFocus(boolean_state) {
|
||||
RunWait("komorebic.exe mouse-follows-focus " boolean_state, , "Hide")
|
||||
}
|
||||
|
||||
ToggleMouseFollowsFocus() {
|
||||
RunWait("komorebic.exe toggle-mouse-follows-focus", , "Hide")
|
||||
}
|
||||
|
||||
AhkLibrary() {
|
||||
RunWait("komorebic.exe ahk-library", , "Hide")
|
||||
}
|
||||
|
||||
AhkAppSpecificConfiguration(path, override_path) {
|
||||
RunWait("komorebic.exe ahk-app-specific-configuration " path " " override_path, , "Hide")
|
||||
}
|
||||
|
||||
PwshAppSpecificConfiguration(path, override_path) {
|
||||
RunWait("komorebic.exe pwsh-app-specific-configuration " path " " override_path, , "Hide")
|
||||
}
|
||||
|
||||
FormatAppSpecificConfiguration(path) {
|
||||
RunWait("komorebic.exe format-app-specific-configuration " path, , "Hide")
|
||||
}
|
||||
|
||||
NotificationSchema() {
|
||||
RunWait("komorebic.exe notification-schema", , "Hide")
|
||||
}
|
||||
|
||||
SocketSchema() {
|
||||
RunWait("komorebic.exe socket-schema", , "Hide")
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "komorebic"
|
||||
version = "0.1.15"
|
||||
version = "0.1.16"
|
||||
authors = ["Jade Iqbal <jadeiqbal@fastmail.com>"]
|
||||
description = "The command-line interface for Komorebi, a tiling window manager for Windows"
|
||||
categories = ["cli", "tiling-window-manager", "windows"]
|
||||
@@ -16,7 +16,7 @@ komorebi-core = { path = "../komorebi-core" }
|
||||
|
||||
clap = { version = "4", features = ["derive", "wrap_help"] }
|
||||
color-eyre = "0.6"
|
||||
dirs = "4"
|
||||
dirs = "5"
|
||||
fs-tail = "0.1"
|
||||
heck = "0.4"
|
||||
lazy_static = "1"
|
||||
@@ -25,11 +25,11 @@ powershell_script = "1.0"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
serde_yaml = "0.9"
|
||||
sysinfo = "0.27"
|
||||
sysinfo = "0.29"
|
||||
uds_windows = "1"
|
||||
|
||||
[dependencies.windows]
|
||||
version = "0.44"
|
||||
version = "0.48"
|
||||
features = [
|
||||
"Win32_Foundation",
|
||||
"Win32_UI_WindowsAndMessaging"
|
||||
|
||||
@@ -9,6 +9,8 @@ use std::io::ErrorKind;
|
||||
use std::io::Write;
|
||||
use std::path::PathBuf;
|
||||
use std::process::Command;
|
||||
use std::sync::atomic::AtomicBool;
|
||||
use std::sync::atomic::Ordering;
|
||||
use std::time::Duration;
|
||||
|
||||
use clap::Parser;
|
||||
@@ -46,6 +48,7 @@ use komorebi_core::StateQuery;
|
||||
use komorebi_core::WindowKind;
|
||||
|
||||
lazy_static! {
|
||||
static ref HAS_CUSTOM_CONFIG_HOME: AtomicBool = AtomicBool::new(false);
|
||||
static ref HOME_DIR: PathBuf = {
|
||||
std::env::var("KOMOREBI_CONFIG_HOME").map_or_else(
|
||||
|_| dirs::home_dir().expect("there is no home directory"),
|
||||
@@ -53,6 +56,7 @@ lazy_static! {
|
||||
let home = PathBuf::from(&home_path);
|
||||
|
||||
if home.as_path().is_dir() {
|
||||
HAS_CUSTOM_CONFIG_HOME.store(true, Ordering::SeqCst);
|
||||
home
|
||||
} else {
|
||||
panic!(
|
||||
@@ -113,6 +117,8 @@ gen_enum_subcommand_args! {
|
||||
CycleMove: CycleDirection,
|
||||
CycleMoveToWorkspace: CycleDirection,
|
||||
CycleSendToWorkspace: CycleDirection,
|
||||
CycleSendToMonitor: CycleDirection,
|
||||
CycleMoveToMonitor: CycleDirection,
|
||||
CycleMonitor: CycleDirection,
|
||||
CycleWorkspace: CycleDirection,
|
||||
Stack: OperationDirection,
|
||||
@@ -509,6 +515,28 @@ gen_application_target_subcommand_args! {
|
||||
IdentifyBorderOverflowApplication,
|
||||
}
|
||||
|
||||
#[derive(Parser, AhkFunction)]
|
||||
struct InitialWorkspaceRule {
|
||||
#[clap(value_enum)]
|
||||
identifier: ApplicationIdentifier,
|
||||
/// Identifier as a string
|
||||
id: String,
|
||||
/// Monitor index (zero-indexed)
|
||||
monitor: usize,
|
||||
/// Workspace index on the specified monitor (zero-indexed)
|
||||
workspace: usize,
|
||||
}
|
||||
|
||||
#[derive(Parser, AhkFunction)]
|
||||
struct InitialNamedWorkspaceRule {
|
||||
#[clap(value_enum)]
|
||||
identifier: ApplicationIdentifier,
|
||||
/// Identifier as a string
|
||||
id: String,
|
||||
/// Name of a workspace
|
||||
workspace: String,
|
||||
}
|
||||
|
||||
#[derive(Parser, AhkFunction)]
|
||||
struct WorkspaceRule {
|
||||
#[clap(value_enum)]
|
||||
@@ -659,6 +687,8 @@ enum SubCommand {
|
||||
Start(Start),
|
||||
/// Stop the komorebi.exe process and restore all hidden windows
|
||||
Stop,
|
||||
/// Output various important komorebi-related environment values
|
||||
Check,
|
||||
/// Show a JSON representation of the current window manager state
|
||||
State,
|
||||
/// Query the current window manager state
|
||||
@@ -722,6 +752,9 @@ enum SubCommand {
|
||||
/// Move the focused window to the specified monitor
|
||||
#[clap(arg_required_else_help = true)]
|
||||
MoveToMonitor(MoveToMonitor),
|
||||
/// Move the focused window to the monitor in the given cycle direction
|
||||
#[clap(arg_required_else_help = true)]
|
||||
CycleMoveToMonitor(CycleMoveToMonitor),
|
||||
/// Move the focused window to the specified workspace
|
||||
#[clap(arg_required_else_help = true)]
|
||||
MoveToWorkspace(MoveToWorkspace),
|
||||
@@ -734,6 +767,9 @@ enum SubCommand {
|
||||
/// Send the focused window to the specified monitor
|
||||
#[clap(arg_required_else_help = true)]
|
||||
SendToMonitor(SendToMonitor),
|
||||
/// Send the focused window to the monitor in the given cycle direction
|
||||
#[clap(arg_required_else_help = true)]
|
||||
CycleSendToMonitor(CycleSendToMonitor),
|
||||
/// Send the focused window to the specified workspace
|
||||
#[clap(arg_required_else_help = true)]
|
||||
SendToWorkspace(SendToWorkspace),
|
||||
@@ -777,7 +813,6 @@ enum SubCommand {
|
||||
InvisibleBorders(InvisibleBorders),
|
||||
/// Set offsets to exclude parts of the work area from tiling
|
||||
#[clap(arg_required_else_help = true)]
|
||||
#[clap(alias = "global-work-area-offset")]
|
||||
GlobalWorkAreaOffset(GlobalWorkAreaOffset),
|
||||
/// Set offsets for a monitor to exclude parts of the work area from tiling
|
||||
#[clap(arg_required_else_help = true)]
|
||||
@@ -908,6 +943,12 @@ enum SubCommand {
|
||||
/// Add a rule to always manage the specified application
|
||||
#[clap(arg_required_else_help = true)]
|
||||
ManageRule(ManageRule),
|
||||
/// Add a rule to associate an application with a workspace on first show
|
||||
#[clap(arg_required_else_help = true)]
|
||||
InitialWorkspaceRule(InitialWorkspaceRule),
|
||||
/// Add a rule to associate an application with a named workspace on first show
|
||||
#[clap(arg_required_else_help = true)]
|
||||
InitialNamedWorkspaceRule(InitialNamedWorkspaceRule),
|
||||
/// Add a rule to associate an application with a workspace
|
||||
#[clap(arg_required_else_help = true)]
|
||||
WorkspaceRule(WorkspaceRule),
|
||||
@@ -981,6 +1022,45 @@ fn main() -> Result<()> {
|
||||
let opts: Opts = Opts::parse();
|
||||
|
||||
match opts.subcmd {
|
||||
SubCommand::Check => {
|
||||
let home = HOME_DIR.clone();
|
||||
let home_lossy_string = home.to_string_lossy();
|
||||
if HAS_CUSTOM_CONFIG_HOME.load(Ordering::SeqCst) {
|
||||
println!("KOMOREBI_CONFIG_HOME detected: {home_lossy_string}\n");
|
||||
} else {
|
||||
println!(
|
||||
"No KOMOREBI_CONFIG_HOME detected, defaulting to {}\n",
|
||||
dirs::home_dir()
|
||||
.expect("could not find home dir")
|
||||
.to_string_lossy()
|
||||
);
|
||||
}
|
||||
|
||||
println!("Looking for configuration files in {home_lossy_string}\n");
|
||||
|
||||
let mut config_pwsh = home.clone();
|
||||
config_pwsh.push("komorebi.ps1");
|
||||
|
||||
let mut config_ahk = home.clone();
|
||||
config_ahk.push("komorebi.ahk");
|
||||
|
||||
if config_pwsh.exists() {
|
||||
println!("Found komorebi.ps1; this file will be autoloaded by komorebi\n");
|
||||
let mut config_whkd = dirs::home_dir().expect("could not find home dir");
|
||||
config_whkd.push(".config");
|
||||
config_whkd.push("whkdrc");
|
||||
if config_whkd.exists() {
|
||||
println!("Found ~/.config/whkdrc; key bindings will be loaded from here when whkd is started\n");
|
||||
} else {
|
||||
println!("No ~/.config/whkdrc found; you may not be able to control komorebi with your keyboard\n");
|
||||
}
|
||||
} else if config_ahk.exists() {
|
||||
println!("Found komorebi.ahk; this file will be autoloaded by komorebi\n");
|
||||
} else {
|
||||
println!("No komorebi configuration found in {home_lossy_string}\n");
|
||||
println!("If running 'komorebic start --await-configuration', you will manually have to call the following command to begin tiling: komorebic complete-configuration\n");
|
||||
}
|
||||
}
|
||||
SubCommand::AhkLibrary => {
|
||||
let mut library = HOME_DIR.clone();
|
||||
library.push("komorebic.lib.ahk");
|
||||
@@ -996,17 +1076,19 @@ fn main() -> Result<()> {
|
||||
file.write_all(fixed_output.as_bytes())?;
|
||||
|
||||
println!(
|
||||
"\nAHK helper library for komorebic written to {}",
|
||||
"\nAHKv1 helper library for komorebic written to {}",
|
||||
library.to_str().ok_or_else(|| anyhow!(
|
||||
"could not find the path to the generated ahk lib file"
|
||||
))?
|
||||
);
|
||||
|
||||
println!("\nYou can convert this file to AHKv2 syntax using https://github.com/mmikeww/AHK-v2-script-converter");
|
||||
|
||||
println!(
|
||||
"\nYou can include the library at the top of your ~/komorebi.ahk config with this line:"
|
||||
"\nYou can include the converted library at the top of your komorebi.ahk config with this line:"
|
||||
);
|
||||
|
||||
println!("\n#Include %A_ScriptDir%\\komorebic.lib.ahk");
|
||||
println!("\n#Include komorebic.lib.ahk");
|
||||
}
|
||||
SubCommand::Log => {
|
||||
let mut color_log = std::env::temp_dir();
|
||||
@@ -1054,6 +1136,11 @@ fn main() -> Result<()> {
|
||||
SubCommand::MoveToMonitor(arg) => {
|
||||
send_message(&SocketMessage::MoveContainerToMonitorNumber(arg.target).as_bytes()?)?;
|
||||
}
|
||||
SubCommand::CycleMoveToMonitor(arg) => {
|
||||
send_message(
|
||||
&SocketMessage::CycleMoveContainerToMonitor(arg.cycle_direction).as_bytes()?,
|
||||
)?;
|
||||
}
|
||||
SubCommand::MoveToWorkspace(arg) => {
|
||||
send_message(&SocketMessage::MoveContainerToWorkspaceNumber(arg.target).as_bytes()?)?;
|
||||
}
|
||||
@@ -1068,6 +1155,11 @@ fn main() -> Result<()> {
|
||||
SubCommand::SendToMonitor(arg) => {
|
||||
send_message(&SocketMessage::SendContainerToMonitorNumber(arg.target).as_bytes()?)?;
|
||||
}
|
||||
SubCommand::CycleSendToMonitor(arg) => {
|
||||
send_message(
|
||||
&SocketMessage::CycleSendContainerToMonitor(arg.cycle_direction).as_bytes()?,
|
||||
)?;
|
||||
}
|
||||
SubCommand::SendToWorkspace(arg) => {
|
||||
send_message(&SocketMessage::SendContainerToWorkspaceNumber(arg.target).as_bytes()?)?;
|
||||
}
|
||||
@@ -1385,6 +1477,23 @@ fn main() -> Result<()> {
|
||||
SubCommand::ManageRule(arg) => {
|
||||
send_message(&SocketMessage::ManageRule(arg.identifier, arg.id).as_bytes()?)?;
|
||||
}
|
||||
SubCommand::InitialWorkspaceRule(arg) => {
|
||||
send_message(
|
||||
&SocketMessage::InitialWorkspaceRule(
|
||||
arg.identifier,
|
||||
arg.id,
|
||||
arg.monitor,
|
||||
arg.workspace,
|
||||
)
|
||||
.as_bytes()?,
|
||||
)?;
|
||||
}
|
||||
SubCommand::InitialNamedWorkspaceRule(arg) => {
|
||||
send_message(
|
||||
&SocketMessage::InitialNamedWorkspaceRule(arg.identifier, arg.id, arg.workspace)
|
||||
.as_bytes()?,
|
||||
)?;
|
||||
}
|
||||
SubCommand::WorkspaceRule(arg) => {
|
||||
send_message(
|
||||
&SocketMessage::WorkspaceRule(arg.identifier, arg.id, arg.monitor, arg.workspace)
|
||||
@@ -1699,12 +1808,6 @@ fn main() -> Result<()> {
|
||||
"could not find the path to the generated configuration file"
|
||||
))?
|
||||
);
|
||||
|
||||
println!(
|
||||
"\nYou can include the generated configuration at the top of your komorebi.ahk config with this line:"
|
||||
);
|
||||
|
||||
println!("\n#Include %A_ScriptDir%\\komorebi.generated.ahk");
|
||||
}
|
||||
SubCommand::PwshAppSpecificConfiguration(arg) => {
|
||||
let content = std::fs::read_to_string(resolve_windows_path(&arg.path)?)?;
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
.shell pwsh
|
||||
.shell powershell
|
||||
|
||||
# reload swhkd configuration
|
||||
# alt + o : taskkill /f /im swhkd.exe && start /b swhkd # if shell is cmd
|
||||
alt + o : taskkill /f /im swhkd.exe && Start-Process swhkd -WindowStyle hidden # if shell is pwsh / powershell
|
||||
# Reload whkd configuration
|
||||
# alt + o : taskkill /f /im whkd.exe && start /b whkd # if shell is cmd
|
||||
alt + o : taskkill /f /im whkd.exe && Start-Process whkd -WindowStyle hidden # if shell is pwsh / powershell
|
||||
alt + shift + o : komorebic reload-configuration
|
||||
|
||||
# app shortcuts - these require shell to be pwsh / powershell
|
||||
# the apps will be focused if open, or launched if not open
|
||||
# App shortcuts - these require shell to be pwsh / powershell
|
||||
# The apps will be focused if open, or launched if not open
|
||||
# alt + f : if ($wshell.AppActivate('Firefox') -eq $False) { start firefox }
|
||||
# alt + b : if ($wshell.AppActivate('Chrome') -eq $False) { start chrome }
|
||||
|
||||
# focus windows
|
||||
# Focus windows
|
||||
alt + h : komorebic focus left
|
||||
alt + j : komorebic focus down
|
||||
alt + k : komorebic focus up
|
||||
@@ -18,14 +18,14 @@ alt + l : komorebic focus right
|
||||
alt + shift + oem_4 : komorebic cycle-focus previous # oem_4 is [
|
||||
alt + shift + oem_6 : komorebic cycle-focus next # oem_6 is ]
|
||||
|
||||
# move windows
|
||||
# Move windows
|
||||
alt + shift + h : komorebic move left
|
||||
alt + shift + j : komorebic move down
|
||||
alt + shift + k : komorebic move up
|
||||
alt + shift + l : komorebic move right
|
||||
alt + shift + return : komorebic promote
|
||||
|
||||
# stack windows
|
||||
# Stack windows
|
||||
alt + left : komorebic stack left
|
||||
alt + down : komorebic stack down
|
||||
alt + up : komorebic stack up
|
||||
@@ -34,31 +34,30 @@ alt + oem_1 : komorebic unstack # oem_1 is ;
|
||||
alt + oem_4 : komorebic cycle-stack previous # oem_4 is [
|
||||
alt + oem_6 : komorebic cycle-stack next # oem_6 is ]
|
||||
|
||||
# resize
|
||||
# Resize
|
||||
alt + oem_plus : komorebic resize-axis horizontal increase
|
||||
alt + oem_minus : komorebic resize-axis horizontal decrease
|
||||
alt + shift + oem_plus : komorebic resize-axis vertical increase
|
||||
alt + shift + oem_minus : komorebic resize-axis vertical decrease
|
||||
|
||||
# manipulate windows
|
||||
# Manipulate windows
|
||||
alt + t : komorebic toggle-float
|
||||
alt + shift + f : komorebic toggle-monocle
|
||||
|
||||
# window manager options
|
||||
# Window manager options
|
||||
alt + shift + r : komorebic retile
|
||||
alt + p : komorebic toggle-pause
|
||||
alt + 0 : komorebic toggle-focus-follows-mouse
|
||||
|
||||
# layouts
|
||||
# Layouts
|
||||
alt + x : komorebic flip-layout horizontal
|
||||
alt + y : komorebic flip-layout vertical
|
||||
|
||||
# workspaces
|
||||
# Workspaces
|
||||
alt + 1 : komorebic focus-workspace 0
|
||||
alt + 2 : komorebic focus-workspace 1
|
||||
alt + 3 : komorebic focus-workspace 2
|
||||
|
||||
# move windows across workspaces
|
||||
# Move windows across workspaces
|
||||
alt + shift + 1 : komorebic move-to-workspace 0
|
||||
alt + shift + 2 : komorebic move-to-workspace 1
|
||||
alt + shift + 3 : komorebic move-to-workspace 2
|
||||
|
||||
Reference in New Issue
Block a user