Fix lost window state when toggling popups

Replaces af045213 with a method for preserving popup state.
This commit is contained in:
Henrik Lissner 2018-08-29 01:58:18 +02:00
parent d6695d4cf3
commit be8eedc296
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
2 changed files with 13 additions and 17 deletions

View file

@ -97,12 +97,6 @@ and enables `+popup-buffer-mode'."
(defun +popup--normalize-alist (alist) (defun +popup--normalize-alist (alist)
"Merge `+popup-default-alist' and `+popup-default-parameters' with ALIST." "Merge `+popup-default-alist' and `+popup-default-parameters' with ALIST."
(when alist (when alist
;; In case ALIST is window state (from `window-state-get'), we map its
;; entries to display-buffer alist parameters.
(dolist (prop +popup-window-state-alist)
(when-let* ((val (assq (car prop) alist)))
(setf (alist-get (cdr prop) alist) (cdr val))
(setq alist (delq val alist))))
(let ((alist ; handle defaults (let ((alist ; handle defaults
(cl-remove-duplicates (cl-remove-duplicates
(append alist +popup-default-alist) (append alist +popup-default-alist)
@ -119,9 +113,9 @@ and enables `+popup-buffer-mode'."
'window-width 'window-width
'window-height))) 'window-height)))
(setq list (assq-delete-all 'size alist)) (setq list (assq-delete-all 'size alist))
(setcdr (assq param alist) size)) (setf (alist-get param alist) size))
(setcdr (assq 'window-parameters alist) (setf (alist-get 'window-parameters alist)
parameters) parameters)
alist))) alist)))
@ -197,6 +191,15 @@ Uses `shrink-window-if-larger-than-buffer'."
(unless (= (- (point-max) (point-min)) 0) (unless (= (- (point-max) (point-min)) 0)
(shrink-window-if-larger-than-buffer window))) (shrink-window-if-larger-than-buffer window)))
;;;###autoload
(defun +popup-alist-from-window-state (state)
"Convert window STATE (from `window-state-get') to a `display-buffer' alist."
(let* ((params (alist-get 'parameters state)))
`((side . ,(alist-get 'window-side params))
(window-width . ,(alist-get 'total-width state))
(window-height . ,(alist-get 'total-height state))
(window-parameters ,@params))))
;; ;;
;; Hooks ;; Hooks
@ -366,7 +369,7 @@ the message buffer in a popup window."
(error "No popups to restore")) (error "No popups to restore"))
(cl-loop for (buffer . state) in +popup--last (cl-loop for (buffer . state) in +popup--last
if (buffer-live-p buffer) if (buffer-live-p buffer)
do (+popup-buffer buffer state)) do (+popup-buffer buffer (+popup-alist-from-window-state state)))
(setq +popup--last nil) (setq +popup--last nil)
t) t)

View file

@ -20,13 +20,6 @@ Modifying this has no effect, unless done before ui/popup loads.")
(no-other-window . t)) (no-other-window . t))
"The default window parameters.") "The default window parameters.")
(defvar +popup-window-state-alist
'((total-width . window-width)
(total-height . window-height)
(parameters . window-parameters))
"An alist mapping `window-state-get' entries to display-buffer alist entries.
Used by `+popup--normalize-alist'.")
(defvar +popup-margin-width 1 (defvar +popup-margin-width 1
"Size of the margins to give popup windows. Set this to nil to disable margin "Size of the margins to give popup windows. Set this to nil to disable margin
adjustment.") adjustment.")