diff options
| author | srdusr <[email protected]> | 2026-05-04 21:37:00 +0200 |
|---|---|---|
| committer | srdusr <[email protected]> | 2026-05-04 21:37:00 +0200 |
| commit | 790ee906957b8b855dfc23cf1b206628585fd1ec (patch) | |
| tree | 2351094dede798ed8b3fa32fd8fa41641752c64b /docs | |
| parent | 3ea84a31ee671b88d8c343b3007de0e975eff31c (diff) | |
| download | srdwm-790ee906957b8b855dfc23cf1b206628585fd1ec.tar.gz srdwm-790ee906957b8b855dfc23cf1b206628585fd1ec.zip | |
Support monitor split in the nested backend, correcting a wrong "blocked"
Earlier today I wrote that a nested compositor cannot produce a second
monitor because split and fake monitors "need real head machinery that only
the DRM backend has". That was inferred from both commands returning ok and
changing nothing, not read from the code, and the first half is false.
udev/platform.rs was simply the only backend draining those request queues.
The winit poll never took them off, so the request sat there forever and the
dispatch looked like it had worked. Nothing about split is DRM-bound:
MonitorSplit is bookkeeping in WindowManager and split_rect is pure geometry
in core. The winit poll now drains split requests the same way, and its
monitors() expands a split into one Monitor per part with its own
full_geometry and maximize_geometry, matching the udev expansion. Splitting
the nested output into two 640x800 monitors with a seam now works, which is
what a multi-monitor repro needs. Fake monitors stay udev-only; that half was
not re-checked and is not claimed either way.
Also corrected: the capture pass measured the shadow rect from w.geometry
while both on-screen loops measure it from effective_frame, the client's real
committed size. src indexes into a buffer rasterised at the frame's size, so
the two disagreeing reads the wrong region whenever a client settles on a
different size than it was asked for.
The seam check this was meant to unblock is still not done. With the split
working, the negative control failed: a floating window off the seam had no
shadow either. Running both clients in one instance showed Alacritty renders
a shadow in a capture and Nemo renders none, same settings, both floating,
either focus. Nemo is server-side decorated and Alacritty is not, which is a
lead and not a conclusion. Recorded in docs/TODO.md as open rather than
guessed at.
515 tests pass, clippy clean.
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/TODO.md | 63 |
1 files changed, 58 insertions, 5 deletions
diff --git a/docs/TODO.md b/docs/TODO.md index d24f9b8..e6f95f8 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -1,5 +1,58 @@ # TODO / planned features - master checklist +## A wrong "blocked" of my own, corrected: monitor split works in a nested compositor (2026-08-28) + +Written earlier the same day, as the reason the monitor-seam shadow fix could +not be checked on screen: "the nested backend cannot produce a second monitor +- `set output split` and `create fake-monitor` both need real head machinery +that only the DRM backend has". The first half of that is now false and the +second half was never checked. + +What actually happened: both commands returned `{"ok":true}` and changed +nothing, and the cause was inferred from that rather than read. The real +cause is that `udev/platform.rs` was the only backend draining those request +queues. The winit backend never took them off the queue, so the request sat +there forever and the dispatch looked like it had worked. Nothing about +split is DRM-bound: `MonitorSplit` is bookkeeping in `WindowManager` and +`split_rect` is pure geometry in `core`. + +Wired up: the winit poll drains split requests the same way the udev one +does, and its `monitors()` expands a split into one `Monitor` per part with +its own `full_geometry`/`maximize_geometry`, matching the udev expansion +exactly. `srd dispatch set output split winit 2 columns` now really does +report two 640x800 monitors with a seam at x=640, which is what a +multi-monitor repro needs. Fake monitors remain udev-only and that half was +not re-checked, so it stays stated as unverified rather than as a fact. + +Prompted by the AGS peer session, which had carried its own "no typechecker +works offline" as settled for a day and disproved it in twenty minutes once +challenged. Their generalisation is the useful part and it applied here +immediately: a "blocked" is a measurement and it decays, and two commands +failing is two commands failing, not proof that the space is empty. + +**The seam check itself is still not done, and here is exactly where it +stopped.** With the split working, a floating window was placed with its +right edge exactly on the seam and the pixels just past it sampled: no +shadow, correctly. But the negative control failed - the same window off +the seam had no shadow either, so the test proved nothing. Running both +clients in one instance settled why: Alacritty renders a shadow in a capture +(a real measured gradient, 24 -> 27 -> 32 -> 35 -> 36 over ~24px), and Nemo +renders none, with `shadows: true`, both floating, in the same instance, +regardless of which is focused. Nemo is server-side decorated and Alacritty +is not, which is a lead and not a conclusion - it has not been root-caused +and is recorded here rather than guessed at. Finishing the seam check needs +either that answer or a shadow-rendering client that can be positioned onto +a seam (Alacritty has no titlebar to drag). + +One real inconsistency was found and fixed on the way: the winit capture +pass measured the shadow from `w.geometry` while both on-screen loops +measure it from `effective_frame`, which is the client's real committed +size. `src` indexes into a buffer rasterised at the frame's size, so the two +disagreeing reads the wrong region whenever a client settles on a different +size than it was asked for. Corrected to match. It did not change the Nemo +result, so it is not the cause of that - stated plainly rather than +implied. + ## Eight asks recovered from the previous session's transcript, all built (2026-08-28) Reported as "there was more stuff from previous agent", then "please do all of @@ -204,11 +257,11 @@ the fragment list is clipped. Six tests, built on the incident's own numbers (two 1920x1080 outputs, seam at x=1920): flush against the seam from either side, straddling it, mid-monitor, the desktop's outer edge, and no monitors at all. -**Not confirmed on screen.** The nested backend cannot produce a second -monitor - `set output split` and `create fake-monitor` both return -`{"ok":true}` and change nothing there, because both need real head -machinery that only the DRM backend has. Confirming it needs the user's own -two-monitor session. +**Not confirmed on screen** - and the reason first given for that was +wrong. See the correction entry at the top of this file: monitor split works +in a nested instance now, so the seam itself is reproducible; what is still +missing is a window that both renders a shadow and can be positioned onto +the seam. Correcting the entry below, which called this moot because the user had turned shadows off: `srd settings` against the live session reports |