What Tiny Pebbles showed, what the lab measured (a new activity gives the same bare desktop; a file path as the fallback is ignored; live D-Bus is refused by the lockdown), the two parts of the fix, and the check with a real television switched on after a reboot — the one thing the lab cannot do, because KWin will not start with no screen. Co-Authored-By: Claude Opus 5.5 <[email protected]>
138 lines
7.5 KiB
Markdown
138 lines
7.5 KiB
Markdown
# Classroom display size (Plasma v2)
|
||
|
||
Each room keeps its own `UI_SCALE` in `/etc/ekklesia-classroom/device.conf`.
|
||
Package upgrades preserve the value. Plasma applies it at every classroom login.
|
||
Native display resolution is unchanged.
|
||
|
||
## Administrator setting
|
||
|
||
On the classroom keyboard press **Meta+Ctrl+Alt+Shift+D** to open Display size.
|
||
It is hidden from application lists and the teacher's panel. Saving requires
|
||
administrator authentication through polkit; the keyboard shortcut grants no
|
||
privilege. Choose a percentage and press Save and apply. Canceling the password
|
||
prompt leaves the saved setting unchanged.
|
||
|
||
Start at **200% for a 4K TV**, which gives 1920×1080 logical space while retaining
|
||
3840×2160 output. The offered values are 100, 125, 150, 175, 200, 225, 250 and 300%.
|
||
The choice applies to all connected, enabled displays on that classroom computer.
|
||
|
||
For SSH administration, the fixed-purpose helper can also be run as root:
|
||
|
||
```
|
||
sudo /usr/local/bin/classroom-set-scale 2
|
||
```
|
||
|
||
It writes only UI_SCALE, preserving room configuration, broker credentials and
|
||
file ownership and permissions. The new size takes effect at the next classroom
|
||
login, or by running `classroom-scale` inside the classroom's graphical session.
|
||
The hidden window saves and applies in one operation.
|
||
|
||
## Implementation and validation limits
|
||
|
||
`classroom-scale` uses `kscreen-doctor`; the login autostart runs only in KDE and
|
||
the script applies only to the classroom account. Values read from older/manual
|
||
configurations remain clamped to 0.8–3.0; invalid/nonfinite values become 1.0.
|
||
The helper accepts only the window's predefined choices, takes no paths, and
|
||
writes the root-owned settings file atomically. Polkit requires auth_admin for
|
||
every save, with no retained authorization.
|
||
|
||
Hardware checks required: shortcut registration, administrator authentication,
|
||
200% at 4K, logout/reboot persistence, and Chrome/Parent Call/DVD sizing. XWayland
|
||
applications may be softer than native Wayland applications when scaled.
|
||
|
||
## Wallpaper in the v2 package
|
||
|
||
The approved background source is `config/wallpapers/classroom-calm.png`. The
|
||
package installs it at `/usr/share/backgrounds/ekklesia/classroom-calm.png`, the
|
||
path used by the packaged Plasma layout. The layout is rebuilt at login, so
|
||
upgraded classrooms receive the package wallpaper without per-room copying.
|
||
|
||
### A desktop the layout never saw (0.2.6.6)
|
||
|
||
Tiny Pebbles came through the 0.2.2 → 0.2.6.4 upgrade showing Plasma's own
|
||
purple wallpaper. Its desktop was containment 10 with no `Wallpaper` group;
|
||
River Kids' is containment 1 with one. The package and the picture were the
|
||
same on both.
|
||
|
||
The layout sets the wallpaper on the desktops that exist *while it runs*.
|
||
Plasma makes a desktop for every screen or activity that appears later, and
|
||
it makes those without the layout. 0.2.2's updater rebooted as soon as it
|
||
had installed, at 03:00–03:30. A television switched off at the set is
|
||
usually no screen at all, so the layout would have run with no desktop, and
|
||
the desktop Plasma made when the television came on was bare. A panel built
|
||
with no screen takes number 1 and its eight applets 2–9, which is exactly
|
||
how a desktop ends up as 10. **The television is inferred, not observed**.
|
||
See the hardware check in [testing.md](testing.md#the-television-switched-on-after-a-night-time-reboot).
|
||
|
||
Measured in the lab (Plasma 6.3.6, Debian 13):
|
||
|
||
| What was tried | What happened |
|
||
| --- | --- |
|
||
| Activity manager delayed 20 s at login | Plasma waited for it; desktop 1, wallpaper right. Not the cause |
|
||
| A new activity created mid-session | Plasma made desktop 11 with no `Wallpaper` group, the same shape as Tiny Pebbles' 10. The screen showed Plasma's *Next*; the panel was untouched |
|
||
| Look-and-feel default `Image=` set to a **file path** (0.2.2–0.2.6.5) | Ignored. `DefaultWallpaper` in libkworkspace6 looks the value up as a wallpaper **package** under `wallpapers/<name>`, the way Breeze says `Image=Next` |
|
||
| The same default set to a **package name**, whose one image links to the file | Desktop 11, still with no `Image`, showed the classroom's picture after a shell restart |
|
||
| Setting it live over D-Bus (`evaluateScript`, `plasma-apply-wallpaperimage`) | Refused: "Widgets are locked". The classroom's lockdown forbids the scripting console, and it stays forbidden |
|
||
| Disabling the only screen to reproduce a screenless start | KWin refuses ("Disabling all outputs … is not allowed"), and the nested lab cannot hot-plug a screen |
|
||
|
||
So there are two parts, and they do different jobs:
|
||
|
||
* **The default is now a package**, `/usr/share/wallpapers/EkklesiaClassroom`.
|
||
Its image is a link to the file above, and the look and feel names it.
|
||
Any desktop Plasma makes without the layout shows the classroom's picture
|
||
with nothing having to run. This is the fix for Tiny Pebbles.
|
||
* **`classroom-desktop-wallpaper`** writes `wallpaperplugin=org.kde.image` and
|
||
the classroom `Image` into every desktop containment already in the file,
|
||
so the configuration says what the screen shows. It finds desktops by
|
||
plugin (`org.kde.plasma.folder`, `org.kde.desktopcontainment`), never by
|
||
number. It changes nothing else, and it does not write a file that is
|
||
already right. It runs as plasmashell's `ExecStartPre`, the one moment
|
||
the shell does not own the file: every login, every reboot, every restart
|
||
after a crash. At a login it usually finds nothing, because
|
||
`classroom-desktop-reset` has just removed the file for the layout to
|
||
rebuild.
|
||
|
||
To apply it in a running session without logging out, from the maintenance
|
||
terminal:
|
||
|
||
```
|
||
classroom-desktop-wallpaper --check # read-only
|
||
systemctl --user restart plasma-plasmashell.service # the panel blinks, windows stay
|
||
```
|
||
|
||
Run without `--check` while the shell is up, it refuses and prints that
|
||
second line rather than edit the file underneath the shell.
|
||
|
||
Tests: `tests/test-classroom-desktop-wallpaper.sh` (in the build) covers
|
||
Tiny Pebbles' own file, a healthy River Kids file, differing numbers,
|
||
idempotence and the guard. `tools/lab/wallpaper-check` covers real Plasma,
|
||
reading the colour off the screen, and runs inside `tools/lab/dirty-upgrade`.
|
||
`tools/validate-trixie-release.sh` covers the installed package when
|
||
upgrading from a previous release.
|
||
|
||
## What the one number reaches
|
||
|
||
`classroom-ui-scale` prints it, clamped, and everything that cannot read
|
||
the display scale for itself asks that command rather than the file:
|
||
|
||
* **Plasma** — the panel, the clock, notifications, the volume display and
|
||
every dialog, because `classroom-scale` sets it as the display's scale
|
||
through `kscreen-doctor` at every login.
|
||
* **Chrome** — `--force-device-scale-factor`, because Chrome on the sway
|
||
session was measured not to follow the compositor's output scale on its
|
||
own. **Under Plasma it does**, so this is now a second scaling: measured
|
||
at 150%, Chrome's pages report `devicePixelRatio` 2.25, not 1.5. Left as
|
||
it is in 0.2.6.1 because it is the size teachers know; see
|
||
[wonder-ink.md](wonder-ink.md#how-large-a-lesson-is).
|
||
* **Wonder Ink** — its window follows the compositor as every Qt
|
||
application does, and its *pages* start at a zoom of `UI_SCALE`, so a
|
||
lesson is the size the browser shows it.
|
||
* **The disc player's own surfaces** — they are measured in the logical
|
||
pixels the compositor is already scaling, so they follow without being
|
||
told.
|
||
|
||
The clock is the one thing that used to be left behind. It was pinned at
|
||
15 points, which is the same 15 points at every scale, and on a 4K
|
||
television it was a clock nobody at the back of the room could read. It
|
||
is sized by the bar now.
|