gnus-win.el (gnus-configure-frame): Spelling fix
[gnus] / lisp / gnus-win.el
index cd9ef74..efe2a31 100644 (file)
@@ -1,26 +1,24 @@
 ;;; gnus-win.el --- window configuration functions for Gnus
 ;;; gnus-win.el --- window configuration functions for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
-;;        Free Software Foundation, Inc.
+
+;; Copyright (C) 1996-2012 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
 
 ;; This file is part of GNU Emacs.
 
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
 ;; GNU General Public License for more details.
 
 ;; 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.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 
 ;;; Commentary:
 
@@ -40,9 +38,6 @@
   :group 'gnus-windows
   :type 'boolean)
 
   :group 'gnus-windows
   :type 'boolean)
 
-(defvar gnus-window-configuration nil
-  "Obsolete variable.  See `gnus-buffer-configuration'.")
-
 (defcustom gnus-window-min-width 2
   "*Minimum width of Gnus buffers."
   :group 'gnus-windows
 (defcustom gnus-window-min-width 2
   "*Minimum width of Gnus buffers."
   :group 'gnus-windows
   :type 'boolean)
 
 (defcustom gnus-use-frames-on-any-display nil
   :type 'boolean)
 
 (defcustom gnus-use-frames-on-any-display nil
-  "*If non-nil, frames on all displays will be considered useable by Gnus.
+  "*If non-nil, frames on all displays will be considered usable by Gnus.
 When nil, only frames on the same display as the selected frame will be
 used to display Gnus windows."
 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
   :group 'gnus-windows
   :type 'boolean)
 
 (defvar gnus-buffer-configuration
   '((group
      (vertical 1.0
-              (group 1.0 point)
-              (if gnus-carpal '(group-carpal 4))))
+              (group 1.0 point)))
     (summary
      (vertical 1.0
     (summary
      (vertical 1.0
-              (summary 1.0 point)
-              (if gnus-carpal '(summary-carpal 4))))
+              (summary 1.0 point)))
     (article
      (cond
       (gnus-use-trees
     (article
      (cond
       (gnus-use-trees
@@ -84,16 +78,13 @@ used to display Gnus windows."
       (t
        '(vertical 1.0
                  (summary 0.25 point)
       (t
        '(vertical 1.0
                  (summary 0.25 point)
-                 (if gnus-carpal '(summary-carpal 4))
                  (article 1.0)))))
     (server
      (vertical 1.0
                  (article 1.0)))))
     (server
      (vertical 1.0
-              (server 1.0 point)
-              (if gnus-carpal '(server-carpal 2))))
+              (server 1.0 point)))
     (browse
      (vertical 1.0
     (browse
      (vertical 1.0
-              (browse 1.0 point)
-              (if gnus-carpal '(browse-carpal 2))))
+              (browse 1.0 point)))
     (message
      (vertical 1.0
               (message 1.0 point)))
     (message
      (vertical 1.0
               (message 1.0 point)))
@@ -107,6 +98,9 @@ used to display Gnus windows."
      (vertical 1.0
               (summary 0.25)
               (faq 1.0 point)))
      (vertical 1.0
               (summary 0.25)
               (faq 1.0 point)))
+    (only-article
+     (vertical 1.0
+              (article 1.0 point)))
     (edit-article
      (vertical 1.0
               (article 1.0 point)))
     (edit-article
      (vertical 1.0
               (article 1.0 point)))
@@ -118,6 +112,10 @@ used to display Gnus windows."
      (vertical 1.0
               (summary 0.25)
               (edit-score 1.0 point)))
      (vertical 1.0
               (summary 0.25)
               (edit-score 1.0 point)))
+    (edit-server
+     (vertical 1.0
+              (server 0.5)
+              (edit-form 1.0 point)))
     (post
      (vertical 1.0
               (post 1.0 point)))
     (post
      (vertical 1.0
               (post 1.0 point)))
@@ -138,7 +136,6 @@ used to display Gnus windows."
     (pipe
      (vertical 1.0
               (summary 0.25 point)
     (pipe
      (vertical 1.0
               (summary 0.25 point)
-              (if gnus-carpal '(summary-carpal 4))
               ("*Shell Command Output*" 1.0)))
     (bug
      (vertical 1.0
               ("*Shell Command Output*" 1.0)))
     (bug
      (vertical 1.0
@@ -164,8 +161,12 @@ used to display Gnus windows."
               (article 0.5)
               (message 1.0 point)))
     (display-term
               (article 0.5)
               (message 1.0 point)))
     (display-term
-      (vertical 1.0
-               ("*display*" 1.0))))
+     (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.")
 
   "Window configuration for all possible Gnus buffers.
 See the Gnus manual for an explanation of the syntax used.")
 
@@ -178,10 +179,6 @@ See the Gnus manual for an explanation of the syntax used.")
     (edit-group . gnus-group-edit-buffer)
     (edit-form . gnus-edit-form-buffer)
     (edit-server . gnus-server-edit-buffer)
     (edit-group . gnus-group-edit-buffer)
     (edit-form . gnus-edit-form-buffer)
     (edit-server . gnus-server-edit-buffer)
-    (group-carpal . gnus-carpal-group-buffer)
-    (summary-carpal . gnus-carpal-summary-buffer)
-    (server-carpal . gnus-carpal-server-buffer)
-    (browse-carpal . gnus-carpal-browse-buffer)
     (edit-score . gnus-score-edit-buffer)
     (message . gnus-message-buffer)
     (mail . gnus-message-buffer)
     (edit-score . gnus-score-edit-buffer)
     (message . gnus-message-buffer)
     (mail . gnus-message-buffer)
@@ -193,11 +190,13 @@ See the Gnus manual for an explanation of the syntax used.")
     (info . gnus-info-buffer)
     (category . gnus-category-buffer)
     (article-copy . gnus-article-copy)
     (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."
   "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)
 
   :group 'gnus-windows
   :type 'hook)
 
@@ -219,56 +218,6 @@ See the Gnus manual for an explanation of the syntax used.")
        (delete-frame (car gnus-created-frames))))
     (pop gnus-created-frames)))
 
        (delete-frame (car gnus-created-frames))))
     (pop gnus-created-frames)))
 
-(defun gnus-window-configuration-element (list)
-  (while (and list
-             (not (assq (car list) gnus-window-configuration)))
-    (pop list))
-  (cadr (assq (car list) gnus-window-configuration)))
-
-(defun gnus-windows-old-to-new (setting)
-  ;; First we take care of the really, really old Gnus 3 actions.
-  (when (symbolp setting)
-    (setq setting
-         ;; Take care of ooold GNUS 3.x values.
-         (cond ((eq setting 'SelectArticle) 'article)
-               ((memq setting '(SelectNewsgroup SelectSubject ExpandSubject))
-                'summary)
-               ((memq setting '(ExitNewsgroup)) 'group)
-               (t setting))))
-  (if (or (listp setting)
-         (not (and gnus-window-configuration
-                   (memq setting '(group summary article)))))
-      setting
-    (let* ((elem
-           (cond
-            ((eq setting 'group)
-             (gnus-window-configuration-element
-              '(group newsgroups ExitNewsgroup)))
-            ((eq setting 'summary)
-             (gnus-window-configuration-element
-              '(summary SelectNewsgroup SelectSubject ExpandSubject)))
-            ((eq setting 'article)
-             (gnus-window-configuration-element
-              '(article SelectArticle)))))
-          (total (apply '+ elem))
-          (types '(group summary article))
-          (pbuf (if (eq setting 'newsgroups) 'group 'summary))
-          (i 0)
-          perc out)
-      (while (< i 3)
-       (or (not (numberp (nth i elem)))
-           (zerop (nth i elem))
-           (progn
-             (setq perc (if (= i 2)
-                            1.0
-                          (/ (float (nth i elem)) total)))
-             (push (if (eq pbuf (nth i types))
-                       (list (nth i types) perc 'point)
-                     (list (nth i types) perc))
-                   out)))
-       (incf i))
-      `(vertical 1.0 ,@(nreverse out)))))
-
 ;;;###autoload
 (defun gnus-add-configuration (conf)
   "Add the window configuration CONF to `gnus-buffer-configuration'."
 ;;;###autoload
 (defun gnus-add-configuration (conf)
   "Add the window configuration CONF to `gnus-buffer-configuration'."
@@ -290,22 +239,14 @@ See the Gnus manual for an explanation of the syntax used.")
 
 (defun gnus-configure-frame (split &optional window)
   "Split WINDOW according to SPLIT."
 
 (defun gnus-configure-frame (split &optional window)
   "Split WINDOW according to SPLIT."
-  (let ((current-window
-        (or (get-buffer-window (current-buffer)) (selected-window))))
-    (unless window
-      (setq window current-window))
+  (let* ((current-window (or (get-buffer-window (current-buffer))
+                             (selected-window)))
+         (window (or window current-window)))
     (select-window window)
     (select-window window)
-    ;; This might be an old-style buffer config.
-    (when (vectorp split)
-      (setq split (append split nil)))
-    (when (or (consp (car split))
-             (vectorp (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))
     ;; return a new SPLIT.
     (while (and (not (assq (car split) gnus-window-to-buffer))
-               (gnus-functionp (car split)))
+               (symbolp (car split)) (fboundp (car split)))
       (setq split (eval split)))
     (let* ((type (car split))
           (subs (cddr split))
       (setq split (eval split)))
     (let* ((type (car split))
           (subs (cddr split))
@@ -328,8 +269,22 @@ See the Gnus manual for an explanation of the syntax used.")
            (error "Invalid buffer type: %s" type))
          (let ((buf (gnus-get-buffer-create
                      (gnus-window-to-buffer-helper buffer))))
            (error "Invalid buffer type: %s" type))
          (let ((buf (gnus-get-buffer-create
                      (gnus-window-to-buffer-helper buffer))))
-           (if (eq buf (window-buffer (selected-window))) (set-buffer buf)
-             (switch-to-buffer buf)))
+           (when (buffer-name 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.
          (when (memq 'frame-focus split)
            (setq gnus-window-frame-focus window))
          ;; We return the window if it has the `point' spec.
@@ -368,7 +323,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))
          (while subs
            (setq sub (append (pop subs) nil))
            (while (and (not (assq (car sub) gnus-window-to-buffer))
-                       (gnus-functionp (car sub)))
+                       (symbolp (car sub)) (fboundp (car sub)))
              (setq sub (eval sub)))
            (when sub
              (push sub comp-subs)
              (setq sub (eval sub)))
            (when sub
              (push sub comp-subs)
@@ -398,9 +353,9 @@ See the Gnus manual for an explanation of the syntax used.")
          ;; fashion.
          (setq comp-subs (nreverse comp-subs))
          (while comp-subs
          ;; 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
                    (split-window window (cadar comp-subs)
                                  (eq type 'horizontal))))
            (setq result (or (gnus-configure-frame
@@ -416,59 +371,64 @@ See the Gnus manual for an explanation of the syntax used.")
 (defvar gnus-frame-split-p nil)
 
 (defun gnus-configure-windows (setting &optional force)
 (defvar gnus-frame-split-p nil)
 
 (defun gnus-configure-windows (setting &optional force)
-  (if (window-configuration-p setting)
-      (set-window-configuration setting)
+  (cond
+   ((null setting)
+    ;; Do nothing.
+    )
+   ((window-configuration-p setting)
+    (set-window-configuration setting))
+   (t
     (setq gnus-current-window-configuration setting)
     (setq force (or force gnus-always-force-window-configuration))
     (setq gnus-current-window-configuration setting)
     (setq force (or force gnus-always-force-window-configuration))
-    (setq setting (gnus-windows-old-to-new setting))
     (let ((split (if (symbolp setting)
     (let ((split (if (symbolp setting)
-                    (cadr (assq setting gnus-buffer-configuration))
-                  setting))
-         all-visible)
+                     (cadr (assq setting gnus-buffer-configuration))
+                   setting))
+          all-visible)
 
       (setq gnus-frame-split-p nil)
 
       (unless split
 
       (setq gnus-frame-split-p nil)
 
       (unless split
-       (error "No such setting in `gnus-buffer-configuration': %s" setting))
+        (error "No such setting in `gnus-buffer-configuration': %s" setting))
 
       (if (and (setq all-visible (gnus-all-windows-visible-p split))
 
       (if (and (setq all-visible (gnus-all-windows-visible-p split))
-              (not force))
-         ;; All the windows mentioned are already visible, so we just
-         ;; 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))
-
-       ;; Either remove all windows or just remove all Gnus windows.
-       (let ((frame (selected-frame)))
-         (unwind-protect
-             (if gnus-use-full-window
-                 ;; 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.
-                     (delete-other-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)
-               (if (featurep 'xemacs)
-                   (switch-to-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))
-         (gnus-configure-frame split)
-         (run-hooks 'gnus-configure-windows-hook)
-         (when gnus-window-frame-focus
-           (select-frame (window-frame gnus-window-frame-focus))))))))
+               (not force))
+          ;; All the windows mentioned are already visible, so we just
+          ;; 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))
+
+        ;; Either remove all windows or just remove all Gnus windows.
+        (let ((frame (selected-frame)))
+          (unwind-protect
+              (if gnus-use-full-window
+                  ;; 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.
+                      (delete-other-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)
+                (if (featurep 'xemacs)
+                    (switch-to-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))
+          (gnus-configure-frame split)
+          (run-hooks 'gnus-configure-windows-hook)
+          (when gnus-window-frame-focus
+            (gnus-select-frame-set-input-focus
+             (window-frame gnus-window-frame-focus)))))))))
 
 (defun gnus-delete-windows-in-gnusey-frames ()
   "Do a `delete-other-windows' in all frames that have Gnus windows."
 
 (defun gnus-delete-windows-in-gnusey-frames ()
   "Do a `delete-other-windows' in all frames that have Gnus windows."
@@ -497,17 +457,13 @@ should have point."
        type buffer win buf)
     (while (and (setq split (pop stack))
                all-visible)
        type buffer win buf)
     (while (and (setq split (pop stack))
                all-visible)
-      ;; Be backwards compatible.
-      (when (vectorp split)
-       (setq split (append split nil)))
-      (when (or (consp (car split))
-               (vectorp (car split)))
+      (when (consp (car split))
        (push 1.0 split)
        (push 'vertical 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))
       ;; return a new SPLIT.
       (while (and (not (assq (car split) gnus-window-to-buffer))
-                 (gnus-functionp (car split)))
+                 (symbolp (car split)) (fboundp (car split)))
        (setq split (eval split)))
 
       (setq type (elt split 0))
        (setq split (eval split)))
 
       (setq type (elt split 0))
@@ -521,6 +477,7 @@ should have point."
        (unless buffer
          (error "Invalid buffer type: %s" type))
        (if (and (setq buf (get-buffer (gnus-window-to-buffer-helper buffer)))
        (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))
                 (setq win (gnus-get-buffer-window buf t)))
            (if (memq 'point split)
                (setq all-visible win))
@@ -533,6 +490,7 @@ should have point."
       all-visible)))
 
 (defun gnus-window-top-edge (&optional window)
       all-visible)))
 
 (defun gnus-window-top-edge (&optional window)
+  "Return the top coordinate of WINDOW."
   (nth 1 (window-edges window)))
 
 (defun gnus-remove-some-windows ()
   (nth 1 (window-edges window)))
 
 (defun gnus-remove-some-windows ()
@@ -571,7 +529,7 @@ should have point."
              (memq frame '(t 0 visible)))
         (car
          (let ((frames (gnus-frames-on-display-list)))
              (memq frame '(t 0 visible)))
         (car
          (let ((frames (gnus-frames-on-display-list)))
-           (gnus-delete-if (lambda (win) (not (memq (window-frame win)
+           (gnus-remove-if (lambda (win) (not (memq (window-frame win)
                                                     frames)))
                            (get-buffer-window-list buffer nil frame)))))
        (t
                                                     frames)))
                            (get-buffer-window-list buffer nil frame)))))
        (t