From 82622100135bc7a53b632603fb7f398a49637a69 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Mon, 9 Nov 2026 20:52:42 +0100 Subject: feat: auto-below placement re-reads the live layout --- deckit/display.py | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'deckit') 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}}})']) -- cgit v1.2.3