emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 4961cc3: In `pop-to-buffer' handle case where `disp


From: Martin Rudalics
Subject: [Emacs-diffs] master 4961cc3: In `pop-to-buffer' handle case where `display-buffer' fails (Bug#24332)
Date: Tue, 30 Aug 2016 10:31:16 +0000 (UTC)

branch: master
commit 4961cc3f368d9114c305efe6243987bcfa3fd29b
Author: Martin Rudalics <address@hidden>
Commit: Martin Rudalics <address@hidden>

    In `pop-to-buffer' handle case where `display-buffer' fails (Bug#24332)
    
    * lisp/window.el (pop-to-buffer): Don't assume that
    `display-buffer' has supplied a window (Bug#24332).
    Rename BUFFER argument to BUFFER-OR-NAME.
    * doc/lispref/windows.texi (Switching Buffers): Fix
    `pop-to-buffer' documentation.
---
 doc/lispref/windows.texi |    6 +++---
 lisp/window.el           |   47 +++++++++++++++++++++++++---------------------
 2 files changed, 29 insertions(+), 24 deletions(-)

diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index 36bccdd..3c9df0b 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -2233,15 +2233,15 @@ This function makes @var{buffer-or-name} the current 
buffer and
 displays it in some window, preferably not the window currently
 selected.  It then selects the displaying window.  If that window is
 on a different graphical frame, that frame is given input focus if
-possible (@pxref{Input Focus}).  The return value is the buffer that
-was switched to.
+possible (@pxref{Input Focus}).
 
 If @var{buffer-or-name} is @code{nil}, it defaults to the buffer
 returned by @code{other-buffer} (@pxref{Buffer List}).  If
 @var{buffer-or-name} is a string that is not the name of any existing
 buffer, this function creates a new buffer with that name; the new
 buffer's major mode is determined by the variable @code{major-mode}
-(@pxref{Major Modes}).
+(@pxref{Major Modes}).  In any case, that buffer is made current and
+returned, even when no suitable window was found to display it.
 
 If @var{action} is address@hidden, it should be a display action to
 pass to @code{display-buffer} (@pxref{Choosing Window}).
diff --git a/lisp/window.el b/lisp/window.el
index cfa10ea..6728ea3 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -6692,8 +6692,7 @@ that allows the selected frame)."
           (window--display-buffer
            buffer window 'frame alist display-buffer-mark-dedicated)
         (unless (cdr (assq 'inhibit-switch-frame alist))
-          (window--maybe-raise-frame frame))))
-    ))
+          (window--maybe-raise-frame frame))))))
 
 (defun display-buffer-same-window (buffer alist)
   "Display BUFFER in the selected window.
@@ -7074,12 +7073,12 @@ returned from `display-buffer' in this case."
     'fail))
 
 ;;; Display + selection commands:
-(defun pop-to-buffer (buffer &optional action norecord)
-  "Select buffer BUFFER in some window, preferably a different one.
-BUFFER may be a buffer, a string (a buffer name), or nil.  If it
-is a string not naming an existent buffer, create a buffer with
-that name.  If BUFFER is nil, choose some other buffer.  Return
-the buffer.
+(defun pop-to-buffer (buffer-or-name &optional action norecord)
+  "Display buffer specified by BUFFER-OR-NAME and select its window.
+BUFFER-OR-NAME may be a buffer, a string (a buffer name), or nil.
+If it is a string not naming an existent buffer, create a buffer
+with that name.  If BUFFER-OR-NAME is nil, choose some other
+buffer.  In either case, make that buffer current and return it.
 
 This uses `display-buffer' as a subroutine.  The optional ACTION
 argument is passed to `display-buffer' as its ACTION argument.
@@ -7088,24 +7087,30 @@ interactively with a prefix argument, which means to 
pop to a
 window other than the selected one even if the buffer is already
 displayed in the selected window.
 
-If the window to show BUFFER is not on the selected
-frame, raise that window's frame and give it input focus.
+If a suitable window is found, select that window.  If it is not
+on the selected frame, raise that window's frame and give it
+input focus.
 
 Optional third arg NORECORD non-nil means do not put this buffer
 at the front of the list of recently selected ones."
   (interactive (list (read-buffer "Pop to buffer: " (other-buffer))
                     (if current-prefix-arg t)))
-  (setq buffer (window-normalize-buffer-to-switch-to buffer))
-  ;; This should be done by `select-window' below.
-  ;; (set-buffer buffer)
-  (let* ((old-frame (selected-frame))
-        (window (display-buffer buffer action))
-        (frame (window-frame window)))
-    ;; If we chose another frame, make sure it gets input focus.
-    (unless (eq frame old-frame)
-      (select-frame-set-input-focus frame norecord))
-    ;; Make sure new window is selected (Bug#8615), (Bug#6954).
-    (select-window window norecord)
+  (let* ((buffer (window-normalize-buffer-to-switch-to buffer-or-name))
+         (old-frame (selected-frame))
+        (window (display-buffer buffer action)))
+    ;; Don't assume that `display-buffer' has supplied us with a window
+    ;; (Bug#24332).
+    (if window
+        (let ((frame (window-frame window)))
+          ;; If we chose another frame, make sure it gets input focus.
+          (unless (eq frame old-frame)
+            (select-frame-set-input-focus frame norecord))
+          ;; Make sure the window is selected (Bug#8615), (Bug#6954)
+          (select-window window norecord))
+      ;; If `display-buffer' failed to supply a window, just make the
+      ;; buffer current.
+      (set-buffer buffer))
+    ;; Return BUFFER even when we got no window.
     buffer))
 
 (defun pop-to-buffer-same-window (buffer &optional norecord)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]