feat: give Parent Call a mark that says what it does

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]>
This commit is contained in:
ekklesia
2026-09-10 12:47:58 -05:00
co-authored by Claude Opus 5
parent 323989ac61
commit 18cf0249dd
14 changed files with 94 additions and 40 deletions
+38
View File
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22" width="22" height="22">
<!-- 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. -->
<!-- Parent Call.
Drawn in Breeze's own language rather than picked from it, because
Breeze has no icon that means "fetch this child's grown-up". It has
people, and it has telephones, and the two never meet. A bare handset
was tried first and read as a telephone feature; a bell was tried
before that and read as Plasma's notifications, which sit in the same
bar.
So: an adult and a child, and one small speech bubble. Same 22-unit
grid, same single path style, same ColorScheme-Text class, so it
recolours with the session exactly as a Breeze icon does and follows
the light and dark themes without a second file. -->
<defs>
<style type="text/css">.ColorScheme-Text { color: #fcfcfc; }</style>
</defs>
<g class="ColorScheme-Text" style="fill:currentColor;fill-opacity:1;stroke:none">
<!-- One small speech bubble, top right, clear of both heads: somebody
is being asked for. It is the only round thing up there, so it
cannot be counted as a third person. -->
<path d="M16.6 1.2c-2.4 0-4.4 1.3-4.4 3s2 3 4.4 3c.3 0 .6 0 .9-.1l2.3 1.2-.5-1.7c1-.5 1.6-1.4
1.6-2.4 0-1.7-2-3-4.3-3z"/>
<!-- The adult: taller, at the back, on the left. -->
<circle cx="6.6" cy="8.2" r="3.1"/>
<path d="M6.6 12.3c-2.9 0-5.1 2.1-5.1 4.9V19h10.2v-1.8c0-2.8-2.2-4.9-5.1-4.9z"/>
<!-- The child: smaller, in front, on the right. -->
<circle cx="14.6" cy="12.4" r="2.2"/>
<path d="M14.6 15.3c-2.1 0-3.6 1.5-3.6 3.3V19h7.2v-.4c0-1.8-1.5-3.3-3.6-3.3z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

+14 -8
View File
@@ -1,13 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 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. -->
<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"/>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -2,16 +2,15 @@
Type=Application
Name=Parent Call
Comment=Ask the sanctuary to call a child's parent to this room
# Breeze's own, and deliberately not a bell.
#
# The previous mark was a bell, which sat two inches from Plasma's
# notification bell in the same bar and meant something entirely
# different. A handset with an outgoing arrow cannot be mistaken for an
# alert: it reads as placing a call, and the arrow says the call leaves
# this room. No stock Breeze icon combines a person with a call, so the
# unambiguous half was chosen over the half that could be read as user
# settings — which is what two grey people on a panel look like.
Icon=call-outgoing
# Drawn for this, in Breeze's language, because Breeze has no icon that
# means "fetch this child's grown-up". Two marks were tried and rejected
# on a real panel first: a bell, which sat inches from Plasma's own
# notification bell in the same bar, and a handset with an outgoing
# arrow, which read as a telephone feature. This one is an adult, a
# child, and one small speech bubble. It uses Breeze's ColorScheme-Text
# class, so it recolours with the session and needs no second file for
# the light theme.
Icon=ekklesia-parent-call
Exec=/usr/local/bin/classroom-parent-call
Terminal=false
Categories=Utility;
@@ -41,29 +41,29 @@ 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.
// Quick Launch: a launcher, and only a launcher.
//
// 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.
// 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.
//
// 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");
// Quick Launch reads the entry live and shows nothing but the button.
var parentCall = panel.addWidget("org.kde.plasma.quicklaunch");
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);
// 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"];