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)
"Merge `+popup-default-alist' and `+popup-default-parameters' with 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
(cl-remove-duplicates
(append alist +popup-default-alist)
@ -119,8 +113,8 @@ and enables `+popup-buffer-mode'."
'window-width
'window-height)))
(setq list (assq-delete-all 'size alist))
(setcdr (assq param alist) size))
(setcdr (assq 'window-parameters alist)
(setf (alist-get param alist) size))
(setf (alist-get 'window-parameters alist)
parameters)
alist)))
@ -197,6 +191,15 @@ Uses `shrink-window-if-larger-than-buffer'."
(unless (= (- (point-max) (point-min)) 0)
(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
@ -366,7 +369,7 @@ the message buffer in a popup window."
(error "No popups to restore"))
(cl-loop for (buffer . state) in +popup--last
if (buffer-live-p buffer)
do (+popup-buffer buffer state))
do (+popup-buffer buffer (+popup-alist-from-window-state state)))
(setq +popup--last nil)
t)

View file

@ -20,13 +20,6 @@ Modifying this has no effect, unless done before ui/popup loads.")
(no-other-window . t))
"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
"Size of the margins to give popup windows. Set this to nil to disable margin
adjustment.")