]> code.delx.au - gnu-emacs/blobdiff - lisp/gnus/gnus-win.el
; Merge from origin/emacs-25
[gnu-emacs] / lisp / gnus / gnus-win.el
index ecd5b3b525b4e454783cb98bb109ce7b59fb7cd8..9c950a9e3e969e46b345aa3a31db6fc77f1f13b2 100644 (file)
@@ -1,6 +1,6 @@
 ;;; gnus-win.el --- window configuration functions for Gnus
 
-;; Copyright (C) 1996-2011 Free Software Foundation, Inc.
+;; Copyright (C) 1996-2016 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
@@ -239,10 +239,11 @@ See the Gnus manual for an explanation of the syntax used.")
 
 (defun gnus-configure-frame (split &optional window)
   "Split WINDOW according to SPLIT."
-  (let* ((current-window (or (get-buffer-window (current-buffer)) (selected-window)))
+  (let* ((current-window (or (get-buffer-window (current-buffer))
+                             (selected-window)))
          (window (or window current-window)))
     (select-window window)
-    ;; The SPLIT might be something that is to be evaled to
+    ;; The SPLIT might be something that is to be evalled to
     ;; return a new SPLIT.
     (while (and (not (assq (car split) gnus-window-to-buffer))
                (symbolp (car split)) (fboundp (car split)))
@@ -269,9 +270,21 @@ See the Gnus manual for an explanation of the syntax used.")
          (let ((buf (gnus-get-buffer-create
                      (gnus-window-to-buffer-helper buffer))))
            (when (buffer-name buf)
-             (if (eq buf (window-buffer (selected-window)))
-                 (set-buffer buf)
-               (switch-to-buffer buf))))
+             (cond
+               ((eq buf (window-buffer (selected-window)))
+                (set-buffer buf))
+               ((eq t (window-dedicated-p))
+                ;; If the window is hard-dedicated, we have a problem because
+                ;; we just can't do what we're asked.  But signaling an error,
+                ;; like `switch-to-buffer' would do, is not an option because
+                ;; it would prevent things like "^" (to jump to the *Servers*)
+                ;; in a dedicated *Group*.
+                ;; FIXME: Maybe a better/additional fix would be to change
+                ;; gnus-configure-windows so that when called
+                ;; from a hard-dedicated frame, it creates (and
+                ;; configures) a new frame, leaving the dedicated frame alone.
+                (pop-to-buffer buf))
+               (t (switch-to-buffer buf)))))
          (when (memq 'frame-focus split)
            (setq gnus-window-frame-focus window))
          ;; We return the window if it has the `point' spec.
@@ -340,9 +353,9 @@ See the Gnus manual for an explanation of the syntax used.")
          ;; fashion.
          (setq comp-subs (nreverse comp-subs))
          (while comp-subs
-           (if (null (cdr comp-subs))
-               (setq new-win window)
-             (setq new-win
+           (setq new-win
+                  (if (null (cdr comp-subs))
+                      window
                    (split-window window (cadar comp-subs)
                                  (eq type 'horizontal))))
            (setq result (or (gnus-configure-frame
@@ -402,19 +415,15 @@ See the Gnus manual for an explanation of the syntax used.")
                     (gnus-delete-windows-in-gnusey-frames))
                 ;; Just remove some windows.
                 (gnus-remove-some-windows)
-                (if (featurep 'xemacs)
-                    (switch-to-buffer nntp-server-buffer)
-                  (set-buffer nntp-server-buffer)))
+                (set-buffer nntp-server-buffer))
             (select-frame frame)))
 
         (let (gnus-window-frame-focus)
-          (if (featurep 'xemacs)
-              (switch-to-buffer nntp-server-buffer)
-            (set-buffer nntp-server-buffer))
+          (set-buffer nntp-server-buffer)
           (gnus-configure-frame split)
           (run-hooks 'gnus-configure-windows-hook)
           (when gnus-window-frame-focus
-            (gnus-select-frame-set-input-focus
+            (select-frame-set-input-focus
              (window-frame gnus-window-frame-focus)))))))))
 
 (defun gnus-delete-windows-in-gnusey-frames ()
@@ -447,7 +456,7 @@ should have point."
       (when (consp (car split))
        (push 1.0 split)
        (push 'vertical split))
-      ;; The SPLIT might be something that is to be evaled to
+      ;; The SPLIT might be something that is to be evalled to
       ;; return a new SPLIT.
       (while (and (not (assq (car split) gnus-window-to-buffer))
                  (symbolp (car split)) (fboundp (car split)))
@@ -464,6 +473,7 @@ should have point."
        (unless buffer
          (error "Invalid buffer type: %s" type))
        (if (and (setq buf (get-buffer (gnus-window-to-buffer-helper buffer)))
+                (buffer-live-p buf)
                 (setq win (gnus-get-buffer-window buf t)))
            (if (memq 'point split)
                (setq all-visible win))
@@ -494,27 +504,15 @@ should have point."
                  lowest-buf buf))))
       (when lowest-buf
        (pop-to-buffer lowest-buf)
-       (if (featurep 'xemacs)
-           (switch-to-buffer nntp-server-buffer)
-         (set-buffer nntp-server-buffer)))
+       (set-buffer nntp-server-buffer))
       (mapcar (lambda (b) (delete-windows-on b t))
              (delq lowest-buf bufs)))))
 
-(eval-and-compile
-  (cond
-   ((fboundp 'frames-on-display-list)
-    (defalias 'gnus-frames-on-display-list 'frames-on-display-list))
-   ((and (featurep 'xemacs) (fboundp 'frame-device))
-    (defun gnus-frames-on-display-list ()
-      (apply 'filtered-frame-list 'identity (list (frame-device nil)))))
-   (t
-    (defalias 'gnus-frames-on-display-list 'frame-list))))
-
 (defun gnus-get-buffer-window (buffer &optional frame)
   (cond ((and (null gnus-use-frames-on-any-display)
              (memq frame '(t 0 visible)))
         (car
-         (let ((frames (gnus-frames-on-display-list)))
+         (let ((frames (frames-on-display-list)))
            (gnus-remove-if (lambda (win) (not (memq (window-frame win)
                                                     frames)))
                            (get-buffer-window-list buffer nil frame)))))