"""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) # The scale the classroom's own GTK surfaces render at. # # UI_SCALE is applied by sway to the whole output (see classroom-scale), # which scales Chrome, VLC and every other application along with the # dock. Our surfaces are measured in the same logical pixels sway is # already scaling, so scaling them here as well would apply UI_SCALE # twice and the dock would come out half again too big. # # This is the seam: if compositor scaling ever has to be abandoned, # changing this back to ui_scale(config) restores per-surface scaling # without touching the templates. SHELL_SCALE = 1.0 def scaled(value, scale): """A pixel measurement at the given scale, never smaller than 1.""" return max(1, int(round(value * scale)))