Files
Classroom_Desktop/packaging/debian/postinst
T
ekklesiaandClaude Opus 5 f8ddfbe345 feat: make DVD playback a classroom surface, not a media player
Pressing DVD now enters DVD mode rather than opening VLC. VLC is still
the backend, because its dvdnav module is what decodes disc menus and
nothing else on Debian does that reliably, but nothing a person can see
or press belongs to it any more.

classroom-dvd-session owns the whole thing. It puts a full-screen black
layer-shell surface up the moment the button is pressed, starts VLC
behind it, and drops it once playback is actually on screen — so the
harsh cut from wallpaper to VLC's black window is gone, and no partial
VLC window or reserved dock strip is ever visible. A deadline drops the
surface regardless, because DVD mode must never leave a black screen
with nothing behind it.

The controls are a classroom bar on the overlay layer, the one layer
sway draws above a fullscreen window. It slides up when the pointer
reaches the bottom of the screen and hides again shortly after it
leaves. It is drawn from the dock's own stylesheet at the room's UI
scale, so it is the same surface, the same radius and the same white
icons. While hidden it only accepts the pointer in a thin strip along
the bottom edge, so a click on a disc menu goes to the disc.

The bar reaches VLC through an HTTP interface on loopback behind a
password generated per session, sending hotkey *actions* by name. That
is what makes the next part possible.

All 108 hotkeys VLC 3.0.23 defines are unset, then Space, Esc and the
arrow keys plus Enter are bound. Crop, aspect ratio, subtitles, audio
tracks and deinterlacing are no longer reachable by pressing a key at
random, and the arrow keys no longer change VLC's volume — the
television owns volume, and CEC will own it properly later.

Esc quits instead of leaving fullscreen. There is nothing to leave, and
leaving it was what stranded people on a black VLC window. Close, Eject
and Esc all ask VLC to quit and escalate to SIGTERM then SIGKILL if it
does not; when VLC exits by any route, including a crash, the session
ends and the classroom desktop comes back.

Verified against VLC 3.0.23 on Trixie: every argument accepted, every
control action accepted over the control interface, a wrong password
refused, and quit exiting cleanly. The surfaces were rendered under a
headless sway and screenshotted to check the bar against the dock.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-04 22:33:53 -05:00

93 lines
2.9 KiB
Bash
Executable File

#!/bin/bash
set -e
if ! id classroom >/dev/null 2>&1; then
adduser \
--disabled-password \
--gecos "" \
classroom
fi
cat > /home/classroom/.bash_profile <<'PROFILE'
if [ -z "$WAYLAND_DISPLAY" ] && [ "${XDG_VTNR:-}" = "1" ]; then
exec sway -c /etc/ekklesia-classroom/sway/config
fi
PROFILE
chown classroom:classroom /home/classroom/.bash_profile
chmod 0644 /home/classroom/.bash_profile
chmod 0755 /usr/local/bin/classroom-browser
chmod 0755 /usr/local/bin/classroom-window
chmod 0755 /usr/local/bin/classroom-dvd
chmod 0755 /usr/local/bin/classroom-dvd-session
chmod 0755 /usr/local/bin/classroom-dvd-css-setup
chmod 0755 /usr/local/bin/classroom-notify-test
chmod 0755 /usr/local/bin/classroom-notifications
chmod 0755 /usr/local/bin/classroom-chrome-setup
chmod 0755 /usr/local/bin/classroom-provision
# Reading the optical drive needs group cdrom. Takes effect at the next
# login, which the OTA reboot provides.
if getent group cdrom >/dev/null 2>&1; then
adduser classroom cdrom >/dev/null 2>&1 || true
fi
if [ ! -f /etc/ekklesia-classroom/device.conf ]; then
cat > /etc/ekklesia-classroom/device.conf <<'CONFIG'
# Ekklesia Classroom device configuration
UPDATE_URL=https://updates.riverofglorymn.org
CHANNEL=stable
# Set to true on classrooms that have a DVD drive.
DVD_ENABLED=false
# Size of the dock, clock and notifications, 0.8 to 1.5.
# Larger rooms and larger TVs want a larger number.
UI_SCALE=1.0
CONFIG
chmod 0644 /etc/ekklesia-classroom/device.conf
fi
# Make the settings discoverable on classrooms installed before they
# existed. Both defaults are what those rooms already do, so nothing
# about their behaviour changes.
if ! grep -q '^DVD_ENABLED=' /etc/ekklesia-classroom/device.conf; then
cat >> /etc/ekklesia-classroom/device.conf <<'CONFIG'
# Set to true on classrooms that have a DVD drive.
DVD_ENABLED=false
CONFIG
fi
if ! grep -q '^UI_SCALE=' /etc/ekklesia-classroom/device.conf; then
cat >> /etc/ekklesia-classroom/device.conf <<'CONFIG'
# Size of the dock, clock and notifications, 0.8 to 1.5.
# Larger rooms and larger TVs want a larger number.
UI_SCALE=1.0
CONFIG
fi
systemctl daemon-reload || true
systemctl enable ekklesia-classroom-update.timer || true
systemctl start ekklesia-classroom-update.timer || true
# Google Chrome, and the DVD codecs when the room has a drive, are
# fetched by the provisioning service at the next boot.
#
# Deliberately enabled but not started here. It cannot run during this
# script anyway, because dpkg holds the apt lock throughout. Starting it
# straight afterwards would race the reboot that an OTA update performs
# the moment this install finishes, and an apt run killed by that reboot
# leaves dpkg half-configured. Every OTA reboots, so waiting for the next
# boot costs nothing and cannot corrupt anything.
#
# A failure there must never fail this installation.
systemctl enable ekklesia-classroom-provision.service || true
exit 0