summaryrefslogtreecommitdiff
path: root/lisp/window.el
diff options
context:
space:
mode:
authorDavid Kastrup <dak@gnu.org>2006-10-20 15:12:31 +0000
committerDavid Kastrup <dak@gnu.org>2006-10-20 15:12:31 +0000
commitf5da083ed9884178b88bf2ee81486e4527d0da81 (patch)
treeb50d3336c4edde0ed64773c4da4281b98d4ac0d0 /lisp/window.el
parent98d763e7e7bc46ea8c2e1b633b45648f6507aaac (diff)
downloademacs-f5da083ed9884178b88bf2ee81486e4527d0da81.tar.gz
(kill-buffer-and-window): Fix a bug where an aborted
operation would still cause some window to collapse later.
Diffstat (limited to 'lisp/window.el')
-rw-r--r--lisp/window.el22
1 files changed, 15 insertions, 7 deletions
diff --git a/lisp/window.el b/lisp/window.el
index 0c50bc63a08..ac4fc0b7c96 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -719,17 +719,25 @@ or if the window is the only window of its frame."
"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.