appt.el trivia.
[bpt/emacs.git] / lisp / calendar / appt.el
index dce6cc2..d547102 100644 (file)
@@ -167,16 +167,16 @@ Only relevant if reminders are being displayed in a window."
 
 ;; TODO Turn this into an alist?  It would be easier to add more
 ;; optional elements.
-;; TODO There should be a way to set WARNTIME (and other properties)
-;; from the diary-file.  Implementing that would be a good reason
-;; to change this to an alist.
+;; Why is the first element (MINUTES) rather than just MINUTES?
+;; It may just inherit from diary-entries-list, where we have
+;; ((MONTH DAY YEAR) ENTRY)
 (defvar appt-time-msg-list nil
   "The list of appointments for today.
 Use `appt-add' and `appt-delete' to add and delete appointments.
 The original list is generated from today's `diary-entries-list', and
 can be regenerated using the function `appt-check'.
 Each element of the generated list has the form
-\(MINUTES STRING [FLAG] [WARNTIME])
+\((MINUTES) STRING [FLAG] [WARNTIME])
 where MINUTES is the time in minutes of the appointment after midnight,
 and STRING is the description of the appointment.
 FLAG and WARNTIME are not always present.  A non-nil FLAG
@@ -282,15 +282,15 @@ displayed in a window:
   (let* ((min-to-app -1)
          (prev-appt-mode-string appt-mode-string)
          (prev-appt-display-count (or appt-display-count 0))
-         now cur-comp-time appt-comp-time appt-warn-time)
+         now now-mins appt-mins appt-warn-time)
     (save-excursion                   ; FIXME ?
       ;; Convert current time to minutes after midnight (12.01am = 1).
       (setq now (decode-time)
-            cur-comp-time (+ (* 60 (nth 2 now)) (nth 1 now)))
+            now-mins (+ (* 60 (nth 2 now)) (nth 1 now)))
       ;; At first check in any day, update appointments to today's list.
       (if (or force                      ; eg initialize, diary save
               (null appt-prev-comp-time) ; first check
-              (< cur-comp-time appt-prev-comp-time)) ; new day
+              (< now-mins appt-prev-comp-time)) ; new day
           (ignore-errors
             (let ((diary-hook (if (assoc 'appt-make-list diary-hook)
                                   diary-hook
@@ -301,22 +301,24 @@ displayed in a window:
                 ;; diary-number-of-entries.  Since appt.el only
                 ;; works on a daily basis, no need for more entries.
                 (diary-list-entries (calendar-current-date) 1 t)))))
-      (setq appt-prev-comp-time cur-comp-time
+      (setq appt-prev-comp-time now-mins
             appt-mode-string nil
             appt-display-count nil)
+      ;; Remove any entries that are in the past.
+      ;; FIXME how can there be any such entries, given that this
+      ;; function removes entries when they hit zero minutes,
+      ;; and appt-make-list doesn't add any in the past in the first place?
+      (while (and appt-time-msg-list
+                  (< (setq appt-mins (caar (car appt-time-msg-list)))
+                     now-mins))
+        (setq appt-time-msg-list (cdr appt-time-msg-list)))
       ;; If there are entries in the list, and the user wants a
       ;; message issued, get the first time off of the list and
       ;; calculate the number of minutes until the appointment.
       (when appt-time-msg-list
-        (setq appt-comp-time (caar (car appt-time-msg-list))
-              appt-warn-time (or (nth 3 (car appt-time-msg-list))
+        (setq appt-warn-time (or (nth 3 (car appt-time-msg-list))
                                  appt-message-warning-time)
-              min-to-app (- appt-comp-time cur-comp-time))
-        (while (and appt-time-msg-list
-                    (< appt-comp-time cur-comp-time))
-          (setq appt-time-msg-list (cdr appt-time-msg-list))
-          (if appt-time-msg-list
-              (setq appt-comp-time (caar (car appt-time-msg-list)))))
+              min-to-app (- appt-mins now-mins))
         ;; If we have an appointment between midnight and
         ;; `appt-warn-time' minutes after midnight, we
         ;; must begin to issue a message before midnight.  Midnight
@@ -325,16 +327,17 @@ displayed in a window:
         ;; appointment variable.  It is equal to the number of
         ;; minutes before midnight plus the number of minutes after
         ;; midnight our appointment is.
-        (if (and (< appt-comp-time appt-warn-time)
-                 (> (+ cur-comp-time appt-warn-time)
-                    appt-max-time))
-            (setq min-to-app (+ (- (1+ appt-max-time) cur-comp-time)
-                                appt-comp-time)))
+        ;; FIXME but appt-make-list constructs appt-time-msg-list to only
+        ;; contain entries with today's date, so this cannot work?
+        ;; Also above we just removed anything with appt-mins < now-mins.
+        (if (and (< appt-mins appt-warn-time)
+                 (> (+ now-mins appt-warn-time) appt-max-time))
+            (setq min-to-app (+ (- (1+ appt-max-time) now-mins)
+                                appt-mins)))
         ;; Issue warning if the appointment time is within
         ;; appt-message-warning time.
         (when (and (<= min-to-app appt-warn-time)
                    (>= min-to-app 0))
-          (setq appt-display-count (1+ prev-appt-display-count))
           ;; This is true every appt-display-interval minutes.
           (and (zerop (mod prev-appt-display-count appt-display-interval))
                (appt-display-message (cadr (car appt-time-msg-list))
@@ -342,18 +345,20 @@ displayed in a window:
           (when appt-display-mode-line
             (setq appt-mode-string
                   (concat " " (propertize
-                               (format "App't in %s min." min-to-app)
+                               (format "App't %s"
+                                       (if (zerop min-to-app) "NOW"
+                                         (format "in %s min." min-to-app)))
                                'face 'mode-line-emphasis))))
           ;; When an appointment is reached, delete it from the
           ;; list.  Reset the count to 0 in case we display another
           ;; appointment on the next cycle.
           (if (zerop min-to-app)
               (setq appt-time-msg-list (cdr appt-time-msg-list)
-                    appt-display-count nil))))
+                    appt-display-count nil)
+            (setq appt-display-count (1+ prev-appt-display-count)))))
       ;; If we have changed the mode line string, redisplay all mode lines.
       (and appt-display-mode-line
-           (not (string-equal appt-mode-string
-                              prev-appt-mode-string))
+           (not (string-equal appt-mode-string prev-appt-mode-string))
            (progn
              (force-mode-line-update t)
              ;; If the string now has a notification, redisplay right now.
@@ -548,6 +553,8 @@ Any appointments made with `appt-add' are not affected by this function."
                          ;; Get the whole string for this appointment.
                          (appt-time-string
                           (substring time-string beg end))
+                         ;; FIXME why the list?  It makes the first
+                         ;; element (MINUTES) rather than MINUTES.
                          (appt-time (list (appt-convert-time only-time)))
                          (time-msg (append
                                     (list appt-time appt-time-string)
@@ -569,15 +576,12 @@ Any appointments made with `appt-add' are not affected by this function."
                 (setq entry-list (cdr entry-list)))))
         (setq appt-time-msg-list (appt-sort-list appt-time-msg-list))
         ;; Convert current time to minutes after midnight (12:01am = 1),
-        ;; so that elements in the list that are earlier than the
-        ;; present time can be removed.
+        ;; and remove elements in the list that are in the past.
         (let* ((now (decode-time))
-               (cur-comp-time (+ (* 60 (nth 2 now)) (nth 1 now)))
-               (appt-comp-time (caar (car appt-time-msg-list))))
-          (while (and appt-time-msg-list (< appt-comp-time cur-comp-time))
-            (setq appt-time-msg-list (cdr appt-time-msg-list))
-            (if appt-time-msg-list
-                (setq appt-comp-time (caar (car appt-time-msg-list)))))))))
+               (now-mins (+ (* 60 (nth 2 now)) (nth 1 now))))
+          (while (and appt-time-msg-list
+                      (< (caar (car appt-time-msg-list)) now-mins))
+            (setq appt-time-msg-list (cdr appt-time-msg-list)))))))
 
 
 (defun appt-sort-list (appt-list)