aboutsummaryrefslogtreecommitdiffstats
path: root/deckit
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-11-09 20:52:42 +0100
committerDanilo M. <danix@danix.xyz>2026-11-09 20:52:42 +0100
commit82622100135bc7a53b632603fb7f398a49637a69 (patch)
tree069e47c6fb7be290d893e2602d40def2b2ea5b3e /deckit
parentae94e849a03122d8a4a2356e375cec9804b3e91a (diff)
downloaddeck-it-82622100135bc7a53b632603fb7f398a49637a69.tar.gz
deck-it-82622100135bc7a53b632603fb7f398a49637a69.zip
feat: auto-below placement re-reads the live layout
Diffstat (limited to 'deckit')
-rw-r--r--deckit/display.py11
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}}})'])