(mml2015-epg-sign): Save the signing keys in
[gnus] / lisp / gnus-win.el
index f11f302..84c726d 100644 (file)
@@ -1,6 +1,7 @@
 ;;; gnus-win.el --- window configuration functions for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000
-;;        Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;;   2005, 2006 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
@@ -19,8 +20,8 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
 
@@ -29,6 +30,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."
+  :version "22.1"
+  :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
               ("*Shell Command Output*" 1.0)))
     (bug
      (vertical 1.0
-              ("*Gnus Help Bug*" 0.5)
+              (if gnus-bug-create-help-buffer '("*Gnus Help Bug*" 0.5))
               ("*Gnus Bug*" 1.0 point)))
     (score-trace
      (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)))
+    (mml-preview
+     (vertical 1.0
+              (message 0.5)
+              (mml-preview 1.0 point))))
   "Window configuration for all possible Gnus buffers.
 See the Gnus manual for an explanation of the syntax used.")
 
@@ -187,16 +193,22 @@ 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*")
     (info . gnus-info-buffer)
     (category . gnus-category-buffer)
     (article-copy . gnus-article-copy)
-    (draft . gnus-draft-buffer))
+    (draft . gnus-draft-buffer)
+    (mml-preview . mml-preview-buffer))
   "Mapping from short symbols to buffer names or buffer variables.")
 
+(defcustom gnus-configure-windows-hook nil
+  "*A hook called when configuring windows."
+  :version "22.1"
+  :group 'gnus-windows
+  :type 'hook)
+
 ;;; Internal variables.
 
 (defvar gnus-current-window-configuration nil
@@ -291,7 +303,7 @@ See the Gnus manual for an explanation of the syntax used.")
     (unless window
       (setq window current-window))
     (select-window window)
-    ;; This might be an old-stylee buffer config.
+    ;; This might be an old-style buffer config.
     (when (vectorp split)
       (setq split (append split nil)))
     (when (or (consp (car split))
@@ -301,7 +313,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))
@@ -330,7 +342,7 @@ See the Gnus manual for an explanation of the syntax used.")
            (setq gnus-window-frame-focus window))
          ;; We return the window if it has the `point' spec.
          (and (memq 'point split) window)))
-     ;; This is a frame split.
+       ;; This is a frame split.
        ((eq type 'frame)
        (unless gnus-frame-list
          (setq gnus-frame-list (list (window-frame current-window))))
@@ -339,7 +351,7 @@ See the Gnus manual for an explanation of the syntax used.")
          (while (< i (length subs))
            ;; Frame parameter is gotten from the sub-split.
            (setq params (cadr (elt subs i)))
-         ;; It should be a list.
+           ;; It should be a list.
            (unless (listp params)
              (setq params nil))
            ;; Create a new frame?
@@ -348,15 +360,15 @@ See the Gnus manual for an explanation of the syntax used.")
              (push frame gnus-created-frames))
            ;; Is the old frame still alive?
            (unless (frame-live-p frame)
-           (setcar (nthcdr i gnus-frame-list)
-                   (setq frame (make-frame params))))
+             (setcar (nthcdr i gnus-frame-list)
+                     (setq frame (make-frame params))))
            ;; Select the frame in question and do more splits there.
            (select-frame frame)
            (setq fresult (or (gnus-configure-frame (elt subs i)) fresult))
            (incf i))
          ;; Select the frame that has the selected buffer.
          (when fresult
-         (select-frame (window-frame fresult)))))
+           (select-frame (window-frame fresult)))))
        ;; This is a normal split.
        (t
        (when (> (length subs) 0)
@@ -364,7 +376,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)
@@ -379,14 +391,14 @@ See the Gnus manual for an explanation of the syntax used.")
                    (t
                     (error "Invalid size: %s" size)))
              ;; Try to make sure that we are inside the safe limits.
-           (cond ((zerop s))
-                 ((eq type 'horizontal)
-                  (setq s (max s window-min-width)))
-                 ((eq type 'vertical)
-                  (setq s (max s window-min-height))))
-           (setcar (cdar comp-subs) s)
-           (incf total s)))
-       ;; Take care of the "1.0" spec.
+             (cond ((zerop s))
+                   ((eq type 'horizontal)
+                    (setq s (max s window-min-width)))
+                   ((eq type 'vertical)
+                    (setq s (max s window-min-height))))
+             (setcar (cdar comp-subs) s)
+             (incf total s)))
+         ;; Take care of the "1.0" spec.
          (if rest
              (setcar (cdr rest) (- len total))
            (error "No 1.0 specs in %s" split))
@@ -396,9 +408,9 @@ See the Gnus manual for an explanation of the syntax used.")
          (while comp-subs
            (if (null (cdr comp-subs))
                (setq new-win window)
-           (setq new-win
-                 (split-window window (cadar comp-subs)
-                               (eq type 'horizontal))))
+             (setq new-win
+                   (split-window window (cadar comp-subs)
+                                 (eq type 'horizontal))))
            (setq result (or (gnus-configure-frame
                              (car comp-subs) window)
                             result))
@@ -433,7 +445,7 @@ See the Gnus manual for an explanation of the syntax used.")
          ;; put point in the assigned buffer, and do not touch the
          ;; winconf.
          (select-window all-visible)
-       
+
        ;; Make sure "the other" buffer, nntp-server-buffer, is live.
        (unless (gnus-buffer-live-p nntp-server-buffer)
          (nnheader-init-server-buffer))
@@ -447,17 +459,22 @@ 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.
                (gnus-remove-some-windows)
-               (set-buffer nntp-server-buffer))
+               (if (featurep 'xemacs)
+                   (switch-to-buffer nntp-server-buffer)
+                 (set-buffer nntp-server-buffer)))
            (select-frame frame)))
 
        (let (gnus-window-frame-focus)
-         (set-buffer nntp-server-buffer)
+         (if (featurep 'xemacs)
+             (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))))))))
 
@@ -498,7 +515,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))
@@ -512,7 +529,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 t)))
+                (setq win (gnus-get-buffer-window buf t)))
            (if (memq 'point split)
                (setq all-visible win))
          (setq all-visible nil)))
@@ -541,9 +558,34 @@ should have point."
                  lowest-buf buf))))
       (when lowest-buf
        (pop-to-buffer lowest-buf)
-       (set-buffer nntp-server-buffer))
-      (mapcar (lambda (b) (delete-windows-on b t)) bufs))))
+       (if (featurep 'xemacs)
+           (switch-to-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)))
+           (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)
 
+;;; arch-tag: ccd5a394-2ddf-4397-b8f8-6d80d3e46e2b
 ;;; gnus-win.el ends here