diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-06-14 15:34:47 +1000 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-06-14 15:34:47 +1000 |
| commit | 4409620ac7a6965259fc6407127799c468f5421c (patch) | |
| tree | 9f4b4cdc64abb6fd48202744bab2210411ee1e65 /src/caelestia/subcommands | |
| parent | feat: impl emoji picker subcommand (diff) | |
| download | caelestia-cli-4409620ac7a6965259fc6407127799c468f5421c.tar.gz caelestia-cli-4409620ac7a6965259fc6407127799c468f5421c.tar.bz2 caelestia-cli-4409620ac7a6965259fc6407127799c468f5421c.zip | |
feat: impl pip subcommand
Diffstat (limited to 'src/caelestia/subcommands')
| -rw-r--r-- | src/caelestia/subcommands/pip.py | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/caelestia/subcommands/pip.py b/src/caelestia/subcommands/pip.py index 37f9a2b..5f1b5fa 100644 --- a/src/caelestia/subcommands/pip.py +++ b/src/caelestia/subcommands/pip.py @@ -1,5 +1,9 @@ +import re +import socket from argparse import Namespace +from caelestia.utils import hypr + class Command: args: Namespace @@ -8,4 +12,33 @@ class Command: self.args = args def run(self) -> None: - pass + if self.args.daemon: + self.daemon() + else: + win = hypr.message("activewindow") + if win["floating"]: + self.handle_window(win["address"], win["workspace"]["name"]) + + def handle_window(self, address: str, ws: str) -> None: + mon_id = next(w for w in hypr.message("workspaces") if w["name"] == ws)["monitorID"] + mon = next(m for m in hypr.message("monitors") if m["id"] == mon_id) + width, height = next(c for c in hypr.message("clients") if c["address"] == address)["size"] + + scale_factor = mon["height"] / 4 / height + scaled_win_size = f"{int(width * scale_factor)} {int(height * scale_factor)}" + off = min(mon["width"], mon["height"]) * 0.03 + move_to = f"{int(mon['width'] - off - width * scale_factor)} {int(mon['height'] - off - height * scale_factor)}" + + hypr.dispatch("resizewindowpixel", "exact", f"{scaled_win_size},address:{address}") + hypr.dispatch("movewindowpixel", "exact", f"{move_to},address:{address}") + + def daemon(self) -> None: + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect(hypr.socket2_path) + + while True: + data = sock.recv(4096).decode() + if data.startswith("openwindow>>"): + address, ws, cls, title = data[12:].split(",") + if re.match(r"^[Pp]icture(-| )in(-| )[Pp]icture$", title): + self.handle_window(f"0x{address}", ws) |