"""Device configuration for the Ekklesia Classroom shell. Everything that has to agree about /etc/ekklesia-classroom/device.conf reads it through here, so the dock, the notification daemon and the DVD commands cannot drift apart over what a setting means. """ import math from pathlib import Path CONFIG_FILE = Path("/etc/ekklesia-classroom/device.conf") TRUTHY = {"1", "true", "yes", "on", "enabled"} # The dock is tuned for a 1080p classroom TV at 1.0. Smaller rooms with a # 32" panel sit near the bottom of this range, a 65" set near the top. UI_SCALE_DEFAULT = 1.0 UI_SCALE_MIN = 0.8 UI_SCALE_MAX = 1.5 def read_device_config(path=None): config = {} path = Path(path) if path is not None else CONFIG_FILE if not path.exists(): return config for raw_line in path.read_text().splitlines(): line = raw_line.strip() if not line or line.startswith("#") or "=" not in line: continue key, value = line.split("=", 1) config[key.strip()] = value.strip() return config def enabled(config, key, default=False): if key not in config: return default return config[key].lower() in TRUTHY def ui_scale(config): """UI_SCALE, clamped to something a classroom can actually use.""" raw = config.get("UI_SCALE", "") try: value = float(raw) except (TypeError, ValueError): return UI_SCALE_DEFAULT if not math.isfinite(value): return UI_SCALE_DEFAULT return min(max(value, UI_SCALE_MIN), UI_SCALE_MAX) def scaled(value, scale): """A pixel measurement at the configured scale, never smaller than 1.""" return max(1, int(round(value * scale)))