The DVD player was the only thing still speaking a compositor the room no longer runs. It asked sway's tree whether VLC's window had really gone fullscreen, because VLC reports playing while its window is still the black startup one the loading cover exists to hide. VLC's own status was measured as a replacement and is not one: it reports fullscreen true in the same 250ms poll as playing, because the flag is the option it was started with and not a report about its window. So the cover is held for a floor and capped by the deadline that was already there, and the compositor is not asked anything. Focus-or-launch went the same way. The session already takes an exclusive lock, so a second one cannot start, and bringing an existing one to the front is the panel's job. classroom-window, classroom_sway and classroom_chrome are gone with it — the last of them was reachable from nothing at all. DVD also moves out of the status row, where it sat beside the clock as though a disc were a machine reading. It is an application: it is in the row with Wonder Ink and the browser, and classroom-provision removes it from the layout on a machine with no optical drive, which retires DVD_ENABLED. A computer that moves between rooms takes its drive with it; nobody remembers to edit a file when it does. The panel is rebuilt from the package at every login now. Plasma keeps whatever panel it first built, so an update could change the bar in the package and never change it in a room — measured, with an icon that outlived the file it came from. Editing the live panel configuration was tried instead and destroyed the panel, because the shell owns that file. Removing it before the shell starts is safe and makes the desktop stateless. Co-Authored-By: Claude Opus 5 <[email protected]>
142 lines
6.3 KiB
JavaScript
142 lines
6.3 KiB
JavaScript
// The Ekklesia Classroom desktop.
|
|
//
|
|
// Plasma runs this once, when a session has no panel yet, and again on
|
|
// demand — `plasma-apply-lookandfeel -a org.ekklesia.classroom.desktop
|
|
// --resetLayout` rebuilds the whole desktop from this file. That is the
|
|
// classroom's recovery path for a damaged shell, and it is Plasma's own
|
|
// mechanism rather than something written here.
|
|
//
|
|
// One full-width bar along the bottom. Left is auxiliary, the middle is
|
|
// applications, the right is the small amount of status a teacher needs.
|
|
// Nothing else is on the screen.
|
|
|
|
var WALLPAPER = "/usr/share/backgrounds/ekklesia/classroom-calm.png";
|
|
|
|
// Matches the 76px strip the classroom has always used, so muscle memory
|
|
// and the room's viewing distance both carry over.
|
|
var PANEL_HEIGHT = 76;
|
|
|
|
// The idle desktop: the wallpaper, and nothing on it.
|
|
var screens = desktops();
|
|
for (var i = 0; i < screens.length; i++) {
|
|
var desktop = screens[i];
|
|
desktop.wallpaperPlugin = "org.kde.image";
|
|
desktop.currentConfigGroup = ["Wallpaper", "org.kde.image", "General"];
|
|
desktop.writeConfig("Image", "file://" + WALLPAPER);
|
|
desktop.writeConfig("SlidePaths", "");
|
|
// 2 is "scaled and cropped": the landscape fills the display at any
|
|
// aspect ratio without being stretched out of shape.
|
|
desktop.writeConfig("FillMode", 2);
|
|
desktop.reloadConfig();
|
|
}
|
|
|
|
var panel = new Panel();
|
|
panel.location = "bottom";
|
|
panel.height = PANEL_HEIGHT;
|
|
panel.hiding = "none";
|
|
panel.floating = false;
|
|
panel.lengthMode = "fill";
|
|
panel.alignment = "center";
|
|
panel.opacity = "adaptive";
|
|
|
|
// LEFT — auxiliary. Parent Call is not one of the room's applications and
|
|
// is deliberately not in the row with them.
|
|
// Quick Launch: a launcher, and only a launcher.
|
|
//
|
|
// Two other widgets were tried on a real panel. The Icon widget copies
|
|
// the desktop entry into the user's home and uses the copy, so an update
|
|
// could never change the icon or the command — it kept showing a bell out
|
|
// of a package that no longer contained one. A task manager reads
|
|
// /usr/share/applications live, which fixes that, but a task manager also
|
|
// shows every running window, so the auxiliary corner filled up with the
|
|
// lesson's tasks.
|
|
//
|
|
// Quick Launch reads the entry live and shows nothing but the button.
|
|
var parentCall = panel.addWidget("org.kde.plasma.quicklaunch");
|
|
parentCall.currentConfigGroup = ["General"];
|
|
// A file URL, not applications:. Quick Launch resolves the entry itself
|
|
// and does not copy it, so the path is a live reference to what the
|
|
// package installs.
|
|
parentCall.writeConfig(
|
|
"launcherUrls",
|
|
"file:///usr/share/applications/ekklesia-parent-call.desktop"
|
|
);
|
|
parentCall.writeConfig("showLauncherNames", false);
|
|
parentCall.writeConfig("enablePopup", false);
|
|
parentCall.writeConfig("maxSectionCount", 1);
|
|
|
|
var leftGap = panel.addWidget("org.kde.plasma.panelspacer");
|
|
leftGap.currentConfigGroup = ["General"];
|
|
leftGap.writeConfig("expanding", true);
|
|
|
|
// CENTRE — the applications, and the whole of the running/minimised/active
|
|
// story. This applet is the reason the classroom stops writing a dock.
|
|
var tasks = panel.addWidget("org.kde.plasma.icontasks");
|
|
tasks.currentConfigGroup = ["General"];
|
|
// The DVD line is rewritten by classroom-provision to match the machine:
|
|
// a room with no optical drive has it removed, so no teacher is offered a
|
|
// disc player that cannot exist. Between the marker comments, and nowhere
|
|
// else, so the edit is a line replacement and not a parse.
|
|
tasks.writeConfig("launchers", [
|
|
"applications:ekklesia-wonderink.desktop",
|
|
"applications:google-chrome.desktop",
|
|
/* CLASSROOM-DVD-LAUNCHER */ "applications:ekklesia-dvd.desktop"
|
|
].join(","));
|
|
// Every window gets its own button. Teachers should never have to open a
|
|
// group to find out that a second window exists.
|
|
tasks.writeConfig("groupingStrategy", 0);
|
|
tasks.writeConfig("showOnlyCurrentDesktop", false);
|
|
tasks.writeConfig("showOnlyCurrentActivity", false);
|
|
tasks.writeConfig("showOnlyCurrentScreen", false);
|
|
// Clicking a button always means "show me this", and never "hide it".
|
|
//
|
|
// This was measured before it was decided. Plasma 6.3 draws a minimised
|
|
// task and a task that is merely behind another window identically: no
|
|
// indicator for closed, a grey indicator for running, a teal one for
|
|
// active — three marks for four states. Rather than write a task manager
|
|
// that draws a fourth, the classroom removes the state. There is nothing
|
|
// on the idle desktop for a teacher to want to see, so minimising an
|
|
// application in this room has no purpose and only ever loses it.
|
|
//
|
|
// A window minimised some other way is still shown as running and comes
|
|
// back with one click, so it can never be lost even then.
|
|
tasks.writeConfig("minimizeActiveTaskOnClick", false);
|
|
tasks.writeConfig("fill", false);
|
|
tasks.writeConfig("maxStripes", 1);
|
|
tasks.writeConfig("indicateAudioStreams", false);
|
|
tasks.writeConfig("wheelEnabled", false);
|
|
tasks.writeConfig("middleClickAction", "NewInstance");
|
|
tasks.writeConfig("showToolTips", true);
|
|
tasks.writeConfig("iconSpacing", 2);
|
|
|
|
var rightGap = panel.addWidget("org.kde.plasma.panelspacer");
|
|
rightGap.currentConfigGroup = ["General"];
|
|
rightGap.writeConfig("expanding", true);
|
|
|
|
// RIGHT — status.
|
|
//
|
|
// Three ordinary applets straight on the bar, and no system tray around
|
|
// them. A tray is a container that discovers whatever is installed and
|
|
// then hides most of it behind an arrow; measured in the lab it collected
|
|
// battery, brightness, clipboard, keyboard layout, camera, vaults and
|
|
// screen management on a machine that has none of those to say anything
|
|
// about. Naming the four the classroom actually uses is both smaller and
|
|
// deterministic, and it leaves nothing for a teacher to expand.
|
|
panel.addWidget("org.kde.plasma.networkmanagement");
|
|
panel.addWidget("org.kde.plasma.volume");
|
|
|
|
panel.addWidget("org.kde.plasma.notifications");
|
|
|
|
var clock = panel.addWidget("org.kde.plasma.digitalclock");
|
|
clock.currentConfigGroup = ["Appearance"];
|
|
clock.writeConfig("showDate", true);
|
|
clock.writeConfig("dateFormat", "custom");
|
|
clock.writeConfig("customDateFormat", "ddd d MMM");
|
|
clock.writeConfig("showSeconds", 0);
|
|
clock.writeConfig("dateDisplayFormat", "BelowTime");
|
|
// Left to itself the clock grows to the height of the bar and becomes the
|
|
// largest text in the room. It is status, not a headline.
|
|
clock.writeConfig("autoFontAndSize", false);
|
|
clock.writeConfig("fontSize", 15);
|
|
clock.writeConfig("fontWeight", 500);
|