UI_SCALE only ever reached the surfaces we draw ourselves. Chrome stayed tiny — its tabs, omnibox and menus are Chrome's own pixels, and Ctrl+ only scales page content, which is no use to a volunteer reading a toolbar from across the room. UI_SCALE is a property of the television, not of one program, so it now sets sway's output scale, which every client is measured against. classroom-scale runs first in the session and applies it. The display mode is untouched: the panel stays at 1920x1080 and only the logical coordinate space shrinks, which is what makes everything in it larger. Our own surfaces stop scaling themselves. They are measured in the same logical pixels sway is already scaling, so applying UI_SCALE again would double it. SHELL_SCALE is that decision in one named place, and setting it back to ui_scale(config) would restore per-surface scaling without touching a template. Measured at 1920x1080 with Chrome 152. Chrome's tab strip 40 -> 49 -> 59px against 1.0, 1.25, 1.5; sway's title bar 25 -> 31 -> 38px; the classroom dock 74 -> 92 -> 110px. Everything scales once, together, and 1.0 is identical to no scaling at all. Two tradeoffs, both measured rather than assumed. GTK 3 has no fractional scaling, so at 1.5 it renders at 2x and sway scales down — very slightly softer, invisible at classroom distance. XWayland is softer too: terminal text at 1.5 showed about 50% more intermediate-tone pixels than at 1.0. VLC is the only XWayland application here, and in DVD mode none of its interface is on screen, only video from a 720x480 disc that is being upscaled regardless. Chrome is a native Wayland client and stays sharp, which is what matters for reading. Co-Authored-By: Claude Opus 5 <[email protected]>
94 lines
2.9 KiB
Bash
Executable File
94 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-scale
|
|
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
|