feat: give the classroom a desktop instead of a shell

The whole appliance UI is now configuration for a desktop Debian already
ships: a Plasma 6.3 session with a colour scheme, a look and feel package
that builds the bar, window rules, and KDE's own Kiosk restrictions.

Two things were measured rather than assumed, and both changed a decision.

Plasma restarts a crashed panel three times a minute and then gives up,
which is the failure a classroom has already had. Four lines of systemd
drop-in make it unconditional; the panel then survived eight SIGKILLs a
second apart, back each time in 2.4s.

Plasma draws a minimised task and a background task identically, so the
five states the room needs cannot all be shown. Rather than write a task
manager, the classroom removes minimise: clicking a launcher always means
show me this.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
ekklesia
2026-09-10 08:35:12 -05:00
co-authored by Claude Opus 5
parent bfc7caf28f
commit 87b55761c6
51 changed files with 1352 additions and 36 deletions
+24 -23
View File
@@ -1,32 +1,33 @@
#!/bin/bash
set -euo pipefail
# The dock's Browser button. classroom-window decides whether this is a
# launch, a focus, a minimise or a restore.
# The room's ordinary browser: YouTube, and anywhere else a lesson goes.
#
# Chrome stays a full browser: Wonder Ink is only the starting page, and
# the profile in ~/.config/google-chrome is never touched here so logins
# and cookies survive reboots and updates.
# It is a full browser with a tab strip and an address bar, in the room's
# own profile, so the church YouTube sign-in survives reboots and updates.
# Wonder Ink is a separate application in a separate profile and is not
# reachable from this one.
#
# There is no launch/focus/minimise/restore logic here any more. The panel
# owns that: it knows this window by StartupWMClass and does the right
# thing with a click, including telling the teacher which of those four
# states the application is in.
#
# --hide-crash-restore-bubble is what suppresses "Restore pages? Chrome
# didn't shut down correctly" after a reboot. Note the switch name: the
# didn't shut down correctly" after a power cut. Note the switch name: the
# older --disable-session-crashed-bubble is not present in Chrome 152 at
# all, so it would have silently done nothing. Verified against the
# strings of the installed binary.
# all, so it would have silently done nothing.
HOME_PAGE='https://app.wonderink.org/'
# Not Wonder Ink. Wonder Ink is its own application in its own profile,
# and a second way in through this window would put a teacher's lesson
# session in the room's shared browser profile — the exact leak the split
# exists to prevent.
HOME_PAGE='https://www.youtube.com/'
exec /usr/local/bin/classroom-window toggle \
--match 'google-chrome' \
--match 'chrome' \
--match 'chrome-.*' \
--match 'google-chrome-.*' \
-- \
google-chrome \
--ozone-platform=wayland \
--start-maximized \
--no-first-run \
--no-default-browser-check \
--password-store=basic \
--hide-crash-restore-bubble \
"$HOME_PAGE"
exec google-chrome \
--ozone-platform=wayland \
--no-first-run \
--no-default-browser-check \
--password-store=basic \
--hide-crash-restore-bubble \
"${@:-$HOME_PAGE}"