Mercurial > emacs
changeset 99249:57c1a97ddf78
(quit-window): Simplify code. Say in doc-string
that it operates on the selected window's buffer. (Bug#1259)
author | Martin Rudalics <rudalics@gmx.at> |
---|---|
date | Thu, 30 Oct 2008 15:41:07 +0000 |
parents | 847ff1d1650c |
children | d5943eac9112 |
files | lisp/window.el |
diffstat | 1 files changed, 24 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/window.el Thu Oct 30 09:23:31 2008 +0000 +++ b/lisp/window.el Thu Oct 30 15:41:07 2008 +0000 @@ -1395,51 +1395,33 @@ (error nil))))) (defun quit-window (&optional kill window) - "Quit the current buffer. Bury it, and maybe delete the selected frame. -\(The frame is deleted if it contains a dedicated window for the buffer.) -With a prefix argument, kill the buffer instead. - -Noninteractively, if KILL is non-nil, then kill the current buffer, -otherwise bury it. - -If WINDOW is non-nil, it specifies a window; we delete that window, -and the buffer that is killed or buried is the one in that window." - (interactive "P") - (let ((buffer (window-buffer window)) - (frame (window-frame (or window (selected-window)))) - (window-solitary - (save-selected-window - (if window - (select-window window)) - (one-window-p t))) - window-handled) - - (save-selected-window - (if window - (select-window window)) - (or (window-minibuffer-p) - (window-dedicated-p (selected-window)) - (switch-to-buffer (other-buffer)))) - - ;; Get rid of the frame, if it has just one dedicated window - ;; and other visible frames exist. - (and (or (window-minibuffer-p) (window-dedicated-p window)) - (delq frame (visible-frame-list)) - window-solitary - (if (and (eq default-minibuffer-frame frame) - (= 1 (length (minibuffer-frame-list)))) - (setq window nil) - (delete-frame frame) - (setq window-handled t))) - + "Bury or kill (with KILL non-nil) the buffer displayed in WINDOW. +KILL defaults to nil, WINDOW to the selected window. If WINDOW +is dedicated or a minibuffer window, delete it and, if it's the +only window on its frame, delete its frame as well provided there +are other frames left. Otherwise, display some other buffer in +the window." + (interactive) + (let* ((window (or window (selected-window))) + (buffer (window-buffer window))) + (if (or (window-minibuffer-p window) (window-dedicated-p window)) + (if (eq window (frame-root-window (window-frame window))) + ;; If this is the only window on its frame, try to delete the + ;; frame (`delete-windows-on' knows how to do that). + (delete-windows-on buffer (selected-frame)) + ;; Other windows are left, delete this window. But don't + ;; throw an error if that fails for some reason. + (condition-case nil + (delete-window window) + (error nil))) + ;; The window is neither dedicated nor a minibuffer window, + ;; display another buffer in it. + (with-selected-window window + (switch-to-buffer (other-buffer)))) ;; Deal with the buffer. (if kill (kill-buffer buffer) - (bury-buffer buffer)) - - ;; Maybe get rid of the window. - (and window (not window-handled) (not window-solitary) - (delete-window window)))) + (bury-buffer buffer)))) (defvar recenter-last-op nil "Indicates the last recenter operation performed.