LGUG2Z / komorebi

A tiling window manager for Windows πŸ‰
https://lgug2z.github.io/komorebi/
Other
9.59k stars 198 forks source link

[BUG]: Unexpected behavior after enabling monocle mode on a window stack #770

Closed RaptDept closed 7 months ago

RaptDept commented 7 months ago

Describe the bug Enabling monocle mode on a stack of windows causes unexpected behavior:

To Reproduce Steps to reproduce the behavior:

  1. Stack two windows
  2. Set focus on the stack
  3. Turn monocle mode on
  4. Turn monocle mode off, notice that nothing happens. Do any of the following in this state:
    • Unstacking restores the windows to their unstacked state as expected
    • Cycling through the stack instead of unstacking causes the tiling behavior described above
    • Triggering komorebic promote will cause a panic and komorebi will stop responding (this can also happen in step 3)

Expected behavior

Screenshots and Videos Add screenshots and videos to help explain your problem.

Operating System

OS Name:                   Microsoft Windows 11 Pro
OS Version:                10.0.22621 N/A Build 22621

komorebic check Output

KOMOREBI_CONFIG_HOME detected: C:\Users\[username]\.komorebi

Looking for configuration files in C:\Users\[username]\.komorebi

Found komorebi.json; this file can be passed to the start command with the --config flag

Found C:\Users\[username]\.config\whkdrc; key bindings will be loaded from here when whkd is started, and you can start it automatically using the --whkd flag

Additional context

2024-04-18T01:55:44.930419Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 198188 })}:focus_window{idx=0}: komorebi::container: focusing window
2024-04-18T01:55:44.931168Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 198188 })}:focus_container{idx=1}: komorebi::workspace: focusing container
2024-04-18T01:55:44.931657Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 198188 })}:update_focused_workspace{follow_focus=false}: komorebi::window_manager: updating
2024-04-18T01:55:45.032177Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 198188 })}: komorebi::process_event: processed: (hwnd: 198188, title: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.EXE, exe: powershell.exe, class: ConsoleWindowClass)
2024-04-18T01:55:45.096368Z  INFO process_event{event=Hide(ObjectHide, Window { hwnd: 198188 })}:focus_container{idx=0}: komorebi::workspace: focusing container
2024-04-18T01:55:45.096979Z  INFO process_event{event=Hide(ObjectHide, Window { hwnd: 198188 })}:update_focused_workspace{follow_focus=false}: komorebi::window_manager: updating
2024-04-18T01:55:45.170695Z  INFO process_event{event=Hide(ObjectHide, Window { hwnd: 198188 })}: komorebi::process_event: processed: (hwnd: 198188, title: Administrator: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.EXE, exe: powershell.exe, class: ConsoleWindowClass)
2024-04-18T01:55:45.330731Z  INFO process_command{Stop}: komorebi::process_command: received stop command, restoring all hidden windows and terminating process
2024-04-18T01:55:45.333977Z  INFO process_command{Stop}:restore_all_windows: komorebi::window_manager: restoring all hidden windows
2024-04-18T01:55:46.449943Z  INFO foreground_lock_timeout: komorebi::windows_api: current value of ForegroundLockTimeout is 0
2024-04-18T01:55:46.461309Z  INFO komorebi: creating window manager from static configuration file: C:\Users\[username]\.komorebi\komorebi-single.json
2024-04-18T01:55:46.468031Z  INFO init: komorebi::window_manager: initialising
2024-04-18T01:55:46.516351Z  INFO komorebi::process_command: listening on komorebi.sock
2024-04-18T01:55:46.535110Z  INFO komorebi::process_event: listening
2024-04-18T01:55:47.105698Z  INFO process_event{event=DisplayChange(Window { hwnd: 394828 })}: komorebi::process_event: processed: (hwnd: 394828, title: komorebi-hidden, exe: komorebi.exe, class: komorebi-hidden)
2024-04-18T01:55:47.502989Z  INFO process_command{AddSubscriberPipe("yasb-c6681530-fd26-11ee-8458-b48c9d8e08f0")}: komorebi::process_command: processed
2024-04-18T01:55:47.567699Z  INFO process_command{State}: komorebi::process_command: replying to state
2024-04-18T01:55:47.568150Z  INFO process_command{State}: komorebi::process_command: replying to state done
2024-04-18T01:55:47.569849Z  INFO process_command{State}: komorebi::process_command: processed
2024-04-18T01:55:47.633885Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 4985358 })}:focus_window{idx=0}: komorebi::container: focusing window
2024-04-18T01:55:47.634544Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 4985358 })}:focus_container{idx=1}: komorebi::workspace: focusing container
2024-04-18T01:55:47.634975Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 4985358 })}:update_focused_workspace{follow_focus=false}: komorebi::window_manager: updating
2024-04-18T01:55:47.980041Z ERROR komorebi::process_event: Invalid window handle. (0x80070578)
2024-04-18T01:55:47.992314Z ERROR komorebi::process_event: there is no monitor associated with this window, it may have already been destroyed
2024-04-18T01:55:48.011335Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 463424 })}:focus_container{idx=0}: komorebi::workspace: focusing container
2024-04-18T01:55:48.085855Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 463424 })}: komorebi::process_event: reaped 1 orphan window(s) and 0 orphaned container(s) on monitor: 0, workspace: 0
2024-04-18T01:55:48.117235Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 463424 })}:focus_window{idx=0}: komorebi::container: focusing window
2024-04-18T01:55:48.118535Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 463424 })}:focus_container{idx=1}: komorebi::workspace: focusing container
2024-04-18T01:55:48.137323Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 463424 })}:update_focused_workspace{follow_focus=false}: komorebi::window_manager: updating
2024-04-18T01:55:48.166218Z ERROR komorebi::process_event: The parameter is incorrect. (0x80070057)
2024-04-18T01:55:48.180961Z ERROR komorebi::process_event: there is no monitor associated with this window, it may have already been destroyed
2024-04-18T01:55:48.191718Z ERROR komorebi::process_event: there is no monitor associated with this window, it may have already been destroyed
2024-04-18T01:55:48.207253Z ERROR komorebi::process_event: there is no monitor associated with this window, it may have already been destroyed
2024-04-18T01:55:48.223568Z ERROR komorebi::process_event: there is no monitor associated with this window, it may have already been destroyed
2024-04-18T01:55:48.240351Z ERROR komorebi::process_event: there is no monitor associated with this window, it may have already been destroyed
2024-04-18T01:55:48.241147Z ERROR komorebi::process_event: there is no monitor associated with this window, it may have already been destroyed
2024-04-18T01:55:48.251805Z ERROR komorebi::process_event: there is no monitor associated with this window, it may have already been destroyed
2024-04-18T01:55:48.266079Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 856574 })}:focus_container{idx=0}: komorebi::workspace: focusing container
2024-04-18T01:55:48.344884Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 856574 })}: komorebi::process_event: reaped 1 orphan window(s) and 0 orphaned container(s) on monitor: 0, workspace: 0
2024-04-18T01:55:48.362148Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 856574 })}:focus_window{idx=0}: komorebi::container: focusing window
2024-04-18T01:55:48.362867Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 856574 })}:focus_container{idx=1}: komorebi::workspace: focusing container
2024-04-18T01:55:48.383351Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 856574 })}:update_focused_workspace{follow_focus=false}: komorebi::window_manager: updating
2024-04-18T01:55:48.405711Z ERROR komorebi::process_event: The parameter is incorrect. (0x80070057)
2024-04-18T01:55:48.419239Z ERROR komorebi::process_event: there is no monitor associated with this window, it may have already been destroyed
2024-04-18T01:55:48.433690Z ERROR komorebi::process_event: there is no monitor associated with this window, it may have already been destroyed
2024-04-18T01:55:48.435387Z ERROR komorebi::process_event: there is no monitor associated with this window, it may have already been destroyed
2024-04-18T01:55:48.459838Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 17961494 })}:focus_container{idx=0}: komorebi::workspace: focusing container
2024-04-18T01:55:48.496419Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 17961494 })}: komorebi::process_event: reaped 1 orphan window(s) and 0 orphaned container(s) on monitor: 0, workspace: 0
2024-04-18T01:55:48.516291Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 17961494 })}:focus_window{idx=0}: komorebi::container: focusing window
2024-04-18T01:55:48.525289Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 17961494 })}:focus_container{idx=1}: komorebi::workspace: focusing container
2024-04-18T01:55:48.538900Z  INFO process_event{event=Show(ObjectShow, Window { hwnd: 17961494 })}:update_focused_workspace{follow_focus=false}: komorebi::window_manager: updating
2024-04-18T01:55:48.562118Z ERROR komorebi::process_event: The parameter is incorrect. (0x80070057)
2024-04-18T01:55:48.571761Z ERROR komorebi::process_event: there is no monitor associated with this window, it may have already been destroyed
2024-04-18T01:55:48.572658Z  INFO process_event{event=Hide(ObjectHide, Window { hwnd: 4985358 })}:focus_container{idx=0}: komorebi::workspace: focusing container
2024-04-18T01:55:48.631851Z  INFO process_event{event=Hide(ObjectHide, Window { hwnd: 4985358 })}: komorebi::process_event: reaped 1 orphan window(s) and 0 orphaned container(s) on monitor: 0, workspace: 0
2024-04-18T01:55:48.639651Z ERROR komorebi::process_event: Invalid window handle. (os error 1400)
2024-04-18T01:55:48.641746Z ERROR komorebi::process_event: Invalid window handle. (os error 1400)
2024-04-18T01:55:48.643237Z ERROR komorebi::process_event: Invalid window handle. (os error 1400)
2024-04-18T01:55:48.646157Z ERROR komorebi::process_event: Invalid window handle. (os error 1400)
2024-04-18T01:55:48.648000Z ERROR komorebi::process_event: Invalid window handle. (os error 1400)
2024-04-18T01:55:48.650521Z ERROR komorebi::process_event: Invalid window handle. (os error 1400)
2024-04-18T01:55:48.653000Z ERROR komorebi::process_event: Invalid window handle. (os error 1400)
2024-04-18T01:55:56.354937Z  INFO process_event{event=FocusChange(SystemForeground, Window { hwnd: 1249470 })}:focus_window{idx=0}: komorebi::container: focusing window
2024-04-18T01:55:56.355891Z  INFO process_event{event=FocusChange(SystemForeground, Window { hwnd: 1249470 })}:focus_container{idx=1}: komorebi::workspace: focusing container
2024-04-18T01:55:56.372511Z  INFO process_event{event=FocusChange(SystemForeground, Window { hwnd: 1249470 })}: komorebi::process_event: processed: (hwnd: 1249470, title: Primary β€” New Issue Β· LGUG2Z/komorebi β€” Mozilla Firefox, exe: firefox.exe, class: MozillaWindowClass)
2024-04-18T01:56:01.687435Z  INFO process_command{StackWindow(Left)}:add_window_to_container{direction=Left}: komorebi::window_manager: adding window to container
2024-04-18T01:56:01.712562Z  INFO process_command{StackWindow(Left)}:add_window_to_container{direction=Left}:focus_window{idx=1}: komorebi::container: focusing window
2024-04-18T01:56:01.713667Z  INFO process_command{StackWindow(Left)}:add_window_to_container{direction=Left}:focus_container{idx=0}: komorebi::workspace: focusing container
2024-04-18T01:56:01.726573Z  INFO process_command{StackWindow(Left)}:add_window_to_container{direction=Left}:update_focused_workspace{follow_focus=false}: komorebi::window_manager: updating
2024-04-18T01:56:01.788820Z  INFO process_command{StackWindow(Left)}: komorebi::process_command: processed
2024-04-18T01:56:01.795749Z  INFO process_event{event=Cloak(ObjectCloaked, Window { hwnd: 594262 })}: komorebi::process_event: processed: (hwnd: 594262, title: komorebi.log - Visual Studio Code, exe: Code.exe, class: Chrome_WidgetWin_1)
2024-04-18T01:56:02.776156Z  INFO process_command{ToggleMonocle}:toggle_monocle:monocle_on: komorebi::window_manager: enabling monocle
2024-04-18T01:56:02.781346Z  INFO process_command{ToggleMonocle}:toggle_monocle:update_focused_workspace{follow_focus=true}: komorebi::window_manager: updating
2024-04-18T01:56:02.805207Z  INFO process_command{ToggleMonocle}: komorebi::process_command: processed
2024-04-18T01:56:05.213979Z  INFO process_command{ToggleMonocle}:toggle_monocle:monocle_off: komorebi::window_manager: disabling monocle
2024-04-18T01:56:05.216762Z  INFO process_command{ToggleMonocle}:toggle_monocle:monocle_off:focus_container{idx=0}: komorebi::workspace: focusing container
2024-04-18T01:56:05.223620Z  INFO process_command{ToggleMonocle}:toggle_monocle:update_focused_workspace{follow_focus=true}: komorebi::window_manager: updating
2024-04-18T01:56:05.231396Z ERROR komorebi::process_command: The parameter is incorrect. (0x80070057)
2024-04-18T01:56:15.036733Z  INFO process_command{CycleStack(Previous)}:cycle_container_window_in_direction{direction=Previous}: komorebi::window_manager: cycling container windows
2024-04-18T01:56:15.039523Z  INFO process_command{CycleStack(Previous)}:cycle_container_window_in_direction{direction=Previous}:focus_window{idx=0}: komorebi::container: focusing window
2024-04-18T01:56:15.048868Z  INFO process_command{CycleStack(Previous)}:cycle_container_window_in_direction{direction=Previous}:update_focused_workspace{follow_focus=false}: komorebi::window_manager: updating
2024-04-18T01:56:15.049509Z ERROR komorebi::process_command: Invalid window handle. (0x80070578)
2024-04-18T01:56:15.058254Z  INFO process_event{event=Uncloak(ObjectUncloaked, Window { hwnd: 594262 })}: komorebi::process_event: processed: (hwnd: 594262, title: komorebi.log - Visual Studio Code, exe: Code.exe, class: Chrome_WidgetWin_1)
2024-04-18T01:56:15.062349Z  INFO process_event{event=Cloak(ObjectCloaked, Window { hwnd: 1249470 })}: komorebi::process_event: processed: (hwnd: 1249470, title: Primary β€” New Issue Β· LGUG2Z/komorebi β€” Mozilla Firefox, exe: firefox.exe, class: MozillaWindowClass)
2024-04-18T01:56:18.537240Z  INFO process_command{CycleStack(Previous)}:cycle_container_window_in_direction{direction=Previous}: komorebi::window_manager: cycling container windows
2024-04-18T01:56:18.541748Z  INFO process_command{CycleStack(Previous)}:cycle_container_window_in_direction{direction=Previous}:focus_window{idx=1}: komorebi::container: focusing window
2024-04-18T01:56:18.550805Z  INFO process_command{CycleStack(Previous)}:cycle_container_window_in_direction{direction=Previous}:update_focused_workspace{follow_focus=false}: komorebi::window_manager: updating
2024-04-18T01:56:18.551324Z ERROR komorebi::process_command: Invalid window handle. (0x80070578)
2024-04-18T01:56:18.559803Z  INFO process_event{event=Cloak(ObjectCloaked, Window { hwnd: 594262 })}: komorebi::process_event: processed: (hwnd: 594262, title: komorebi.log - Visual Studio Code, exe: Code.exe, class: Chrome_WidgetWin_1)
2024-04-18T01:56:18.576341Z  INFO process_event{event=Uncloak(ObjectUncloaked, Window { hwnd: 1249470 })}: komorebi::process_event: processed: (hwnd: 1249470, title: Primary β€” New Issue Β· LGUG2Z/komorebi β€” Mozilla Firefox, exe: firefox.exe, class: MozillaWindowClass)
2024-04-18T01:56:21.179190Z  INFO process_command{CycleStack(Previous)}:cycle_container_window_in_direction{direction=Previous}: komorebi::window_manager: cycling container windows
2024-04-18T01:56:21.182615Z  INFO process_command{CycleStack(Previous)}:cycle_container_window_in_direction{direction=Previous}:focus_window{idx=0}: komorebi::container: focusing window
2024-04-18T01:56:21.190657Z  INFO process_command{CycleStack(Previous)}:cycle_container_window_in_direction{direction=Previous}:update_focused_workspace{follow_focus=false}: komorebi::window_manager: updating
2024-04-18T01:56:21.191236Z ERROR komorebi::process_command: Invalid window handle. (0x80070578)
2024-04-18T01:56:21.199751Z  INFO process_event{event=Uncloak(ObjectUncloaked, Window { hwnd: 594262 })}: komorebi::process_event: processed: (hwnd: 594262, title: komorebi.log - Visual Studio Code, exe: Code.exe, class: Chrome_WidgetWin_1)
2024-04-18T01:56:21.202219Z  INFO process_event{event=Cloak(ObjectCloaked, Window { hwnd: 1249470 })}: komorebi::process_event: processed: (hwnd: 1249470, title: Primary β€” New Issue Β· LGUG2Z/komorebi β€” Mozilla Firefox, exe: firefox.exe, class: MozillaWindowClass)
2024-04-18T01:56:21.531834Z ERROR komorebi::process_command: Invalid window handle. (0x80070578)
2024-04-18T01:56:23.476305Z  INFO process_event{event=FocusChange(SystemForeground, Window { hwnd: 594262 })}:focus_window{idx=0}: komorebi::container: focusing window
2024-04-18T01:56:23.477675Z  INFO process_event{event=FocusChange(SystemForeground, Window { hwnd: 594262 })}:focus_container{idx=0}: komorebi::workspace: focusing container
2024-04-18T01:56:23.486572Z  INFO process_event{event=FocusChange(SystemForeground, Window { hwnd: 594262 })}: komorebi::process_event: processed: (hwnd: 594262, title: komorebi.log - Visual Studio Code, exe: Code.exe, class: Chrome_WidgetWin_1)
2024-04-18T01:57:06.356035Z  INFO process_command{ToggleMonocle}:toggle_monocle:monocle_on: komorebi::window_manager: enabling monocle
2024-04-18T01:57:06.361747Z  INFO process_command{ToggleMonocle}:toggle_monocle:update_focused_workspace{follow_focus=true}: komorebi::window_manager: updating
2024-04-18T01:57:06.380383Z  INFO process_command{ToggleMonocle}: komorebi::process_command: processed
2024-04-18T01:57:07.059329Z  INFO process_command{ToggleMonocle}:toggle_monocle:monocle_off: komorebi::window_manager: disabling monocle
2024-04-18T01:57:07.063478Z  INFO process_command{ToggleMonocle}:toggle_monocle:monocle_off:focus_container{idx=0}: komorebi::workspace: focusing container
2024-04-18T01:57:07.067688Z  INFO process_command{ToggleMonocle}:toggle_monocle:update_focused_workspace{follow_focus=true}: komorebi::window_manager: updating
2024-04-18T01:57:07.069479Z ERROR komorebi::process_command: Invalid window handle. (0x80070578)
2024-04-18T01:57:08.061869Z  INFO process_command{Promote}:promote_container_to_front: komorebi::window_manager: promoting container
2024-04-18T01:57:08.063935Z ERROR process_command{Promote}:promote_container_to_front: komorebi: panicked at komorebi\src\workspace.rs:551:51:
removal index (is 0) should be < len (is 0) panic.file="komorebi\\src\\workspace.rs" panic.line=551 panic.column=51
LGUG2Z commented 7 months ago

Repro'd by myself and @raggi earlier this week, but I can't remember if this was fixed on master or not yet.

raggi commented 7 months ago

I believe this is https://github.com/LGUG2Z/komorebi/issues/758

I think the root cause is that now that we're sending ObjectDestroy messages down into process_event now - previously they would error in should_manage, which prevented any of those messages to be passed in at all (relying on reap to cleanup instead). This then raised a pre-existing but not-exercised bug where ObjectDestroy assumes that the object being destroyed is always in the "focsued workspace" / "focused container", which isn't always the case.

This is essentially a whole class of bug around event processing using focused_* to route events. Another example in this class is the "invisible windows still affecting layout", like Discord frequently triggers. (Repro for discord is: open discord, focus another window in another workspace, hit the X on discord without focusing it - Komorebi won't correctly understand what changed, resulting a few different kinds of issue). Another class of this bug is: Open an unmanaged window, e.g. WhatsApp (without extra app definitions), which is layered and ignored. Focus a managed window, then drag whatsapp by title - the managed window will get moved when the drag completes.

As a broad stroke we need to move away from "focused_*" for workspace/containers in event processing, instead we need to look at WindowsApi::foreground_window to get an HWND (which requires retries sometimes if the foreground window is mid-switch), then hunt for that HWND in the containers to perform container modifications. The general notion of "focused container" needs to be kept in sync with WindowsApi::foreground_window (most events will need to check this for result - even ObjectFocus - as I've seen ObjectFocus,SystemForeground come in pointing at the wrong window (e.g. the stackbar windows create these, but never get focused/activated, and when those events arrive WindowsApi::foreground_window shows a different window being focused)). The notion of a focused container will then only be used to implement commands, and never to target or originate externally generated mutations (window drags, alt-tabs, click-to-focus changes, etc).

LGUG2Z commented 7 months ago

Closing as a dupe, will track work on #758