Browse Source

Update org-timer.el so that we only allow one timer.

Also get rid of a bug: as timers where not properly canceled,
`org-timer-show-remaining-time' was not giving the proper result.

Thanks to Frédéric Couchet for this catch.
Bastien Guerry 8 years ago
parent
commit
1759ccd4db
2 changed files with 26 additions and 34 deletions
  1. 6 0
      lisp/ChangeLog
  2. 20 34
      lisp/org-timer.el

+ 6 - 0
lisp/ChangeLog

@@ -1,5 +1,11 @@
 2010-02-25  Bastien Guerry  <bzg@altern.org>
 
+	* org-timer.el (org-timer-current-timer): Renamed from
+	`org-timer-last-timer'.
+	(org-timer-timer1, org-timer-timer2, org-timer-timer3): Removed.
+	(org-timer-cancel-timer, org-timer-show-remaining-time)
+	(org-timer-set-timer): Update to use only one timer.
+
 	* org.el (org-set-property): Remove useless space in the prompt.
 
 2010-02-25  Carsten Dominik  <carsten.dominik@gmail.com>

+ 20 - 34
lisp/org-timer.el

@@ -275,38 +275,28 @@ VALUE can be `on', `off', or `pause'."
 	  (concat " <" (substring (org-timer-value-string) 0 -1) ">"))
     (force-mode-line-update)))
 
-(defvar org-timer-timer1 nil)
-(defvar org-timer-timer2 nil)
-(defvar org-timer-timer3 nil)
-(defvar org-timer-last-timer nil)
-
-(defun org-timer-cancel-timers ()
-  "Reset all timers."
+(defvar org-timer-current-timer nil)
+(defun org-timer-cancel-timer ()
+  "Cancel the current timer."
   (interactive)
-  (mapc (lambda(timer)
-	  (when (eval timer)
-            (run-hooks 'org-timer-cancel-hook)
-	    (cancel-timer timer)
-	    (setq timer nil)))
-	'(org-timer-timer1
-	  org-timer-timer2
-	  org-timer-timer3))
-  (message "All timers reset"))
+  (when (eval org-timer-current-timer)
+    (run-hooks 'org-timer-cancel-hook)
+    (cancel-timer org-timer-current-timer)
+    (setq org-timer-current-timer nil))
+  (message "Last timer canceled"))
 
 (defun org-timer-show-remaining-time ()
   "Display the remaining time before the timer ends."
   (interactive)
   (require 'time)
-  (if (and (not org-timer-timer1)
-	   (not org-timer-timer2)
-	   (not org-timer-timer3))
+  (if (not org-timer-current-timer)
       (message "No timer set")
     (let* ((rtime (decode-time
-		   (time-subtract (timer--time org-timer-last-timer)
+		   (time-subtract (timer--time org-timer-current-timer)
 				  (current-time))))
 	   (rsecs (nth 0 rtime))
 	   (rmins (nth 1 rtime)))
-      (message "%d minutes %d seconds left before next time out"
+      (message "%d minute(s) %d seconds left before next time out"
 	       rmins rsecs))))
 
 ;;;###autoload
@@ -333,19 +323,15 @@ VALUE can be `on', `off', or `pause'."
 		 (org-get-heading))
 		(t (error "Not in an Org buffer"))))
 	   timer-set)
-      (mapcar (lambda(timer)
-		(when (not (or (eval timer) timer-set))
-		  (setq timer-set t)
-		  (setq org-timer-last-timer
-			(run-with-timer
-			 secs nil '(lambda ()
-                                     (org-notify (format "%s: time out" hl) t)
-                                     (run-hooks 'org-timer-done-hook))))
-		  (set timer org-timer-last-timer)
-                  (run-hooks 'org-timer-set-hook)))
-	      '(org-timer-timer1
-		org-timer-timer2
-		org-timer-timer3)))))
+      (if org-timer-current-timer
+	  (error "You cannot run several timers at the same time")
+	(setq org-timer-current-timer
+	      (run-with-timer
+	       secs nil `(lambda ()
+			   (setq org-timer-current-timer nil)
+			   (org-notify ,(format "%s: time out" hl) t)
+			   (run-hooks 'org-timer-done-hook))))
+	(run-hooks 'org-timer-set-hook)))))
 
 (provide 'org-timer)