branch: externals/dired-preview commit c20af9c9eb5d6941159cbc476aca4103fa0c2b6b Author: Protesilaos Stavrou <i...@protesilaos.com> Commit: Protesilaos Stavrou <i...@protesilaos.com>
Fix how the window is set up and closed outside Dired Thanks to Bruno Boal for taking a look into this with me: <https://git.sr.ht/~bboal>. This was done in a private channel and the information is shared with permission. --- dired-preview.el | 51 +++++++++++++++++++++------------------------------ 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/dired-preview.el b/dired-preview.el index 4ccaa827c9..b61f5ded41 100644 --- a/dired-preview.el +++ b/dired-preview.el @@ -94,10 +94,6 @@ Used by the default value of `dired-preview-display-action-alist'." (slot . -1) (window-width . 0.3) (dedicated . t) - ;; FIXME 2023-06-29: Should `dired-preview-set-up-preview-window' - ;; be part of the `body-function'? It seems wrong as the user may - ;; omit this entry from the alist, thus breaking the preview. - (body-function . dired-preview-set-up-preview-window) (window-parameters . ((no-other-window . t) (mode-line-format . ("%e" mode-line-front-space @@ -105,11 +101,7 @@ Used by the default value of `dired-preview-display-action-alist'." "The `display-buffer' action for the preview. This is the same data that is passed to `display-buffer-alist'. Read Info node `(elisp) Displaying Buffers'. As such, it is -meant for experienced users. - -To ensure best results, the `body-function' in the alist must be -set to `dired-preview-set-up-preview-window', as shown in this -user option's default value." +meant for experienced users." :group 'dired-preview :type 'alist) @@ -170,8 +162,7 @@ Always return FILE buffer." "Return windows that show previews." (seq-filter (lambda (window) - (when (window-parameter window 'dired-preview-window) - window)) + (window-parameter window 'dired-preview-window)) (window-list))) (defun dired-preview--file-ignored-p (file) @@ -210,8 +201,7 @@ See user option `dired-preview-ignored-extensions-regexp'." (mapc (lambda (buffer) (when (and (not (eq buffer (current-buffer))) - (window-parameter (get-buffer-window buffer) 'dired-preview-window) - delayed-mode-hooks) + (window-parameter (get-buffer-window buffer) 'dired-preview-window)) (ignore-errors (kill-buffer-if-not-modified buffer)))) (dired-preview--get-buffers)) @@ -219,8 +209,8 @@ See user option `dired-preview-ignored-extensions-regexp'." (defun dired-preview--close-previews () "Kill preview buffers and delete their windows." - (dired-preview--delete-windows) - (dired-preview--kill-buffers)) + (dired-preview--kill-buffers) + (dired-preview--delete-windows)) (defun dired-preview--return-preview-buffer (file) "Return buffer to preview FILE in. @@ -235,13 +225,10 @@ conforms with `dired-preview--preview-p'." (dired-preview--close-previews) (remove-hook 'window-state-change-hook #'dired-preview--close-previews-outside-dired))) -;; NOTE 2023-06-29: See the FIXME for `dired-preview-display-action-alist'. -(defun dired-preview-set-up-preview-window (window &rest _) - "Set WINDOW `:preview' parameter. -Use this as the `body-function' in the user option -`dired-preview-display-action-alist'." - (set-window-parameter window 'dired-preview-window :preview) - (with-current-buffer (window-buffer window) +(defun dired-preview-set-up-preview-window (buffer) + "Set BUFFER window `:preview' parameter." + (when-let ((window (get-buffer-window buffer))) + (set-window-parameter window 'dired-preview-window :preview) (add-hook 'window-state-change-hook #'dired-preview--close-previews-outside-dired))) (defun dired-preview--display-buffer (buffer) @@ -262,7 +249,8 @@ Only do it with the current major mode is Dired." ((eq buffer (get-file-buffer file)))) (display-buffer buffer - dired-preview-display-action-alist))) + dired-preview-display-action-alist) + (dired-preview-set-up-preview-window buffer))) (defun dired-preview-display-file () "Display preview of `dired-file-name-at-point' if appropriate. @@ -286,13 +274,16 @@ Return buffer object of displayed buffer." (defun dired-preview-trigger () "Trigger display of file at point after `dired-preview-trigger-commands'." - (when (memq this-command dired-preview-trigger-commands) - (dired-preview--cancel-timer) - (setq dired-preview--timer - (run-with-idle-timer - dired-preview-delay - nil - #'dired-preview-display-file)))) + (if (and (eq major-mode 'dired-mode) + (memq this-command dired-preview-trigger-commands)) + (progn + (dired-preview--cancel-timer) + (setq dired-preview--timer + (run-with-idle-timer + dired-preview-delay + nil + #'dired-preview-display-file))) + (dired-preview--close-previews-outside-dired))) (defun dired-preview-disable-preview () "Disable Dired preview."