diff options
| author | srdusr <[email protected]> | 2026-08-24 00:37:00 +0200 |
|---|---|---|
| committer | srdusr <[email protected]> | 2026-08-24 00:37:00 +0200 |
| commit | 807d0ba1680cdc1322bfe9584781416339f6f76d (patch) | |
| tree | 40ddafea03fca3689dc2ba0d8ac8f52cadbd9781 /crates/config/src/lib.rs | |
| parent | d440a3992e8a0fa49857210e646b0d653dfa7675 (diff) | |
| download | srdwm-807d0ba1680cdc1322bfe9584781416339f6f76d.tar.gz srdwm-807d0ba1680cdc1322bfe9584781416339f6f76d.zip | |
Look for a free spot before piling a new window on the last one
Reported: windows spawn predominantly on one side and on top of each other,
with no smart placement. Measured first, in a nested compositor: five
windows opened at 30,30 then 60,60 then 90,90 then 120,120 then 150,150 --
every pair overlapping, all in the top-left. The cascade was the only thing
running.
The grid never engaged, and could not. It asked whether a grid CELL was
free and then placed the window at that cell's corner at its own, larger
size. An ordinary 800x600 window on a 1280x800 screen overlaps every cell
of a 2x2 grid, so no cell was ever free, the grid returned nothing, and
everything fell through to the cascade.
Placement now looks for a position where the window overlaps nothing at
all, and only cascades when the screen genuinely cannot fit one - which is
what Windows does once its own screen fills up, and what makes the cascade
the right last resort rather than the first answer.
The candidates are the edges of what is already on screen: every window's
left and right edge plus the monitor's own, taken both as "put my left edge
here" and "put my right edge here", and the same vertically. That is
Openbox's place_overlap reduced to this case (~/reference-wms/openbox), and
it works because a rectangle packed against other rectangles is always
flush with one of their edges - nothing is gained by testing the space in
between.
Two things the naive version got wrong, both fixed here:
Ties go to the position nearest the middle of the monitor, and the choice
rotates through the four most central free spots. Least-overlap placement
is deterministic, so opening one window at a time - open, use, close, open
the next - put every one of them in exactly the same place, which is this
project's own earlier bug report. Every candidate rotated between is free,
so variety never costs the guarantee.
And placement now runs again once the client's real size is known. It has
to happen before the client commits anything, so it was deciding where an
800x600 placeholder should go rather than the window - a small terminal
was told it was 800x600, no two of those fit, and it cascaded. Only when
the client actually chooses a different size: re-running it otherwise
consumed a second cascade step for nothing, and the cascade wraps, which
measured as two windows landing on exactly the same spot.
287 core tests pass, clippy clean.
Diffstat (limited to 'crates/config/src/lib.rs')
0 files changed, 0 insertions, 0 deletions