diff options
Diffstat (limited to '')
| -rw-r--r-- | src/utils/icons.ts (renamed from utils/icons.ts) | 0 | ||||
| -rw-r--r-- | src/utils/mpris.ts (renamed from utils/mpris.ts) | 0 | ||||
| -rw-r--r-- | src/utils/strings.ts (renamed from utils/strings.ts) | 0 | ||||
| -rw-r--r-- | src/utils/system.ts (renamed from utils/system.ts) | 0 | ||||
| -rw-r--r-- | src/utils/widgets.ts | 45 |
5 files changed, 45 insertions, 0 deletions
diff --git a/utils/icons.ts b/src/utils/icons.ts index f12aee0..f12aee0 100644 --- a/utils/icons.ts +++ b/src/utils/icons.ts diff --git a/utils/mpris.ts b/src/utils/mpris.ts index e0cc111..e0cc111 100644 --- a/utils/mpris.ts +++ b/src/utils/mpris.ts diff --git a/utils/strings.ts b/src/utils/strings.ts index e5bc43e..e5bc43e 100644 --- a/utils/strings.ts +++ b/src/utils/strings.ts diff --git a/utils/system.ts b/src/utils/system.ts index 5d77908..5d77908 100644 --- a/utils/system.ts +++ b/src/utils/system.ts diff --git a/src/utils/widgets.ts b/src/utils/widgets.ts new file mode 100644 index 0000000..08f9740 --- /dev/null +++ b/src/utils/widgets.ts @@ -0,0 +1,45 @@ +import { Binding } from "astal"; +import { Astal, Widget } from "astal/gtk3"; +import AstalHyprland from "gi://AstalHyprland"; + +export const setupCustomTooltip = (self: any, text: string | Binding<string>) => { + if (!text) return null; + + const window = new Widget.Window({ + visible: false, + namespace: "caelestia-tooltip", + keymode: Astal.Keymode.NONE, + exclusivity: Astal.Exclusivity.IGNORE, + anchor: Astal.WindowAnchor.TOP | Astal.WindowAnchor.LEFT, + child: new Widget.Label({ className: "tooltip", label: text }), + }); + self.set_tooltip_window(window); + + let dirty = true; + let lastX = 0; + self.connect("size-allocate", () => (dirty = true)); + window.connect("size-allocate", () => { + window.marginLeft = lastX + (self.get_allocated_width() - window.get_preferred_width()[1]) / 2; + }); + if (text instanceof Binding) self.hook(text, (_: any, v: string) => !v && window.hide()); + + self.connect("query-tooltip", (_: any, x: number, y: number) => { + if (text instanceof Binding && !text.get()) return false; + if (dirty) { + const { width, height } = self.get_allocation(); + const { x: cx, y: cy } = AstalHyprland.get_default().get_cursor_position(); + window.marginLeft = cx + ((width - window.get_preferred_width()[1]) / 2 - x); + window.marginTop = cy + (height - y); + lastX = cx - x; + dirty = false; + } + return true; + }); + + self.connect("destroy", () => window.destroy()); + + return window; +}; + +export const setupChildClickthrough = (self: any) => + self.connect("size-allocate", () => self.get_window()?.set_child_input_shapes()); |