*** empty log message ***
[gnus] / lisp / gnus-win.el
index 16fd475..ad0cc06 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)
+(require 'gnus)
 
-(defvar gnus-use-full-window t
-  "*If non-nil, use the entire Emacs screen.")
+(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 +64,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)
               (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)
@@ -197,11 +198,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 +225,7 @@ buffer configuration.")
                    (memq setting '(group summary article)))))
       setting
     (let* ((elem
-           (cond 
+           (cond
             ((eq setting 'group)
              (gnus-window-configuration-element
               '(group newsgroups ExitNewsgroup)))
@@ -378,7 +378,8 @@ buffer configuration.")
                  (split-window window (cadar comp-subs)
                                (eq type 'horizontal))))
          (setq result (or (gnus-configure-frame
-                           (car comp-subs) window) result))
+                           (car comp-subs) window)
+                          result))
          (select-window new-win)
          (setq window new-win)
          (setq comp-subs (cdr comp-subs))))
@@ -416,18 +417,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))
@@ -436,6 +430,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
@@ -474,7 +495,7 @@ should have point."
          (setq win (get-buffer-window buf t)))
        (if win
            (when (memq 'point split)
-               (setq all-visible win))
+             (setq all-visible win))
          (setq all-visible nil)))
        (t
        (when (eq type 'frame)
@@ -493,39 +514,35 @@ should have point."
       ;; Remove windows on all known Gnus buffers.
       (while buffers
        (setq buf (cdar buffers))
-       (if (symbolp buf)
-           (setq buf (and (boundp buf) (symbol-value buf))))
+       (when (symbolp buf)
+         (setq buf (and (boundp buf) (symbol-value buf))))
        (and buf
             (get-buffer-window buf)
             (progn
-              (setq bufs (cons buf bufs))
+              (push buf bufs)
               (pop-to-buffer buf)
-              (if (or (not lowest)
-                      (< (gnus-window-top-edge) lowest))
-                  (progn
-                    (setq lowest (gnus-window-top-edge))
-                    (setq lowest-buf buf)))))
+              (when (or (not lowest)
+                        (< (gnus-window-top-edge) lowest))
+                (setq lowest (gnus-window-top-edge))
+                (setq lowest-buf buf))))
        (setq buffers (cdr buffers)))
       ;; Remove windows on *all* summary buffers.
       (walk-windows
        (lambda (win)
         (let ((buf (window-buffer win)))
-          (if (string-match    "^\\*Summary" (buffer-name buf))
-              (progn
-                (setq bufs (cons buf bufs))
-                (pop-to-buffer buf)
-                (if (or (not lowest)
-                        (< (gnus-window-top-edge) lowest))
-                    (progn
-                      (setq lowest-buf buf)
-                      (setq lowest (gnus-window-top-edge)))))))))
-      (and lowest-buf
-          (progn
-            (pop-to-buffer lowest-buf)
-            (switch-to-buffer nntp-server-buffer)))
+          (when (string-match  "^\\*Summary" (buffer-name buf))
+            (push buf bufs)
+            (pop-to-buffer buf)
+            (when (or (not lowest)
+                      (< (gnus-window-top-edge) lowest))
+              (setq lowest-buf buf)
+              (setq lowest (gnus-window-top-edge)))))))
+      (when lowest-buf
+       (pop-to-buffer lowest-buf)
+       (switch-to-buffer nntp-server-buffer))
       (while bufs
-       (and (not (eq (car bufs) lowest-buf))
-            (delete-windows-on (car bufs)))
+       (when (not (eq (car bufs) lowest-buf))
+         (delete-windows-on (car bufs)))
        (setq bufs (cdr bufs))))))
 
 (provide 'gnus-win)