*** empty log message ***
[gnus] / lisp / gnus-demon.el
index 015f4f0..e7bf2be 100644 (file)
@@ -1,5 +1,5 @@
 ;;; gnus-demon.el --- daemonic Gnus behaviour
-;; Copyright (C) 1995,96 Free Software Foundation, Inc.
+;; Copyright (C) 1995,96,97 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
 ;; Keywords: news
@@ -43,8 +43,8 @@ Each handler is a list on the form
 
 \(FUNCTION TIME IDLE)
 
-FUNCTION is the function to be called. 
-TIME is the number of `gnus-demon-timestep's between each call.  
+FUNCTION is the function to be called.
+TIME is the number of `gnus-demon-timestep's between each call.
 If nil, never call.  If t, call each `gnus-demon-timestep'.
 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
@@ -52,8 +52,8 @@ 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."
   :group 'gnus-demon
-  :type '(repeat (list function 
-                      (choice :tag "Time" 
+  :type '(repeat (list function
+                      (choice :tag "Time"
                               (const :tag "never" nil)
                               (const :tag "one" t)
                               (integer :tag "steps" 1))
@@ -73,7 +73,6 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's."
 (defvar gnus-demon-idle-has-been-called nil)
 (defvar gnus-demon-idle-time 0)
 (defvar gnus-demon-handler-state nil)
-(defvar gnus-demon-is-idle nil)
 (defvar gnus-demon-last-keys nil)
 
 (eval-and-compile
@@ -92,7 +91,7 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's."
 
 (defun gnus-demon-remove-handler (function &optional no-init)
   "Remove the handler FUNCTION from the list of handlers."
-  (setq gnus-demon-handlers 
+  (setq gnus-demon-handlers
        (delq (assq function gnus-demon-handlers)
              gnus-demon-handlers))
   (unless no-init
@@ -105,12 +104,12 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's."
   (if (null gnus-demon-handlers)
       ()                               ; Nothing to do.
     ;; Set up timer.
-    (setq gnus-demon-timer 
-         (nnheader-run-at-time 
+    (setq gnus-demon-timer
+         (nnheader-run-at-time
           gnus-demon-timestep gnus-demon-timestep 'gnus-demon))
     ;; Reset control variables.
     (setq gnus-demon-handler-state
-         (mapcar 
+         (mapcar
           (lambda (handler)
             (list (car handler) (gnus-demon-time-to-step (nth 1 handler))
                   (nth 2 handler)))
@@ -151,7 +150,7 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's."
       time
     (let* ((date (current-time-string))
           (dv (timezone-parse-date date))
-          (tdate (timezone-make-arpa-date 
+          (tdate (timezone-make-arpa-date
                   (string-to-number (aref dv 0))
                   (string-to-number (aref dv 1))
                   (string-to-number (aref dv 2)) time
@@ -159,10 +158,11 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's."
           (nseconds (gnus-time-minus
                      (gnus-encode-date tdate) (gnus-encode-date date))))
       (round
-       (/ (if (< nseconds 0)
-             (+ nseconds (* 60 60 24))
-           nseconds)
-         gnus-demon-timestep)))))
+       (/ (+ (if (< (car nseconds) 0)
+                86400 0)
+            (* 65536 (car nseconds))
+            (nth 1 nseconds))
+         gnus-demon-timestep)))))
 
 (defun gnus-demon ()
   "The Gnus daemon that takes care of running all Gnus handlers."
@@ -171,48 +171,54 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's."
       (incf gnus-demon-idle-time)
     (setq gnus-demon-idle-time 0)
     (setq gnus-demon-idle-has-been-called nil))
-  ;; Then we go through all the handler and call those that are
-  ;; sufficiently ripe.
-  (let ((handlers gnus-demon-handler-state)
-       handler time idle)
-    (while handlers
-      (setq handler (pop handlers))
-      (cond 
-       ((numberp (setq time (nth 1 handler)))
-       ;; These handlers use a regular timeout mechanism.  We decrease
-       ;; the timer if it hasn't reached zero yet.
-       (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...
-                     (< idle gnus-demon-idle-time)) ; Idle timed out.
-                gnus-demon-is-idle)    ; Or just need to be idle.
-            ;; So we call the handler.
-            (progn
-              (funcall (car handler))
-              ;; And reset the timer.
-              (setcar (nthcdr 1 handler)
-                      (gnus-demon-time-to-step
-                       (nth 1 (assq (car handler) gnus-demon-handlers)))))))
-       ;; These are only supposed to be called when Emacs is idle. 
-       ((null (setq idle (nth 2 handler)))
-       ;; We do nothing.
-       )
-       ((not (numberp idle))
-       ;; We want to call this handler each and every time that
-       ;; Emacs is idle. 
-       (funcall (car handler)))
-       (t
-       ;; We want to call this handler only if Emacs has been idle
-       ;; for a specified number of timesteps.
-       (and (not (memq (car handler) gnus-demon-idle-has-been-called))
-            (< idle gnus-demon-idle-time)
-            (progn
-              (funcall (car handler))
-              ;; Make sure the handler won't be called once more in
-              ;; this idle-cycle.
-              (push (car handler) gnus-demon-idle-has-been-called))))))))
+  ;; Disable all daemonic stuff if we're in the minibuffer
+  (unless (window-minibuffer-p (selected-window))
+    ;; Then we go through all the handler and call those that are
+    ;; sufficiently ripe.
+    (let ((handlers gnus-demon-handler-state)
+         handler time idle)
+      (while handlers
+       (setq handler (pop handlers))
+       (cond
+        ((numberp (setq time (nth 1 handler)))
+         ;; These handlers use a regular timeout mechanism.  We decrease
+         ;; the timer if it hasn't reached zero yet.
+         (unless (zerop time)
+           (setcar (nthcdr 1 handler) (decf time)))
+         (and (zerop time)             ; If the timer now is zero...
+              ;; Test for appropriate idleness
+              (progn
+                (setq idle (nth 2 handler))
+                (cond
+                 ((null idle) t)       ; Don't care about idle.
+                 ((numberp idle)       ; Numerical idle...
+                  (< idle gnus-demon-idle-time)) ; Idle timed out.
+                 (t (< 0 gnus-demon-idle-time)))) ; Or just need to be idle.
+              ;; So we call the handler.
+              (progn
+                (funcall (car handler))
+                ;; And reset the timer.
+                (setcar (nthcdr 1 handler)
+                        (gnus-demon-time-to-step
+                         (nth 1 (assq (car handler) gnus-demon-handlers)))))))
+        ;; These are only supposed to be called when Emacs is idle.
+        ((null (setq idle (nth 2 handler)))
+         ;; We do nothing.
+         )
+        ((not (numberp idle))
+         ;; We want to call this handler each and every time that
+         ;; Emacs is idle.
+         (funcall (car handler)))
+        (t
+         ;; We want to call this handler only if Emacs has been idle
+         ;; for a specified number of timesteps.
+         (and (not (memq (car handler) gnus-demon-idle-has-been-called))
+              (< idle gnus-demon-idle-time)
+              (progn
+                (funcall (car handler))
+                ;; Make sure the handler won't be called once more in
+                ;; this idle-cycle.
+                (push (car handler) gnus-demon-idle-has-been-called)))))))))
 
 (defun gnus-demon-add-nocem ()
   "Add daemonic NoCeM handling to Gnus."