Remember popup size in history + refactor

This commit is contained in:
Henrik Lissner 2017-05-19 03:01:49 +02:00
parent c2fcebdb75
commit 002d4cff9e

View file

@ -25,6 +25,7 @@ current window if omitted."
;;;###autoload ;;;###autoload
(defun doom-popup-switch-to-buffer (buffer) (defun doom-popup-switch-to-buffer (buffer)
"Switch the current (or closest) pop-up window to BUFFER."
(unless (doom-popup-p) (unless (doom-popup-p)
(let ((popups (doom-popup-windows))) (let ((popups (doom-popup-windows)))
(unless popups (unless popups
@ -45,7 +46,7 @@ possible rules."
;;;###autoload ;;;###autoload
(defun doom-popup-windows () (defun doom-popup-windows ()
"Get a list of open poups." "Get a list of open pop up windows."
(cl-remove-if-not #'doom-popup-p (window-list))) (cl-remove-if-not #'doom-popup-p (window-list)))
;;;###autoload ;;;###autoload
@ -62,12 +63,15 @@ Returns t if popups were restored, nil otherwise."
(dolist (spec doom-popup-history) (dolist (spec doom-popup-history)
(let ((buffer (get-buffer (car spec))) (let ((buffer (get-buffer (car spec)))
(file (plist-get (cdr spec) :file)) (file (plist-get (cdr spec) :file))
(rules (plist-get (cdr spec) :rules))) (rules (plist-get (cdr spec) :rules))
(size (plist-get (cdr spec) :size)))
(when (and (not buffer) file) (when (and (not buffer) file)
(setq buffer (setq buffer
(if-let (buf (get-file-buffer file)) (if-let (buf (get-file-buffer file))
(clone-indirect-buffer (buffer-name buf) nil t) (clone-indirect-buffer (buffer-name buf) nil t)
(find-file-noselect file t)))) (find-file-noselect file t))))
(when size
(setq rules (plist-put rules :size size)))
(when (and buffer (apply #'doom-popup-buffer buffer rules) (not any-p)) (when (and buffer (apply #'doom-popup-buffer buffer rules) (not any-p))
(setq any-p t)))) (setq any-p t))))
(when any-p (when any-p
@ -102,28 +106,26 @@ interactively, it will close all popups without question. Otherwise, it will
only close popups that have an :autoclose property in their rule (see only close popups that have an :autoclose property in their rule (see
`shackle-rules')." `shackle-rules')."
(interactive) (interactive)
(let ((orig-win (selected-window))) (when-let (popups (doom-popup-windows))
(when-let (popups (doom-popup-windows)) (let ((orig-win (selected-window))
doom-popup-remember-history)
(setq doom-popup-history (mapcar #'doom--popup-data popups)) (setq doom-popup-history (mapcar #'doom--popup-data popups))
(let (doom-popup-remember-history) (dolist (window popups)
(dolist (window popups) (when (or force-p
(let ((rules (window-parameter window 'popup))) (called-interactively-p 'interactive)
(when (or force-p (doom-popup-prop :autoclose window))
(called-interactively-p 'interactive) (delete-window window))))))
(and (plist-member rules :autoclose)
(plist-get rules :autoclose)))
(delete-window window))))))))
;;;###autoload ;;;###autoload
(defun doom/popup-close-maybe () (defun doom/popup-close-maybe ()
"Close the current popup *if* its window doesn't have a noesc parameter." "Close the current popup *if* its window doesn't have a noesc parameter."
(interactive) (interactive)
(let ((window (selected-window))) (if (doom-popup-prop :noesc)
(if (plist-get doom-popup-rules :noesc) (call-interactively
(call-interactively (if (featurep 'evil) (if (featurep 'evil)
#'evil-force-normal-state #'evil-force-normal-state
#'keyboard-escape-quit)) #'keyboard-escape-quit))
(delete-window window)))) (delete-window)))
;;;###autoload ;;;###autoload
(defun doom/popup () (defun doom/popup ()
@ -131,13 +133,6 @@ only close popups that have an :autoclose property in their rule (see
(interactive) (interactive)
(doom-popup-buffer (current-buffer) :align t :autokill t)) (doom-popup-buffer (current-buffer) :align t :autokill t))
(defun doom--popup-data (window)
(let ((buffer (window-buffer window)))
(when buffer
`(,(buffer-name buffer)
:file ,(buffer-file-name buffer)
:rules ,(window-parameter window 'popup)))))
;;;###autoload ;;;###autoload
(defun doom/popup-toggle-messages () (defun doom/popup-toggle-messages ()
"Toggle *Messages* buffer." "Toggle *Messages* buffer."
@ -145,3 +140,39 @@ only close popups that have an :autoclose property in their rule (see
(if-let (win (get-buffer-window "*Messages*")) (if-let (win (get-buffer-window "*Messages*"))
(doom/popup-close win) (doom/popup-close win)
(doom-popup-buffer (get-buffer "*Messages*")))) (doom-popup-buffer (get-buffer "*Messages*"))))
;;;###autoload
(defun doom-popup-prop (prop &optional window)
(or (plist-get (or (if window
(buffer-local-value 'doom-popup-rules (window-buffer window))
doom-popup-rules)
(window-parameter window 'popup))
prop)
(cond ((eq prop :size)
shackle-default-size)
((eq prop :align)
shackle-default-alignment))))
;;;###autoload
(defun doom-popup-side (&optional window)
(let ((align (doom-popup-prop :align window)))
(when (eq align t)
(setq align shackle-default-alignment))
(when (functionp align)
(setq align (funcall align)))
align))
;;;###autoload
(defun doom-popup-size (&optional window)
(let ((side (doom-popup-side window)))
(cond ((memq side '(left right))
(window-width window))
((memq side '(above below))
(window-height window)))))
(defun doom--popup-data (window)
(when-let (buffer (window-buffer window))
`(,(buffer-name buffer)
:file ,(buffer-file-name buffer)
:rules ,(window-parameter window 'popup)
:size ,(doom-popup-size window))))