- ;; let display catch up so far
- (when gnus-picons-refresh-before-display
- (sit-for 0))
- (when (and (featurep 'xpm)
- (or (not (fboundp 'device-type)) (equal (device-type) 'x)))
- (save-excursion
- (set-buffer (get-buffer-create
- (gnus-get-buffer-name gnus-picons-display-where)))
- (gnus-add-current-to-buffer-list)
- (goto-char (point-min))
- (if (and (eq gnus-picons-display-where 'article)
- gnus-picons-display-article-move-p)
- (when (search-forward "\n\n" nil t)
- (forward-line -1))
- (unless (eolp)
- (push (make-annotation "\n" (point) 'text)
- gnus-group-annotations)))
- (cond
- ((listp gnus-group-annotations)
- (mapc #'(lambda (ext) (when (extent-live-p ext)
- (delete-annotation ext)))
- gnus-group-annotations)
- (setq gnus-group-annotations nil))
- ((annotationp gnus-group-annotations)
- (delete-annotation gnus-group-annotations)
- (setq gnus-group-annotations nil)))
- (gnus-picons-remove gnus-group-annotations)
- (setq gnus-group-annotations
- (gnus-picons-insert-face-if-exists
- gnus-picons-news-directory
- (message-tokenize-header gnus-newsgroup-name ".")
- "unknown" nil t))
- (add-hook 'gnus-summary-exit-hook 'gnus-picons-remove-all))))
-
-(defsubst gnus-picons-try-suffixes (file)
- (let ((suffixes gnus-picons-file-suffixes)
- f)
- (while (and suffixes
- (not (file-exists-p (setq f (concat file (pop suffixes))))))
- (setq f nil))
- f))
-
-(defun gnus-picons-insert-face-if-exists (database addrs filename &optional
- nobar-p dots rightp)
- "Inserts a face at point if I can find one"
- ;; '(gnus-picons-insert-face-if-exists
- ;; "Database" '("edu" "indiana" "cs") "Name")
- ;; looks for:
- ;; 1. edu/indiana/cs/Name
- ;; 2. edu/indiana/Name
- ;; 3. edu/Name
- ;; '(gnus-picons-insert-face-if-exists
- ;; "Database/MISC" '("edu" "indiana" "cs") "Name")
- ;; looks for:
- ;; 1. MISC/Name
- ;; The special treatment of MISC doesn't conform with the conventions for
- ;; picon databases, but otherwise we would always see the MISC/unknown face.
- (let ((bar (and (not nobar-p)
- (or gnus-picons-display-as-address
- (annotations-in-region
- (point) (min (point-max) (1+ (point)))
- (current-buffer)))))
- (path (concat (file-name-as-directory gnus-picons-database)
- database "/"))
- (domainp (and gnus-picons-display-as-address dots))
- picons found bar-ann cur first)
- (when (string-match "/MISC" database)
- (setq addrs '("")))
- (while (and addrs
- (file-accessible-directory-p path))
- (setq cur (pop addrs)
- path (concat path cur "/"))
- (if (setq found
- (gnus-picons-try-suffixes (concat path filename "/face.")))
- (progn
- (setq picons (nconc (when (and domainp first rightp)
- (list (make-annotation
- "." (point) 'text
- nil nil nil rightp)
- picons))
- (gnus-picons-try-to-find-face
- found nil (if domainp cur filename) rightp)
- (when (and domainp first (not rightp))
- (list (make-annotation
- "." (point) 'text
- nil nil nil rightp)
- picons))
- picons)))
- (when domainp
- (setq picons
- (nconc (list (make-annotation
- (if first (concat (if (not rightp) ".") cur
- (if rightp ".")) cur)
- (point) 'text nil nil nil rightp))
- picons))))
- (when (and bar (or domainp found))
- (setq bar-ann (gnus-picons-try-to-find-face
- (concat gnus-xmas-glyph-directory "bar.xbm")
- nil nil t))
- (when bar-ann
- (setq picons (nconc picons bar-ann))
- (setq bar nil)))
- (setq first t))
- (when (and addrs domainp)
- (let ((it (mapconcat 'downcase (nreverse addrs) ".")))
- (make-annotation
- (if first (concat (if (not rightp) ".") it (if rightp ".")) it)
- (point) 'text nil nil nil rightp)))
- picons))
-
-(defvar gnus-picons-glyph-alist nil)
-
-(defun gnus-picons-try-to-find-face (path &optional xface-p part rightp)
- "If PATH exists, display it as a bitmap. Returns t if succeeded."
- (let ((glyph (and (not xface-p)
- (cdr (assoc path gnus-picons-glyph-alist)))))
- (when (or glyph (file-exists-p path))
- (unless glyph
- (setq glyph (make-glyph path))
- (unless xface-p
- (push (cons path glyph) gnus-picons-glyph-alist))
- (set-glyph-face glyph 'default))
- (let ((new (make-annotation glyph (point) 'text nil nil nil rightp)))
- (nconc
- (list new)
- (when (and (eq major-mode 'gnus-article-mode)
- (not gnus-picons-display-as-address)
- (not part))
- (list (make-annotation " " (point) 'text nil nil nil rightp)))
- (when (and part gnus-picons-display-as-address)
- (let ((txt (make-annotation part (point) 'text nil nil nil rightp)))
- (hide-annotation txt)
- (set-extent-property txt 'its-partner new)
- (set-extent-property txt 'keymap gnus-picons-map)
- (set-extent-property txt 'mouse-face gnus-article-mouse-face)
- (set-extent-property new 'its-partner txt)
- (set-extent-property new 'keymap gnus-picons-map))))))))
-
-(defun gnus-picons-reverse-domain-path (str)
- "a/b/c/d -> d/c/b/a"
- (mapconcat 'downcase (nreverse (message-tokenize-header str "/")) "/"))
-
-(defun gnus-picons-toggle-extent (event)
- "Toggle picon glyph at given point"
- (interactive "e")
- (let* ((ant1 (event-glyph-extent event))
- (ant2 (extent-property ant1 'its-partner)))
- (when (and (annotationp ant1) (annotationp ant2))
- (reveal-annotation ant2)
- (hide-annotation ant1))))
-
-(gnus-add-shutdown 'gnus-picons-close 'gnus)
-
-(defun gnus-picons-close ()
- "Shut down the picons."
- (setq gnus-picons-glyph-alist nil))