Three marks were put on a real panel and judged at the size the bar actually draws them. A bell sat inches from Plasma's own notification bell and meant something entirely different. A handset with an outgoing arrow read as a telephone feature. Breeze has people and it has telephones and the two never meet, so this is drawn in Breeze's language instead: an adult, a child, and one small speech bubble, on Breeze's 22-unit grid with its ColorScheme-Text class, so it recolours with the session and needs no second file for the light theme. Quick Launch carries it. The Icon widget copies the entry into the user's home so an update could never change it; a task manager reads the entry live but also shows every running window, which filled the auxiliary corner with the lesson's tasks. One defect found on the way, and it affected the Wonder Ink icon that is already shipping: gdk-pixbuf recognises an SVG by sniffing the first bytes, and a licence-length comment above the opening tag pushes it out of that window. Every GTK program reported "couldn't recognize the image file format" while Qt rendered the same file happily. The comments live inside <svg> now. Co-Authored-By: Claude Opus 5 <[email protected]>
142 lines
6.2 KiB
JavaScript
142 lines
6.2 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"];
|
|
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);
|