#!/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())