JigsawWM icon indicating copy to clipboard operation
JigsawWM copied to clipboard

screen layout does not fit to intended configuration

Open nnako opened this issue 5 months ago • 13 comments

Hi,

when starting nnako.pyw from the examples folder, I can cycle through the existing "themes" using <WIN> + <CTRL> + <SPACE>. The desired main theme for my process would be static_bigscreen_8.

In nnako.pyw an application index list has been defined as follows. There would be 8 applications to be placed on the screen:

        # list of application windows to be managed
        WmRule(exe="cmd.exe", title="nvim", static_window_index=0),
        WmRule(exe="cmd.exe", static_window_index=1),
        WmRule(exe="notepad++.exe", static_window_index=2),
        WmRule(
            exe="freeplane.exe",
            title="freeplane",
            static_window_index=3,
        ),
        WmRule(exe="chrome.exe", static_window_index=4),
        WmRule(exe="ms-teams.exe", static_window_index=5),
        WmRule(exe="yEd.exe", static_window_index=6),
        WmRule(exe="EXCEL.EXE", static_window_index=7),

On activation of that static_bigscreen_8 theme, the applications are to be expected to show like this (see static_bigscreen_8 function within src/jigsawwm/tiler/layouts.py). I adjusted the displayed index values to match the static_window_index values within the example:

    +----------+----------+----------+----------+
    |          |          |          |          |
    |          |          |          |          |
    |     5    |     6    |     7    |          |
    |          |          |          |          |
    |          |          |          |          |
    +----------+--+-----+-+----------+          |
    |             |     |            |          |
    |             |     |            |          |
    |             |     |            |          |
    |             |     |            |     3    |
    |             |  2  |      0     |          |
    |     4       |     |            |          |
    |             |     |            |          |
    |             |     |            |          |
    |             +-----+------------|          |
    |             |                  |          |
    |             |         1        |          |
    +-------------+------------------+----------+

But when activating that theme, the sequence does not seem to be correct (while the single window sizes seem correct).

    +----------+----------+----------+----------+
    |          |          |          |          |
    |          |          |          |          |
    |     3    |     1    |     0    |          |
    |          |          |          |          |
    |          |          |          |          |
    +----------+--+-----+-+----------+          |
    |             |     |            |          |
    |             |     |            |          |
    |             |     |            |          |
    |             |     |            |     6    |
    |             |  5  |      2     |          |
    |     7       |     |            |          |
    |             |     |            |          |
    |             |     |            |          |
    |             +-----+------------|          |
    |             |                  |          |
    |             |         4        |          |
    +-------------+------------------+----------+

Somehow, the order got messed up or I haven't understood the concept behind the static_window_index parameter within the WmRule() functions and the layouting sequence defined within layouts.py.

Any hints?

nnako avatar Aug 11 '25 06:08 nnako

where is the mapping defined between the static_window_index given within the WmRule elements within the rules array of the daemon.wm.manager.config and the actual yield sequence positions of the respective (directly used) layout within layouts.py?

nnako avatar Aug 23 '25 14:08 nnako

spective (directly use It is located in https://github.com/klesh/JigsawWM/blob/ced4e5ffd2ba713c4dd3c04e7e55bc6d7f2c7084/src/jigsawwm/wm/workspace_state.py#L137

The windows get sorted by the static indexes before actually get arranged to screen.

klesh avatar Aug 25 '25 01:08 klesh

Thanks for the pointers.

I was trying to check the window index values within the internal windows and incoming windows lists starting from the function sync_windows() within wm/workspace_state.py but my breakpoiint set at the start of that function does not fire.

Are there specific actions necessary in order to successfully debug JigsawWM source the standard way (e.g. using PDB)? I see that "threads" and "thread pools" are used. So, I think, the use of breakpoints for debugging might be somehow different?

How do you debug your code on a practical level?

nnako avatar Aug 25 '25 08:08 nnako

@nnako Do not use breakpoints to debug the project — many parts rely on Win32 hooks, and hitting a breakpoint can freeze the entire OS.

For now, I’m using log printing for debugging instead.

klesh avatar Aug 25 '25 08:08 klesh

Hi,

I guess, I managed to track down the issue concerning the mismatch when sorting the list of windows to the fact that with some windows, the static_window_index does not get set within virtdesk_state.py / apply_rule_to_window(). Here, I see:

https://github.com/klesh/JigsawWM/blob/a0e23c17670a094801d4da228b78d2231bdf6d5d/src/jigsawwm/wm/virtdesk_state.py#L119

Due to the fact that window.applicable is False, the respective member of the rule further down in:

https://github.com/klesh/JigsawWM/blob/a0e23c17670a094801d4da228b78d2231bdf6d5d/src/jigsawwm/wm/virtdesk_state.py#L135

is not copied into the window's attributes.

This happens with 3 of my 8 windows (Freeplane, one of the two CommandTerminals, and yED graph editor). So their static_window_index does not show up when it is about sorting the windows in workspace_state.py / sort_by_static_index(). The sequence gets messed up badly.

As I haven't figured out the detailled reason for not transferring the static_window_index into the window object for the mentioned applications in the 1st place, I wouldn't know where to fix it without possibly disturbing other functionalities using the same resources.

I tried to further debug the scene by adding in a logger.info() below the following line:

https://github.com/klesh/JigsawWM/blob/a0e23c17670a094801d4da228b78d2231bdf6d5d/src/jigsawwm/wm/virtdesk_state.py#L119

But now, JigsawWM does not work properly, anymore when trying to switch layouts.

Any hints?

nnako avatar Aug 25 '25 10:08 nnako

Hi @nnako,

To better understand why this happened, I’ll need the unapplicable_reason information. I’ve updated the Window Inspection logic to log this detail. Please pull the latest changes from the main branch and follow these steps:

  1. Define a hotkey to trigger the Window Inspection. You can refer to the example here: Window Inspection Example.
  2. Switch the problematic window and hit the hotkey.
  3. Open the log file located at C:\Users\<YourUsername>\AppData\Local\jigsawwm\jigsawwm.log and scroll to the bottom.
  4. Locate the relevant lines and copy them here. Thanks!

klesh avatar Aug 27 '25 02:08 klesh

Hi @klesh ,

I pulled the current state of the sources and started my configuration nnako.pyw, but I just see the following within the terminal:

2025-08-28 07:11:24,146 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  Daemon initializing
2025-08-28 07:11:24,224 [jigsawwm.ui.splash] [MainThread  ] [INFO ]  register hooks
2025-08-28 07:11:24,225 [jigsawwm.ui.splash] [MainThread  ] [INFO ]  WindowsSplash init
2025-08-28 07:11:24,225 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  registering jmk
2025-08-28 07:11:24,225 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  registering Window Manager
2025-08-28 07:11:24,226 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  Daemon starting
2025-08-28 07:11:24,226 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  skip tasks: None
2025-08-28 07:11:24,227 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  autorun jmk
2025-08-28 07:11:24,227 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  autorun Window Manager
2025-08-28 07:11:24,229 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:11:27,230 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:11:30,246 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:11:33,251 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:11:36,254 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:11:39,255 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:11:42,256 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:11:45,257 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:11:48,259 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:11:51,260 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:11:54,261 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:11:57,263 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:00,264 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:03,266 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:06,267 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:09,276 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:12,292 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:15,294 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:18,296 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:21,297 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:24,299 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:27,302 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:30,303 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:33,305 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:36,306 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:39,308 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:42,311 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:45,312 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:48,314 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:51,326 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:54,327 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:12:57,329 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:00,330 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:03,332 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:06,339 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:09,343 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:12,344 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:15,345 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:18,346 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:21,351 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:24,352 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:27,353 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:30,359 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:33,362 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
2025-08-28 07:13:36,365 [jigsawwm.wm.manager] [MainThread  ] [WARNI]  desktop_id is invalid, maybe not fully boot up yet? wait a little bit logger
QObject::killTimer: Timers cannot be stopped from another thread
QObject::~QObject: Timers cannot be stopped from another thread
^C

and it goes on forever.

Without the pull, I had just a few of these warnings until a valid desktop_id would have been found and the functionality was started.

Could you revert the changes that causes this particular behaviour? Then I could try your proposed investigation.

nnako avatar Aug 28 '25 05:08 nnako

@nnako Sorry about that. I just removed the detection logic, please try again

klesh avatar Aug 28 '25 05:08 klesh

ok. thanks. works again. At the start of the initial log section, you see the "negotiations" concerning the two monitors:

2025-08-28 07:57:00,156 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  Daemon initializing
2025-08-28 07:57:00,206 [jigsawwm.ui.splash] [MainThread  ] [INFO ]  register hooks
2025-08-28 07:57:00,207 [jigsawwm.ui.splash] [MainThread  ] [INFO ]  WindowsSplash init
2025-08-28 07:57:00,207 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  registering jmk
2025-08-28 07:57:00,207 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  registering Window Manager
2025-08-28 07:57:00,209 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  Daemon starting
2025-08-28 07:57:00,209 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  skip tasks: None
2025-08-28 07:57:00,209 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  autorun jmk
2025-08-28 07:57:00,209 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  autorun Window Manager
2025-08-28 07:57:00,212 [jigsawwm.app.daemon] [MainThread  ] [INFO ]  start message loop
2025-08-28 07:57:00,212 [jigsawwm.wm.virtdesk_state] [ThreadPoolEx] [INFO ]  new monitor connected: <Monitor hmon=65537 name=\\.\DISPLAY1 rect=Rect(left=0, top=0, right=1920, bottom=1020) scale=1.25> index: 0
2025-08-28 07:57:00,223 [jigsawwm.w32.monitor] [ThreadPoolEx] [WARNI]  GetDC failed, maybe user is not logon yet? retrying...
2025-08-28 07:57:01,227 [jigsawwm.w32.monitor] [ThreadPoolEx] [WARNI]  GetDC failed, maybe user is not logon yet? retrying...
2025-08-28 07:57:02,229 [jigsawwm.w32.monitor] [ThreadPoolEx] [WARNI]  GetDC failed, maybe user is not logon yet? retrying...
2025-08-28 07:57:03,232 [jigsawwm.wm.virtdesk_state] [ThreadPoolEx] [INFO ]  new monitor connected: <Monitor hmon=65539 name=\\.\DISPLAY2 rect=Rect(left=-3840, top=-516, right=0, bottom=1596) scale=1.0> index: 1
2025-08-28 07:57:03,234 [jigsawwm.w32.monitor] [ThreadPoolEx] [WARNI]  GetDC failed, maybe user is not logon yet? retrying...
2025-08-28 07:57:04,237 [jigsawwm.w32.monitor] [ThreadPoolEx] [WARNI]  GetDC failed, maybe user is not logon yet? retrying...
2025-08-28 07:57:05,244 [jigsawwm.w32.monitor] [ThreadPoolEx] [WARNI]  GetDC failed, maybe user is not logon yet? retrying...
2025-08-28 07:57:06,246 [jigsawwm.w32.monitor] [ThreadPoolEx] [WARNI]  GetDC failed, maybe user is not logon yet? retrying...
2025-08-28 07:57:07,249 [jigsawwm.w32.monitor] [ThreadPoolEx] [WARNI]  GetDC failed, maybe user is not logon yet? retrying...
2025-08-28 07:57:08,252 [jigsawwm.w32.monitor] [ThreadPoolEx] [WARNI]  GetDC failed, maybe user is not logon yet? retrying...
2025-08-28 07:57:09,501 [jigsawwm.wm.virtdesk_state] [ThreadPoolEx] [INFO ]  windows change detected: WindowsChange(changed=True, new_windows={<Window hwnd=69124 pid=7200 exe=freeplane.exe title=flexui - F child=0(TM)>, <Window hwnd=67908 pid=19376 exe=ms-teams.exe title=Chat | Off child=0(TM)>, <Window hwnd=134502 pid=10620 exe=EXCEL.EXE title=Planung.xl child=0(TM)>, <Window hwnd=330490 pid=14680 exe=WindowsTerminal.exe title=Eingabeauf child=0(TM)>, <Window hwnd=1313512 pid=14680 exe=WindowsTerminal.exe title=Eingabeauf child=0(TM)>, <Window hwnd=69488 pid=18292 exe=yEd.exe title=code2mm.gr child=0(TM)>, <Window hwnd=134202 pid=10080 exe=notepad++.exe title=C:\Users\p child=0(TM)>, <Window hwnd=69662 pid=24944 exe=chrome.exe title=klesh/Jigs child=0(TM)>}, removed_windows=set())
2025-08-28 07:57:09,502 [jigsawwm.wm.virtdesk_state] [ThreadPoolEx] [INFO ]  distributing windows on starting up
2025-08-28 07:57:09,503 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  assigned <Window hwnd=67908 pid=19376 exe=ms-teams.exe title=Chat | Off child=0(TM)> to <WorkspaceState #1.0> with index 0
2025-08-28 07:57:09,504 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  added window <Window hwnd=67908 pid=19376 exe=ms-teams.exe title=Chat | Off child=0(TM)> to <WorkspaceState #1.0>
2025-08-28 07:57:09,505 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  assigned <Window hwnd=69488 pid=18292 exe=yEd.exe title=code2mm.gr child=0(TM)> to <WorkspaceState #1.0> with index 1
2025-08-28 07:57:09,505 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  added window <Window hwnd=69488 pid=18292 exe=yEd.exe title=code2mm.gr child=0(TM)> to <WorkspaceState #1.0>
2025-08-28 07:57:09,506 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  assigned <Window hwnd=134502 pid=10620 exe=EXCEL.EXE title=Planung.xl child=0(TM)> to <WorkspaceState #1.0> with index 2
2025-08-28 07:57:09,507 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  added window <Window hwnd=134502 pid=10620 exe=EXCEL.EXE title=Planung.xl child=0(TM)> to <WorkspaceState #1.0>
2025-08-28 07:57:09,507 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  assigned <Window hwnd=69124 pid=7200 exe=freeplane.exe title=flexui - F child=0(TM)> to <WorkspaceState #1.0> with index 3
2025-08-28 07:57:09,508 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  added window <Window hwnd=69124 pid=7200 exe=freeplane.exe title=flexui - F child=0(TM)> to <WorkspaceState #1.0>
2025-08-28 07:57:09,509 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  assigned <Window hwnd=69662 pid=24944 exe=chrome.exe title=klesh/Jigs child=0(TM)> to <WorkspaceState #1.0> with index 4
2025-08-28 07:57:09,509 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  added window <Window hwnd=69662 pid=24944 exe=chrome.exe title=klesh/Jigs child=0(TM)> to <WorkspaceState #1.0>
2025-08-28 07:57:09,510 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  assigned <Window hwnd=1313512 pid=14680 exe=WindowsTerminal.exe title=Eingabeauf child=0(TM)> to <WorkspaceState #1.0> with index 5
2025-08-28 07:57:09,511 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  added window <Window hwnd=1313512 pid=14680 exe=WindowsTerminal.exe title=Eingabeauf child=0(TM)> to <WorkspaceState #1.0>
2025-08-28 07:57:09,511 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  assigned <Window hwnd=330490 pid=14680 exe=WindowsTerminal.exe title=Eingabeauf child=0(TM)> to <WorkspaceState #1.0> with index 6
2025-08-28 07:57:09,544 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  added window <Window hwnd=330490 pid=14680 exe=WindowsTerminal.exe title=Eingabeauf child=0(TM)> to <WorkspaceState #1.0>
2025-08-28 07:57:09,549 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  assigned <Window hwnd=134202 pid=10080 exe=notepad++.exe title=C:\Users\p child=0(TM)> to <WorkspaceState #1.0> with index 7
2025-08-28 07:57:09,549 [jigsawwm.wm.monitor_state] [ThreadPoolEx] [INFO ]  added window <Window hwnd=134202 pid=10080 exe=notepad++.exe title=C:\Users\p child=0(TM)> to <WorkspaceState #1.0>
2025-08-28 07:57:09,549 [jigsawwm.wm.virtdesk_state] [ThreadPoolEx] [INFO ]  reclaiming hidden workspaces
total_windows 8

Here the relevant sections from the log...

switching to FREEPLANE (this one appeared to be "not applicable" during the recent test)

2025-08-28 07:57:29,010 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys triggered: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]
2025-08-28 07:57:29,011 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  <Window hwnd=69124 pid=7200 exe=freeplane.exe title=flexui - F child=0(TM)>
2025-08-28 07:57:29,012 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  title        : flexui - Freeplane - Mindmap-Modus C:\Users\nnako\_NEXTCLOUD\_TOOLS\_Python\APP__flexui\flexui.mm
2025-08-28 07:57:29,012 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  pid          : 7200
2025-08-28 07:57:29,013 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  class name   : SunAwtFrame
2025-08-28 07:57:29,013 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exe path     : C:\Program Files\Freeplane\freeplane.exe
2025-08-28 07:57:29,014 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  relative rect: Rect(left=216, top=124, right=3678, bottom=2024)
2025-08-28 07:57:29,014 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restrict rect: Rect(left=-3624, top=-392, right=-162, bottom=1508)
2025-08-28 07:57:29,015 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  overlapped   : True
2025-08-28 07:57:29,016 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  style        : BORDER, CLIPCHILDREN, CLIPSIBLINGS, DLGFRAME, GROUP, MAXIMIZEBOX, SIZEBOX, SYSMENU, VISIBLE
2025-08-28 07:57:29,016 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exstyle      : WINDOWEDGE
2025-08-28 07:57:29,017 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_monitor_index): 1
2025-08-28 07:57:29,018 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_workspace_index): 0
2025-08-28 07:57:29,018 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_window_index): 3
2025-08-28 07:57:29,019 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(monitor_state): <MonitorState #1 Rect(left=-3840, top=-516, right=0, bottom=1596)>
2025-08-28 07:57:29,019 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(workspace_state): <WorkspaceState #1.0>
2025-08-28 07:57:29,020 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  rect         : left -3624 top -392 right -162 bottom 1508
2025-08-28 07:57:29,020 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  bound        : left -3617 top -392 right -169 bottom 1501
2025-08-28 07:57:29,020 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restricted   : left -3624 top -392 right -162 bottom 1508
2025-08-28 07:57:29,021 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_evelated  : False
2025-08-28 07:57:29,021 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_toplevel  : 1
2025-08-28 07:57:29,022 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_cloaked   : False
2025-08-28 07:57:29,022 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_visible   : True
2025-08-28 07:57:29,022 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_iconic    : 0
2025-08-28 07:57:29,023 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_restored  : True
2025-08-28 07:57:29,023 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unapplicable : None
2025-08-28 07:57:29,024 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unmanageable : None
2025-08-28 07:57:29,024 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  manageable   : True
2025-08-28 07:57:29,024 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  untilable    : None
2025-08-28 07:57:29,025 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  tilable      : True
2025-08-28 07:57:29,025 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  parent       : 0
2025-08-28 07:57:29,025 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  dpi_awareness: PROCESS_PER_MONITOR_DPI_AWARE
2025-08-28 07:57:33,188 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys released: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]

switching to a COMMAND window (I am not sure about this window or the other command window):

2025-08-28 07:58:58,149 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys triggered: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]
2025-08-28 07:58:58,150 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  <Window hwnd=330490 pid=14680 exe=WindowsTerminal.exe title=Eingabeauf child=0(TM)>
2025-08-28 07:58:58,151 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  title        : Eingabeaufforderung - nvim  --listen \\.\pipe\nvim.1973.0
2025-08-28 07:58:58,151 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  pid          : 14680
2025-08-28 07:58:58,151 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  class name   : CASCADIA_HOSTING_WINDOW_CLASS
2025-08-28 07:58:58,152 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exe path     : C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.22.12111.0_x64__8wekyb3d8bbwe\WindowsTerminal.exe
2025-08-28 07:58:58,153 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  relative rect: Rect(left=51, top=34, right=3513, bottom=1933)
2025-08-28 07:58:58,154 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restrict rect: Rect(left=-3789, top=-482, right=-327, bottom=1417)
2025-08-28 07:58:58,154 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  overlapped   : True
2025-08-28 07:58:58,155 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  style        : BORDER, CLIPSIBLINGS, DLGFRAME, GROUP, MAXIMIZEBOX, SIZEBOX, SYSMENU, VISIBLE
2025-08-28 07:58:58,155 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exstyle      : NOREDIRECTIONBITMAP, WINDOWEDGE
2025-08-28 07:58:58,156 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_monitor_index): 1
2025-08-28 07:58:58,157 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_workspace_index): 0
2025-08-28 07:58:58,157 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_window_index): 6
2025-08-28 07:58:58,158 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(monitor_state): <MonitorState #1 Rect(left=-3840, top=-516, right=0, bottom=1596)>
2025-08-28 07:58:58,158 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(workspace_state): <WorkspaceState #1.0>
2025-08-28 07:58:58,158 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  rect         : left -3789 top -482 right -327 bottom 1417
2025-08-28 07:58:58,158 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  bound        : left -3782 top -482 right -334 bottom 1410
2025-08-28 07:58:58,158 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restricted   : left -3789 top -482 right -327 bottom 1417
2025-08-28 07:58:58,158 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_evelated  : False
2025-08-28 07:58:58,158 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_toplevel  : 1
2025-08-28 07:58:58,158 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_cloaked   : False
2025-08-28 07:58:58,158 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_visible   : True
2025-08-28 07:58:58,159 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_iconic    : 0
2025-08-28 07:58:58,159 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_restored  : True
2025-08-28 07:58:58,159 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unapplicable : None
2025-08-28 07:58:58,159 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unmanageable : None
2025-08-28 07:58:58,159 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  manageable   : True
2025-08-28 07:58:58,159 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  untilable    : None
2025-08-28 07:58:58,159 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  tilable      : True
2025-08-28 07:58:58,159 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  parent       : 0
2025-08-28 07:58:58,159 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  dpi_awareness: PROCESS_PER_MONITOR_DPI_AWARE
2025-08-28 07:58:59,282 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys released: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]

switching to another COMMAND window (I am not sure about this window or the other command window):

2025-08-28 07:59:07,308 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys triggered: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]
2025-08-28 07:59:07,311 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  <Window hwnd=1313512 pid=14680 exe=WindowsTerminal.exe title=Eingabeauf child=0(TM)>
2025-08-28 07:59:07,312 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  title        : Eingabeaufforderung - python  .\examples\nnako.pyw
2025-08-28 07:59:07,312 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  pid          : 14680
2025-08-28 07:59:07,312 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  class name   : CASCADIA_HOSTING_WINDOW_CLASS
2025-08-28 07:59:07,312 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exe path     : C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.22.12111.0_x64__8wekyb3d8bbwe\WindowsTerminal.exe
2025-08-28 07:59:07,312 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  relative rect: Rect(left=106, top=64, right=3568, bottom=1964)
2025-08-28 07:59:07,312 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restrict rect: Rect(left=-3734, top=-452, right=-272, bottom=1448)
2025-08-28 07:59:07,312 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  overlapped   : True
2025-08-28 07:59:07,314 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  style        : BORDER, CLIPSIBLINGS, DLGFRAME, GROUP, MAXIMIZEBOX, SIZEBOX, SYSMENU, VISIBLE
2025-08-28 07:59:07,314 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exstyle      : NOREDIRECTIONBITMAP, WINDOWEDGE
2025-08-28 07:59:07,314 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_monitor_index): 1
2025-08-28 07:59:07,314 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_workspace_index): 0
2025-08-28 07:59:07,314 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_window_index): 5
2025-08-28 07:59:07,314 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(monitor_state): <MonitorState #1 Rect(left=-3840, top=-516, right=0, bottom=1596)>
2025-08-28 07:59:07,314 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(workspace_state): <WorkspaceState #1.0>
2025-08-28 07:59:07,315 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  rect         : left -3734 top -452 right -272 bottom 1448
2025-08-28 07:59:07,315 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  bound        : left -3727 top -452 right -279 bottom 1441
2025-08-28 07:59:07,315 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restricted   : left -3734 top -452 right -272 bottom 1448
2025-08-28 07:59:07,315 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_evelated  : False
2025-08-28 07:59:07,315 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_toplevel  : 1
2025-08-28 07:59:07,315 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_cloaked   : False
2025-08-28 07:59:07,315 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_visible   : True
2025-08-28 07:59:07,315 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_iconic    : 0
2025-08-28 07:59:07,315 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_restored  : True
2025-08-28 07:59:07,316 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unapplicable : None
2025-08-28 07:59:07,316 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unmanageable : None
2025-08-28 07:59:07,316 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  manageable   : True
2025-08-28 07:59:07,316 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  untilable    : None
2025-08-28 07:59:07,316 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  tilable      : True
2025-08-28 07:59:07,316 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  parent       : 0
2025-08-28 07:59:07,316 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  dpi_awareness: PROCESS_PER_MONITOR_DPI_AWARE
2025-08-28 07:59:08,591 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys released: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]

switching to YED (this one appeared to be "not applicable" during the recent test):

2025-08-28 07:59:32,931 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys triggered: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]
2025-08-28 07:59:32,932 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  <Window hwnd=69488 pid=18292 exe=yEd.exe title=code2mm.gr child=0(TM)>
2025-08-28 07:59:32,933 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  title        : code2mm.graphml - yEd
2025-08-28 07:59:32,933 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  pid          : 18292
2025-08-28 07:59:32,934 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  class name   : SunAwtFrame
2025-08-28 07:59:32,934 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exe path     : C:\Program Files\yWorks\yEd\yEd.exe
2025-08-28 07:59:32,934 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  relative rect: Rect(left=326, top=185, right=3788, bottom=2084)
2025-08-28 07:59:32,935 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restrict rect: Rect(left=-3514, top=-331, right=-52, bottom=1568)
2025-08-28 07:59:32,935 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  overlapped   : True
2025-08-28 07:59:32,936 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  style        : BORDER, CLIPCHILDREN, CLIPSIBLINGS, DLGFRAME, GROUP, MAXIMIZEBOX, SIZEBOX, SYSMENU, VISIBLE
2025-08-28 07:59:32,936 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exstyle      : WINDOWEDGE
2025-08-28 07:59:32,937 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(static_window_index): 6
2025-08-28 07:59:32,937 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_monitor_index): 1
2025-08-28 07:59:32,938 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_workspace_index): 0
2025-08-28 07:59:32,939 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_window_index): 1
2025-08-28 07:59:32,939 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(monitor_state): <MonitorState #1 Rect(left=-3840, top=-516, right=0, bottom=1596)>
2025-08-28 07:59:32,939 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(workspace_state): <WorkspaceState #1.0>
2025-08-28 07:59:32,939 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  rect         : left -3514 top -331 right -52 bottom 1568
2025-08-28 07:59:32,940 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  bound        : left -3507 top -331 right -59 bottom 1561
2025-08-28 07:59:32,941 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restricted   : left -3514 top -331 right -52 bottom 1568
2025-08-28 07:59:32,941 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_evelated  : False
2025-08-28 07:59:32,941 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_toplevel  : 1
2025-08-28 07:59:32,942 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_cloaked   : False
2025-08-28 07:59:32,942 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_visible   : True
2025-08-28 07:59:32,943 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_iconic    : 0
2025-08-28 07:59:32,943 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_restored  : True
2025-08-28 07:59:32,943 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unapplicable : None
2025-08-28 07:59:32,944 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unmanageable : None
2025-08-28 07:59:32,944 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  manageable   : True
2025-08-28 07:59:32,945 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  untilable    : None
2025-08-28 07:59:32,946 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  tilable      : True
2025-08-28 07:59:32,946 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  parent       : 0
2025-08-28 07:59:32,947 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  dpi_awareness: PROCESS_PER_MONITOR_DPI_AWARE
2025-08-28 07:59:33,868 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys released: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]

switching to CHROME (this one was always ok concerning the "applicability"):

2025-08-28 08:01:00,430 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys triggered: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]
2025-08-28 08:01:00,431 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  <Window hwnd=69662 pid=24944 exe=chrome.exe title=screen lay child=0(TM)>
2025-08-28 08:01:00,432 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  title        : screen layout does not fit to intended configuration · Issue #17 · klesh/JigsawWM - Google Chrome
2025-08-28 08:01:00,432 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  pid          : 24944
2025-08-28 08:01:00,432 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  class name   : Chrome_WidgetWin_1
2025-08-28 08:01:00,432 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exe path     : C:\Program Files\Google\Chrome\Application\chrome.exe
2025-08-28 08:01:00,433 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  relative rect: Rect(left=161, top=94, right=3623, bottom=1994)
2025-08-28 08:01:00,433 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restrict rect: Rect(left=-3679, top=-422, right=-217, bottom=1478)
2025-08-28 08:01:00,433 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  overlapped   : True
2025-08-28 08:01:00,434 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  style        : BORDER, CLIPCHILDREN, CLIPSIBLINGS, DLGFRAME, GROUP, MAXIMIZEBOX, SIZEBOX, SYSMENU, VISIBLE
2025-08-28 08:01:00,435 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exstyle      : NOREDIRECTIONBITMAP, WINDOWEDGE
2025-08-28 08:01:00,435 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(static_window_index): 4
2025-08-28 08:01:00,436 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_monitor_index): 1
2025-08-28 08:01:00,436 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_workspace_index): 0
2025-08-28 08:01:00,437 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_window_index): 4
2025-08-28 08:01:00,437 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(monitor_state): <MonitorState #1 Rect(left=-3840, top=-516, right=0, bottom=1596)>
2025-08-28 08:01:00,437 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(workspace_state): <WorkspaceState #1.0>
2025-08-28 08:01:00,438 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  rect         : left -3679 top -422 right -217 bottom 1478
2025-08-28 08:01:00,438 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  bound        : left -3672 top -422 right -224 bottom 1471
2025-08-28 08:01:00,439 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restricted   : left -3679 top -422 right -217 bottom 1478
2025-08-28 08:01:00,439 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_evelated  : False
2025-08-28 08:01:00,440 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_toplevel  : 1
2025-08-28 08:01:00,440 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_cloaked   : False
2025-08-28 08:01:00,441 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_visible   : True
2025-08-28 08:01:00,441 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_iconic    : 0
2025-08-28 08:01:00,441 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_restored  : True
2025-08-28 08:01:00,442 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unapplicable : None
2025-08-28 08:01:00,442 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unmanageable : None
2025-08-28 08:01:00,442 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  manageable   : True
2025-08-28 08:01:00,443 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  untilable    : None
2025-08-28 08:01:00,443 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  tilable      : True
2025-08-28 08:01:00,444 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  parent       : 0
2025-08-28 08:01:00,444 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  dpi_awareness: PROCESS_PER_MONITOR_DPI_AWARE
2025-08-28 08:01:01,534 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys released: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]

hope, you identify the relevant signs.

nnako avatar Aug 28 '25 06:08 nnako

within the message above, I was using the "default" theme. And after pressing <CTRL> + <WIN> + <SPACE> three times, I got to my bigscreen_8 layout. There I repeated the window identifications:

COMMAND window showing the VIM editor:

2025-08-28 08:30:55,620 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys triggered: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]
2025-08-28 08:30:55,621 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  <Window hwnd=330490 pid=14680 exe=WindowsTerminal.exe title=Eingabeauf child=0(TM)>
2025-08-28 08:30:55,621 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  title        : Eingabeaufforderung - nvim  --listen \\.\pipe\nvim.1973.0
2025-08-28 08:30:55,622 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  pid          : 14680
2025-08-28 08:30:55,622 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  class name   : CASCADIA_HOSTING_WINDOW_CLASS
2025-08-28 08:30:55,623 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exe path     : C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.22.12111.0_x64__8wekyb3d8bbwe\WindowsTerminal.exe
2025-08-28 08:30:55,623 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  relative rect: Rect(left=1915, top=2, right=2885, bottom=786)
2025-08-28 08:30:55,623 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restrict rect: Rect(left=-1925, top=-514, right=-955, bottom=270)
2025-08-28 08:30:55,624 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  overlapped   : True
2025-08-28 08:30:55,624 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  style        : BORDER, CLIPSIBLINGS, DLGFRAME, GROUP, MAXIMIZEBOX, SIZEBOX, SYSMENU, VISIBLE
2025-08-28 08:30:55,624 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exstyle      : NOREDIRECTIONBITMAP, WINDOWEDGE
2025-08-28 08:30:55,625 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_monitor_index): 1
2025-08-28 08:30:55,625 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_workspace_index): 0
2025-08-28 08:30:55,625 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_window_index): 10
2025-08-28 08:30:55,625 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(monitor_state): <MonitorState #1 Rect(left=-3840, top=-516, right=0, bottom=1596)>
2025-08-28 08:30:55,626 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(workspace_state): <WorkspaceState #1.0>
2025-08-28 08:30:55,626 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  rect         : left -1925 top -514 right -955 bottom 270
2025-08-28 08:30:55,626 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  bound        : left -1918 top -514 right -962 bottom 263
2025-08-28 08:30:55,627 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restricted   : left -1925 top -514 right -955 bottom 270
2025-08-28 08:30:55,627 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_evelated  : False
2025-08-28 08:30:55,627 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_toplevel  : 1
2025-08-28 08:30:55,628 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_cloaked   : False
2025-08-28 08:30:55,628 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_visible   : True
2025-08-28 08:30:55,628 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_iconic    : 0
2025-08-28 08:30:55,629 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_restored  : True
2025-08-28 08:30:55,629 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unapplicable : None
2025-08-28 08:30:55,630 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unmanageable : None
2025-08-28 08:30:55,630 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  manageable   : True
2025-08-28 08:30:55,630 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  untilable    : None
2025-08-28 08:30:55,630 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  tilable      : True
2025-08-28 08:30:55,631 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  parent       : 0
2025-08-28 08:30:55,631 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  dpi_awareness: PROCESS_PER_MONITOR_DPI_AWARE
2025-08-28 08:30:56,378 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys released: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]

COMMAND window running JigsawWM:

2025-08-28 08:31:01,934 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys triggered: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]
2025-08-28 08:31:01,936 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  <Window hwnd=1313512 pid=14680 exe=WindowsTerminal.exe title=Eingabeauf child=0(TM)>
2025-08-28 08:31:01,936 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  title        : Eingabeaufforderung - python  .\examples\nnako.pyw
2025-08-28 08:31:01,937 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  pid          : 14680
2025-08-28 08:31:01,937 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  class name   : CASCADIA_HOSTING_WINDOW_CLASS
2025-08-28 08:31:01,938 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exe path     : C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.22.12111.0_x64__8wekyb3d8bbwe\WindowsTerminal.exe
2025-08-28 08:31:01,939 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  relative rect: Rect(left=955, top=2, right=1925, bottom=786)
2025-08-28 08:31:01,939 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restrict rect: Rect(left=-2885, top=-514, right=-1915, bottom=270)
2025-08-28 08:31:01,940 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  overlapped   : True
2025-08-28 08:31:01,940 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  style        : BORDER, CLIPSIBLINGS, DLGFRAME, GROUP, MAXIMIZEBOX, SIZEBOX, SYSMENU, VISIBLE
2025-08-28 08:31:01,941 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exstyle      : NOREDIRECTIONBITMAP, WINDOWEDGE
2025-08-28 08:31:01,941 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_monitor_index): 1
2025-08-28 08:31:01,942 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_workspace_index): 0
2025-08-28 08:31:01,942 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_window_index): 9
2025-08-28 08:31:01,943 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(monitor_state): <MonitorState #1 Rect(left=-3840, top=-516, right=0, bottom=1596)>
2025-08-28 08:31:01,943 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(workspace_state): <WorkspaceState #1.0>
2025-08-28 08:31:01,944 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  rect         : left -2885 top -514 right -1915 bottom 270
2025-08-28 08:31:01,944 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  bound        : left -2878 top -514 right -1922 bottom 263
2025-08-28 08:31:01,945 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restricted   : left -2885 top -514 right -1915 bottom 270
2025-08-28 08:31:01,945 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_evelated  : False
2025-08-28 08:31:01,945 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_toplevel  : 1
2025-08-28 08:31:01,946 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_cloaked   : False
2025-08-28 08:31:01,946 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_visible   : True
2025-08-28 08:31:01,947 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_iconic    : 0
2025-08-28 08:31:01,947 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_restored  : True
2025-08-28 08:31:01,947 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unapplicable : None
2025-08-28 08:31:01,947 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unmanageable : None
2025-08-28 08:31:01,948 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  manageable   : True
2025-08-28 08:31:01,949 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  untilable    : None
2025-08-28 08:31:01,949 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  tilable      : True
2025-08-28 08:31:01,949 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  parent       : 0
2025-08-28 08:31:01,949 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  dpi_awareness: PROCESS_PER_MONITOR_DPI_AWARE
2025-08-28 08:31:02,709 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys released: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]

FREEPLANE:

2025-08-28 08:31:07,126 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys triggered: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]
2025-08-28 08:31:07,128 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  <Window hwnd=69124 pid=7200 exe=freeplane.exe title=flexui* -  child=0(TM)>
2025-08-28 08:31:07,128 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  title        : flexui* - Freeplane - Mindmap-Modus C:\Users\nnako\_NEXTCLOUD\_TOOLS\_Python\APP__flexui\flexui.mm
2025-08-28 08:31:07,129 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  pid          : 7200
2025-08-28 08:31:07,129 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  class name   : SunAwtFrame
2025-08-28 08:31:07,129 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exe path     : C:\Program Files\Freeplane\freeplane.exe
2025-08-28 08:31:07,130 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  relative rect: Rect(left=-5, top=2, right=965, bottom=786)
2025-08-28 08:31:07,131 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restrict rect: Rect(left=-3845, top=-514, right=-2875, bottom=270)
2025-08-28 08:31:07,131 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  overlapped   : True
2025-08-28 08:31:07,132 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  style        : BORDER, CLIPCHILDREN, CLIPSIBLINGS, DLGFRAME, GROUP, MAXIMIZEBOX, SIZEBOX, SYSMENU, VISIBLE
2025-08-28 08:31:07,132 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  exstyle      : WINDOWEDGE
2025-08-28 08:31:07,133 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_monitor_index): 1
2025-08-28 08:31:07,133 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_workspace_index): 0
2025-08-28 08:31:07,134 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(preferred_window_index): 8
2025-08-28 08:31:07,134 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(monitor_state): <MonitorState #1 Rect(left=-3840, top=-516, right=0, bottom=1596)>
2025-08-28 08:31:07,135 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  attr(workspace_state): <WorkspaceState #1.0>
2025-08-28 08:31:07,135 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  rect         : left -3845 top -514 right -2875 bottom 270
2025-08-28 08:31:07,136 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  bound        : left -3838 top -514 right -2882 bottom 263
2025-08-28 08:31:07,136 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  restricted   : left -3845 top -514 right -2875 bottom 270
2025-08-28 08:31:07,137 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_evelated  : False
2025-08-28 08:31:07,137 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_toplevel  : 1
2025-08-28 08:31:07,139 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_cloaked   : False
2025-08-28 08:31:07,139 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_visible   : True
2025-08-28 08:31:07,139 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_iconic    : 0
2025-08-28 08:31:07,140 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  is_restored  : True
2025-08-28 08:31:07,140 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unapplicable : None
2025-08-28 08:31:07,141 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  unmanageable : None
2025-08-28 08:31:07,141 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  manageable   : True
2025-08-28 08:31:07,141 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  untilable    : None
2025-08-28 08:31:07,141 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  tilable      : True
2025-08-28 08:31:07,143 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  parent       : 0
2025-08-28 08:31:07,143 [jigsawwm.w32.window] [ThreadPoolEx] [INFO ]  dpi_awareness: PROCESS_PER_MONITOR_DPI_AWARE
2025-08-28 08:31:08,191 [jigsawwm.jmk.core] [ThreadPoolEx] [INFO ]  keys released: [<Vk.LWIN: 91>, <Vk.LCONTROL: 162>, <Vk.I: 73>]

nnako avatar Aug 28 '25 06:08 nnako

Try removing the title constraint from the rule

         WmRule(
            exe="freeplane.exe",
            title="freeplane",
            static_window_index=3,
        ),

klesh avatar Aug 28 '25 09:08 klesh

When I remove the title constraint from the FREEPLANE rule configuration, the FREEPLANE window now gets identified as a window to be placed. So, the issue seems to be connected with the title attribute.

But, as I have two CONSOLE windows that I wand to distinguish when displaying my layout, I have the problem not to be able to do so if I avoid the title constraint.

What do you think?

nnako avatar Aug 28 '25 11:08 nnako

@nnako By design, it should work.
I suspect the issue might be that the title at the time the window was first detected was different from what you’re seeing now.
To verify, try exiting and restarting JigsawWM, then check whether the static_window_index is assigned correctly.

klesh avatar Aug 28 '25 14:08 klesh