From 476fbe69d37ca25e134dbb11a7ca80bfcfea71c3 Mon Sep 17 00:00:00 2001
From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>
Date: Thu, 16 Jan 2025 16:23:30 +1100
Subject: popupwindow: switch to class

---
 utils/widgets.tsx | 46 +++++++++++++++++++++++++++++-----------------
 1 file changed, 29 insertions(+), 17 deletions(-)

(limited to 'utils/widgets.tsx')

diff --git a/utils/widgets.tsx b/utils/widgets.tsx
index 51986ec..7b16075 100644
--- a/utils/widgets.tsx
+++ b/utils/widgets.tsx
@@ -1,4 +1,4 @@
-import { Binding } from "astal";
+import { Binding, register } from "astal";
 import { App, Astal, Gdk, Widget } from "astal/gtk3";
 import AstalHyprland from "gi://AstalHyprland";
 
@@ -52,21 +52,33 @@ const extendProp = <T,>(
     override: (prop: T | undefined) => T | undefined
 ) => prop && (prop instanceof Binding ? prop.as(override) : override(prop));
 
-export const convertPopupWindowProps = (props: Widget.WindowProps): Widget.WindowProps => ({
-    keymode: Astal.Keymode.ON_DEMAND,
-    exclusivity: Astal.Exclusivity.IGNORE,
-    ...props,
-    visible: false,
-    application: App,
-    name: props.monitor ? extendProp(props.name, n => (n ? n + props.monitor : undefined)) : props.name,
-    namespace: extendProp(props.name, n => `caelestia-${n}`),
-    onKeyPressEvent: (self, event) => {
-        // Close window on escape
-        if (event.get_keyval()[1] === Gdk.KEY_Escape) self.hide();
+@register()
+export class PopupWindow extends Widget.Window {
+    constructor(props: Widget.WindowProps) {
+        super({
+            keymode: Astal.Keymode.ON_DEMAND,
+            exclusivity: Astal.Exclusivity.IGNORE,
+            ...props,
+            visible: false,
+            application: App,
+            name: props.monitor ? extendProp(props.name, n => (n ? n + props.monitor : undefined)) : props.name,
+            namespace: extendProp(props.name, n => `caelestia-${n}`),
+            onKeyPressEvent: (self, event) => {
+                // Close window on escape
+                if (event.get_keyval()[1] === Gdk.KEY_Escape) self.hide();
 
-        return props.onKeyPressEvent?.(self, event);
-    },
-    borderWidth: 20, // To allow shadow, cause if not it gets cut off
-});
+                return props.onKeyPressEvent?.(self, event);
+            },
+            borderWidth: 20, // To allow shadow, cause if not it gets cut off
+        });
+    }
 
-export const PopupWindow = (props: Widget.WindowProps) => <window {...convertPopupWindowProps(props)} />;
+    popup_at_widget(widget: JSX.Element, event: Gdk.Event) {
+        const { width, height } = widget.get_allocation();
+        const [_, x, y] = event.get_coords();
+        const { x: cx, y: cy } = AstalHyprland.get_default().get_cursor_position();
+        this.marginLeft = cx + ((width - this.get_preferred_width()[1]) / 2 - x);
+        this.marginTop = cy + (height - y);
+        this.show();
+    }
+}
-- 
cgit v1.2.3-freya

