]> code.delx.au - gnu-emacs/blobdiff - lisp/org/org-clock.el
Install org-mode version 7.3
[gnu-emacs] / lisp / org / org-clock.el
index f451cf807920d71f3c67f0c8c7e5d16a55dfd298..457a4dcb2f0e2ce304ce6f36f3581a01849ef897 100644 (file)
@@ -6,7 +6,7 @@
 ;; Author: Carsten Dominik <carsten at orgmode dot org>
 ;; Keywords: outlines, hypermedia, calendar, wp
 ;; Homepage: http://orgmode.org
-;; Version: 7.01
+;; Version: 7.3
 ;;
 ;; This file is part of GNU Emacs.
 ;;
@@ -35,6 +35,7 @@
   (require 'cl))
 
 (declare-function calendar-absolute-from-iso    "cal-iso"    (&optional date))
+(declare-function notifications-notify "notifications" (&rest params))
 (defvar org-time-stamp-formats)
 
 (defgroup org-clock nil
@@ -557,6 +558,14 @@ use libnotify if available, or fall back on a message."
        ((stringp org-show-notification-handler)
         (start-process "emacs-timer-notification" nil
                        org-show-notification-handler notification))
+       ((featurep 'notifications)
+        (require 'notifications)
+        (notifications-notify
+         :title "Org-mode message"
+         :body notification
+         ;; FIXME how to link to the Org icon?
+         ;; :app-icon "~/.emacs.d/icons/mail.png"
+         :urgency 'low))
        ((org-program-exists "notify-send")
         (start-process "emacs-timer-notification" nil
                        "notify-send" notification))
@@ -950,7 +959,7 @@ the clocking selection, associated with the letter `d'."
        ;; We are interrupting the clocking of a different task.
        ;; Save a marker to this task, so that we can go back.
        ;; First check if we are trying to clock into the same task!
-       (if (save-excursion
+       (when (save-excursion
                (unless selected-task
                  (org-back-to-heading t))
                (and (equal (marker-buffer org-clock-hd-marker)
@@ -961,13 +970,13 @@ the clocking selection, associated with the letter `d'."
                        (if selected-task
                            (marker-position selected-task)
                          (point)))))
-           (message "Clock continues in \"%s\"" org-clock-heading)
-         (progn
-           (move-marker org-clock-interrupted-task
-                        (marker-position org-clock-marker)
-                        (org-clocking-buffer))
-           (let ((org-clock-clocking-in t))
-             (org-clock-out t)))))
+         (message "Clock continues in \"%s\"" org-clock-heading)
+         (throw 'abort nil))
+       (move-marker org-clock-interrupted-task
+                    (marker-position org-clock-marker)
+                    (marker-buffer org-clock-marker))
+       (let ((org-clock-clocking-in t))
+         (org-clock-out t)))
 
       (when (equal select '(16))
        ;; Mark as default clocking task
@@ -1098,6 +1107,7 @@ the clocking selection, associated with the letter `d'."
 (defun org-clock-set-current ()
   "Set `org-clock-current-task' to the task currently clocked in."
   (setq org-clock-current-task (nth 4 (org-heading-components))))
+
 (defun org-clock-delete-current ()
   "Reset `org-clock-current-task' to nil."
   (setq org-clock-current-task nil))
@@ -1830,6 +1840,7 @@ the currently selected interval size."
            (org-prepare-agenda-buffers files)
            (while (setq file (pop files))
              (with-current-buffer (find-buffer-visiting file)
+               (setq org-clock-file-total-minutes 0)
                (setq tbl1 (org-dblock-write:clocktable p1))
                (when tbl1
                  (push (org-clocktable-add-file
@@ -1862,7 +1873,7 @@ the currently selected interval size."
            (when (setq time (get-text-property p :org-clock-minutes))
              (save-excursion
                (beginning-of-line 1)
-               (when (and (looking-at (org-re "\\(\\*+\\)[ \t]+\\(.*?\\)\\([ \t]+:[[:alnum:]_@:]+:\\)?[ \t]*$"))
+               (when (and (looking-at (org-re "\\(\\*+\\)[ \t]+\\(.*?\\)\\([ \t]+:[[:alnum:]_@#%:]+:\\)?[ \t]*$"))
                           (setq level (org-reduced-level
                                        (- (match-end 1) (match-beginning 1))))
                           (<= level maxlevel))
@@ -1970,10 +1981,22 @@ the currently selected interval size."
     (when block
       (setq cc (org-clock-special-range block nil t)
            ts (car cc) te (nth 1 cc) range-text (nth 2 cc)))
-    (if ts (setq ts (org-float-time
-                    (apply 'encode-time (org-parse-time-string ts)))))
-    (if te (setq te (org-float-time
-                    (apply 'encode-time (org-parse-time-string te)))))
+    (cond
+     ((numberp ts)
+      ;; If ts is a number, it's an absolute day number from org-agenda.
+      (destructuring-bind (month day year) (calendar-gregorian-from-absolute ts)
+       (setq ts (org-float-time (encode-time 0 0 0 day month year)))))
+     (ts
+      (setq ts (org-float-time
+               (apply 'encode-time (org-parse-time-string ts))))))
+    (cond
+     ((numberp te)
+      ;; Likewise for te.
+      (destructuring-bind (month day year) (calendar-gregorian-from-absolute te)
+       (setq te (org-float-time (encode-time 0 0 0 day month year)))))
+     (te
+      (setq te (org-float-time
+               (apply 'encode-time (org-parse-time-string te))))))
     (setq p1 (plist-put p1 :header ""))
     (setq p1 (plist-put p1 :step nil))
     (setq p1 (plist-put p1 :block nil))