diff lisp/window.el @ 90645:7eeafaaa9eab

Merge from emacs--devo--0 Patches applied: * emacs--devo--0 (patch 476-489) - Update from CVS - Merge from gnus--rel--5.10 * gnus--rel--5.10 (patch 153-160) - Merge from emacs--devo--0 - Update from CVS Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-127
author Miles Bader <miles@gnu.org>
date Mon, 30 Oct 2006 08:54:41 +0000
parents a1a25ac6c88a 7c85e65e0464
children 02cf29720f31
line wrap: on
line diff
--- a/lisp/window.el	Mon Oct 30 06:52:47 2006 +0000
+++ b/lisp/window.el	Mon Oct 30 08:54:41 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.