aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-09-17 13:27:55 +0200
committerDanilo M. <danix@danix.xyz>2026-09-17 13:27:55 +0200
commitebe8d060b28b3e602f83d7f0a385c8cc2ee424a9 (patch)
tree1c08b317f3af46520b03e3d95336356d94f4ee4d
parent96841b1cef108130bcf1ab21c34cf89b92f1b35c (diff)
downloadsddm-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.md7
-rw-r--r--docs/superpowers/specs/2026-09-17-sddm-theme-udt-design.md43
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