diff --git a/lisp/org-clock.el b/lisp/org-clock.el index f2f49a8fa..30f9b2a3b 100644 --- a/lisp/org-clock.el +++ b/lisp/org-clock.el @@ -86,6 +86,10 @@ The function is called with point at the beginning of the headline." :group 'org-clock :type 'function) +(defcustom org-clock-string-limit 0 + "Maximum length of clock strings in the modeline. 0 means no limit" + :group 'org-clock + :type 'integer) ;;; The clock for measuring work time. @@ -107,6 +111,9 @@ of a different task.") (defvar org-clock-interrupted-task (make-marker) "Marker pointing to the task that has been interrupted by the current clock.") +(defvar org-clock-mode-map (make-sparse-keymap)) +(define-key org-clock-mode-map [mode-line mouse-2] 'org-clock-goto) + (defun org-clock-history-push (&optional pos buffer) "Push a marker to the clock history." (setq org-clock-history-length (max 1 (min 35 org-clock-history-length))) @@ -190,15 +197,24 @@ of a different task.") (when (and cat task) (insert (format "[%c] %-15s %s\n" i cat task)) (cons i marker))))) - + (defun org-update-mode-line () (let* ((delta (- (time-to-seconds (current-time)) - (time-to-seconds org-clock-start-time))) + (time-to-seconds org-clock-start-time))) (h (floor delta 3600)) (m (floor (- delta (* 3600 h)) 60))) (setq org-mode-line-string - (propertize (format (concat "-[" org-time-clocksum-format " (%s)]") h m org-clock-heading) - 'help-echo "Org-mode clock is running")) + (org-propertize + (let ((clock-string (format (concat "-[" org-time-clocksum-format " (%s)]") + h m org-clock-heading)) + (help-text "Org-mode clock is running. Mouse-2 to go there.")) + (if (and (> org-clock-string-limit 0) + (> (length clock-string) org-clock-string-limit)) + (org-propertize (substring clock-string 0 org-clock-string-limit) + 'help-echo (concat help-text ": " org-clock-heading)) + (org-propertize clock-string 'help-echo help-text))) + 'local-map org-clock-mode-map + 'mouse-face '(face mode-line-highlight))) (force-mode-line-update))) (defvar org-clock-mode-line-entry nil @@ -253,13 +269,14 @@ the clocking selection, associated with the letter `d'." org-clock-in-switch-to-state "\\>")))) (org-todo org-clock-in-switch-to-state)) - (if (and org-clock-heading-function - (functionp org-clock-heading-function)) - (setq org-clock-heading (funcall org-clock-heading-function)) - (if (looking-at org-complex-heading-regexp) - (setq org-clock-heading (match-string 4)) - (setq org-clock-heading "???"))) - (setq org-clock-heading (propertize org-clock-heading 'face nil)) + (setq org-clock-heading + (cond ((and org-clock-heading-function + (functionp org-clock-heading-function)) + (funcall org-clock-heading-function)) + ((looking-at org-complex-heading-regexp) + (match-string 4)) + (t "???"))) + (setq org-clock-heading (org-propertize org-clock-heading 'face nil)) (org-clock-find-position) (insert "\n") (backward-char 1)