diff options
Diffstat (limited to 'lisp/org/org-timer.el')
-rw-r--r-- | lisp/org/org-timer.el | 75 |
1 files changed, 43 insertions, 32 deletions
diff --git a/lisp/org/org-timer.el b/lisp/org/org-timer.el index f26060d4564..91664eb7b1a 100644 --- a/lisp/org/org-timer.el +++ b/lisp/org/org-timer.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.33x +;; Version: 6.35i ;; ;; This file is part of GNU Emacs. ;; @@ -48,6 +48,24 @@ the value of the relative timer." :group 'org-time :type 'string) +(defvar org-timer-start-hook nil + "Hook run after relative timer is started.") + +(defvar org-timer-stop-hook nil + "Hook run before relative timer is stopped.") + +(defvar org-timer-pause-hook nil + "Hook run before relative timer is paused.") + +(defvar org-timer-set-hook nil + "Hook run after countdown timer is set.") + +(defvar org-timer-done-hook nil + "Hook run after countdown timer reaches zero.") + +(defvar org-timer-cancel-hook nil + "Hook run before countdown timer is canceled.") + ;;;###autoload (defun org-timer-start (&optional offset) "Set the starting time for the relative timer to now. @@ -82,7 +100,8 @@ the region 0:00:00." (org-timer-set-mode-line 'on) (message "Timer start time set to %s, current value is %s" (format-time-string "%T" org-timer-start-time) - (org-timer-secs-to-hms (or delta 0)))))) + (org-timer-secs-to-hms (or delta 0))) + (run-hooks 'org-timer-start-hook)))) (defun org-timer-pause-or-continue (&optional stop) "Pause or continue the relative timer. With prefix arg, stop it entirely." @@ -103,6 +122,7 @@ the region 0:00:00." (message "Timer continues at %s" (org-timer-value-string))) (t ;; pause timer + (run-hooks 'org-timer-pause-hook) (setq org-timer-pause-time (current-time)) (org-timer-set-mode-line 'pause) (message "Timer paused at %s" (org-timer-value-string))))) @@ -110,6 +130,7 @@ the region 0:00:00." (defun org-timer-stop () "Stop the relative timer." (interactive) + (run-hooks 'org-timer-stop-hook) (setq org-timer-start-time nil org-timer-pause-time nil) (org-timer-set-mode-line 'off)) @@ -254,37 +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) - (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 @@ -311,16 +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 'org-notify (format "%s: time out" hl) t)) - (set timer org-timer-last-timer))) - '(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) |