Skip to content

Example subagent window hooks (subagent UI pop ups)

Elijah Charles edited this page Jun 30, 2026 · 1 revision

display-buffer-below-selected

(defun my-macher-show-agent-window (buf)
  (let* ((buffer (get-buffer buf))
         (window (when buffer
                   (display-buffer buffer
                                   '(display-buffer-below-selected
                                     (window-height . 5)
                                     (dedicated . t))))))
    (when window
      (set-window-point window (with-current-buffer buffer (point-max))))))

(defun my-macher-hide-agent-window (buf)
  (let ((win (get-buffer-window buf)))
    (when win
      (delete-window win))))

(setq macher-agent-display-subagent-fn #'my-macher-show-agent-window)
(setq macher-agent-hide-subagent-fn #'my-macher-hide-agent-window)

Posframe

(require 'cl-lib)

(defvar my-macher-popup-counter 0)

(defun my-macher-poshandler-stack-bottom-left (info)
  (let* ((window-left (plist-get info :parent-window-left))
         (window-top (plist-get info :parent-window-top))
         (window-height (plist-get info :parent-window-height))
         (posframe-height (plist-get info :posframe-height))
         (mode-line-height (plist-get info :mode-line-height))
         (base-y (+ window-top window-height (- 0 mode-line-height posframe-height)))
         (y-shift (- base-y (* my-macher-popup-counter (+ posframe-height 2)))))
    (cons window-left y-shift)))

(defun my-macher-show-child-frame (buf)
  (let* ((buffer (get-buffer buf))
         (win-width (window-width))
         (existing-frame (posframe--find-existing-posframe buffer))
         (is-new (not (and existing-frame (frame-visible-p existing-frame)))))
    (unless (cl-some (lambda (f)
                       (and (frame-parameter f 'macher-agent-posframe)
                            (frame-visible-p f)))
                     (frame-list))
      (setq my-macher-popup-counter 0))
    (posframe-show buffer
                   :poshandler #'my-macher-poshandler-stack-bottom-left
                   :width win-width
                   :min-width win-width
                   :height 5
                   :min-height 5
                   :window-point (with-current-buffer buffer (point-max))
                   :override-parameters '((macher-agent-posframe . t))
                   :background-color "#1e1e2e"
                   :internal-border-width 2
                   :internal-border-color "#cba6f7"
                   :respect-header-line t)
    (when is-new
      (setq my-macher-popup-counter (1+ my-macher-popup-counter)))))

(defun my-macher-hide-child-frame (buf)
  (let ((frame (posframe--find-existing-posframe (get-buffer buf))))
    (posframe-hide buf)
    (unless (cl-some (lambda (f)
                       (and (frame-parameter f 'macher-agent-posframe)
                            (not (eq f frame))
                            (frame-visible-p f)))
                     (frame-list))
      (setq my-macher-popup-counter 0))))

(setq macher-agent-display-subagent-fn #'my-macher-show-child-frame)
(setq macher-agent-hide-subagent-fn #'my-macher-hide-child-frame)