From 603ee96750ba3342fe1060e9629cfe35ff97b839 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Tue, 25 Mar 2025 22:01:31 +1100 Subject: [PATCH] tooltip: show above cursor if offscreen --- src/utils/widgets.ts | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/utils/widgets.ts b/src/utils/widgets.ts index ef952f27..e0e512d8 100644 --- a/src/utils/widgets.ts +++ b/src/utils/widgets.ts @@ -23,35 +23,35 @@ export const setupCustomTooltip = ( }); self.set_tooltip_window(window); - let lastX = 0; - window.connect("size-allocate", () => { - const mWidth = AstalHyprland.get_default().get_focused_monitor().get_width(); - const pWidth = window.get_preferred_width()[1]; - - let marginLeft = lastX - pWidth / 2; - if (marginLeft < 0) marginLeft = 0; - else if (marginLeft + pWidth > mWidth) marginLeft = mWidth - pWidth; - - window.marginLeft = marginLeft; - }); if (text instanceof Binding) self.hook(text, (_, v) => !v && window.hide()); - self.connect("query-tooltip", () => { - if (text instanceof Binding && !text.get()) return false; - if (window.visible) return true; - - const mWidth = AstalHyprland.get_default().get_focused_monitor().get_width(); - const pWidth = window.get_preferred_width()[1]; - const { x, y } = AstalHyprland.get_default().get_cursor_position(); + const positionWindow = ({ x, y }: { x: number; y: number }) => { + const { width: mWidth, height: mHeight } = AstalHyprland.get_default().get_focused_monitor(); + const { width: pWidth, height: pHeight } = window.get_preferred_size()[1]!; const cursorSize = Gtk.Settings.get_default()?.gtkCursorThemeSize ?? 0; let marginLeft = x - pWidth / 2; if (marginLeft < 0) marginLeft = 0; else if (marginLeft + pWidth > mWidth) marginLeft = mWidth - pWidth; + let marginTop = y + cursorSize; + if (marginTop < 0) marginTop = 0; + else if (marginTop + pHeight > mHeight) marginTop = y - pHeight; + window.marginLeft = marginLeft; - window.marginTop = y + cursorSize; - lastX = x; + window.marginTop = marginTop; + }; + + let lastPos = { x: 0, y: 0 }; + + window.connect("size-allocate", () => positionWindow(lastPos)); + self.connect("query-tooltip", () => { + if (text instanceof Binding && !text.get()) return false; + if (window.visible) return true; + + const cPos = AstalHyprland.get_default().get_cursor_position(); + positionWindow(cPos); + lastPos = cPos; return true; });