// 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);