feat: give every room the broker, one scale, and its own panel back
Little Waders took the Plasma build and reported what a container cannot. A disc player on a machine with no optical drive, a clock nobody at the back of the room could read, a browser at half the size of the panel around it, and Parent Call with no broker to call. The broker is the same for every classroom, so it is a default now and not something to fill in room by room. classroom-migrate brings an existing room to the same place without touching its name, its username or its password, and Parent Call distinguishes a broker it cannot reach from one that was never set up: those send somebody to look at completely different things. The disc player's detection was right and ran too late — alongside the session rather than before it, and the panel is built from the layout the moment a session starts. It runs before the display manager now, and again from udev when a drive is plugged in. UI_SCALE had a ceiling of 1.5, which cannot express a 4K television; a clock pinned at 15 points, which is the same size at every scale; and a browser that was never told the number at all. All three are fixed and the room doubles together at 200%. This also brings 0.1.47's work into the repository, where it had only ever existed in a build directory under /tmp: the hidden display dialog, its authenticated writer, the polkit action, and the church's own wallpaper. One piece of it is deliberately left out. The custom volume display needed a shell package of our own, and with one selected plasmashell builds no panel at all — measured twice, with that build's own files, on a classroom that deletes its panel configuration at every login by design. The lab connected to the real church broker the moment the package defaulted to it. Nothing was left behind, which was checked, but the guard that should have stopped it had never worked: it used iptables, which the lab image does not have, and probed with /dev/tcp under dash, where that always fails. Both reported success. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5
parent
926668dc9b
commit
34fd02e08f
@@ -1,21 +1,26 @@
|
||||
{
|
||||
"DefaultBrowserSettingEnabled": false,
|
||||
"PromotionalTabsEnabled": false,
|
||||
"MetricsReportingEnabled": false,
|
||||
"BrowserSignin": 0,
|
||||
"SyncDisabled": true,
|
||||
"SigninInterceptionEnabled": false,
|
||||
"BackgroundModeEnabled": false,
|
||||
"BrowserAddPersonEnabled": false,
|
||||
"BrowserGuestModeEnabled": false,
|
||||
"ProfilePickerOnStartupAvailability": 1,
|
||||
"PasswordManagerEnabled": false,
|
||||
"PasswordLeakDetectionEnabled": false,
|
||||
"BackgroundModeEnabled": false,
|
||||
"DisablePrintPreview": true,
|
||||
"BrowserSignin": 0,
|
||||
"CookiesSessionOnlyForUrls": [
|
||||
"[*.]wonderink.org"
|
||||
],
|
||||
"ShowHomeButton": true,
|
||||
"DefaultBrowserSettingEnabled": false,
|
||||
"DefaultNotificationsSetting": 2,
|
||||
"DisablePrintPreview": true,
|
||||
"HomepageIsNewTabPage": false,
|
||||
"HomepageLocation": "https://www.youtube.com/"
|
||||
"HomepageLocation": "https://www.youtube.com/",
|
||||
"MetricsReportingEnabled": false,
|
||||
"NotificationsAllowedForUrls": [],
|
||||
"NotificationsBlockedForUrls": [
|
||||
"*"
|
||||
],
|
||||
"PasswordLeakDetectionEnabled": false,
|
||||
"PasswordManagerEnabled": false,
|
||||
"ProfilePickerOnStartupAvailability": 1,
|
||||
"PromotionalTabsEnabled": false,
|
||||
"ShowHomeButton": true,
|
||||
"SigninInterceptionEnabled": false,
|
||||
"SyncDisabled": true
|
||||
}
|
||||
|
||||
@@ -1,33 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128">
|
||||
<!-- The comment lives inside <svg>, not above it. gdk-pixbuf
|
||||
recognises an SVG by sniffing the first bytes of the file, and a
|
||||
licence-length comment before the opening tag pushes it out of
|
||||
that window: every GTK program then reports "couldn't recognize
|
||||
the image file format" while Qt renders it happily. Measured on
|
||||
both of the classroom's own icons. -->
|
||||
<!-- Wonder Ink.
|
||||
|
||||
A stand-in for the product's own mark, which the classroom does not
|
||||
have a licensed asset for. It is a filled colour tile rather than a
|
||||
line drawing on purpose: the room already learned, the hard way, that
|
||||
a monochrome glyph on a bar is read as a decoration and not as an
|
||||
application. Somebody asked whether the old browser glyph meant "the
|
||||
Internet". A tile with its own colour does not get that question. -->
|
||||
<defs>
|
||||
<linearGradient id="tile" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0" stop-color="#4FB3A8"/>
|
||||
<stop offset="0.55" stop-color="#3E93A8"/>
|
||||
<stop offset="1" stop-color="#7C6FC4"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect x="6" y="6" width="116" height="116" rx="28" fill="url(#tile)"/>
|
||||
<path d="M64 30c0 0 26 28 26 44a26 26 0 0 1-52 0c0-16 26-44 26-44z"
|
||||
fill="#FFFFFF" fill-opacity="0.94"/>
|
||||
<path d="M50 76a14 14 0 0 0 10 13" stroke="#3E93A8" stroke-width="5"
|
||||
stroke-linecap="round" fill="none" opacity="0.55"/>
|
||||
<g fill="#FFFFFF" opacity="0.9">
|
||||
<path d="M96 34l2.6 6.4L105 43l-6.4 2.6L96 52l-2.6-6.4L87 43l6.4-2.6z"/>
|
||||
<circle cx="34" cy="40" r="3.2"/>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
|
||||
<title>Wonder Ink</title>
|
||||
<!-- The Wonder Ink mark, as supplied, on a square canvas.
|
||||
|
||||
A panel icon slot is square and the mark is 65.67 by 46.68, so it is
|
||||
fitted to the width and centred rather than stretched: the
|
||||
transform below is the only thing added to the artwork, and the
|
||||
paths are untouched.
|
||||
|
||||
The comment is inside the root element on purpose. A comment
|
||||
before it stops gdk-pixbuf recognising the file as SVG at all,
|
||||
which took two classroom icons out of the panel once already. -->
|
||||
<g transform="translate(0 9.254) scale(0.97457)">
|
||||
<path d="M64.54 45.7l-31.4 1a3.2 3.2 0 01-2.93-3.14l.13-34.75 32.28 1.49a3.23 3.23 0 013 3.51z" fill="#003b5c"></path><path d="M38.15 37l-32.61.91A3.18 3.18 0 012.42 35L0 0l36.25.85a3.21 3.21 0 013.26 3.3z" fill="#e48043"></path><path fill="#85b36d" d="M45.67 13.92l6.66.55.78 27.54h-7.23l-.21-28.09z"></path><path d="M4.81 4.46h4.75l3.52 17.8c.2 1 .36 2 .36 2s.12-1 .28-2L15.13 7h7.14l1.44 15.3c.15 1 .27 2 .27 2s.16-1 .36-2l2.3-16.34 5.11.21c1.1 0 2.52 1.87 2.18 2.92l-6.62 23.4h-6.58L19 22.26c-.2-1.11-.28-1.74-.28-1.74s-.08.63-.28 1.74l-1.75 10.23h-3.37a1.28 1.28 0 01-1.22-.9z" fill="#efc848"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,8 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Classroom display size
|
||||
Exec=/usr/local/bin/classroom-display-settings
|
||||
Icon=preferences-desktop-display
|
||||
Terminal=false
|
||||
NoDisplay=true
|
||||
X-KDE-Shortcuts=Meta+Ctrl+Alt+Shift+D
|
||||
@@ -0,0 +1,6 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Classroom display size
|
||||
Exec=/usr/local/bin/classroom-scale
|
||||
OnlyShowIn=KDE;
|
||||
NoDisplay=true
|
||||
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
The card every Plasma popup in the classroom is drawn on: notifications,
|
||||
the volume display, the panel's own popups.
|
||||
|
||||
A Plasma style is the supported way to change this, and it is the reason
|
||||
no QML was replaced to do it. A style is a set of pictures: anything this
|
||||
package does not provide comes from Breeze, so the worst this file can do
|
||||
is look wrong, never fail to appear. Replacing the notification plasmoid's
|
||||
QML would have been the other route, and a QML error there is a classroom
|
||||
with no notifications at all.
|
||||
|
||||
Nine named pieces, which is what Plasma's FrameSvg expects: four corners,
|
||||
four edges and a middle. The corners are the whole point — a 14px radius
|
||||
instead of Breeze's, so a card on a television reads as a card rather than
|
||||
as a panel that has come loose.
|
||||
|
||||
The colour is not in here. ColorScheme-Background is replaced at runtime
|
||||
by the session's own scheme, so this follows classroom-theme between dark
|
||||
and light without a second file.
|
||||
-->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" version="1.1">
|
||||
<defs>
|
||||
<style type="text/css" id="current-color-scheme">
|
||||
.ColorScheme-Background { color: #141c20; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<g class="ColorScheme-Background" fill="currentColor">
|
||||
<path id="topleft" d="M 0,14 A 14,14 0 0 1 14,0 L 14,14 Z" />
|
||||
<rect id="top" x="20" y="0" width="8" height="14" />
|
||||
<path id="topright" d="M 34,0 A 14,14 0 0 1 48,14 L 34,14 Z" />
|
||||
|
||||
<rect id="left" x="0" y="20" width="14" height="8" />
|
||||
<rect id="center" x="20" y="20" width="8" height="8" />
|
||||
<rect id="right" x="34" y="20" width="14" height="8" />
|
||||
|
||||
<path id="bottomleft" d="M 14,48 A 14,14 0 0 1 0,34 L 14,34 Z" />
|
||||
<rect id="bottom" x="20" y="34" width="8" height="14" />
|
||||
<path id="bottomright" d="M 48,34 A 14,14 0 0 1 34,48 L 34,34 Z" />
|
||||
</g>
|
||||
</svg>
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"KPlugin": {
|
||||
"Authors": [
|
||||
{
|
||||
"Name": "Ekklesia"
|
||||
}
|
||||
],
|
||||
"Description": "Cards for a room read from across it",
|
||||
"Id": "ekklesia",
|
||||
"License": "GPLv2+",
|
||||
"Name": "Ekklesia Classroom",
|
||||
"Website": "https://riverofglorymn.org"
|
||||
},
|
||||
"X-Plasma-API": "5.0"
|
||||
}
|
||||
@@ -15,7 +15,7 @@ AccentColor=79,179,168
|
||||
Theme=breeze-dark
|
||||
|
||||
[plasmarc][Theme]
|
||||
name=default
|
||||
name=ekklesia
|
||||
|
||||
[kcminputrc][Mouse]
|
||||
cursorTheme=breeze_cursors
|
||||
|
||||
@@ -123,7 +123,23 @@ rightGap.writeConfig("expanding", true);
|
||||
// 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");
|
||||
|
||||
var volume = panel.addWidget("org.kde.plasma.volume");
|
||||
volume.currentConfigGroup = ["General"];
|
||||
// No chime when the volume changes. A classroom is often listening to
|
||||
// something when somebody adjusts it, and a beep over a lesson is worse
|
||||
// than no feedback at all — the on-screen display is the feedback, and it
|
||||
// is in the look and feel package where a television can read it.
|
||||
//
|
||||
// Plasma 6 moved this setting out of the applet and into a global one,
|
||||
// and the applet migrates a false written here into it on first run. So
|
||||
// this is both the setting and the instruction to carry it across.
|
||||
volume.writeConfig("volumeFeedback", false);
|
||||
volume.writeConfig("volumeOsd", true);
|
||||
volume.writeConfig("muteOsd", true);
|
||||
volume.writeConfig("outputChangeOsd", true);
|
||||
// A teacher pressing the volume key expects a step they can hear.
|
||||
volume.writeConfig("volumeStep", 5);
|
||||
|
||||
panel.addWidget("org.kde.plasma.notifications");
|
||||
|
||||
@@ -134,8 +150,13 @@ 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);
|
||||
// Sized by the bar, not by a number written here.
|
||||
//
|
||||
// It used to be pinned at 15 points to stop it becoming the largest text
|
||||
// in the room. On a 4K television that was a clock a teacher could not
|
||||
// read from the back of the room, and it was the one thing in the
|
||||
// classroom that did not follow UI_SCALE, because a point size written
|
||||
// into a layout is the same point size at every scale. Plasma's own
|
||||
// sizing follows the bar, and the bar follows the scale.
|
||||
clock.writeConfig("autoFontAndSize", true);
|
||||
clock.writeConfig("fontWeight", 500);
|
||||
|
||||
@@ -1,9 +1,16 @@
|
||||
# Small cards, top right, out of the way of the bottom bar and of anything
|
||||
# a teacher is reading. Plasma's own notification service does this; the
|
||||
# classroom does not run a notification daemon of its own.
|
||||
# Top right, out of the way of the bottom bar and of anything a teacher is
|
||||
# reading. Plasma's own notification service does this; the classroom does
|
||||
# not run a notification daemon of its own, and replacing the daemon was
|
||||
# never on the table — what the room changes is how the card looks, in the
|
||||
# Plasma style, and how large it is, which follows UI_SCALE like the rest
|
||||
# of the session.
|
||||
[Notifications][$i]
|
||||
PopupPosition=TopRight
|
||||
PopupTimeout=6000
|
||||
# Eight seconds. Six is comfortable at a desk and short at the back of a
|
||||
# classroom, where the card has to be noticed before it can be read.
|
||||
# Critical notifications ignore this and stay until they are dismissed,
|
||||
# which is Plasma's behaviour and the reason it is not changed here.
|
||||
PopupTimeout=8000
|
||||
LowPriorityPopups=false
|
||||
LowPriorityHistory=false
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
[General]
|
||||
AudioFeedback[$i]=false
|
||||
RaiseMaximumVolume[$i]=false
|
||||
VolumeOsd=true
|
||||
MuteOsd=true
|
||||
@@ -0,0 +1,12 @@
|
||||
# Which Plasma style draws the room's popups.
|
||||
#
|
||||
# The style is a set of pictures — see
|
||||
# /usr/share/plasma/desktoptheme/ekklesia — and it is what gives a
|
||||
# notification and the volume display a rounded card instead of Breeze's.
|
||||
# Anything the classroom's style does not provide comes from Breeze, so
|
||||
# this cannot take a popup away, only change how it looks.
|
||||
#
|
||||
# Immutable on the key rather than the group, because the rest of this
|
||||
# file is Plasma's own working state.
|
||||
[Theme]
|
||||
name[$i]=ekklesia
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
|
||||
<policyconfig>
|
||||
<action id="org.ekklesia.classroom.display">
|
||||
<description>Change the classroom display size</description>
|
||||
<message>Enter an administrator password to save this room's display size.</message>
|
||||
<defaults>
|
||||
<allow_any>no</allow_any>
|
||||
<allow_inactive>no</allow_inactive>
|
||||
<allow_active>auth_admin</allow_active>
|
||||
</defaults>
|
||||
<annotate key="org.freedesktop.policykit.exec.path">/usr/local/bin/classroom-set-scale</annotate>
|
||||
</action>
|
||||
</policyconfig>
|
||||
@@ -0,0 +1,12 @@
|
||||
# A drive plugged in later.
|
||||
#
|
||||
# The panel's disc player follows the machine's hardware rather than a
|
||||
# setting, so a USB drive connected after the room was set up has to be
|
||||
# noticed. This re-runs the same detection the boot service runs; the
|
||||
# button appears at the next login, because the panel is built at login
|
||||
# and rewriting a running one destroys it — measured.
|
||||
#
|
||||
# --no-block so udev never waits for systemd, and a match narrow enough
|
||||
# that nothing but an optical drive can trigger it.
|
||||
ACTION=="add|remove", SUBSYSTEM=="block", ENV{ID_CDROM}=="1", \
|
||||
RUN+="/usr/bin/systemctl start --no-block ekklesia-classroom-layout.service"
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 1.8 MiB |
Reference in New Issue
Block a user