Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
[bpt/emacs.git] / lisp / gnus / gnus-win.el
index 4d0c18a..8de4673 100644 (file)
@@ -1,5 +1,5 @@
 ;;; gnus-win.el --- window configuration functions for Gnus
-;; Copyright (C) 1996, 97, 98, 1999, 2000, 02, 2004
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
@@ -29,6 +29,7 @@
 (eval-when-compile (require 'cl))
 
 (require 'gnus)
+(require 'gnus-util)
 
 (defgroup gnus-windows nil
   "Window configuration."
   :group 'gnus-windows
   :type 'boolean)
 
+(defcustom gnus-use-frames-on-any-display nil
+  "*If non-nil, frames on all displays will be considered useable by Gnus.
+When nil, only frames on the same display as the selected frame will be
+used to display Gnus windows."
+  :group 'gnus-windows
+  :type 'boolean)
+
 (defvar gnus-buffer-configuration
   '((group
      (vertical 1.0
               (if gnus-carpal '(summary-carpal 4))))
     (article
      (cond
-      ((and gnus-use-picons
-           (eq gnus-picons-display-where 'picons))
-       '(frame 1.0
-              (vertical 1.0
-                        (summary 0.25 point)
-                        (if gnus-carpal '(summary-carpal 4))
-                        (article 1.0))
-              (vertical ((height . 5) (width . 15)
-                         (user-position . t)
-                         (left . -1) (top . 1))
-                        (picons 1.0))))
       (gnus-use-trees
        '(vertical 1.0
                  (summary 0.25 point)
               (post 1.0 point)))
     (reply
      (vertical 1.0
-              (article-copy 0.5)
+              (article 0.5)
               (message 1.0 point)))
     (forward
      (vertical 1.0
     (compose-bounce
      (vertical 1.0
               (article 0.5)
-              (message 1.0 point))))
+              (message 1.0 point)))
+    (display-term
+      (vertical 1.0
+               ("*display*" 1.0))))
   "Window configuration for all possible Gnus buffers.
 See the Gnus manual for an explanation of the syntax used.")
 
@@ -187,7 +187,6 @@ See the Gnus manual for an explanation of the syntax used.")
     (mail . gnus-message-buffer)
     (post-news . gnus-message-buffer)
     (faq . gnus-faq-buffer)
-    (picons . gnus-picons-buffer-name)
     (tree . gnus-tree-buffer)
     (score-trace . "*Score Trace*")
     (split-trace . "*Split Trace*")
@@ -197,6 +196,11 @@ See the Gnus manual for an explanation of the syntax used.")
     (draft . gnus-draft-buffer))
   "Mapping from short symbols to buffer names or buffer variables.")
 
+(defcustom gnus-configure-windows-hook nil
+  "*A hook called when configuring windows."
+  :group 'gnus-windows
+  :type 'hook)
+
 ;;; Internal variables.
 
 (defvar gnus-current-window-configuration nil
@@ -301,7 +305,7 @@ See the Gnus manual for an explanation of the syntax used.")
     ;; The SPLIT might be something that is to be evaled to
     ;; return a new SPLIT.
     (while (and (not (assq (car split) gnus-window-to-buffer))
-               (gnus-functionp (car split)))
+               (functionp (car split)))
       (setq split (eval split)))
     (let* ((type (car split))
           (subs (cddr split))
@@ -364,7 +368,7 @@ See the Gnus manual for an explanation of the syntax used.")
          (while subs
            (setq sub (append (pop subs) nil))
            (while (and (not (assq (car sub) gnus-window-to-buffer))
-                       (gnus-functionp (car sub)))
+                       (functionp (car sub)))
              (setq sub (eval sub)))
            (when sub
              (push sub comp-subs)
@@ -447,7 +451,7 @@ See the Gnus manual for an explanation of the syntax used.")
                      ;; This is not a `frame' split, so we ignore the
                      ;; other frames.
                      (delete-other-windows)
-                   ;; This is a `frame' split, so we delete all windows
+                 ;; This is a `frame' split, so we delete all windows
                    ;; on all frames.
                    (gnus-delete-windows-in-gnusey-frames))
                ;; Just remove some windows.
@@ -462,6 +466,7 @@ See the Gnus manual for an explanation of the syntax used.")
              (switch-to-buffer nntp-server-buffer)
            (set-buffer nntp-server-buffer))
          (gnus-configure-frame split)
+         (run-hooks 'gnus-configure-windows-hook)
          (when gnus-window-frame-focus
            (select-frame (window-frame gnus-window-frame-focus))))))))
 
@@ -502,7 +507,7 @@ should have point."
       ;; The SPLIT might be something that is to be evaled to
       ;; return a new SPLIT.
       (while (and (not (assq (car split) gnus-window-to-buffer))
-                 (gnus-functionp (car split)))
+                 (functionp (car split)))
        (setq split (eval split)))
 
       (setq type (elt split 0))
@@ -516,7 +521,7 @@ should have point."
        (unless buffer
          (error "Invalid buffer type: %s" type))
        (if (and (setq buf (get-buffer (gnus-window-to-buffer-helper buffer)))
-                (setq win (get-buffer-window buf 0)))
+                (setq win (gnus-get-buffer-window buf t)))
            (if (memq 'point split)
                (setq all-visible win))
          (setq all-visible nil)))
@@ -548,7 +553,29 @@ should have point."
        (if (featurep 'xemacs)
            (switch-to-buffer nntp-server-buffer)
          (set-buffer nntp-server-buffer)))
-      (mapcar (lambda (b) (delete-windows-on b t)) bufs))))
+      (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)))
+           (gnus-remove-if (lambda (win) (not (memq (window-frame win)
+                                                    frames)))
+                           (get-buffer-window-list buffer nil frame)))))
+       (t
+        (get-buffer-window buffer frame))))
 
 (provide 'gnus-win)