]> git.eshelyaron.com Git - emacs.git/commitdiff
Have 'display-buffer-reuse-window' prefer window on selected frame (Bug#36680)
authorMartin Rudalics <rudalics@gmx.at>
Fri, 19 Jul 2019 08:08:08 +0000 (10:08 +0200)
committerMartin Rudalics <rudalics@gmx.at>
Fri, 19 Jul 2019 08:08:08 +0000 (10:08 +0200)
* lisp/window.el (display-buffer-reuse-window): Preferably reuse
window on selected frame (Bug#36680).
* doc/lispref/windows.texi (Buffer Display Action Functions): Say
that 'display-buffer-reuse-window' prefers window on the selected
frame.

doc/lispref/windows.texi
lisp/window.el

index b5ca053e466c044e9c1ee63166d07a2cdaaa3648..1035739e2b0dd867111d87c553f33d4b194d8ed6 100644 (file)
@@ -2536,7 +2536,8 @@ to another buffer (@pxref{Dedicated Windows}).  It also fails if
 
 @defun display-buffer-reuse-window buffer alist
 This function tries to display @var{buffer} by finding a window that
-is already displaying it.
+is already displaying it.  Windows on the selected frame are preferred
+to windows on other frames.
 
 If @var{alist} has a non-@code{nil} @code{inhibit-same-window} entry,
 the selected window is not eligible for reuse.  The set of frames to
index 726d022dfe99c8e86c55a6da1edbcc72912af4fa..8cb9670ae47a9738a3de65715d165ebacf4c9e97 100644 (file)
@@ -7332,25 +7332,26 @@ return nil."
 
 (defun display-buffer-reuse-window (buffer alist)
   "Return a window that is already displaying BUFFER.
-Return nil if no usable window is found.
+Preferably use a window on the selected frame if such a window
+exists.  Return nil if no usable window is found.
 
-If ALIST has a non-nil `inhibit-same-window' entry, the selected
+If ALIST has a non-nil 'inhibit-same-window' entry, the selected
 window is not eligible for reuse.
 
-If ALIST contains a `reusable-frames' entry, its value determines
+If ALIST contains a 'reusable-frames' entry, its value determines
 which frames to search for a reusable window:
   nil -- the selected frame (actually the last non-minibuffer frame)
   A frame   -- just that frame
-  `visible' -- all visible frames
+  'visible' -- all visible frames
   0   -- all frames on the current terminal
   t   -- all frames.
 
-If ALIST contains no `reusable-frames' entry, search just the
+If ALIST contains no 'reusable-frames' entry, search just the
 selected frame if `display-buffer-reuse-frames' and
 `pop-up-frames' are both nil; search all frames on the current
 terminal if either of those variables is non-nil.
 
-If ALIST has a non-nil `inhibit-switch-frame' entry, then in the
+If ALIST has a non-nil 'inhibit-switch-frame' entry, then in the
 event that a window on another frame is chosen, avoid raising
 that frame."
   (let* ((alist-entry (assq 'reusable-frames alist))
@@ -7364,9 +7365,21 @@ that frame."
         (window (if (and (eq buffer (window-buffer))
                          (not (cdr (assq 'inhibit-same-window alist))))
                     (selected-window)
-                  (car (delq (selected-window)
-                             (get-buffer-window-list buffer 'nomini
-                                                     frames))))))
+                   ;; Preferably use a window on the selected frame,
+                   ;; if such a window exists (Bug#36680).
+                   (let* ((windows (delq (selected-window)
+                                         (get-buffer-window-list
+                                          buffer 'nomini frames)))
+                          (first (car windows))
+                          (this-frame (selected-frame)))
+                     (cond
+                      ((eq (window-frame first) this-frame)
+                       first)
+                      ((catch 'found
+                         (dolist (next (cdr windows))
+                           (when (eq (window-frame next) this-frame)
+                             (throw 'found next)))))
+                      (t first))))))
     (when (window-live-p window)
       (prog1 (window--display-buffer buffer window 'reuse alist)
        (unless (cdr (assq 'inhibit-switch-frame alist))