aboutsummaryrefslogtreecommitdiffstats
path: root/deckit/display.py
diff options
context:
space:
mode:
Diffstat (limited to 'deckit/display.py')
-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}}})'])