2016-03-22 18:23:51 -04:00
|
|
|
;;; defuns-popups.el
|
|
|
|
|
2016-04-23 22:08:46 -04:00
|
|
|
;;;###autoload
|
2016-05-20 22:37:30 -04:00
|
|
|
(defun doom/popup-remove (window)
|
2016-05-23 17:07:35 -04:00
|
|
|
(setq doom-popup-windows (delete window doom-popup-windows))
|
|
|
|
(unless (and doom-prev-buffer (not (buffer-live-p doom-prev-buffer)))
|
|
|
|
(setq doom-prev-buffer nil)))
|
2016-03-22 18:23:51 -04:00
|
|
|
|
|
|
|
;;;###autoload
|
2016-05-20 22:37:30 -04:00
|
|
|
(defun doom/popup-p (&optional window)
|
2016-03-22 18:23:51 -04:00
|
|
|
"Whether WINDOW is a shackle popup window or not."
|
2016-05-20 22:37:30 -04:00
|
|
|
(and doom-popup-windows
|
2016-03-22 18:23:51 -04:00
|
|
|
(-any? (lambda (w)
|
2016-05-20 22:37:30 -04:00
|
|
|
(if (window-live-p w) t (doom/popup-remove w) nil))
|
|
|
|
doom-popup-windows)
|
2016-03-22 18:23:51 -04:00
|
|
|
(if window
|
2016-05-20 22:37:30 -04:00
|
|
|
(-any? (lambda (w) (eq window w)) doom-popup-windows)
|
2016-03-22 18:23:51 -04:00
|
|
|
t)))
|
|
|
|
|
2016-04-27 23:20:02 -04:00
|
|
|
;;;###autoload
|
2016-05-20 22:37:30 -04:00
|
|
|
(defmacro doom/popup-save (&rest body)
|
|
|
|
`(let ((popup-p (doom/popup-p)))
|
|
|
|
(when popup-p (doom/popup-close-all t))
|
2016-04-27 23:20:02 -04:00
|
|
|
,@body
|
|
|
|
(when popup-p
|
|
|
|
(save-selected-window
|
2016-05-20 22:37:30 -04:00
|
|
|
(doom/popup-last-buffer)))))
|
2016-04-27 23:20:02 -04:00
|
|
|
|
2016-03-22 18:23:51 -04:00
|
|
|
;;;###autoload
|
2016-05-20 22:37:30 -04:00
|
|
|
(defun doom/popup-buffer (buffer &optional plist)
|
2016-03-22 18:23:51 -04:00
|
|
|
"Display BUFFER in a shackle popup."
|
2016-05-21 18:54:23 -04:00
|
|
|
(let* ((buffer-name (if (stringp buffer) buffer (buffer-name buffer)))
|
|
|
|
(buffer (get-buffer-create buffer-name)))
|
|
|
|
(shackle-display-buffer buffer nil (or plist (shackle-match buffer-name)))
|
|
|
|
(setq doom-last-popup buffer)))
|
2016-03-22 18:23:51 -04:00
|
|
|
|
|
|
|
;;;###autoload
|
2016-05-20 22:37:30 -04:00
|
|
|
(defun doom/popup-close (&optional window dont-kill dont-close-all)
|
2016-03-22 18:23:51 -04:00
|
|
|
"Find and close the currently active popup (if available)."
|
|
|
|
(interactive)
|
2016-05-21 18:54:23 -04:00
|
|
|
(let ((dont-kill (or doom-popup-protect dont-kill)))
|
|
|
|
(when (not window)
|
|
|
|
(if (doom/popup-p (selected-window))
|
|
|
|
(setq window (selected-window))
|
|
|
|
(unless dont-close-all
|
|
|
|
(doom/popup-close-all dont-kill))))
|
|
|
|
(when (and window (window-live-p window))
|
|
|
|
;; REPL buffer
|
|
|
|
(cond ((and (derived-mode-p 'comint-mode)
|
|
|
|
(featurep 'repl-toggle)
|
|
|
|
repl-toggle-mode)
|
|
|
|
(setq rtog/--last-buffer nil))
|
|
|
|
((eq major-mode 'messages-buffer-mode)
|
|
|
|
(bury-buffer)
|
|
|
|
(setq dont-kill t)))
|
|
|
|
(doom/popup-remove window)
|
|
|
|
(unless dont-kill
|
|
|
|
(let ((kill-buffer-query-functions
|
|
|
|
(delq 'process-kill-buffer-query-function
|
|
|
|
kill-buffer-query-functions)))
|
|
|
|
(kill-buffer (window-buffer window))))
|
|
|
|
(delete-window window))))
|
2016-03-22 18:23:51 -04:00
|
|
|
|
|
|
|
;;;###autoload
|
2016-05-20 22:37:30 -04:00
|
|
|
(defun doom/popup-close-all (&optional dont-kill-buffers)
|
2016-03-22 18:23:51 -04:00
|
|
|
"Closes all popup windows (and kills the buffers if DONT-KILL-BUFFERS is non-nil)"
|
|
|
|
(interactive)
|
2016-05-20 22:37:30 -04:00
|
|
|
(mapc (lambda (w) (doom/popup-close w dont-kill-buffers))
|
|
|
|
doom-popup-windows)
|
|
|
|
(setq doom-popup-windows nil))
|
2016-03-22 18:23:51 -04:00
|
|
|
|
|
|
|
;;;###autoload
|
2016-05-20 22:37:30 -04:00
|
|
|
(defun doom/popup-toggle ()
|
2016-03-22 18:23:51 -04:00
|
|
|
"Toggles the popup window, reopening the last popup (if available)."
|
|
|
|
(interactive)
|
2016-05-20 22:37:30 -04:00
|
|
|
(if (doom/popup-p)
|
|
|
|
(doom/popup-close t)
|
|
|
|
(doom/popup-last-buffer)))
|
2016-03-22 18:23:51 -04:00
|
|
|
|
|
|
|
;;;###autoload
|
2016-05-20 22:37:30 -04:00
|
|
|
(defun doom/popup-last-buffer ()
|
2016-03-22 18:23:51 -04:00
|
|
|
"Pop up the last popup buffer."
|
|
|
|
(interactive)
|
2016-05-21 18:54:23 -04:00
|
|
|
(unless (and doom-last-popup
|
|
|
|
(buffer-live-p doom-last-popup))
|
|
|
|
(setq doom-last-popup nil)
|
2016-04-27 23:20:28 -04:00
|
|
|
(error "No popup to restore"))
|
2016-05-21 18:54:23 -04:00
|
|
|
(doom/popup-buffer doom-last-popup))
|
2016-03-22 18:23:51 -04:00
|
|
|
|
|
|
|
;;;###autoload
|
2016-05-20 22:37:30 -04:00
|
|
|
(defun doom/popup-messages ()
|
2016-05-21 18:54:23 -04:00
|
|
|
"Pop up the *Messages* buffer."
|
|
|
|
(interactive)
|
|
|
|
(doom/popup-buffer "*Messages*")
|
|
|
|
(with-current-buffer "*Messages*"
|
|
|
|
(doom|hide-mode-line)
|
|
|
|
(goto-char (point-max))))
|
|
|
|
|
|
|
|
;;;###autoload
|
2016-05-23 17:07:35 -04:00
|
|
|
(defun doom*run-popup-pre-hooks (&rest _)
|
|
|
|
(unless (and doom-prev-buffer
|
|
|
|
(doom/popup-p (get-buffer-window doom-prev-buffer)))
|
|
|
|
(setq doom-prev-buffer (current-buffer))))
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom*run-popup-post-hooks (&rest _)
|
2016-05-21 18:54:23 -04:00
|
|
|
(with-current-buffer shackle-last-buffer
|
2016-05-23 17:07:35 -04:00
|
|
|
(run-hooks 'doom-popup-post-hook)))
|
2016-03-22 18:23:51 -04:00
|
|
|
|
2016-04-26 02:01:39 -04:00
|
|
|
;;;###autoload
|
2016-05-20 22:37:30 -04:00
|
|
|
(defun doom|popup-init ()
|
|
|
|
(add-to-list 'doom-popup-windows (get-buffer-window))
|
2016-05-23 20:54:45 -04:00
|
|
|
(unless (one-window-p)
|
2016-05-23 17:07:35 -04:00
|
|
|
(ignore-errors
|
|
|
|
(local-set-key [escape escape] 'doom/popup-close)
|
2016-05-21 18:54:23 -04:00
|
|
|
(let ((map evil-normal-state-local-map))
|
2016-05-23 17:07:35 -04:00
|
|
|
(define-key map [escape escape] 'doom/popup-close)
|
|
|
|
(unless (apply #'derived-mode-p doom-popup-inescapable-modes)
|
|
|
|
(define-key map [escape] 'doom/popup-close)
|
2016-05-23 20:54:45 -04:00
|
|
|
(define-key map (kbd "ESC") 'doom/popup-close)))
|
|
|
|
(when (apply #'derived-mode-p doom-popup-protect-modes)
|
|
|
|
(setq-local doom-popup-protect t)
|
|
|
|
(setq doom-last-popup (current-buffer))))))
|
2016-04-26 02:01:39 -04:00
|
|
|
|
2016-03-22 18:23:51 -04:00
|
|
|
(provide 'defuns-popups)
|
|
|
|
;;; defuns-popups.el ends here
|