comparison lisp/gnus/gnus-xmas.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children ac2d302a0011
comparison
equal deleted inserted replaced
-1:000000000000 0:376386a54a3c
1 ;;; gnus-xmas.el --- Gnus functions for XEmacs
2 ;; Copyright (C) 1995,96 Free Software Foundation, Inc.
3
4 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
5 ;; Keywords: news
6
7 ;; This file is part of GNU Emacs.
8
9 ;; GNU Emacs is free software; you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation; either version 2, or (at your option)
12 ;; any later version.
13
14 ;; GNU Emacs is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;; GNU General Public License for more details.
18
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs; see the file COPYING. If not, write to the
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 ;; Boston, MA 02111-1307, USA.
23
24 ;;; Commentary:
25
26 ;;; Code:
27
28 (require 'text-props)
29 (eval-when-compile (require 'cl))
30 (defvar menu-bar-mode (featurep 'menubar))
31 (require 'messagexmas)
32
33 (defvar gnus-xmas-glyph-directory nil
34 "*Directory where Gnus logos and icons are located.
35 If this variable is nil, Gnus will try to locate the directory
36 automatically.")
37
38 (defvar gnus-xmas-logo-color-alist
39 '((flame "#cc3300" "#ff2200")
40 (pine "#c0cc93" "#f8ffb8")
41 (moss "#a1cc93" "#d2ffb8")
42 (irish "#04cc90" "#05ff97")
43 (sky "#049acc" "#05deff")
44 (tin "#6886cc" "#82b6ff")
45 (velvet "#7c68cc" "#8c82ff")
46 (grape "#b264cc" "#cf7df")
47 (labia "#cc64c2" "#fd7dff")
48 (berry "#cc6485" "#ff7db5")
49 (neutral "#b4b4b4" "#878787")
50 (september "#bf9900" "#ffcc00"))
51 "Color alist used for the Gnus logo.")
52
53 (defvar gnus-xmas-logo-color-style 'september
54 "Color styles used for the Gnus logo.")
55
56 (defvar gnus-xmas-logo-colors
57 (cdr (assq gnus-xmas-logo-color-style gnus-xmas-logo-color-alist))
58 "Colors used for the Gnus logo.")
59
60 (defvar gnus-article-x-face-command
61 (if (featurep 'xface)
62 'gnus-xmas-article-display-xface
63 "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | xv -quit -")
64 "String or function to be executed to display an X-Face header.
65 If it is a string, the command will be executed in a sub-shell
66 asynchronously. The compressed face will be piped to this command.")
67
68 ;;; Internal variables.
69
70 ;; Don't warn about these undefined variables.
71
72 (defvar gnus-group-mode-hook)
73 (defvar gnus-summary-mode-hook)
74 (defvar gnus-article-mode-hook)
75
76 ;;defined in gnus.el
77 (defvar gnus-active-hashtb)
78 (defvar gnus-article-buffer)
79 (defvar gnus-auto-center-summary)
80 (defvar gnus-buffer-list)
81 (defvar gnus-current-headers)
82 (defvar gnus-level-killed)
83 (defvar gnus-level-zombie)
84 (defvar gnus-newsgroup-bookmarks)
85 (defvar gnus-newsgroup-dependencies)
86 (defvar gnus-newsgroup-selected-overlay)
87 (defvar gnus-newsrc-hashtb)
88 (defvar gnus-read-mark)
89 (defvar gnus-refer-article-method)
90 (defvar gnus-reffed-article-number)
91 (defvar gnus-unread-mark)
92 (defvar gnus-version)
93 (defvar gnus-view-pseudos)
94 (defvar gnus-view-pseudos-separately)
95 (defvar gnus-visual)
96 (defvar gnus-zombie-list)
97 ;;defined in gnus-msg.el
98 (defvar gnus-article-copy)
99 (defvar gnus-check-before-posting)
100 ;;defined in gnus-vis.el
101 (defvar gnus-article-button-face)
102 (defvar gnus-article-mouse-face)
103 (defvar gnus-summary-selected-face)
104 (defvar gnus-group-reading-menu)
105 (defvar gnus-group-group-menu)
106 (defvar gnus-group-misc-menu)
107 (defvar gnus-summary-article-menu)
108 (defvar gnus-summary-thread-menu)
109 (defvar gnus-summary-misc-menu)
110 (defvar gnus-summary-post-menu)
111 (defvar gnus-summary-kill-menu)
112 (defvar gnus-article-article-menu)
113 (defvar gnus-article-treatment-menu)
114 (defvar gnus-mouse-2)
115 (defvar standard-display-table)
116 (defvar gnus-tree-minimize-window)
117
118 (defun gnus-xmas-set-text-properties (start end props &optional buffer)
119 "You should NEVER use this function. It is ideologically blasphemous.
120 It is provided only to ease porting of broken FSF Emacs programs."
121 (if (stringp buffer)
122 nil
123 (map-extents (lambda (extent ignored)
124 (remove-text-properties
125 start end
126 (list (extent-property extent 'text-prop) nil)
127 buffer))
128 buffer start end nil nil 'text-prop)
129 (gnus-add-text-properties start end props buffer)))
130
131 (defun gnus-xmas-highlight-selected-summary ()
132 ;; Highlight selected article in summary buffer
133 (when gnus-summary-selected-face
134 (if gnus-newsgroup-selected-overlay
135 (delete-extent gnus-newsgroup-selected-overlay))
136 (setq gnus-newsgroup-selected-overlay
137 (make-extent (gnus-point-at-bol) (gnus-point-at-eol)))
138 (set-extent-face gnus-newsgroup-selected-overlay
139 gnus-summary-selected-face)))
140
141 (defun gnus-xmas-summary-recenter ()
142 "\"Center\" point in the summary window.
143 If `gnus-auto-center-summary' is nil, or the article buffer isn't
144 displayed, no centering will be performed."
145 ;; Suggested by earle@mahendo.JPL.NASA.GOV (Greg Earle).
146 ;; Recenter only when requested. Suggested by popovich@park.cs.columbia.edu.
147 (when gnus-auto-center-summary
148 (let* ((height (if (fboundp 'window-displayed-height)
149 (window-displayed-height)
150 (- (window-height) 2)))
151 (top (cond ((< height 4) 0)
152 ((< height 7) 1)
153 (t 2)))
154 (bottom (save-excursion (goto-char (point-max))
155 (forward-line (- height))
156 (point)))
157 (window (get-buffer-window (current-buffer))))
158 (when (get-buffer-window gnus-article-buffer)
159 ;; Only do recentering when the article buffer is displayed,
160 ;; Set the window start to either `bottom', which is the biggest
161 ;; possible valid number, or the second line from the top,
162 ;; whichever is the least.
163 (set-window-start
164 window (min bottom (save-excursion
165 (forward-line (- top)) (point)))))
166 ;; Do horizontal recentering while we're at it.
167 (when (and (get-buffer-window (current-buffer) t)
168 (not (eq gnus-auto-center-summary 'vertical)))
169 (let ((selected (selected-window)))
170 (select-window (get-buffer-window (current-buffer) t))
171 (gnus-summary-position-point)
172 (gnus-horizontal-recenter)
173 (select-window selected))))))
174
175 (defun gnus-xmas-add-hook (hook function &optional append local)
176 (add-hook hook function))
177
178 (defun gnus-xmas-add-text-properties (start end props &optional object)
179 (add-text-properties start end props object)
180 (put-text-property start end 'start-closed nil object))
181
182 (defun gnus-xmas-put-text-property (start end prop value &optional object)
183 (put-text-property start end prop value object)
184 (put-text-property start end 'start-closed nil object))
185
186 (defun gnus-xmas-extent-start-open (point)
187 (map-extents (lambda (extent arg)
188 (set-extent-property extent 'start-open t))
189 nil point (min (1+ (point)) (point-max))))
190
191 (defun gnus-xmas-article-push-button (event)
192 "Check text under the mouse pointer for a callback function.
193 If the text under the mouse pointer has a `gnus-callback' property,
194 call it with the value of the `gnus-data' text property."
195 (interactive "e")
196 (set-buffer (window-buffer (event-window event)))
197 (let* ((pos (event-closest-point event))
198 (data (get-text-property pos 'gnus-data))
199 (fun (get-text-property pos 'gnus-callback)))
200 (if fun (funcall fun data))))
201
202 (defun gnus-xmas-move-overlay (extent start end &optional buffer)
203 (set-extent-endpoints extent start end))
204
205 ;; Fixed by Christopher Davis <ckd@loiosh.kei.com>.
206 (defun gnus-xmas-article-add-button (from to fun &optional data)
207 "Create a button between FROM and TO with callback FUN and data DATA."
208 (and gnus-article-button-face
209 (gnus-overlay-put (gnus-make-overlay from to)
210 'face gnus-article-button-face))
211 (gnus-add-text-properties
212 from to
213 (nconc
214 (and gnus-article-mouse-face
215 (list 'mouse-face gnus-article-mouse-face))
216 (list 'gnus-callback fun)
217 (and data (list 'gnus-data data))
218 (list 'highlight t))))
219
220 (defun gnus-xmas-window-top-edge (&optional window)
221 (nth 1 (window-pixel-edges window)))
222
223 (defun gnus-xmas-tree-minimize ()
224 (when (and gnus-tree-minimize-window
225 (not (one-window-p)))
226 (let* ((window-min-height 2)
227 (height (1+ (count-lines (point-min) (point-max))))
228 (min (max (1- window-min-height) height))
229 (tot (if (numberp gnus-tree-minimize-window)
230 (min gnus-tree-minimize-window min)
231 min))
232 (win (get-buffer-window (current-buffer)))
233 (wh (and win (1- (window-height win)))))
234 (when (and win
235 (not (eq tot wh)))
236 (let ((selected (selected-window)))
237 (select-window win)
238 (enlarge-window (- tot wh))
239 (select-window selected))))))
240
241 ;; Select the lowest window on the frame.
242 (defun gnus-xmas-appt-select-lowest-window ()
243 (let* ((lowest-window (selected-window))
244 (bottom-edge (car (cdr (cdr (cdr (window-pixel-edges))))))
245 (last-window (previous-window))
246 (window-search t))
247 (while window-search
248 (let* ((this-window (next-window))
249 (next-bottom-edge (car (cdr (cdr (cdr
250 (window-pixel-edges
251 this-window)))))))
252 (if (< bottom-edge next-bottom-edge)
253 (progn
254 (setq bottom-edge next-bottom-edge)
255 (setq lowest-window this-window)))
256
257 (select-window this-window)
258 (if (eq last-window this-window)
259 (progn
260 (select-window lowest-window)
261 (setq window-search nil)))))))
262
263 (defmacro gnus-xmas-menu-add (type &rest menus)
264 `(gnus-xmas-menu-add-1 ',type ',menus))
265 (put 'gnus-xmas-menu-add 'lisp-indent-function 1)
266 (put 'gnus-xmas-menu-add 'lisp-indent-hook 1)
267
268 (defun gnus-xmas-menu-add-1 (type menus)
269 (when (and menu-bar-mode
270 (gnus-visual-p (intern (format "%s-menu" type)) 'menu))
271 (while menus
272 (easy-menu-add (symbol-value (pop menus))))))
273
274 (defun gnus-xmas-group-menu-add ()
275 (gnus-xmas-menu-add group
276 gnus-group-reading-menu gnus-group-group-menu gnus-group-misc-menu))
277
278 (defun gnus-xmas-summary-menu-add ()
279 (gnus-xmas-menu-add summary
280 gnus-summary-misc-menu gnus-summary-kill-menu
281 gnus-summary-article-menu gnus-summary-thread-menu
282 gnus-summary-post-menu ))
283
284 (defun gnus-xmas-article-menu-add ()
285 (gnus-xmas-menu-add article
286 gnus-article-article-menu gnus-article-treatment-menu))
287
288 (defun gnus-xmas-score-menu-add ()
289 (gnus-xmas-menu-add score
290 gnus-score-menu))
291
292 (defun gnus-xmas-pick-menu-add ()
293 (gnus-xmas-menu-add pick
294 gnus-pick-menu))
295
296 (defun gnus-xmas-binary-menu-add ()
297 (gnus-xmas-menu-add binary
298 gnus-binary-menu))
299
300 (defun gnus-xmas-tree-menu-add ()
301 (gnus-xmas-menu-add tree
302 gnus-tree-menu))
303
304 (defun gnus-xmas-server-menu-add ()
305 (gnus-xmas-menu-add menu
306 gnus-server-server-menu gnus-server-connections-menu))
307
308 (defun gnus-xmas-browse-menu-add ()
309 (gnus-xmas-menu-add browse
310 gnus-browse-menu))
311
312 (defun gnus-xmas-grouplens-menu-add ()
313 (gnus-xmas-menu-add grouplens
314 gnus-grouplens-menu))
315
316 (defun gnus-xmas-read-event-char ()
317 "Get the next event."
318 (let ((event (next-event)))
319 ;; We junk all non-key events. Is this naughty?
320 (while (not (key-press-event-p event))
321 (setq event (next-event)))
322 (cons (and (key-press-event-p event)
323 ; (numberp (event-key event))
324 (event-to-character event))
325 event)))
326
327 (defun gnus-xmas-group-remove-excess-properties ()
328 (let ((end (point))
329 (beg (progn (forward-line -1) (point))))
330 (remove-text-properties (1+ beg) end '(gnus-group nil))
331 (remove-text-properties
332 beg end
333 '(gnus-topic nil gnus-topic-level nil gnus-topic-visible nil))
334 (goto-char end)
335 (map-extents
336 (lambda (e ma)
337 (set-extent-property e 'start-closed t))
338 (current-buffer) beg end)))
339
340 (defun gnus-xmas-topic-remove-excess-properties ()
341 (let ((end (point))
342 (beg (progn (forward-line -1) (point))))
343 (remove-text-properties beg end '(gnus-group nil gnus-unread nil))
344 (remove-text-properties (1+ beg) end '(gnus-topic nil))
345 (goto-char end)))
346
347 (defun gnus-xmas-seconds-since-epoch (date)
348 "Return a floating point number that says how many seconds have lapsed between Jan 1 12:00:00 1970 and DATE."
349 (let* ((tdate (mapcar (lambda (ti) (and ti (string-to-int ti)))
350 (timezone-parse-date date)))
351 (ttime (mapcar (lambda (ti) (and ti (string-to-int ti)))
352 (timezone-parse-time
353 (aref (timezone-parse-date date) 3))))
354 (edate (mapcar (lambda (ti) (and ti (string-to-int ti)))
355 (timezone-parse-date "Jan 1 12:00:00 1970")))
356 (tday (- (timezone-absolute-from-gregorian
357 (nth 1 tdate) (nth 2 tdate) (nth 0 tdate))
358 (timezone-absolute-from-gregorian
359 (nth 1 edate) (nth 2 edate) (nth 0 edate)))))
360 (+ (nth 2 ttime)
361 (* (nth 1 ttime) 60)
362 (* (float (nth 0 ttime)) 60 60)
363 (* (float tday) 60 60 24))))
364
365 (defun gnus-xmas-define ()
366 (setq gnus-mouse-2 [button2])
367
368 (or (memq 'underline (face-list))
369 (and (fboundp 'make-face)
370 (funcall (intern "make-face") 'underline)))
371 ;; Must avoid calling set-face-underline-p directly, because it
372 ;; is a defsubst in emacs19, and will make the .elc files non
373 ;; portable!
374 (or (face-differs-from-default-p 'underline)
375 (funcall (intern "set-face-underline-p") 'underline t))
376
377 (fset 'gnus-make-overlay 'make-extent)
378 (fset 'gnus-overlay-put 'set-extent-property)
379 (fset 'gnus-move-overlay 'gnus-xmas-move-overlay)
380 (fset 'gnus-overlay-end 'extent-end-position)
381 (fset 'gnus-extent-detached-p 'extent-detached-p)
382 (fset 'gnus-add-text-properties 'gnus-xmas-add-text-properties)
383 (fset 'gnus-put-text-property 'gnus-xmas-put-text-property)
384
385 (require 'text-props)
386 (if (< emacs-minor-version 14)
387 (fset 'gnus-set-text-properties 'gnus-xmas-set-text-properties))
388
389 (or (boundp 'standard-display-table) (setq standard-display-table nil))
390
391 (defvar gnus-mouse-face-prop 'highlight)
392
393 (unless (fboundp 'encode-time)
394 (defun encode-time (sec minute hour day month year &optional zone)
395 (let ((seconds
396 (gnus-xmas-seconds-since-epoch
397 (timezone-make-arpa-date
398 year month day (timezone-make-time-string hour minute sec)
399 zone))))
400 (list (floor (/ seconds (expt 2 16)))
401 (round (mod seconds (expt 2 16)))))))
402
403 (defun gnus-byte-code (func)
404 "Return a form that can be `eval'ed based on FUNC."
405 (let ((fval (symbol-function func)))
406 (if (compiled-function-p fval)
407 (list 'funcall fval)
408 (cons 'progn (cdr (cdr fval))))))
409
410 ;; Fix by "jeff (j.d.) sparkes" <jsparkes@bnr.ca>.
411 (defvar gnus-display-type (device-class)
412 "A symbol indicating the display Emacs is running under.
413 The symbol should be one of `color', `grayscale' or `mono'. If Emacs
414 guesses this display attribute wrongly, either set this variable in
415 your `~/.emacs' or set the resource `Emacs.displayType' in your
416 `~/.Xdefaults'. See also `gnus-background-mode'.
417
418 This is a meta-variable that will affect what default values other
419 variables get. You would normally not change this variable, but
420 pounce directly on the real variables themselves.")
421
422
423 (fset 'gnus-x-color-values
424 (if (fboundp 'x-color-values)
425 'x-color-values
426 (lambda (color)
427 (color-instance-rgb-components
428 (make-color-instance color)))))
429
430 (defvar gnus-background-mode
431 (let* ((bg-resource
432 (condition-case ()
433 (x-get-resource ".backgroundMode" "BackgroundMode" 'string)
434 (error nil)))
435 (params (frame-parameters))
436 (color (condition-case ()
437 (or (assq 'background-color params)
438 (color-instance-name
439 (specifier-instance
440 (face-background 'default))))
441 (error nil))))
442 (cond (bg-resource (intern (downcase bg-resource)))
443 ((and color
444 (< (apply '+ (gnus-x-color-values color))
445 (/ (apply '+ (gnus-x-color-values "white")) 3)))
446 'dark)
447 (t 'light)))
448 "A symbol indicating the Emacs background brightness.
449 The symbol should be one of `light' or `dark'.
450 If Emacs guesses this frame attribute wrongly, either set this variable in
451 your `~/.emacs' or set the resource `Emacs.backgroundMode' in your
452 `~/.Xdefaults'.
453 See also `gnus-display-type'.
454
455 This is a meta-variable that will affect what default values other
456 variables get. You would normally not change this variable, but
457 pounce directly on the real variables themselves.")
458 )
459
460
461
462 (defun gnus-xmas-redefine ()
463 "Redefine lots of Gnus functions for XEmacs."
464 (fset 'gnus-summary-make-display-table 'ignore)
465 (fset 'gnus-visual-turn-off-edit-menu 'identity)
466 (fset 'gnus-summary-recenter 'gnus-xmas-summary-recenter)
467 (fset 'gnus-extent-start-open 'gnus-xmas-extent-start-open)
468 (fset 'gnus-article-push-button 'gnus-xmas-article-push-button)
469 (fset 'gnus-article-add-button 'gnus-xmas-article-add-button)
470 (fset 'gnus-window-top-edge 'gnus-xmas-window-top-edge)
471 (fset 'gnus-read-event-char 'gnus-xmas-read-event-char)
472 (fset 'gnus-group-startup-message 'gnus-xmas-group-startup-message)
473 (fset 'gnus-tree-minimize 'gnus-xmas-tree-minimize)
474 (fset 'gnus-appt-select-lowest-window
475 'gnus-xmas-appt-select-lowest-window)
476 (fset 'gnus-mail-strip-quoted-names 'gnus-xmas-mail-strip-quoted-names)
477 (fset 'gnus-make-local-hook 'make-local-variable)
478 (fset 'gnus-add-hook 'gnus-xmas-add-hook)
479 (fset 'gnus-character-to-event 'character-to-event)
480 (fset 'gnus-article-show-hidden-text 'gnus-xmas-article-show-hidden-text)
481 (fset 'gnus-mode-line-buffer-identification
482 'gnus-xmas-mode-line-buffer-identification)
483
484 (add-hook 'gnus-group-mode-hook 'gnus-xmas-group-menu-add)
485 (add-hook 'gnus-summary-mode-hook 'gnus-xmas-summary-menu-add)
486 (add-hook 'gnus-article-mode-hook 'gnus-xmas-article-menu-add)
487 (add-hook 'gnus-score-mode-hook 'gnus-xmas-score-menu-add)
488
489 (add-hook 'gnus-pick-mode-hook 'gnus-xmas-pick-menu-add)
490 (add-hook 'gnus-tree-mode-hook 'gnus-xmas-tree-menu-add)
491 (add-hook 'gnus-binary-mode-hook 'gnus-xmas-binary-menu-add)
492 (add-hook 'gnus-grouplens-mode-hook 'gnus-xmas-grouplens-menu-add)
493 (add-hook 'gnus-server-mode-hook 'gnus-xmas-server-menu-add)
494 (add-hook 'gnus-browse-mode-hook 'gnus-xmas-browse-menu-add)
495
496 (add-hook 'gnus-group-mode-hook 'gnus-xmas-setup-group-toolbar)
497 (add-hook 'gnus-summary-mode-hook 'gnus-xmas-setup-summary-toolbar)
498
499 (when (and (<= emacs-major-version 19)
500 (<= emacs-minor-version 13))
501 (fset 'gnus-highlight-selected-summary
502 'gnus-xmas-highlight-selected-summary)
503 (fset 'gnus-group-remove-excess-properties
504 'gnus-xmas-group-remove-excess-properties)
505 (fset 'gnus-topic-remove-excess-properties
506 'gnus-xmas-topic-remove-excess-properties)
507 (fset 'gnus-mode-line-buffer-identification 'identity)
508 (unless (boundp 'shell-command-switch)
509 (setq shell-command-switch "-c"))
510 ))
511
512
513 ;;; XEmacs logo and toolbar.
514
515 (defun gnus-xmas-group-startup-message (&optional x y)
516 "Insert startup message in current buffer."
517 ;; Insert the message.
518 (setq gnus-xmas-glyph-directory (message-xmas-find-glyph-directory "gnus"))
519 (erase-buffer)
520 (let ((logo (and gnus-xmas-glyph-directory
521 (concat
522 (file-name-as-directory gnus-xmas-glyph-directory)
523 "gnus."
524 (if (featurep 'xpm) "xpm" "xbm"))))
525 (xpm-color-symbols
526 (and (featurep 'xpm)
527 (append `(("thing" ,(car gnus-xmas-logo-colors))
528 ("shadow" ,(cadr gnus-xmas-logo-colors)))
529 xpm-color-symbols))))
530 (if (and (featurep 'xpm)
531 (not (equal (device-type) 'tty))
532 logo
533 (file-exists-p logo))
534 (progn
535 (setq logo (make-glyph logo))
536 (insert " ")
537 (set-extent-begin-glyph (make-extent (point) (point)) logo)
538 (goto-char (point-min))
539 (while (not (eobp))
540 (insert (make-string (/ (max (- (window-width) (or x 35)) 0) 2)
541 ? ))
542 (forward-line 1))
543 (goto-char (point-min))
544 (let* ((pheight (+ 20 (count-lines (point-min) (point-max))))
545 (wheight (window-height))
546 (rest (- wheight pheight)))
547 (insert (make-string (max 0 (* 2 (/ rest 3))) ?\n))))
548
549 (insert
550 (format " %s
551 _ ___ _ _
552 _ ___ __ ___ __ _ ___
553 __ _ ___ __ ___
554 _ ___ _
555 _ _ __ _
556 ___ __ _
557 __ _
558 _ _ _
559 _ _ _
560 _ _ _
561 __ ___
562 _ _ _ _
563 _ _
564 _ _
565 _ _
566 _
567 __
568
569 "
570 ""))
571 ;; And then hack it.
572 (gnus-indent-rigidly (point-min) (point-max)
573 (/ (max (- (window-width) (or x 46)) 0) 2))
574 (goto-char (point-min))
575 (forward-line 1)
576 (let* ((pheight (count-lines (point-min) (point-max)))
577 (wheight (window-height))
578 (rest (- wheight pheight)))
579 (insert (make-string (max 0 (* 2 (/ rest 3))) ?\n))))
580 ;; Fontify some.
581 (goto-char (point-min))
582 (and (search-forward "Praxis" nil t)
583 (put-text-property (match-beginning 0) (match-end 0) 'face 'bold))
584 (goto-char (point-min))
585 (let* ((mode-string (gnus-group-set-mode-line)))
586 (setq modeline-buffer-identification
587 (list (concat gnus-version ": *Group*")))
588 (set-buffer-modified-p t))))
589
590
591 ;;; The toolbar.
592
593 (defvar gnus-use-toolbar (if (featurep 'toolbar)
594 'default-toolbar
595 nil)
596 "*If nil, do not use a toolbar.
597 If it is non-nil, it must be a toolbar. The five legal values are
598 `default-toolbar', `top-toolbar', `bottom-toolbar',
599 `right-toolbar', and `left-toolbar'.")
600
601 (defvar gnus-group-toolbar
602 '(
603 [gnus-group-get-new-news gnus-group-get-new-news t "Get new news"]
604 [gnus-group-get-new-news-this-group
605 gnus-group-get-new-news-this-group t "Get new news in this group"]
606 [gnus-group-catchup-current
607 gnus-group-catchup-current t "Catchup group"]
608 [gnus-group-describe-group
609 gnus-group-describe-group t "Describe group"]
610 [gnus-group-kill-group gnus-group-kill-group t "Kill group"]
611 [gnus-group-exit gnus-group-exit t "Exit Gnus"]
612 )
613 "The group buffer toolbar.")
614
615 (defvar gnus-summary-toolbar
616 '(
617 [gnus-summary-prev-unread
618 gnus-summary-prev-unread-article t "Prev unread article"]
619 [gnus-summary-next-unread
620 gnus-summary-next-unread-article t "Next unread article"]
621 [gnus-summary-post-news
622 gnus-summary-post-news t "Post an article"]
623 [gnus-summary-followup-with-original
624 gnus-summary-followup-with-original t
625 "Post a followup and yank the original"]
626 [gnus-summary-followup
627 gnus-summary-followup t "Post a followup"]
628 [gnus-summary-reply-with-original
629 gnus-summary-reply-with-original t "Mail a reply and yank the original"]
630 [gnus-summary-reply
631 gnus-summary-reply t "Mail a reply"]
632 [gnus-summary-caesar-message
633 gnus-summary-caesar-message t "Rot 13"]
634 [gnus-uu-decode-uu
635 gnus-uu-decode-uu t "Decode uuencoded articles"]
636 [gnus-summary-save-article-file
637 gnus-summary-save-article-file t "Save article in file"]
638 [gnus-summary-save-article
639 gnus-summary-save-article t "Save article"]
640 [gnus-uu-post-news
641 gnus-uu-post-news t "Post an uuencoded article"]
642 [gnus-summary-cancel-article
643 gnus-summary-cancel-article t "Cancel article"]
644 [gnus-summary-catchup-and-exit
645 gnus-summary-catchup-and-exit t "Catchup and exit"]
646 [gnus-summary-exit gnus-summary-exit t "Exit this summary"]
647 )
648 "The summary buffer toolbar.")
649
650 (defvar gnus-summary-mail-toolbar
651 '(
652 [gnus-summary-prev-unread
653 gnus-summary-prev-unread-article t "Prev unread article"]
654 [gnus-summary-next-unread
655 gnus-summary-next-unread-article t "Next unread article"]
656 [gnus-summary-mail-reply gnus-summary-reply t "Reply"]
657 [gnus-summary-mail-get gnus-mail-get t "Message get"]
658 [gnus-summary-mail-originate gnus-summary-post-news t "Originate"]
659 [gnus-summary-mail-save gnus-summary-save-article t "Save"]
660 [gnus-summary-mail-copy gnus-summary-copy-article t "Copy message"]
661 ; [gnus-summary-mail-delete gnus-summary-delete-article t "Delete message"]
662 [gnus-summary-mail-forward gnus-summary-mail-forward t "Forward message"]
663 ; [gnus-summary-mail-spell gnus-mail-spell t "Spell"]
664 ; [gnus-summary-mail-help gnus-mail-help t "Message help"]
665 [gnus-summary-caesar-message
666 gnus-summary-caesar-message t "Rot 13"]
667 [gnus-uu-decode-uu
668 gnus-uu-decode-uu t "Decode uuencoded articles"]
669 [gnus-summary-save-article-file
670 gnus-summary-save-article-file t "Save article in file"]
671 [gnus-summary-save-article
672 gnus-summary-save-article t "Save article"]
673 [gnus-summary-catchup-and-exit
674 gnus-summary-catchup-and-exit t "Catchup and exit"]
675 [gnus-summary-exit gnus-summary-exit t "Exit this summary"]
676 )
677 "The summary buffer mail toolbar.")
678
679 (defun gnus-xmas-setup-group-toolbar ()
680 (and gnus-use-toolbar
681 (message-xmas-setup-toolbar gnus-group-toolbar nil "gnus")
682 (set-specifier (symbol-value gnus-use-toolbar)
683 (cons (current-buffer) gnus-group-toolbar))))
684
685 (defun gnus-xmas-setup-summary-toolbar ()
686 (let ((bar (if (gnus-news-group-p gnus-newsgroup-name)
687 gnus-summary-toolbar gnus-summary-mail-toolbar)))
688 (and gnus-use-toolbar
689 (message-xmas-setup-toolbar bar nil "gnus")
690 (set-specifier (symbol-value gnus-use-toolbar)
691 (cons (current-buffer) bar)))))
692
693 (defun gnus-xmas-mail-strip-quoted-names (address)
694 "Protect mail-strip-quoted-names from NIL input.
695 XEmacs compatibility workaround."
696 (if (null address)
697 nil
698 (mail-strip-quoted-names address)))
699
700 (defun gnus-xmas-call-region (command &rest args)
701 (apply
702 'call-process-region (point-min) (point-max) command t '(t nil) nil
703 args))
704
705 (unless (find-face 'gnus-x-face)
706 (copy-face 'default 'gnus-x-face)
707 (set-face-foreground 'gnus-x-face "black")
708 (set-face-background 'gnus-x-face "white"))
709
710 (defun gnus-xmas-article-display-xface (beg end)
711 "Display any XFace headers in the current article."
712 (save-excursion
713 (let (xface-glyph)
714 (if (featurep 'xface)
715 (setq xface-glyph
716 (make-glyph (vector 'xface :data
717 (concat "X-Face: "
718 (buffer-substring beg end)))))
719 (let ((cur (current-buffer)))
720 (save-excursion
721 (gnus-set-work-buffer)
722 (insert (format "%s" (buffer-substring beg end cur)))
723 (gnus-xmas-call-region "uncompface")
724 (goto-char (point-min))
725 (insert "/* Width=48, Height=48 */\n")
726 (gnus-xmas-call-region "icontopbm")
727 (gnus-xmas-call-region "ppmtoxpm")
728 (setq xface-glyph
729 (make-glyph
730 (vector 'xpm :data (buffer-string )))))))
731 (set-glyph-face xface-glyph 'gnus-x-face)
732 (goto-char (point-min))
733 (re-search-forward "^From:" nil t)
734 (set-extent-begin-glyph
735 (make-extent (point) (1+ (point))) xface-glyph))))
736
737 (defun gnus-xmas-article-show-hidden-text (type &optional hide)
738 "Show all hidden text of type TYPE.
739 If HIDE, hide the text instead."
740 (save-excursion
741 (set-buffer gnus-article-buffer)
742 (let ((buffer-read-only nil)
743 (inhibit-point-motion-hooks t)
744 (beg (point-min)))
745 (while (gnus-goto-char (text-property-any
746 beg (point-max) 'gnus-type type))
747 (setq beg (point))
748 (forward-char)
749 (if hide
750 (gnus-hide-text beg (point) gnus-hidden-properties)
751 (gnus-unhide-text beg (point)))
752 (setq beg (point)))
753 (save-window-excursion
754 (select-window (get-buffer-window (current-buffer)))
755 (recenter))
756 t)))
757
758 (defun gnus-xmas-mode-line-buffer-identification (line)
759 (let ((line (car line))
760 chop)
761 (if (not (stringp line))
762 (list line)
763 (unless (setq chop (string-match ":" line))
764 (setq chop (/ (length line) 2)))
765 (list (cons modeline-buffer-id-left-extent (substring line 0 chop))
766 (cons modeline-buffer-id-right-extent (substring line chop))))))
767
768 (provide 'gnus-xmas)
769
770 ;;; gnus-xmas.el ends here