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]>
75 lines
2.2 KiB
Python
Executable File
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())
|