changeset 73447:7c85e65e0464

(kill-buffer-and-window): Fix a bug where an aborted operation would still cause some window to collapse later.
author David Kastrup <dak@gnu.org>
date Fri, 20 Oct 2006 15:12:31 +0000
parents 9895afa2b157
children 1fd4b3c12646
files lisp/ChangeLog lisp/window.el
diffstat 2 files changed, 21 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Fri Oct 20 12:40:30 2006 +0000
+++ b/lisp/ChangeLog	Fri Oct 20 15:12:31 2006 +0000
@@ -1,3 +1,8 @@
+2006-10-20  David Kastrup  <dak@gnu.org>
+
+	* window.el (kill-buffer-and-window): Fix a bug where an aborted
+	operation would still cause some window to collapse later.
+
 2006-10-20  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* vc.el (vc-switch-backend): Try to be more careful with unwanted
@@ -574,7 +579,7 @@
 
 	* autoinsert.el (auto-insert-alist): Doc fix.
 
-2006-10-07  Johan Bockg,be(Brd  <bojohan@dd.chalmers.se>
+2006-10-07  Johan Bockg,Ae(Brd  <bojohan@dd.chalmers.se>
 
 	* mouse-sel.el (mouse-insert-selection-internal):
 	Use insert-for-yank, so that yank handlers are run.
--- a/lisp/window.el	Fri Oct 20 12:40:30 2006 +0000
+++ b/lisp/window.el	Fri Oct 20 15:12:31 2006 +0000
@@ -719,17 +719,25 @@
   "Kill the current buffer and delete the selected window."
   (interactive)
   (let ((window-to-delete (selected-window))
+	(buffer-to-kill (current-buffer))
 	(delete-window-hook (lambda ()
 			      (condition-case nil
 				  (delete-window)
 				(error nil)))))
-    (add-hook 'kill-buffer-hook delete-window-hook t t)
-    (if (kill-buffer (current-buffer))
-	;; If `delete-window' failed before, we rerun it to regenerate
-	;; the error so it can be seen in the minibuffer.
-	(when (eq (selected-window) window-to-delete)
-	  (delete-window))
-      (remove-hook 'kill-buffer-hook delete-window-hook t))))
+    (unwind-protect
+	(progn
+	  (add-hook 'kill-buffer-hook delete-window-hook t t)
+	  (if (kill-buffer (current-buffer))
+	      ;; If `delete-window' failed before, we rerun it to regenerate
+	      ;; the error so it can be seen in the echo area.
+	      (when (eq (selected-window) window-to-delete)
+		(delete-window))))
+      ;; If the buffer is not dead for some reason (probably because
+      ;; of a `quit' signal), remove the hook again.
+      (condition-case nil
+	  (with-current-buffer buffer-to-kill
+	    (remove-hook 'kill-buffer-hook delete-window-hook t))
+	(error nil)))))
 
 (defun quit-window (&optional kill window)
   "Quit the current buffer.  Bury it, and maybe delete the selected frame.