feat(hyprlua): add T/G scale adjust and Enter save+quit to monitor-manager

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
main
Amir Alexander Abdelbaki 2026-06-23 09:15:44 +02:00
parent e840072f69
commit 280a41133f
2 changed files with 32 additions and 6 deletions

View File

@ -1,9 +1,7 @@
-- https://wiki.hypr.land/Configuring/Basics/Monitors/ -- generated by monitor-manager -- do not edit by hand
hl.monitor({ hl.monitor({
output = "", output = "eDP-1",
mode = "highres", mirror = "none",
position = "auto",
scale = 2,
}) })
hl.config({ hl.config({

View File

@ -7,9 +7,11 @@ Keys (normal mode):
h j k l move monitor (50 px) h j k l move monitor (50 px)
H J K L move monitor (10 px fine) H J K L move monitor (10 px fine)
u / i rotate CCW / CW u / i rotate CCW / CW
T / G scale up / scale down (0.25 steps)
m toggle mirror (pick target) / un-mirror m toggle mirror (pick target) / un-mirror
n / N cycle display mode forward / backward n / N cycle display mode forward / backward
s save to hypr/usr/monitors.lua s save to hypr/usr/monitors.lua
Enter save & quit
q / Esc quit (prompts if unsaved changes) q / Esc quit (prompts if unsaved changes)
Mirror-pick mode: Mirror-pick mode:
@ -35,6 +37,9 @@ from typing import List, Optional
MONITORS_LUA = Path.home() / "Dotfiles/desktopenvs/hyprlua/hypr/usr/monitors.lua" MONITORS_LUA = Path.home() / "Dotfiles/desktopenvs/hyprlua/hypr/usr/monitors.lua"
MOVE_STEP = 50 MOVE_STEP = 50
MOVE_STEP_FINE = 10 MOVE_STEP_FINE = 10
SCALE_STEP = 0.25
MIN_SCALE = 0.25
MAX_SCALE = 4.0
MIN_BOX_W = 14 MIN_BOX_W = 14
MIN_BOX_H = 4 MIN_BOX_H = 4
INFO_W = 32 INFO_W = 32
@ -380,6 +385,11 @@ class App:
self.rotate_monitor(-1) self.rotate_monitor(-1)
elif ch == ord("i"): elif ch == ord("i"):
self.rotate_monitor(+1) self.rotate_monitor(+1)
# Scale
elif ch == ord("T"):
self.scale_monitor(+SCALE_STEP)
elif ch == ord("G"):
self.scale_monitor(-SCALE_STEP)
# Mirror # Mirror
elif ch == ord("m"): elif ch == ord("m"):
if mon.mirror_of: if mon.mirror_of:
@ -402,6 +412,10 @@ class App:
# Save # Save
elif ch == ord("s"): elif ch == ord("s"):
self._save() self._save()
# Save & quit
elif ch in (curses.KEY_ENTER, ord("\n"), ord("\r")):
self._save()
return "quit"
# Quit # Quit
elif ch in (ord("q"), 27): # q or Esc elif ch in (ord("q"), 27): # q or Esc
if self.dirty: if self.dirty:
@ -457,6 +471,20 @@ class App:
self.dirty = True self.dirty = True
self.status_msg = err or f"Rotated {mon.name} → {TRANSFORM_LABEL[mon.transform]}" self.status_msg = err or f"Rotated {mon.name} → {TRANSFORM_LABEL[mon.transform]}"
def scale_monitor(self, delta: float):
mon = self.monitors[self.selected_idx]
new_scale = round(max(MIN_SCALE, min(MAX_SCALE, mon.scale + delta)), 10)
# round to nearest SCALE_STEP to avoid floating-point drift
new_scale = round(new_scale / SCALE_STEP) * SCALE_STEP
if new_scale == mon.scale:
self.status_msg = f"Scale already at {mon.scale}x (limit)"
return
mon.scale = new_scale
err = apply_monitor(mon)
mon.dirty = True
self.dirty = True
self.status_msg = err or f"{mon.name} scale → {mon.scale}x"
def cycle_mode(self, delta: int): def cycle_mode(self, delta: int):
mon = self.monitors[self.selected_idx] mon = self.monitors[self.selected_idx]
if not mon.available_modes: if not mon.available_modes:
@ -634,7 +662,7 @@ class App:
if self.mode == "mirror_pick": if self.mode == "mirror_pick":
text = "Tab:cycle-target Enter:confirm Esc:cancel" text = "Tab:cycle-target Enter:confirm Esc:cancel"
else: else:
text = "Tab:next hjkl:move HJK L:fine u/i:rot m:mirror n/N:mode s:save q:quit" text = "Tab:next hjkl:move HJKL:fine u/i:rot T/G:scale m:mirror n/N:mode s:save Enter:save+quit q:quit"
safe_addstr(self.stdscr, row, 0, text[:cols - 1], curses.color_pair(6)) safe_addstr(self.stdscr, row, 0, text[:cols - 1], curses.color_pair(6))
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------