X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Fgnus-demon.el;h=015f4f05ec18128ee3d62969a19ceb919832095d;hb=7c13cb18da8d917ec6688dd63face28caf457158;hp=3ee19b8bb356acbdff0d73a43a260c276b78d7b6;hpb=04981c253f65b8f93dc5b97a38369ec8b9be46b8;p=gnus diff --git a/lisp/gnus-demon.el b/lisp/gnus-demon.el index 3ee19b8bb..015f4f05e 100644 --- a/lisp/gnus-demon.el +++ b/lisp/gnus-demon.el @@ -25,16 +25,19 @@ ;;; Code: -(require 'gnus-load) +(require 'gnus) (require 'gnus-int) (require 'nnheader) -(require 'gnus) (eval-and-compile (if (string-match "XEmacs" (emacs-version)) (require 'itimer) (require 'timer))) -(defvar gnus-demon-handlers nil +(defgroup gnus-demon nil + "Demonic behaviour." + :group 'gnus) + +(defcustom gnus-demon-handlers nil "Alist of daemonic handlers to be run at intervals. Each handler is a list on the form @@ -47,10 +50,22 @@ If IDLE is t, only call if Emacs has been idle for a while. If IDLE is a number, only call when Emacs has been idle more than this number of `gnus-demon-timestep's. If IDLE is nil, don't care about idleness. If IDLE is a number and TIME is nil, then call once each -time Emacs has been idle for IDLE `gnus-demon-timestep's.") - -(defvar gnus-demon-timestep 60 - "*Number of seconds in each demon timestep.") +time Emacs has been idle for IDLE `gnus-demon-timestep's." + :group 'gnus-demon + :type '(repeat (list function + (choice :tag "Time" + (const :tag "never" nil) + (const :tag "one" t) + (integer :tag "steps" 1)) + (choice :tag "Idle" + (const :tag "don't care" nil) + (const :tag "for a while" t) + (integer :tag "steps" 1))))) + +(defcustom gnus-demon-timestep 60 + "*Number of seconds in each demon timestep." + :group 'gnus-demon + :type 'integer) ;;; Internal variables. @@ -59,7 +74,7 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's.") (defvar gnus-demon-idle-time 0) (defvar gnus-demon-handler-state nil) (defvar gnus-demon-is-idle nil) -(defvar gnus-demon-last-keys nil) +(defvar gnus-demon-last-keys nil) (eval-and-compile (autoload 'timezone-parse-date "timezone") @@ -80,7 +95,8 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's.") (setq gnus-demon-handlers (delq (assq function gnus-demon-handlers) gnus-demon-handlers)) - (or no-init (gnus-demon-init))) + (unless no-init + (gnus-demon-init))) (defun gnus-demon-init () "Initialize the Gnus daemon." @@ -108,8 +124,8 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's.") (defun gnus-demon-cancel () "Cancel any Gnus daemons." (interactive) - (and gnus-demon-timer - (nnheader-cancel-timer gnus-demon-timer)) + (when gnus-demon-timer + (nnheader-cancel-timer gnus-demon-timer)) (setq gnus-demon-timer nil gnus-use-demon nil) (condition-case () @@ -145,7 +161,8 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's.") (round (/ (if (< nseconds 0) (+ nseconds (* 60 60 24)) - nseconds) gnus-demon-timestep))))) + nseconds) + gnus-demon-timestep))))) (defun gnus-demon () "The Gnus daemon that takes care of running all Gnus handlers." @@ -164,8 +181,8 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's.") ((numberp (setq time (nth 1 handler))) ;; These handlers use a regular timeout mechanism. We decrease ;; the timer if it hasn't reached zero yet. - (or (zerop time) - (setcar (nthcdr 1 handler) (decf time))) + (unless (zerop time) + (setcar (nthcdr 1 handler) (decf time))) (and (zerop time) ; If the timer now is zero... (or (not (setq idle (nth 2 handler))) ; Don't care about idle. (and (numberp idle) ; Numerical idle... @@ -203,37 +220,60 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's.") (defun gnus-demon-scan-nocem () "Scan NoCeM groups for NoCeM messages." - (gnus-nocem-scan-groups)) + (save-window-excursion + (gnus-nocem-scan-groups))) (defun gnus-demon-add-disconnection () "Add daemonic server disconnection to Gnus." (gnus-demon-add-handler 'gnus-demon-close-connections nil 30)) (defun gnus-demon-close-connections () - (gnus-close-backends)) + (save-window-excursion + (gnus-close-backends))) (defun gnus-demon-add-scanmail () "Add daemonic scanning of mail from the mail backends." (gnus-demon-add-handler 'gnus-demon-scan-mail 120 60)) (defun gnus-demon-scan-mail () - (let ((servers gnus-opened-servers) - server) - (while (setq server (car (pop servers))) - (and (gnus-check-backend-function 'request-scan (car server)) - (or (gnus-server-opened server) - (gnus-open-server server)) - (gnus-request-scan nil server))))) + (save-window-excursion + (let ((servers gnus-opened-servers) + server) + (while (setq server (car (pop servers))) + (and (gnus-check-backend-function 'request-scan (car server)) + (or (gnus-server-opened server) + (gnus-open-server server)) + (gnus-request-scan nil server)))))) (defun gnus-demon-add-rescan () "Add daemonic scanning of new articles from all backends." (gnus-demon-add-handler 'gnus-demon-scan-news 120 60)) (defun gnus-demon-scan-news () + (save-window-excursion + (when (gnus-alive-p) + (save-excursion + (set-buffer gnus-group-buffer) + (gnus-group-get-new-news))))) + +(defun gnus-demon-add-scan-timestamps () + "Add daemonic updating of timestamps in empty newgroups." + (gnus-demon-add-handler 'gnus-demon-scan-timestamps nil 30)) + +(defun gnus-demon-scan-timestamps () + "Set the timestamp on all newsgroups with no unread and no ticked articles." (when (gnus-alive-p) - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-get-new-news)))) + (let ((cur-time (current-time)) + (newsrc (cdr gnus-newsrc-alist)) + info group unread has-ticked) + (while (setq info (pop newsrc)) + (setq group (gnus-info-group info) + unread (gnus-group-unread group) + has-ticked (cdr (assq 'tick (gnus-info-marks info)))) + (when (and (numberp unread) + (= unread 0) + (not has-ticked)) + (gnus-group-set-parameter group 'timestamp cur-time)))))) (provide 'gnus-demon)