*** empty log message ***
[gnus] / lisp / gnus-win.el
index 9dd08d9..d66d0c5 100644 (file)
@@ -1,5 +1,5 @@
 ;;; gnus-win.el --- window configuration functions for Gnus
-;; Copyright (C) 1996 Free Software Foundation, Inc.
+;; Copyright (C) 1996,97 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
 ;; Keywords: news
 
 ;;; Code:
 
-(require 'gnus-load)
+(eval-when-compile (require 'cl))
 
-(defvar gnus-use-full-window t
-  "*If non-nil, use the entire Emacs screen.")
+(require 'gnus)
+
+(defgroup gnus-windows nil
+  "Window configuration."
+  :group 'gnus)
+
+(defcustom gnus-use-full-window t
+  "*If non-nil, use the entire Emacs screen."
+  :group 'gnus-windows
+  :type 'boolean)
 
 (defvar gnus-window-configuration nil
   "Obsolete variable.  See `gnus-buffer-configuration'.")
 
-(defvar gnus-window-min-width 2
-  "*Minimum width of Gnus buffers.")
+(defcustom gnus-window-min-width 2
+  "*Minimum width of Gnus buffers."
+  :group 'gnus-windows
+  :type 'integer)
 
-(defvar gnus-window-min-height 1
-  "*Minimum height of Gnus buffers.")
+(defcustom gnus-window-min-height 1
+  "*Minimum height of Gnus buffers."
+  :group 'gnus-windows
+  :type 'integer)
 
-(defvar gnus-always-force-window-configuration nil
-  "*If non-nil, always force the Gnus window configurations.")
+(defcustom gnus-always-force-window-configuration nil
+  "*If non-nil, always force the Gnus window configurations."
+  :group 'gnus-windows
+  :type 'boolean)
 
 (defvar gnus-buffer-configuration
   '((group
@@ -52,8 +66,9 @@
               (summary 1.0 point)
               (if gnus-carpal '(summary-carpal 4))))
     (article
-     (cond 
-      ((and gnus-use-picons (not (eq gnus-picons-display-where 'article)))
+     (cond
+      ((and gnus-use-picons
+           (eq gnus-picons-display-where 'picons))
        '(frame 1.0
               (vertical 1.0
                         (summary 0.25 point)
      (vertical 1.0
               (article 0.5)
               (message 1.0 point)))
-    (draft
-     (vertical 1.0
-              (draft 1.0 point)))
     (pipe
      (vertical 1.0
               (summary 0.25 point)
      (vertical 1.0
               (summary 0.5 point)
               ("*Score Words*" 1.0)))
+    (category
+     (vertical 1.0
+              (category 1.0)))
     (compose-bounce
      (vertical 1.0
               (article 0.5)
               (message 1.0 point))))
   "Window configuration for all possible Gnus buffers.
-This variable is a list of lists.  Each of these lists has a NAME and
-a RULE.         The NAMEs are commonsense names like `group', which names a
-rule used when displaying the group buffer; `summary', which names a
-rule for what happens when you enter a group and do not display an
-article buffer; and so on.  See the value of this variable for a
-complete list of NAMEs.
-
-Each RULE is a list of vectors.         The first element in this vector is
-the name of the buffer to be displayed; the second element is the
-percentage of the screen this buffer is to occupy (a number in the
-0.0-0.99 range); the optional third element is `point', which should
-be present to denote which buffer point is to go to after making this
-buffer configuration.")
+See the Gnus manual for an explanation of the syntax used.")
 
 (defvar gnus-window-to-buffer
   '((group . gnus-group-buffer)
@@ -181,7 +184,9 @@ buffer configuration.")
     (faq . gnus-faq-buffer)
     (picons . "*Picons*")
     (tree . gnus-tree-buffer)
+    (score-trace . "*Score Trace*")
     (info . gnus-info-buffer)
+    (category . gnus-category-buffer)
     (article-copy . gnus-article-copy)
     (draft . gnus-draft-buffer))
   "Mapping from short symbols to buffer names or buffer variables.")
@@ -197,11 +202,10 @@ buffer configuration.")
   "Kill all frames Gnus has created."
   (while gnus-created-frames
     (when (frame-live-p (car gnus-created-frames))
-      ;; We slap a condition-case around this `delete-frame' to ensure 
+      ;; We slap a condition-case around this `delete-frame' to ensure
       ;; against errors if we try do delete the single frame that's left.
-      (condition-case ()
-         (delete-frame (car gnus-created-frames))
-       (error nil)))
+      (ignore-errors
+       (delete-frame (car gnus-created-frames))))
     (pop gnus-created-frames)))
 
 (defun gnus-window-configuration-element (list)
@@ -225,7 +229,7 @@ buffer configuration.")
                    (memq setting '(group summary article)))))
       setting
     (let* ((elem
-           (cond 
+           (cond
             ((eq setting 'group)
              (gnus-window-configuration-element
               '(group newsgroups ExitNewsgroup)))
@@ -417,18 +421,11 @@ buffer configuration.")
                ;; We want to remove all other windows.
                (if (not gnus-frame-split-p)
                    ;; This is not a `frame' split, so we ignore the
-                   ;; other frames.  
+                   ;; other frames.
                    (delete-other-windows)
                  ;; This is a `frame' split, so we delete all windows
                  ;; on all frames.
-                 (mapcar 
-                  (lambda (frame)
-                    (unless (eq (cdr (assq 'minibuffer
-                                           (frame-parameters frame)))
-                                'only)
-                      (select-frame frame)
-                      (delete-other-windows)))
-                  (frame-list)))
+                 (gnus-delete-windows-in-gnusey-frames))
              ;; Just remove some windows.
              (gnus-remove-some-windows)
              (switch-to-buffer nntp-server-buffer))
@@ -437,6 +434,33 @@ buffer configuration.")
       (switch-to-buffer nntp-server-buffer)
       (gnus-configure-frame split (get-buffer-window (current-buffer))))))
 
+(defun gnus-delete-windows-in-gnusey-frames ()
+  "Do a `delete-other-windows' in all frames that have Gnus windows."
+  (let ((buffers
+        (mapcar
+         (lambda (elem)
+           (if (symbolp (cdr elem))
+               (when (and (boundp (cdr elem))
+                          (symbol-value (cdr elem)))
+                 (get-buffer (symbol-value (cdr elem))))
+             (when (cdr elem)
+               (get-buffer (cdr elem)))))
+         gnus-window-to-buffer)))
+    (mapcar
+     (lambda (frame)
+       (unless (eq (cdr (assq 'minibuffer
+                             (frame-parameters frame)))
+                  'only)
+        (select-frame frame)
+        (let (do-delete)
+          (walk-windows
+           (lambda (window)
+             (when (memq (window-buffer window) buffers)
+               (setq do-delete t))))
+          (when do-delete
+            (delete-other-windows)))))
+     (frame-list))))
+
 (defun gnus-all-windows-visible-p (split)
   "Say whether all buffers in SPLIT are currently visible.
 In particular, the value returned will be the window that