Files
Classroom_Desktop/scripts/classroom-scale
T
ekklesiaandClaude Opus 5 6e4786f448 build: package the desktop instead of the shell
The install list loses the dock, the window helper, the Chrome window
arbiter, the notification wrapper, the compositor and bar configs and the
GTK icon and stylesheet machinery, and gains a look and feel package, a
colour scheme, window rules, Kiosk restrictions and two supervised user
services. Dependencies follow: Plasma and SDDM in, sway, waybar, mako and
gtk-layer-shell out.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 08:59:56 -05:00

75 lines
2.2 KiB
Python
Executable File

#!/usr/bin/env python3
"""Make everything in the room bigger or smaller, once.
UI_SCALE is the display's scale factor, so it scales the browser, VLC, the
bar and every dialog together rather than each of them separately. Plasma
owns display configuration, so this asks Plasma's own tool to do it — which
is the whole of what replaced the compositor-specific version.
"""
import json
import os
import subprocess
import sys
sys.path.insert(0, "/usr/local/lib/ekklesia-classroom")
sys.path.insert(
0,
os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "lib"),
)
from classroom_config import read_device_config, ui_scale # noqa: E402
def outputs():
"""Every connected display, by name.
The JSON form rather than the human one: kscreen-doctor's plain output
is full of terminal colour codes, and a regular expression over it
silently matched nothing.
"""
try:
listing = subprocess.run(
["kscreen-doctor", "-j"],
capture_output=True, text=True, timeout=20, check=False,
).stdout
found = json.loads(listing or "{}").get("outputs") or []
except (OSError, subprocess.SubprocessError, ValueError) as error:
print(f"classroom-scale: {error}", file=sys.stderr)
return []
return [
output["name"] for output in found
if output.get("name") and output.get("connected", True)
]
def main():
# classroom_config clamps a nonsense or out-of-range value rather than
# obeying it, so a mistyped UI_SCALE cannot leave a room unusable.
scale = ui_scale(read_device_config())
found = outputs()
if not found:
print("classroom-scale: no outputs", file=sys.stderr)
return 0
for output in found:
result = subprocess.run(
["kscreen-doctor", f"output.{output}.scale.{scale}"],
capture_output=True, text=True, timeout=20, check=False,
)
if result.returncode == 0:
print(f"classroom-scale: {output} scale {scale}")
else:
print(f"classroom-scale: {output}: {result.stderr.strip()}",
file=sys.stderr)
return 0
if __name__ == "__main__":
sys.exit(main())