summaryrefslogtreecommitdiff
path: root/src/caelestia/subcommands
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-06-14 15:34:47 +1000
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-06-14 15:34:47 +1000
commit4409620ac7a6965259fc6407127799c468f5421c (patch)
tree9f4b4cdc64abb6fd48202744bab2210411ee1e65 /src/caelestia/subcommands
parentfeat: impl emoji picker subcommand (diff)
downloadcaelestia-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.py35
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)