]> code.delx.au - gnu-emacs/commitdiff
Add display-buffer action display-buffer-use-some-frame
authorStephen Leake <stephen_leake@stephe-leake.org>
Wed, 29 Jul 2015 23:30:36 +0000 (18:30 -0500)
committerStephen Leake <stephen_leake@stephe-leake.org>
Wed, 29 Jul 2015 23:30:36 +0000 (18:30 -0500)
* lisp/window.el (display-buffer-use-some-frame): new

lisp/window.el

index f15dd9b735518aea4242d7bb65687b08d5872ea7..986c55380d02241cf8eaec2b4a8f441dda09dea3 100644 (file)
@@ -6488,6 +6488,39 @@ its documentation for additional customization information."
 
 ;;; `display-buffer' action functions:
 
+(defun display-buffer-use-some-frame (buffer alist)
+  "Display BUFFER in an existing frame other than the current frame.
+If successful, return the window used; otherwise return nil.
+
+If ALIST has a non-nil `inhibit-switch-frame' entry, avoid
+raising the frame.
+
+If ALIST has a non-nil `pop-up-frame-parameters' entry, the
+corresponding value is an alist of frame parameters to give the
+new frame.
+
+If ALIST has a non-nil `frame-predicate' entry, the corresponding
+value is a function taking one argument (a frame), returning
+non-nil if the frame is a candidate."
+  (let* ((predicate (or (cdr (assoc 'frame-predicate alist))
+                        (lambda (frame)
+                          (and
+                           (not (eq frame (selected-frame)))
+                           (not (window-dedicated-p
+                                 (or
+                                  (get-lru-window frame)
+                                  (frame-first-window frame)))))
+                          )))
+         (frame (car (filtered-frame-list predicate)))
+         (window (and frame (get-lru-window frame))))
+    (when window
+      (prog1
+          (window--display-buffer
+           buffer window 'frame alist display-buffer-mark-dedicated)
+        (unless (cdr (assq 'inhibit-switch-frame alist))
+          (window--maybe-raise-frame frame))))
+    ))
+
 (defun display-buffer-same-window (buffer alist)
   "Display BUFFER in the selected window.
 This fails if ALIST has a non-nil `inhibit-same-window' entry, or