diff options
Diffstat (limited to 'deckit/display.py')
| -rw-r--r-- | deckit/display.py | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/deckit/display.py b/deckit/display.py index 50fa3f6..c1a74b1 100644 --- a/deckit/display.py +++ b/deckit/display.py @@ -30,6 +30,12 @@ def tablet_resolution(cfg: dict, adb=None) -> str: return f"{w}x{h}" +def below_position(ref: dict, resolution: str, scale=1) -> str: + """Center a monitor below `ref` (a hyprctl monitor dict).""" + width = round(int(re.match(r"(\d+)x", resolution).group(1)) / scale) + return f"{ref['x'] + (ref['width'] - width) // 2}x{ref['y'] + ref['height']}" + + def hypr_lua(cfg: dict) -> bool: mode = cfg.get("hyprland", "auto") if mode == "auto": @@ -72,9 +78,14 @@ def setup_display(cfg: dict, run_cmd=None, popen=None) -> None: if not any(m["name"] == mon for m in monitors): run_cmd(["hyprctl", "output", "create", "headless", mon]) time.sleep(1) + # Creating the output can re-flow the layout, so read it again. + monitors = json.loads(run_cmd(["hyprctl", "monitors", "-j"]) or "[]") mode = f"{tablet_resolution(cfg)}@{d.get('refresh', 60)}" pos = d.get("position", "auto-right") scale = d.get("scale", 1) + if pos in ("auto-below", "below"): + ref = next((m for m in monitors if m["name"] != mon), monitors[0]) + pos = below_position(ref, mode, scale) if hypr_lua(cfg): run_cmd(["hyprctl", "eval", f'hl.monitor({{output="{mon}", mode="{mode}", position="{pos}", scale={scale}}})']) |
