From 1f3c99ca9f35c430fcb3b3244df3bf6fca04e62b Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Sat, 3 Sep 2011 12:55:37 +0200 Subject: [PATCH] Don't delete frame when there's a previous buffer to show (Bug#9419). * window.el (window-deletable-p): Don't return a non-nil value when there's a buffer that was shown in the window before. (Bug#9419) (display-buffer-pop-up-frame, display-buffer-pop-up-window): Set window's previous buffers to nil. --- lisp/ChangeLog | 8 ++++++++ lisp/window.el | 48 +++++++++++++++++++++++++++++++++++------------- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 781833d309c..a365d6078ea 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2011-09-03 Martin Rudalics + + * window.el (window-deletable-p): Don't return a non-nil value + when there's a buffer that was shown in the window before. + (Bug#9419) + (display-buffer-pop-up-frame, display-buffer-pop-up-window): Set + window's previous buffers to nil. + 2011-09-03 Eli Zaretskii * mail/rmailmm.el (rmail-mime-insert-tagline): Insert an extra diff --git a/lisp/window.el b/lisp/window.el index d078fbec35d..5272841a9c7 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -2291,29 +2291,45 @@ frame." (setq window (window-atom-root window)))) (let ((parent (window-parent window)) (frame (window-frame window)) + (buffer (window-buffer window)) (dedicated (and (window-buffer window) (window-dedicated-p window))) (quit-restore (window-parameter window 'quit-restore))) (cond ((frame-root-window-p window) + ;; Don't delete FRAME if `frame-auto-delete' is nil. (when (and (or (eq frame-auto-delete t) (and (eq frame-auto-delete 'automatic) + ;; Delete FRAME only if it's either dedicated + ;; or quit-restore's car is `new-frame' and + ;; WINDOW still displays the same buffer (or dedicated (and (eq (car-safe quit-restore) 'new-frame) (eq (nth 1 quit-restore) (window-buffer window)))))) + ;; Don't delete FRAME if we have another buffer in + ;; WINDOW's previous buffers. Bug#9419. + (or (not (window-prev-buffers window)) + (eq (caar (window-prev-buffers window)) buffer)) + ;; Don't try to delete FRAME when there are no other + ;; visible frames left. (other-visible-frames-p frame)) - ;; WINDOW is the root window of its frame. Return `frame' but - ;; only if WINDOW is (1) either dedicated or quit-restore's car - ;; is `new-frame' and the window still displays the same buffer - ;; and (2) there are other frames left. 'frame)) - ((and (not ignore-window-parameters) - (eq (window-parameter window 'window-side) 'none) - (or (not parent) - (not (eq (window-parameter parent 'window-side) 'none)))) - ;; Can't delete last main window. - nil) - (t)))) + ;; Don't delete WINDOW if we find another buffer in WINDOW's + ;; previous buffers. + ((and (or (not (window-prev-buffers window)) + (eq (caar (window-prev-buffers window)) buffer)) + ;; Delete WINDOW only if it's dedicated or quit-restore's car + ;; is `new-frame' or `new-window' and it still displays the + ;; same buffer. + (or dedicated + (and (memq (car-safe quit-restore) '(new-window new-frame)) + (eq (nth 1 quit-restore) (window-buffer window)))) + ;; Don't delete the last main window. + (or ignore-window-parameters + (not (eq (window-parameter window 'window-side) 'none)) + (and parent + (eq (window-parameter parent 'window-side) 'none)))) + t)))) (defun window-or-subwindow-p (subwindow window) "Return t if SUBWINDOW is either WINDOW or a subwindow of WINDOW." @@ -4714,7 +4730,10 @@ return the window on the new frame; otherwise return nil." (setq frame (funcall fun)) (setq window (frame-selected-window frame))) (display-buffer-record-window 'pop-up-frame window buffer) - (window--display-buffer-2 buffer window)))) + (window--display-buffer-2 buffer window) + ;; Reset list of WINDOW's previous buffers to nil. + (set-window-prev-buffers window nil) + window))) (defun display-buffer-pop-up-window (buffer alist) "Display BUFFER by popping up a new window. @@ -4737,7 +4756,10 @@ If sucessful, return the new window; otherwise return nil." (window--try-to-split-window (get-lru-window frame t))))) (display-buffer-record-window 'pop-up-window window buffer) - (window--display-buffer-2 buffer window)))) + (window--display-buffer-2 buffer window) + ;; Reset list of WINDOW's previous buffers to nil. + (set-window-prev-buffers window nil) + window))) ;; This display action function groups together some lower-level ones: (defun display-buffer-reuse-or-pop-window (buffer alist) -- 2.39.2