1 ;;; gnus-xmas.el --- Gnus functions for XEmacs
3 ;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005
4 ;; Free Software Foundation, Inc.
6 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
9 ;; This file is part of GNU Emacs.
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 2, or (at your option)
16 ;; GNU Emacs is distributed in the hope that it will be useful,
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 ;; GNU General Public License for more details.
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 ;; Boston, MA 02110-1301, USA.
31 (autoload 'gnus-active "gnus" nil nil 'macro)
32 (autoload 'gnus-group-entry "gnus" nil nil 'macro)
33 (autoload 'gnus-info-level "gnus" nil nil 'macro)
34 (autoload 'gnus-info-marks "gnus" nil nil 'macro)
35 (autoload 'gnus-info-method "gnus" nil nil 'macro)
36 (autoload 'gnus-info-score "gnus" nil nil 'macro))
39 (defvar menu-bar-mode (featurep 'menubar))
40 (require 'messagexmas)
42 (require 'timer-funcs)
44 (defgroup gnus-xmas nil
45 "XEmacsoid support for Gnus"
48 (defcustom gnus-xmas-glyph-directory nil
49 "Directory where Gnus logos and icons are located.
50 If this variable is nil, Gnus will try to locate the directory
52 :type '(choice (const :tag "autodetect" nil)
56 (unless gnus-xmas-glyph-directory
57 (unless (setq gnus-xmas-glyph-directory
58 (message-xmas-find-glyph-directory "gnus"))
59 (error "Can't find glyph directory. \
60 Possibly the `etc' directory has not been installed.")))
62 ;;; Internal variables.
64 ;; Don't warn about these undefined variables.
67 (defvar gnus-active-hashtb)
68 (defvar gnus-article-buffer)
69 (defvar gnus-auto-center-summary)
70 (defvar gnus-current-headers)
71 (defvar gnus-level-killed)
72 (defvar gnus-level-zombie)
73 (defvar gnus-newsgroup-bookmarks)
74 (defvar gnus-newsgroup-dependencies)
75 (defvar gnus-newsgroup-selected-overlay)
76 (defvar gnus-newsrc-hashtb)
77 (defvar gnus-read-mark)
78 (defvar gnus-refer-article-method)
79 (defvar gnus-reffed-article-number)
80 (defvar gnus-unread-mark)
82 (defvar gnus-view-pseudos)
83 (defvar gnus-view-pseudos-separately)
85 (defvar gnus-zombie-list)
86 ;;defined in gnus-msg.el
87 (defvar gnus-article-copy)
88 (defvar gnus-check-before-posting)
89 ;;defined in gnus-vis.el
90 (defvar gnus-article-button-face)
91 (defvar gnus-article-mouse-face)
92 (defvar gnus-summary-selected-face)
93 (defvar gnus-group-reading-menu)
94 (defvar gnus-group-group-menu)
95 (defvar gnus-group-misc-menu)
96 (defvar gnus-summary-article-menu)
97 (defvar gnus-summary-thread-menu)
98 (defvar gnus-summary-misc-menu)
99 (defvar gnus-summary-post-menu)
100 (defvar gnus-summary-kill-menu)
101 (defvar gnus-article-article-menu)
102 (defvar gnus-article-treatment-menu)
103 (defvar gnus-mouse-2)
104 (defvar standard-display-table)
105 (defvar gnus-tree-minimize-window)
107 (defun gnus-xmas-highlight-selected-summary ()
108 ;; Highlight selected article in summary buffer
109 (when gnus-summary-selected-face
110 (when gnus-newsgroup-selected-overlay
111 (delete-extent gnus-newsgroup-selected-overlay))
112 (setq gnus-newsgroup-selected-overlay
113 (make-extent (point-at-bol) (point-at-eol)))
114 (set-extent-face gnus-newsgroup-selected-overlay
115 gnus-summary-selected-face)))
117 (defcustom gnus-xmas-force-redisplay nil
118 "*If non-nil, force a redisplay before recentering the summary buffer.
119 This is ugly, but it works around a bug in `window-displayed-height'."
123 (defun gnus-xmas-switch-horizontal-scrollbar-off ()
124 (when (featurep 'scrollbar)
125 (set-specifier scrollbar-height (cons (current-buffer) 0))))
127 (defun gnus-xmas-summary-recenter ()
128 "\"Center\" point in the summary window.
129 If `gnus-auto-center-summary' is nil, or the article buffer isn't
130 displayed, no centering will be performed."
131 ;; Suggested by earle@mahendo.JPL.NASA.GOV (Greg Earle).
132 ;; Recenter only when requested. Suggested by popovich@park.cs.columbia.edu.
133 ;; Force redisplay to get properly computed window height.
134 (when gnus-xmas-force-redisplay
136 (when gnus-auto-center-summary
137 (let* ((height (if (fboundp 'window-displayed-height)
138 (window-displayed-height)
139 (- (window-height) 2)))
140 (top (cond ((< height 4) 0)
142 (t (if (numberp gnus-auto-center-summary)
143 gnus-auto-center-summary
145 (bottom (save-excursion (goto-char (point-max))
146 (forward-line (- height))
148 (window (get-buffer-window (current-buffer))))
149 (when (get-buffer-window gnus-article-buffer)
150 ;; Only do recentering when the article buffer is displayed,
151 ;; Set the window start to either `bottom', which is the biggest
152 ;; possible valid number, or the second line from the top,
153 ;; whichever is the least.
154 ;; NOFORCE parameter suggested by Daniel Pittman <daniel@danann.net>.
156 window (min bottom (save-excursion (forward-line (- top)) (point)))
158 ;; Do horizontal recentering while we're at it.
159 (when (and (get-buffer-window (current-buffer) t)
160 (not (eq gnus-auto-center-summary 'vertical)))
161 (let ((selected (selected-window)))
162 (select-window (get-buffer-window (current-buffer) t))
163 (gnus-summary-position-point)
164 (gnus-horizontal-recenter)
165 (select-window selected))))))
167 (defun gnus-xmas-summary-set-display-table ()
168 ;; Setup the display table -- like `gnus-summary-setup-display-table',
169 ;; but done in an XEmacsish way.
170 (let ((table (make-display-table))
172 ;; Nix out all the control chars...
173 (while (>= (setq i (1- i)) 0)
175 ;; ... but not newline and cr, of course. (cr is necessary for the
176 ;; selective display).
179 ;; We keep TAB as well.
181 ;; We nix out any glyphs over 126 below ctl-arrow.
182 (let ((i (if (integerp ctl-arrow) ctl-arrow 160)))
183 (while (>= (setq i (1- i)) 127)
184 (unless (aref table i)
185 (aset table i [??]))))
186 ;; Can't use `set-specifier' because of a bug in 19.14 and earlier
187 (add-spec-to-specifier current-display-table table (current-buffer) nil)))
189 (defun gnus-xmas-add-text-properties (start end props &optional object)
190 (add-text-properties start end props object)
191 (put-text-property start end 'start-closed nil object))
193 (defun gnus-xmas-put-text-property (start end prop value &optional object)
194 (put-text-property start end prop value object)
195 (put-text-property start end 'start-closed nil object))
197 (defun gnus-xmas-extent-start-open (point)
198 (map-extents (lambda (extent arg)
199 (set-extent-property extent 'start-open t))
200 nil point (min (1+ (point)) (point-max))))
202 (defun gnus-xmas-article-push-button (event)
203 "Check text under the mouse pointer for a callback function.
204 If the text under the mouse pointer has a `gnus-callback' property,
205 call it with the value of the `gnus-data' text property."
207 (set-buffer (window-buffer (event-window event)))
208 (let* ((pos (event-closest-point event))
209 (data (get-text-property pos 'gnus-data))
210 (fun (get-text-property pos 'gnus-callback)))
213 (funcall fun data))))
215 (defun gnus-xmas-move-overlay (extent start end &optional buffer)
216 (set-extent-endpoints extent start end buffer))
218 (defun gnus-xmas-kill-all-overlays ()
219 "Delete all extents in the current buffer."
220 (map-extents (lambda (extent ignore)
221 (delete-extent extent)
224 (defun gnus-xmas-window-top-edge (&optional window)
225 (nth 1 (window-pixel-edges window)))
227 (defun gnus-xmas-tree-minimize ()
228 (when (and gnus-tree-minimize-window
229 (not (one-window-p)))
230 (let* ((window-min-height 2)
231 (height (1+ (count-lines (point-min) (point-max))))
232 (min (max (1- window-min-height) height))
233 (tot (if (numberp gnus-tree-minimize-window)
234 (min gnus-tree-minimize-window min)
236 (win (get-buffer-window (current-buffer)))
237 (wh (and win (1- (window-height win)))))