[BUG]: Preserve floating layer when moving/focusing windows across monitors
Summary
Hi, I have come across Komorebi, and I have really loving this amazing peice of software. Thank you and all the contributors for creating such an amazing product.
I have come across this issue that I am stuck on and I would like to request help regarding if there is any possible solution or workaround to fix it. Any help would be greatly appreciated.
I would like the ability to move any focused window, to any other monitor, where it respects the type of window it is "floating" or "tiling" window.
The behavior I wanted was similar to the behavior you see in these commands:
komorebic focus down/up -> when it goes to the other monitor (this behavior occurs when it can no longer go up or down in the current windows, then goes to the next monitor), it ALWAYS RESPECTS if the window is in tiling mode or not - This is the exact sort of behavior I want komorebic komorebic focus-workspace -> This command when switching workspaces ALWAYS RESPECTS if the workspace that you focus is already in "floating" mode or "tiling" and does not revert it.
However, If I try to use any of these commands, they DO NOT respect the "floating" layer, and always revert it back to the "Tiling" layer. This causes it to always UNFOCUS any "floating" focused window I would move to another monitor because the floating layer is no longer active.
Trying to use any of these commands, they DO NOT respect the "floating" layer, and always revert it back to the "Tiling" layer
- komorebic cycle-move-to-monitor next/previous
- komorebic cycle-monitor next/previous
- komorebic move-to-monitor
I would like the ability to do a few things
- Focus another monitor while retaining the proper layer that workspace was previously in (Tiling or Floating).
Trying to do following command always swithes it to "Tiling" layer even if that workspace was in "Floating" Layer alt + shift + d : komorebic cycle-monitor next;
If the monitor that is switched to is already in "Floating" Layer, it should not revert it back to "Tiling" Layer.
I also have a command that lets me very easily send the focused window to the other monitor in a given workspace:
# Note 'komorebic retile' is used to retile (or readjust tile size), which removes weird stuff like left over borders and window not being full size or properly sized. NEED TO ADD SLEEP OTHERWISE CAUSES ISSUES.
alt + shift + 1 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 0; Start-Sleep -Milliseconds 150; komorebic retile;
alt + shift + 2 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 1; Start-Sleep -Milliseconds 150; komorebic retile;
alt + shift + 3 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 2; Start-Sleep -Milliseconds 150; komorebic retile;
alt + shift + 4 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 3; Start-Sleep -Milliseconds 150; komorebic retile;
alt + shift + 5 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 4; Start-Sleep -Milliseconds 150; komorebic retile;
This works great for any focused window that is not a "floating" window. when pressing alt + shift + 2 for example it will send it to my other monitor in the 2nd workspace. Pressing it again would send it back to my previous monitor in workspace 2.
However, if I try do to run these commands if the focused window is a "floating" window, it will first move the focused window to the other monitor, then it will force "Tiling" Layer, which will cause the floating window I just moved to lose focus which would then make it unable to move that tiling focused window to the specified workspace I had wanted. It would just be stuck on the exact workspace the other monitor was at. If the monitor I wanted to move the tiling window was at workspace 1 and I pressed ALT+SHIFT+3 wanting to send a tiling window to that monitor for workspace 3, it would not work. Instead, it would focus the monitor I moved the window to, change it to Tiling mode, and then not move to workspace 3.
Major issue with forcing "Tiling" Layer
There is a major reason why always forcing to "Tiling" Layer is a major issue. Anytime we switch back from "Floating" layer to "Tiling" Layer, it does not retain the order of which floating windows were most recently focused. Rather it always defaults to the order in which floating windows were added (when using the komorebic cycel-focus <previous/next> commands).
Example: I float following windows in order
- Notepad
- File Explorer
- Notepad++
- Notion
Say I want to then use Notion for referencing my notes repteadly and quickly switch between Tiling layer and floating layer. Anytime I switch to tiling layer and see a pdf or do anything then go back to "Floating" Layer, it would not show me Notion as the first window, rather it would show me Notepad, then file explorer, then notepad++ then notion.
When using following commands to move between floating windows:
alt + u : komorebic cycle-focus previous alt + shift + u : komorebic cycle-focus next
Two things to note, komorebic cycle-focus next gets bugged where it won't let you move past first window, so you are forced to use komorebic cycle-focus previous to switch between the windows.
The behavior here is not consistent with moving floating windows with
komorebic focus left/right/up/down
Which actually retains the exact window when you switch between layers. Cycle-focus does not. Reason I would prefer using cycle-focus is because it ensures I never get out of tiling mode and stay within the same workspace. Using "komorebic focus
Here is a video example. I am not sure how to create a video for two monitors, so the monitor you see is the window where I am going to move my focused-window to.
https://github.com/user-attachments/assets/8c0e1863-2000-43ca-8143-f45f03445112
I run command "komorebic cycle-move-to-monitor next; komorebic move-to-workspace 1; Start-Sleep -Milliseconds 150; komorebic retile;" where my focused window was a WARP terminal application.
The monitor you see where I will move to is at the start in floating layer, however, the moment komorebic cycle-move-to-monitor next runs it will automatically change it to tiling layer. Then triggering floating layer, it will not immediately focus the Warp Terminal that w
It is a bit confusing to show, but the moment you see the adobe pdf, is when the window was moved, it auto changed from the floating window mode to the tiling mode.
I believe what should happen is that instead of it going to tiling mode, it should immediately just put warp at the front focused and remain in floating mode.
I just want to know how the following can happen
If I move any Floating window to another monitor with cycle-move-to-monitor, how can it retain floating layer in that monitor instead of it always defaulting to tiling layer. If I focus another monitor with cycle-monitor, how can it respect whatever layer that workspace window is on, floating or tiling without it always forcing it into tiling layer.
Version Information
OS Name/Version: Edition Windows 10 Home Version 22H2 Installed on 11/20/2020 OS Build 19045.6456
============= komorebi Version: komorebic 0.1.38 tag:v0.1.38 commit_hash:ffa76ea2 build_time:2025-09-13 18:40:25 +00:00 build_env:rustc 1.89.0 (29483883e 2025-08-04),stable-x86_64-pc-windows-msvc
Komorebi Configuration
Komorebi.json file:
{
"$schema": "https://raw.githubusercontent.com/LGUG2Z/komorebi/v0.1.37/schema.json",
"app_specific_configuration_path": "$Env:KOMOREBI_CONFIG_HOME/applications.json",
"window_hiding_behaviour": "Cloak",
"cross_monitor_move_behaviour": "Insert",
"cross_boundary_behaviour": "Workspace",
"window_handling_behaviour": "Async",
"floating_layer_behaviour": "Float",
"mouse_follows_focus": true,
"focus_follows_mouse": "Komorebi",
"default_workspace_padding": 0,
"default_container_padding": -1,
"toggle_float_placement": "CenterAndResize",
"floating_window_aspect_ratio": "Widescreen",
"floating_layer_placement": "Center",
"float_rule_placement": "Center",
"border": true,
"border_implementation": "Komorebi",
"border_width": 4,
"border_offset": 0,
"border_style": "Rounded",
"border_colours": {
"single": "#28c6ff",
"stack": "#00ff7b",
"monocle": "#ec5959",
"floating": "#fbf1c7",
"unfocused": "#353333",
"unfocused_locked": "#ff2e2e"
},
"animation": {
"enabled": true,
"duration": 250,
"fps": 120,
"style": {
"movement": "EaseOutBack",
"transparency": "Linear"
}
},
"transparency": false,
"transparency_alpha": 240,
"bar_configurations": [
"$Env:KOMOREBI_CONFIG_HOME/komorebi.bar.monitor1.json",
"$Env:KOMOREBI_CONFIG_HOME/komorebi.bar.monitor2.json"
],
"display_index_preferences": {
"0": "Z7K00615SL0",
"1": "38796"
},
"monitors": [
{
"name": "Primary",
"workspaces": [
{
"name": "1",
"layout": "VerticalStack",
"initial_workspace_rules": [
{
"kind": "Exe",
"id": "opera.exe",
"matching_strategy": "Equals"
},
{
"kind": "Exe",
"id": "olk.exe",
"matching_strategy": "Equals"
}
]
},
{
"name": "2",
"layout": "Grid",
"initial_workspace_rules": [
{
"kind": "Exe",
"id": "explorer.exe",
"matching_strategy": "Equals"
}
],
"window_container_behaviour": "Create"
},
{
"name": "3",
"layout": "Grid"
},
{
"name": "4",
"layout": "UltrawideVerticalStack"
},
{
"name": "5",
"layout": "Grid"
}
]
},
{
"name": "Secondary",
"workspaces": [
{
"name": "I",
"layout": "BSP",
"initial_workspace_rules": [
{
"kind": "Exe",
"id": "Obsidian.exe",
"matching_strategy": "Equals"
},
{
"kind": "Exe",
"id": "Notion.exe",
"matching_strategy": "Equals"
}
],
"float_override": false
},
{
"name": "II",
"layout": "RightMainVerticalStack",
"initial_workspace_rules": [
{
"kind": "Exe",
"id": "Code.exe",
"matching_strategy": "Equals"
},
{
"kind": "Exe",
"id": "warp.exe",
"matching_strategy": "Equals"
}
],
"window_container_behaviour": "Append"
},
{
"name": "III",
"layout": "Grid"
},
{
"name": "IV",
"layout": "Grid"
},
{
"name": "V",
"layout": "Grid"
}
]
}
],
"floating_applications": [
{
"kind": "Exe",
"id": "PowerToys.Settings.exe",
"matching_strategy": "Equals"
},
{
"kind": "Exe",
"id": "olk.exe",
"matching_strategy": "Equals"
},
{
"kind": "Exe",
"id": "Notion.exe",
"matching_strategy": "Equals"
},
{
"kind": "Exe",
"id": "warp.exe",
"matching_strategy": "Equals"
},
{
"kind": "Exe",
"id": "notepad++.exe",
"matching_strategy": "Equals"
},
{
"kind": "Exe",
"id": "Everything.exe",
"matching_strategy": "Equals"
}
],
"layered_applications": [
{
"kind": "Exe",
"id": "WhatsApp.exe",
"matching_strategy": "Equals"
}
],
"manage_rules": [
{
"kind": "Exe",
"id": "claude.exe",
"matching_strategy": "Equals"
}
],
"ignore_rules": [
{
"kind": "Title",
"id": "Snipaste",
"matching_strategy": "Equals"
},
{
"kind": "Exe",
"id": "ShareX.exe",
"matching_strategy": "Equals"
},
{
"kind": "Title",
"id": "Steam",
"matching_strategy": "Equals"
},
[
{
"kind": "Exe",
"id": "ApplicationFrameHost.exe",
"matching_strategy": "Equals"
},
{
"kind": "Title",
"id": "WhatsApp",
"matching_strategy": "DoesNotEqual"
}
],
{
"kind": "Title",
"id": "Microsoft Store",
"matching_strategy": "Equals"
},
{
"kind": "Exe",
"id": "vlc.exe",
"matching_strategy": "Equals"
},
{
"kind": "Exe",
"id": "espansod.exe",
"matching_strategy": "Equals"
}
]
}
Hotkey Configuration
.shell powershell
alt + o : taskkill /f /im whkd.exe; Start-Process whkd -WindowStyle hidden alt + shift + o : komorebic reload-configuration alt + oem_comma : komorebic toggle-shortcuts alt + j : komorebic focus left alt + k : komorebic focus down alt + i : komorebic focus up alt + l : komorebic focus right alt + shift + j : komorebic move left alt + shift + k : komorebic move down alt + shift + i : komorebic move up alt + shift + l : komorebic move right alt + shift + return : komorebic promote ctrl + alt + j : komorebic stack left ctrl + alt + k : komorebic stack down ctrl + alt + i : komorebic stack up ctrl + alt + l : komorebic stack right alt + h : komorebic stack-all alt + shift + h : komorebic unstack-all alt + a : komorebic focus-monitor-at-cursor; komorebic cycle-stack previous alt + s : komorebic focus-monitor-at-cursor; komorebic cycle-stack next alt + shift + a : komorebic focus-monitor-at-cursor; komorebic unstack alt + oem_4 : komorebic cycle-stack-index previous alt + oem_6 : komorebic cycle-stack-index next alt + oem_plus : 1..4 | ForEach-Object { komorebic resize-axis horizontal increase } alt + oem_minus : komorebic resize-axis horizontal decrease alt + shift + oem_plus : 1..3 | ForEach-Object { komorebic resize-axis vertical increase } alt + shift + oem_minus : komorebic resize-axis vertical decrease alt + q : if (Get-Process -Name "masir" -ErrorAction SilentlyContinue) { taskkill /f /im masir.exe }; Start-Process masir -WindowStyle Hidden; Start-Sleep -Milliseconds 400; taskkill /f /im masir.exe; alt + shift + q : komorebic close alt + n : komorebic minimize alt + shift + n : komorebic restore-windows alt + m : komorebic manage alt + shift + m : komorebic unmanage alt + e : komorebic toggle-float; alt + shift + e : komorebic focus-monitor-at-cursor; komorebic toggle-workspace-layer; alt + t : komorebic toggle-float-override alt + f : komorebic toggle-maximize alt + shift + f : komorebic toggle-monocle alt + shift + r : komorebic retile alt + oem_period : komorebic stop --whkd --bar; Start-Sleep -Milliseconds 150; komorebic start --whkd --bar alt + p : komorebic toggle-pause alt + x : komorebic flip-layout horizontal alt + y : komorebic flip-layout vertical alt + shift + y : komorebic cycle-layout next alt + shift + x : komorebic cycle-layout previous lwin + shift + right : komorebic cycle-move-to-monitor next lwin + up : komorebic cycle-monitor next lwin + down : komorebic cycle-monitor previous lwin + shift + down : komorebic cycle-workspace previous lwin + shift + up : komorebic cycle-workspace next alt + u : komorebic cycle-focus previous alt + shift + u : komorebic cycle-focus next alt + d : komorebic focus-monitor-at-cursor; komorebic focus-last-workspace alt + shift + d : komorebic cycle-monitor next; alt + 1 : komorebic focus-monitor-at-cursor; komorebic focus-workspace 0 alt + 2 : komorebic focus-monitor-at-cursor; komorebic focus-workspace 1 alt + 3 : komorebic focus-monitor-at-cursor; komorebic focus-workspace 2 alt + 4 : komorebic focus-monitor-at-cursor; komorebic focus-workspace 3 alt + 5 : komorebic focus-monitor-at-cursor; komorebic focus-workspace 4 alt + 6 : komorebic focus-monitor-at-cursor; komorebic focus-workspace 5 alt + 7 : komorebic focus-monitor-at-cursor; komorebic focus-workspace 6 alt + 8 : komorebic focus-monitor-at-cursor; komorebic focus-workspace 7 lwin + 1 : komorebic focus-workspaces 0 lwin + 2 : komorebic focus-workspaces 1 lwin + 3 : komorebic focus-workspaces 2 lwin + 4 : komorebic focus-workspaces 3 lwin + 5 : komorebic focus-workspaces 4 lwin + 6 : komorebic focus-workspaces 5 lwin + 7 : komorebic focus-workspaces 6 lwin + 8 : komorebic focus-workspaces 7 ctrl + shift + 1 : komorebic focus-monitor-at-cursor; komorebic move-to-workspace 0 ctrl + shift + 2 : komorebic focus-monitor-at-cursor; komorebic move-to-workspace 1 ctrl + shift + 3 : komorebic focus-monitor-at-cursor; komorebic move-to-workspace 2 ctrl + shift + 4 : komorebic focus-monitor-at-cursor; komorebic move-to-workspace 3 ctrl + shift + 5 : komorebic focus-monitor-at-cursor; komorebic move-to-workspace 4 ctrl + shift + 6 : komorebic focus-monitor-at-cursor; komorebic move-to-workspace 5 ctrl + shift + 7 : komorebic focus-monitor-at-cursor; komorebic move-to-workspace 6 ctrl + shift + 8 : komorebic focus-monitor-at-cursor; komorebic move-to-workspace 7 alt + shift + 1 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 0; Start-Sleep -Milliseconds 150; komorebic retile; alt + shift + 2 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 1; Start-Sleep -Milliseconds 150; komorebic retile; alt + shift + 3 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 2; Start-Sleep -Milliseconds 150; komorebic retile; alt + shift + 4 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 3; Start-Sleep -Milliseconds 150; komorebic retile; alt + shift + 5 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 4; Start-Sleep -Milliseconds 150; komorebic retile; alt + shift + 6 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 5; Start-Sleep -Milliseconds 150; komorebic retile; alt + shift + 7 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 6; Start-Sleep -Milliseconds 150; komorebic retile; alt + shift + 8 : komorebic cycle-move-to-monitor next; komorebic move-to-workspace 7; Start-Sleep -Milliseconds 150; komorebic retile; alt + z : if ($(komorebic query focused-monitor-index) -eq 0) { komorebic swap-workspaces-with-monitor 1 } else { komorebic swap-workspaces-with-monitor 0 }
Output of komorebic check
komorebic check KOMOREBI_CONFIG_HOME detected: C:\Users\Syed.config\komorebi
Looking for configuration files in C:\Users\Syed.config\komorebi
Found komorebi.json; this file can be passed to the start command with the --config flag
"focus_follows_mouse" is now end-of-life
End-of-life features will not receive any further bug fixes or updates; they should not be used
Found C:\Users\Syed.config\komorebi\whkdrc; key bindings will be loaded from here when whkd is started, and you can start it automatically using the --whkd flag