[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/dired-preview 8c1c73716e 37/67: Tighten the event loop
From: |
ELPA Syncer |
Subject: |
[elpa] externals/dired-preview 8c1c73716e 37/67: Tighten the event loop to avoid inconsistencies |
Date: |
Sat, 8 Jul 2023 15:57:54 -0400 (EDT) |
branch: externals/dired-preview
commit 8c1c73716e7bd738a1bfc49311f6552d7e16ccc6
Author: Protesilaos Stavrou <info@protesilaos.com>
Commit: Protesilaos Stavrou <info@protesilaos.com>
Tighten the event loop to avoid inconsistencies
I am continuously testing the results. I want this to be rock solid
before adding any new features.
---
dired-preview.el | 136 +++++++++++++++++++++++++++----------------------------
1 file changed, 66 insertions(+), 70 deletions(-)
diff --git a/dired-preview.el b/dired-preview.el
index 68ceaa5460..de0417098c 100644
--- a/dired-preview.el
+++ b/dired-preview.el
@@ -166,47 +166,10 @@ See user option
`dired-preview-ignored-extensions-regexp'."
(window (get-buffer-window buffer)))
(window-live-p window)))
-(defun dired-preview--delete-windows ()
- "Delete preview windows."
- (mapc
- (lambda (window)
- (delete-window window))
- (dired-preview--get-windows)))
-
-(defun dired-preview--kill-buffers ()
- "Kill preview buffers."
- (mapc
- (lambda (buffer)
- (when (and (not (eq buffer (current-buffer)))
- (window-parameter (get-buffer-window buffer)
'dired-preview-window))
- (ignore-errors
- (kill-buffer-if-not-modified buffer))))
- (dired-preview--get-buffers))
- (setq dired-preview--buffers nil))
-
-(defun dired-preview--close-previews ()
- "Kill preview buffers and delete their windows."
- (dired-preview--delete-windows)
- (dired-preview--kill-buffers))
-
(defun dired-preview--return-preview-buffer (file)
"Return buffer to preview FILE in."
(dired-preview--add-to-previews file))
-(defun dired-preview--close-previews-outside-dired ()
- "Call `dired-preview--close-previews' if BUFFER is not in Dired mode."
- (when (and (not (one-window-p :no-minibuffer))
- (not (minibufferp))
- (not (eq major-mode 'dired-mode)))
- (dired-preview--close-previews)
- (remove-hook 'window-state-change-hook
#'dired-preview--close-previews-outside-dired)))
-
-(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)))
-
(defvar dired-preview-buffer-name "*dired-preview*"
"Name of preview buffer.")
@@ -245,19 +208,6 @@ aforementioned user option."
mode-line-front-space
,dired-preview-buffer-name)))))))
-(defun dired-preview--display-buffer (buffer)
- "Call `display-buffer' for BUFFER.
-Only do it with the current major mode is Dired."
- (display-buffer buffer (funcall (or
dired-preview-display-action-alist-function
-
#'dired-preview-display-action-alist-dwim)))
- (when (window-live-p (get-buffer-window buffer))
- (dired-preview-set-up-preview-window buffer)))
-
-(defun dired-preview-display-file (file)
- "Display preview of FILE if appropriate."
- (when-let ((buffer (dired-preview--return-preview-buffer file)))
- (dired-preview--display-buffer buffer)))
-
(defvar dired-preview-trigger-commands
'(dired-next-line dired-previous-line dired-mark dired-goto-file)
"List of Dired commands that trigger a preview.")
@@ -270,6 +220,55 @@ Only do it with the current major mode is Dired."
(when (timerp dired-preview--timer)
(cancel-timer dired-preview--timer)))
+(defun dired-preview--delete-windows ()
+ "Delete preview windows."
+ (mapc
+ (lambda (window)
+ (unless (or (eq window (minibuffer-window))
+ (one-window-p))
+ (delete-window window)))
+ (dired-preview--get-windows)))
+
+(defun dired-preview--kill-buffers ()
+ "Kill preview buffers."
+ (mapc
+ (lambda (buffer)
+ (when (and (not (eq buffer (current-buffer)))
+ (window-parameter (get-buffer-window buffer)
'dired-preview-window))
+ (ignore-errors
+ (kill-buffer-if-not-modified buffer))))
+ (dired-preview--get-buffers))
+ (setq dired-preview--buffers nil))
+
+(defun dired-preview--close-previews ()
+ "Kill preview buffers and delete their windows."
+ (dired-preview--cancel-timer)
+ (dired-preview--delete-windows)
+ (dired-preview--kill-buffers))
+
+(defun dired-preview--close-previews-outside-dired ()
+ "Call `dired-preview--close-previews' if BUFFER is not in Dired mode."
+ (when (not (eq major-mode 'dired-mode))
+ (dired-preview--close-previews)
+ (remove-hook 'window-state-change-hook
#'dired-preview--close-previews-outside-dired)))
+
+(defun dired-preview--display-buffer (buffer)
+ "Call `display-buffer' for BUFFER.
+Only do it with the current major mode is Dired."
+ (display-buffer
+ buffer
+ (funcall (or dired-preview-display-action-alist-function
+ #'dired-preview-display-action-alist-dwim))))
+
+(defun dired-preview-display-file (file)
+ "Display preview of FILE if appropriate."
+ (when-let ((buffer (dired-preview--return-preview-buffer file)))
+ (dired-preview--display-buffer buffer)
+ (if-let ((window (get-buffer-window buffer)))
+ (with-selected-window window
+ (set-window-parameter window 'dired-preview-window :preview))
+ (dired-preview--close-previews))))
+
(defun dired-preview--preview-p (file)
"Return non-nil if FILE can be previewed."
(and (file-exists-p file)
@@ -282,26 +281,24 @@ Only do it with the current major mode is Dired."
"Trigger display of file at point after `dired-preview-trigger-commands'.
With optional NO-DELAY do not start a timer. Otherwise produce
the preview with `dired-preview-delay' of idleness."
+ (add-hook 'window-state-change-hook
#'dired-preview--close-previews-outside-dired)
(dired-preview--cancel-timer)
- (let* ((file (dired-file-name-at-point)))
- (cond
- ((and file
- (dired-preview--preview-p file)
- (memq this-command dired-preview-trigger-commands))
- (if no-delay
- (dired-preview-display-file file)
- (setq dired-preview--timer
- (run-with-idle-timer
- dired-preview-delay
- nil
- #'dired-preview-display-file
- file))))
- ((and file
- (not (dired-preview--preview-p file))
- (eq major-mode 'dired-mode))
- (dired-preview--close-previews))
- (t
- (dired-preview--close-previews-outside-dired)))))
+ (if-let* ((file (dired-file-name-at-point)))
+ (cond
+ ((and (dired-preview--preview-p file)
+ (memq this-command dired-preview-trigger-commands))
+ (if no-delay
+ (dired-preview-display-file file)
+ (setq dired-preview--timer
+ (run-with-idle-timer
+ dired-preview-delay
+ nil
+ #'dired-preview-display-file
+ file))))
+ ((and (not (dired-preview--preview-p file))
+ (eq major-mode 'dired-mode))
+ (dired-preview--close-previews)))
+ (dired-preview--close-previews-outside-dired)))
(defun dired-preview-disable-preview ()
"Disable Dired preview."
@@ -315,7 +312,6 @@ the preview with `dired-preview-delay' of idleness."
(unless (eq major-mode 'dired-mode)
(error "Can only use `dired-preview' in Dired"))
(add-hook 'post-command-hook #'dired-preview-trigger nil :local)
- (add-hook 'post-command-hook #'dired-preview--close-previews-outside-dired
nil :local)
(dired-preview-trigger :no-delay))
;;;###autoload
- [elpa] externals/dired-preview 5ffcfb0c85 24/67: Tweak the format of the timer call, (continued)
- [elpa] externals/dired-preview 5ffcfb0c85 24/67: Tweak the format of the timer call, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview e2da14de12 30/67: Fix scope of action to close preview upon buffer switch, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 75f1b11e99 29/67: Add FIXME for the scope of dired-preview--close-previews-outside-dired, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 3f2588abb3 32/67: Make all preview state be handled by the trigger, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 49bea8f6d4 34/67: Delete windows, then kill buffers, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 070f02a1b0 42/67: Stop changing the mode-line-format, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 5338f5c1a7 26/67: Make commit 3ba4c3f more resilient, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview ec09d4b856 27/67: Fix how delayed-mode-hooks are handled, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview b367550663 28/67: Rewrite how the timer is started, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview c20af9c9eb 31/67: Fix how the window is set up and closed outside Dired, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 8c1c73716e 37/67: Tighten the event loop to avoid inconsistencies,
ELPA Syncer <=
- [elpa] externals/dired-preview 18b607fc48 40/67: Simplify dired-preview-return-window-size, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 86e11c105b 41/67: Make dired-preview-display-file delete windows eagerly, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview ca176e11e4 36/67: Simplify dired-preview--run-mode-hooks, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview b3ef9a2595 43/67: Define predicate function to check for window parameter, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 11bb038063 47/67: Do not try to delete selected preview window, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 077f24db3c 45/67: Tweak how window size is calculated, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview f52ed4774c 48/67: Remove 'dedicated' parameter from selected window, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 29829a63c8 56/67: Refactor how parameters are set, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 8d19b43469 66/67: Fix typos, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview a3dd67d46f 59/67: Refine dired-preview-get-window-size, ELPA Syncer, 2023/07/08