diff options
| author | Danilo M. <danix@danix.xyz> | 2026-09-17 13:27:55 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-09-17 13:27:55 +0200 |
| commit | ebe8d060b28b3e602f83d7f0a385c8cc2ee424a9 (patch) | |
| tree | 1c08b317f3af46520b03e3d95336356d94f4ee4d | |
| parent | 96841b1cef108130bcf1ab21c34cf89b92f1b35c (diff) | |
| download | sddm-theme-udt-ebe8d060b28b3e602f83d7f0a385c8cc2ee424a9.tar.gz sddm-theme-udt-ebe8d060b28b3e602f83d7f0a385c8cc2ee424a9.zip | |
docs: correct the multi-screen premise to per-window SDDM model
| -rw-r--r-- | docs/superpowers/plans/2026-09-17-sddm-theme-udt.md | 7 | ||||
| -rw-r--r-- | docs/superpowers/specs/2026-09-17-sddm-theme-udt-design.md | 43 |
2 files changed, 32 insertions, 18 deletions
diff --git a/docs/superpowers/plans/2026-09-17-sddm-theme-udt.md b/docs/superpowers/plans/2026-09-17-sddm-theme-udt.md index 1da3d20..81ada3d 100644 --- a/docs/superpowers/plans/2026-09-17-sddm-theme-udt.md +++ b/docs/superpowers/plans/2026-09-17-sddm-theme-udt.md @@ -10,6 +10,13 @@ **Spec:** `docs/superpowers/specs/2026-09-17-sddm-theme-udt-design.md` +> **Correction (post-implementation):** Task 1's `Main.qml` assumed one greeter +> window spanning a union of all screens (`screenModel.geometry(-1)`). SDDM +> 0.21 creates one window per screen, each with a single-row `screenModel` and a +> boolean `primaryScreen` context property. The spec's multi-screen decision was +> corrected; the implementation now gates the card per window. Read the spec, +> not Task 1's original code, for the multi-screen model. + ## Global Constraints - License: GPLv2 only. Every source file carries `SPDX-License-Identifier: GPL-2.0-only` and `Copyright (C) 2026 Danilo M. <danix@danix.xyz>`. diff --git a/docs/superpowers/specs/2026-09-17-sddm-theme-udt-design.md b/docs/superpowers/specs/2026-09-17-sddm-theme-udt-design.md index 34104ce..e3ddcc3 100644 --- a/docs/superpowers/specs/2026-09-17-sddm-theme-udt-design.md +++ b/docs/superpowers/specs/2026-09-17-sddm-theme-udt-design.md @@ -79,13 +79,17 @@ So the design needs a channel that is live, world-readable, and data-only. `/usr/share/sddm` (live edits, but lets user-writable QML run in the greeter). -6. **GUI on one screen, wallpaper on all.** SDDM's root item spans the united - geometry of every screen; `screenModel` exposes each screen's `name`, - `geometry` and a `primary` index. The wallpaper is drawn once per screen via - a `Repeater`, the login card is centered inside the geometry of the selected - screen. The selected screen is `uiScreen` (an output name) falling back to - `screenModel.primary`. Rejected: mirroring the UI on every screen (what the - stock themes do, and what the user explicitly did not want). +6. **GUI on one screen, wallpaper on all.** SDDM creates one greeter window per + screen, each with its own single-row `screenModel` and a boolean + `primaryScreen` context property (verified in upstream v0.21.0 + `src/greeter/GreeterApp.cpp` and `ScreenModel.cpp`). So the theme decides per + window, not inside one union window: the wallpaper fills whatever window it + is in, and the login card is shown only where `uiScreen` (an output name) + matches, falling back to `primaryScreen` when `uiScreen` is empty. Rejected: + mirroring the UI on every screen (what the stock themes do, and what the user + explicitly did not want). Corrected during implementation: the original text + of this decision assumed a single union window and `screenModel.geometry(-1)` + covering all screens, which SDDM does not do. 7. **Idle behaviour mirrors Breeze.** After `fadeoutMs` (default 60000) with no input the card fades out, leaving only the wallpaper; any key, click or mouse @@ -125,10 +129,10 @@ root install (once, printed by UDT's install.sh) theme.conf.user -> ~/.local/share/udt/sddm-theme.conf /etc/sddm.conf.d/udt.conf [Theme] Current=udt -greeter start (as sddm) +greeter start (as sddm), one window per screen reads theme.conf + theme.conf.user into `config` reads config.background directly - selects a screen from screenModel + shows the card only where uiScreen matches, else on the primaryScreen window ``` Data flow is one-directional and needs no daemon: `udt-accent` writes a file, @@ -201,13 +205,14 @@ parses and renders before any wallpaper has ever been set. ## Theme behaviour -- **Background per screen.** `Repeater { model: screenModel }`, each delegate - positioned at `geometry` from the model, `Image` with - `fillMode: Image.PreserveAspectCrop`. A `base`-coloured overlay sits above it - for text contrast. -- **Card on one screen.** `uiScreen` names an output (e.g. `DP-1`); empty or - unmatched means `screenModel.primary`. The card is centered in that screen's - geometry, so other screens show wallpaper only. +- **Background per window.** Each greeter window is exactly one screen, so a + single `Image` fills it with `fillMode: Image.PreserveAspectCrop`. A + `base`-coloured overlay sits above it for text contrast. +- **Card on one screen.** `uiScreen` names an output (e.g. `DP-1`); empty means + the window whose `primaryScreen` is true. The card is centered in its window, + so every other screen shows wallpaper only. A name that matches no screen + shows no card anywhere; set `uiScreen` in the root-owned `theme.conf`, never + in the regenerated `theme.conf.user`. - **Frosted card.** `ShaderEffectSource` samples the wallpaper at the card rectangle, `MultiEffect` (QtQuick.Effects, available on Qt 6.11) blurs it, and a rounded mask clips it to the card. If the effect fails to load, the card @@ -293,8 +298,10 @@ The commands need no `sudo` because the user runs them in a root shell. The - **A wallpaper outside `~/Pictures` may not be world-readable.** The card then renders on `theme.conf`'s fallback colour. Documented, not defended against. - **`uiScreen` names a physical output.** Changing monitor layout or names needs - a one-line edit of the generated INI or the theme config; empty falls back to - primary, so the default never breaks. + a one-line edit of the root-owned `theme.conf`; empty falls back to the + primary window, so the default never breaks. A mis-spelled name matches no + window and shows no card anywhere, so change it deliberately and leave it + empty if unsure. - **QtQuick.Effects blur depends on a working GL context in the greeter.** Falls back to a flat translucent card, so a failure is cosmetic. - **SDDM version drift.** `config.stringValue` needs SDDM 0.20+ and |
