emacs-31 07922525948 1/2: Handle 'speedbar-buffer' kill when in 'speedbar-window-mode'.

Eli Zaretskii <[email protected]>
Newsgroups gmane.emacs.diffs
Message-ID <[email protected]>
branch: emacs-31
commit 07922525948f83e45b16329cebafd59d0c6d9e07
Author: Vincenzo Pupillo <[email protected]>
Commit: Eli Zaretskii <[email protected]>

    Handle 'speedbar-buffer' kill when in 'speedbar-window-mode'.
    
    This handles the DFRAME TIMER ERROR reported by Daniel Mendler
    (bug#81561).  In addition, it eliminates other causes of stale
    idle timers.
    * lisp/speedbar.el (speedbar-window-mode): Add a 'kill-buffer'
    handler.  Removed an unnecessary 'speedbar-mode' invocation.
    (speedbar-window--close): New optional parameter used by the
    'kill-buffer' handler for 'speedbar-buffer'.
    (speedbar-set-timer): Make sure that 'speedbar-set-timer' is
    called in 'speedbar-buffer', this prevents the creation of stale
    idle timers.
    (speedbar--speedbar-live-p): Make sure that 'speedbar-buffer' is
    still live.
---
 lisp/speedbar.el | 37 ++++++++++++++++++++++---------------
 1 file changed, 22 insertions(+), 15 deletions(-)

diff --git a/lisp/speedbar.el b/lisp/speedbar.el
index 3e965d4286c..778c5f5f12f 100644
--- a/lisp/speedbar.el
+++ b/lisp/speedbar.el
@@ -1083,7 +1083,6 @@ supported at a time.
 	    speedbar-last-selected-file nil)
 
       (set-buffer speedbar-buffer)
-      (speedbar-mode)
 
       ;; let's create the window
       (setq speedbar--window
@@ -1102,14 +1101,19 @@ supported at a time.
       (speedbar-update-contents)
       (speedbar-set-timer dframe-update-speed)
 
+      ;; handle kill-buffer
+      (add-hook 'kill-buffer-hook (lambda () (speedbar-window--close t)) nil t)
+
       ;; hscroll
       (setq-local auto-hscroll-mode nil)
       ;; reset the selection variable
       (setq speedbar-last-selected-file nil)
       (select-window current-window))))
 
-(defun speedbar-window--close ()
-  "Close `speedbar-window'."
+(defun speedbar-window--close (&optional no-kill-buffer)
+  "Close `speedbar-window'.
+When NO-KILL-BUFFER is not nil, close window without killing
+'speedbar-buffer', which is useful for 'kill-buffer-hook'."
   (when (speedbar-window--live-p)
     (let ((current-window (selected-window)))
       ;; store the current window width
@@ -1123,10 +1127,11 @@ supported at a time.
       (setq speedbar--window nil
 	    speedbar-frame nil
 	    dframe-attached-frame nil)
-      (with-current-buffer speedbar-buffer
-        (speedbar-set-timer nil))
-      (kill-buffer speedbar-buffer)
-      (setq speedbar-buffer nil)
+
+      (speedbar-set-timer nil)
+      (unless no-kill-buffer
+        (kill-buffer speedbar-buffer)
+        (setq speedbar-buffer nil))
       (when (and current-window (window-live-p current-window))
 	(select-window current-window)))))
 
@@ -2724,13 +2729,15 @@ This should only be used by modes classified as special."
   "Set up the speedbar timer with TIMEOUT.
 Uses `dframe-set-timer'.
 Also resets scanner functions."
-  (dframe-set-timer timeout 'speedbar-timer-fn 'speedbar-update-flag)
-  ;; Apply a revert hook that will reset the scanners.  We attach to revert
-  ;; because most reverts occur during VC state change, and this lets our
-  ;; VC scanner fix itself.
-  (if timeout
-      (add-hook 'after-revert-hook 'speedbar-reset-scanners)
-    (remove-hook 'after-revert-hook 'speedbar-reset-scanners))
+  ;; `dframe-set-timer' must be called from `speedbar-buffer'.
+  (with-current-buffer speedbar-buffer
+    (dframe-set-timer timeout 'speedbar-timer-fn 'speedbar-update-flag)
+    ;; Apply a revert hook that will reset the scanners.  We attach to revert
+    ;; because most reverts occur during VC state change, and this lets our
+    ;; VC scanner fix itself.
+    (if timeout
+        (add-hook 'after-revert-hook 'speedbar-reset-scanners)
+      (remove-hook 'after-revert-hook 'speedbar-reset-scanners)))
   ;; change this if it changed for some reason
   (speedbar-set-mode-line-format))
 
@@ -2740,7 +2747,7 @@ Also resets scanner functions."
    ((and (speedbar-current-frame)
 	 (frame-live-p (speedbar-current-frame)))
     t)
-   ((speedbar-window--window-live-p) t)
+   ((speedbar-window--live-p) t)
    (t nil)))
 
 (defun speedbar-timer-fn ()
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.