Two findings, both from watching the bar refuse to change. The Icon widget copies the desktop entry into the user's home and uses the copy. A classroom that had already run kept the old icon and the old command for ever: the package no longer contained a bell and the bar kept showing one. The button is a task manager holding a single launcher now, which resolves /usr/share/applications live — the place an OTA update writes to — and costs nothing, because the classroom already runs one for the applications. NoDisplay=true then hid the entry from the very index that resolves launchers, and the bar drew a blank page. There is no application menu in this classroom for the entry to clutter, so it is indexable now. Co-Authored-By: Claude Opus 5 <[email protected]>
142 lines
6.4 KiB
JavaScript
142 lines
6.4 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.
|
|
// A task manager holding one launcher, not the Icon widget.
|
|
//
|
|
// The Icon widget copies the desktop entry into the user's home and uses
|
|
// the copy, so a classroom that had already run would keep the old icon
|
|
// and the old command for ever — an update could never change either.
|
|
// Measured: it kept showing a bell out of a package that no longer
|
|
// contains one. Quick Launch would also do, but Debian does not ship it.
|
|
//
|
|
// This applet reads /usr/share/applications live, which is what an OTA
|
|
// update writes to, and it costs nothing extra: the classroom already
|
|
// runs one for the applications.
|
|
var parentCall = panel.addWidget("org.kde.plasma.icontasks");
|
|
parentCall.currentConfigGroup = ["General"];
|
|
parentCall.writeConfig("launchers", "applications:ekklesia-parent-call.desktop");
|
|
parentCall.writeConfig("groupingStrategy", 0);
|
|
parentCall.writeConfig("showOnlyCurrentDesktop", false);
|
|
parentCall.writeConfig("showOnlyCurrentActivity", false);
|
|
parentCall.writeConfig("showOnlyCurrentScreen", false);
|
|
parentCall.writeConfig("minimizeActiveTaskOnClick", false);
|
|
parentCall.writeConfig("fill", false);
|
|
parentCall.writeConfig("maxStripes", 1);
|
|
parentCall.writeConfig("wheelEnabled", false);
|
|
parentCall.writeConfig("showToolTips", true);
|
|
|
|
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"];
|
|
tasks.writeConfig("launchers", [
|
|
"applications:ekklesia-wonderink.desktop",
|
|
"applications:google-chrome.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.
|
|
//
|
|
// Four 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");
|
|
|
|
// Present only while there is something in a drive. Plasma's own Solid
|
|
// device notifier is what makes the DVD appear with the disc and leave
|
|
// with it, so nothing in the classroom polls for media.
|
|
panel.addWidget("org.kde.plasma.devicenotifier");
|
|
|
|
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);
|