I did a little POC that I derived from showtip. It does not depend on any external libs:
(defvar tip-timeout 1)
(defvar tip-parameters
'((name . "tip")
(internal-border-width . 2)
(border-width . 1)
(no-special-glyphs . t)
(foreground-color . "white")
(border-color . "white")
(background-color . "gray")))
(defun tip-frame-parameter (&rest args)
(let ((fp (apply #'frame-parameter args)))
;; this seems to be a bug on my system
;; (frame-parameter nil 'left) => (+ -1)
(if (numberp fp) fp 0)))
(defun tip-posn-at-point (&optional pos window)
"Return xy positions of top left corner of glyph a POS.
POS is relative to top left corner of frame containing WINDOW and
defaults to the pos of point in the selected window."
(let* ((window (or window (selected-window)))
(xy (posn-x-y (posn-at-point pos window)))
(edges (window-inside-pixel-edges window)))
(cons (+ (car xy) (car edges))
(+ (cdr xy) (cadr edges)))))
(defun tip (text &optional pos timeout window fg bg)
"Show TEXT in tooltip.
Show tooltip at buffer position POS which defaults to point in
WINDOW which defaults to the selected one.
Hide tooltip after TIMEOUT which defaults to `tip-timeout'.
FG, BG can be used to override foreground and background color
parameters of `tip-parameters'."
(let* ((xy (tip-posn-at-point pos window))
(params tip-parameters)
(left (+ (tip-frame-parameter nil 'left)
(car xy)))
(top (+ (tip-frame-parameter nil 'top)
(cdr xy)
(- (+ (if menu-bar-mode 25 0)
(if tool-bar-mode 35 0)
;; WHY?
40)
(if header-line-format
(frame-char-height) 0)))))
(when (stringp fg)
(setf (alist-get 'foreground-color params) fg)
(setf (alist-get 'border-color params) fg))
(when (stringp bg)
(setf (alist-get 'background-color params) bg))
(x-show-tip text
(selected-frame)
(append params `((left . ,left)
(top . ,top)))
(or timeout tip-timeout))))