A laptop is going in for the women's Bible study, and the obvious way to
build that — a laptop profile that turns off the children's church
applications — is the wrong way. A laptop may well take children's church,
and a tower may well be a Bible study. Hardware cannot be allowed to
decide purpose, so every optional application gets a setting of its own:
WONDERINK_ENABLED already existed; behaviour unchanged
DVD_ENABLED new
PARENT_CALL_ENABLED new
and DEVICE_TYPE says only what the hardware IS. classroom-desktop-layout
never reads it, and there is a test that says so, because this is the rule
that will be under pressure the first time somebody adds a device.
All three default to true, so an existing classroom that has never heard
of any of them comes up exactly as it did before. The settings are
appended to device.conf by the same mechanism every other setting has
used, so an upgrade gains them without losing a byte an administrator
wrote.
The disc player is the one place hardware still votes, and it is a veto:
DVD_ENABLED can take the player away from a machine that has a drive,
nothing can put it on a machine that has none. A button that cannot work
is worse than no button.
The layout's launcher markers are replaced by a feature block of three
plain booleans. The old mechanism commented a line out of an array, which
worked for launchers and could not express Parent Call, because that is a
whole widget rather than one entry. Three booleans express both, and the
launcher list is now built from them in one fixed order, so a disabled
application closes the row up rather than leaving a gap, and the same
enabled set produces the same bar on every machine in the church.
Also here, because it is the bar and not a feature: sortingStrategy=0.
Plasma's default is 1, "manually", and the task manager accepts a
reordering drop only in that mode — MouseHandler.qml tests
tasksModel.sortMode === SortManual before it will move anything. The
classroom never wrote the key, so it had the default, and any teacher
could drag the launchers into a different order. This is the applet's own
lever refusing the drop rather than something of ours putting the bar back
afterwards.
The test now runs the layout the package actually ships, in node, with
Plasma's API stubbed, and asserts the launcher string that comes out.
Asserting against a copy of the file's text in the test was how the old
one worked, and a copy is a thing that drifts.
Co-Authored-By: Claude Opus 5 <[email protected]>
Screenshots from the classroom v2 experiment
All 1920×1080, captured with grim from a real running session in the
container lab. See ../classroom-v2-experiment.md.
The desktop
v2-idle-desktop |
the idle desktop: the wallpaper, one bar, nothing else |
v2-from-package |
the same desktop, produced by installing the .deb on a clean machine |
v2-dark-bar, v2-light-bar |
the bar in both themes |
v2-theme-compare |
the two, one above the other |
v2-testpage |
a maximised browser, edge to edge above the bar |
v2-wonderink |
Wonder Ink as an application, in its own profile |
Application state
state-1-closed |
both launchers closed: no indicator |
state-3-behind |
one active (teal), one running behind it (grey) |
state-4-minimized |
minimised — measured identical to behind, which is why minimise was removed as a route |
state-5-restored |
back |
v2-both-apps |
both applications, one button each, from the packaged install |
labelled-tasks |
the labelled task manager, evaluated and rejected: it shows changing page titles rather than application names |
Wonder Ink with tabs
0.2.1. A teacher prepares a lesson across several tabs, and none of a browser's other furniture is on the screen.
wonderink-tabs |
[ Lesson ] [ Video ] [ Activity ] — the second and third opened by the lesson itself, one through target=_blank and one through window.open |
wonderink-one-tab |
one tab, and no strip at all: the room looks exactly like the application this replaced |
wonderink-tab-closed |
the middle tab closed; the other two carry on |
wonderink-fullscreen |
a lesson's video over the whole display, panel and tab strip included |
wonderink-after-fullscreen |
and back, maximised above the bar, tabs intact — the bug this caught left the window 200 pixels wide in the corner |
wonderink-context-menu |
the whole of the right-click menu: back, forward, reload, print. No view-source, no save-page, no new window |
wonderink-print-dialog |
a lesson calling window.print(), landing on the room's own Elmer queue |
wonderink-and-browser |
the point of the split, in one picture: Chrome in front with its address bar, Wonder Ink a separate button beside it |
wonderink-autoplay, wonderink-autoplay-control |
the Present-view autoplay failure reproduced and then not reproduced: an unmuted video started by a script with no gesture, blocked at Chrome's default and playing as shipped |
wonderink-packaged |
the packaged shell against the real app.wonderink.org, launched from the .deb on a rebooted machine |
wonderink-disabled |
WONDERINK_ENABLED=false — no lesson button, the browser and the disc player where they were |
Wonder Ink worksheets
0.2.2. A lesson link that downloads a PDF comes back as a tab, and nothing else about the room's locks moves.
pdf-opened |
the worksheet a click downloaded, open as a tab beside the lesson and actually rendered — three pages, not a blank frame |
pdf-page2 |
page 2 of 3: multi-page navigation inside the tab |
pdf-spaces |
Leader Guide, Week 1 (Advent).pdf — spaces, a comma and brackets, through the download and into a tab |
pdf-print |
printing the worksheet, on the room's own Elmer queue |
pdf-closed-then-page |
the worksheet tab closed, the lesson still there and still working, and an ordinary target=_blank tab beside it |
pdf-broken |
HTML the server called .pdf: refused on its contents, with a message, and no blank tab |
pdf-interrupted |
a download that did not finish, saying so. The first version of this said nothing at all |
pdf-guard |
three attempts to reach a local file from the page — a link, a script, and a link to a worksheet that was downloaded but not opened by the shell. All refused |
pdf-dotmenu |
the whole of the PDF viewer's overflow menu, audited: two-page view, annotations, present, properties. No open, no save-as, no external link |
pdf-after-save |
the viewer's own download button: straight to Wonder Ink's directory with a notification, no file chooser and no duplicate tab |
pdf-autoplay-preserved |
the 0.2.1 Present-view autoplay fix, still working on the packaged 0.2.2 |
Parent Call
pc-icon-vs-notifications |
the Parent Call mark beside Plasma's notification bell — the comparison that decided it |
pc-mark |
the mark at 32, 48 and 64px, beside the two marks it replaced |
pc-panel |
the whole bar: Parent Call left, applications centre, status right |
pc-ready |
the card, ready, in approval mode |
pc-waiting |
waiting for a volunteer to approve |
pc-sent |
Sent to sanctuary — never "displayed" |
pc-rejected |
not approved, offering Try again |
pc-off |
the coordinator's mode is off |
pc-nobroker |
the broker is unreachable |
pc-typed |
a name in the field |
icon-candidates-2 |
sixteen Breeze person icons at real panel size, none of which meant Parent Call |
DVD
dvd-panel |
DVD in the row with the applications, out of the status area |
dvd-cover |
the DVD launcher's tooltip on the packaged install |
v2-dvd-overlay, v2-layershell |
the loading cover: a gtk-layer-shell overlay under KWin |
Windows
v2-secondary-window |
a window a page opened, floating over an untouched browser, with its own close button |
v2-print-dialog |
the system print dialog, over the page that raised it, offering only Elmer |
v2-fullscreen |
fullscreen video: the whole display, panel covered |
v2-layershell |
a gtk-layer-shell overlay under KWin — what the DVD loading cover is made of |
v2-notification-crop |
a notification card, top right |
Administration
admin-terminal |
the maintenance terminal, opened by its chord's action |
admin-terminal-bar |
the bar with the terminal open, and after closing it: a task button while it runs, no launcher ever |
Reliability and lockdown
recovery-after-8-kills |
the panel after eight consecutive SIGKILLs |
recovery-after-kwin-kill |
the session after KWin was killed twice; the application window survived |
recover-panel |
the bar rebuilt from the layout script after its configuration was deleted |
lock-desktop-rmb |
right-clicking the wallpaper: no menu |
lock-panel-rmb |
right-clicking the bar: no menu |
lock-krunner |
KRunner asked for, and not there |
The migration
migration-before |
what a real room got when it upgraded: stock Debian Plasma, kickoff, a pager, a system tray, the Debian wallpaper. Reproduced in the lab by taking one line out of the harness. |
migration-after |
the same machine after the fix — a Hyprland-era install, upgraded, rebooted |
migration-after-bar |
its bar, at the size a teacher sees it |
migration-parent-call |
Parent Call on the migrated machine, saying it cannot reach the church network rather than pretending it can |
theme-light-live, theme-light-after-logout |
the room's own light theme, and the same room after logging out and back in. The first attempt at this pass lost it. |
The rooms themselves
v2-from-package |
the classroom with the church's own wallpaper and the real Wonder Ink mark |
wonderink-icon |
the same mark as a running application's button |
display-settings |
the hidden display-size dialog, saying that saving needs an administrator |
scale-200, scale-200-notification, scale-200-chrome |
the room at 200%: the panel, a notification card, and the browser, all doubled together |
notification-style |
the notification card on the classroom's own Plasma style |
osd-volume |
Plasma's volume display, which the room keeps |
osd-shellpackage |
the custom one, which rendered correctly and cost the panel |
pc-unreachable, pc-not-configured |
Parent Call telling a broker it cannot reach from one that was never set up |
dvd-absent-bar |
the bar on a machine with no optical drive |
A morning in the rooms
pc-no-mode |
Parent Call ready against a broker with no retained mode — the state that used to say the room was never set up |
pc-bottom-left, pc-200-package |
the card anchored bottom-left at 100% and at 200% |
notif-package-100, notif-package-200 |
the notification card at both scales, from Classroom |
notif-13pt, notif-15pt |
the two font sizes that were weighed for it |
pc-typed-layer |
the card gone: the lab's keyboard tool closes it, which is why typing is still a bench test |
Failures, kept
| — | keyboard injection never reached the nested session, so every interaction in this experiment was driven by the pointer. It is why Parent Call has never had a real key pressed into it, and why that is the first bench test. |
m-closed, m-minimized |
the pair whose pixels were sampled to show that Plasma draws minimised and closed differently, but minimised and behind the same |