emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Konstantin Antipin <antipin.konstantin@googlemail.com>
To: Carsten Dominik <carsten.dominik@gmail.com>,
	Daniel Clemente <n142857@gmail.com>
Cc: emacs-orgmode@gnu.org
Subject: Re: timer for a task
Date: Tue, 26 May 2009 16:26:27 +0200	[thread overview]
Message-ID: <61176df0905260726g7397a370pdc30fb0b3cd067bb@mail.gmail.com> (raw)
In-Reply-To: <3B729AF0-A30A-4EED-B87F-000F5ED0BFA9@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 6953 bytes --]

Carsten, thank you for explanation.
Hopefully, I will get FSF papers soon.

In a meanwhile, here is another patch that introduces following changes:

    In case we set effort estimate on the currently clocked item,
    show message when time is up (notification is shown only once)
     * Linux only: If libnotify is used - the standard notification
       system in linux, then show notification with it.
       Note: Additional package libnotify-bin should be installed.
   Additionally, if variable org-clock-sound is set, interpret it as
path to sound file
   and play it (wav files only).
     * If aplay (tool from alsa - standard linux sound system) is
available play sound
       with it (all type of files).

So, if someone has interest in this features, please try it.
I also would like to discuss If we want this functionality (sound and
notification) in the core,
or it is better to put it to the extension... Or, just introduce
another variable that controls if we show notification or not...


TODO:
* As proposed by Daniel, give user an option to see total time, spend
on the task instead of currently clocked time.
In fact, this functionality requires refactoring of org-clock-sum
function. Is it ok, if I do it?

best,
Konstantin

patch is made on the git version of orgmode.




On Tue, May 26, 2009 at 3:18 PM, Carsten Dominik
<carsten.dominik@gmail.com> wrote:
>
> On May 25, 2009, at 5:43 PM, Konstantin Antipin wrote:
>
>> Here is the patch to org-clock.el that does show estimated effort in
>> the mode-line if it is set.  Like so: 01:20/01:30 (clocked
>> time/estimated time)
>>  It does it by:
>>   * Setting new variable org-clock-effort in org-clock-in function.
>>   * If org-clock-effort is not nil, show estimated effort in the
>> mode-line.
>>
>> I would like to go further and do the following:
>> * Make a beep/or highlight if we spend more time on a task that
>> initially intended
>> * As proposed by Daniel, give user an option to see total time, spend
>> on the task instead of currently clocked time.
>>
>> Does somebody else need this? Will this changes be accepted to the
>> orgmode-core?
>> I just saw that in order to contribute, you need to sign some papers..
>> Is this the only way?
>> I am new to open-source, so I am not really familiar with such things.
>
>
> Hi Konstantin,
>
> this is interesting functionality which I would like to have in the core.
>
> I can accept short patches of only a few lines without the paperwork, but
> your patch is already at the limit, and adding the other ideas you have
> will push it over that limit.  We have the following possibilities:
>
> 1. You sign the papers.  This is very simple to do, unless you have
>   an employer who owns everything you do and who might make problems.
>   This would be my preferred solution.
>
> 2. I can put stuff without FSF copyright assignment into the
>   contrib directory - you could make a little package that hooks
>   into Org, I would created any hooks needed.
>
> 3. I treat your contribution as an "idea/feature request" and implement
>   it myself.  As I have many other things to do, this is my least preferred
>   solution.
>
> If you decide to sign the papers, please get the form from the homepage
> orgmode.org (near te end) and send it to the FSF, with a CC to me.  This
> will take you no more than 2 minutes.  We can then proceed with integrating
> your stuff into the Org core, but I will be able to integrate this change
> into Emacs only after I receive confirmation about the signed paper, which
> will happen within a fee weeks or so.
>
> - Carsten
>
>>
>> best,
>> Konstantin
>>
>>
>> On Mon, May 25, 2009 at 12:44 PM, Eraldo Helal <admin@eraldo.at> wrote:
>>>
>>> Sounds good to me.
>>>
>>> Eraldo
>>>
>>> On Mon, May 25, 2009 at 12:30, Konstantin Antipin
>>> <antipin.konstantin@googlemail.com> wrote:
>>>>
>>>> Hi Daniel,
>>>> Yes, you are right indeed. I am talking about effort estimates - I'v
>>>> missed this chapter for some reason from the manual.
>>>> I like the idea you proposed - to show how much time is left in the
>>>> mode line. And I think I am going to write necessary code for this.
>>>>
>>>> Or, may be someone has even better idea?
>>>>
>>>> best,
>>>> Konstantin
>>>>
>>>> On Mon, May 25, 2009 at 11:25 AM, Daniel Clemente <n142857@gmail.com>
>>>> wrote:
>>>>>
>>>>> Hi.
>>>>>  I suppose you talk about estimated efforts. I also have noticed that I
>>>>> work better if I have defined them, but it is very easy to miss them and
>>>>> work on a task more time than planned.
>>>>>  An easy improvement would be to show at the mode line not only how
>>>>> much time you have worked on the current task but also the remaining time
>>>>> according to your effort estimate. And if it comes to 0, highlight it
>>>>> noticeably.
>>>>>
>>>>>  Other useful things to show would be the *total* elapsed time (not
>>>>> only the elapsed time of the last C-c C-x C-i) or directly the effort
>>>>> estimate (instead of the remaining time, the total time).
>>>>>
>>>>>  And as you say, an alarm would be useful.
>>>>>
>>>>> -- Daniel
>>>>>
>>>>> El dl, mai 25 2009, Konstantin Antipin va escriure:
>>>>>>
>>>>>> Hi everybody!
>>>>>> I am constantly trying to be more productive, and there is one thing
>>>>>> that I noticed:
>>>>>> If you give yourself a specific time for a task, then you tend to
>>>>>> finish this task in this time. It helps to stay focused and do stuff
>>>>>> that is most important.
>>>>>>
>>>>>> So, the question is - Is there any way to set a timer on a taks, and
>>>>>> get a bell when it is expired?
>>>>>> Some time before I even wrote a small extension that helps me to do
>>>>>> that http://www.emacswiki.org/emacs/tea-time
>>>>>> But now I am thinking - is there an orgmode-way to do that? It would
>>>>>> be great to integrate it with great time tracking system, for
>>>>>> example...
>>>>>> If nobody uses proposed feature, please give me a hint how it would be
>>>>>> best to do that.
>>>>>>
>>>>>>
>>>>>> my best,
>>>>>> Konstantin
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Emacs-orgmode mailing list
>>>>>> Remember: use `Reply All' to send replies to the list.
>>>>>> Emacs-orgmode@gnu.org
>>>>>> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Emacs-orgmode mailing list
>>>> Remember: use `Reply All' to send replies to the list.
>>>> Emacs-orgmode@gnu.org
>>>> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
>>>>
>>>
>> <clock-efforts.patch>_______________________________________________
>> Emacs-orgmode mailing list
>> Remember: use `Reply All' to send replies to the list.
>> Emacs-orgmode@gnu.org
>> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
>
>

[-- Attachment #2: clock-effort-notify.patch --]
[-- Type: text/x-patch, Size: 6279 bytes --]

diff --git a/lisp/org-clock.el b/lisp/org-clock.el
index 87ca180..2890155 100644
--- a/lisp/org-clock.el
+++ b/lisp/org-clock.el
@@ -148,6 +148,15 @@ All this depends on running `org-clock-persistence-insinuate' in .emacs"
   :group 'org-clock
   :type 'boolean)
 
+
+(defcustom org-clock-sound nil
+  "Sound that will play once timer is expired.
+If you don't have alsa, it is better to be .wav file"
+  :group 'org-clock
+  :type 'string
+  )
+
+
 ;;; The clock for measuring work time.
 
 (defvar org-mode-line-string "")
@@ -158,6 +167,9 @@ All this depends on running `org-clock-persistence-insinuate' in .emacs"
 (defvar org-clock-heading-for-remember "")
 (defvar org-clock-start-time "")
 
+(defvar org-clock-effort "" 
+  "Effort estimate of the currently clocking task")
+
 (defvar org-clock-history nil
   "List of marker pointing to recent clocked tasks.")
 
@@ -254,9 +266,9 @@ pointing to it."
 				 (org-get-category)))
 		  heading (org-get-heading 'notags)
 		  prefix (save-excursion
-			  (org-back-to-heading t)
-			  (looking-at "\\*+ ")
-			  (match-string 0))
+			   (org-back-to-heading t)
+			   (looking-at "\\*+ ")
+			   (match-string 0))
 		  task (substring
 			(org-fontify-like-in-org-mode 
 			 (concat prefix heading)
@@ -266,24 +278,100 @@ pointing to it."
 	(insert (format "[%c] %-15s %s\n" i cat task))
 	(cons i marker)))))
 
+
+(defun org-clock-get-clock-string ()
+  "Form a clock-string, that will be show in the mode line.
+If effort estimate was defined for current item, then use 01:30/01:50 format (clocked/estimated).
+If not, then 01:50 format (clocked).
+"
+  (let* ((clocked-time (org-clock-get-clocked-time))
+	 (h (floor clocked-time 60))
+	 (m (- clocked-time (* 60 h)))
+	 )
+    (if (and org-clock-effort)
+	(let* ((effort-in-minutes (org-hh:mm-string-to-minutes org-clock-effort))
+	       (effort-h (floor effort-in-minutes 60))
+	       (effort-m (- effort-in-minutes (* effort-h 60))) 
+	       )
+	  (format (concat "-[" org-time-clocksum-format "/" org-time-clocksum-format " (%s)]")
+		  h m effort-h effort-m  org-clock-heading)
+	  )
+      (format (concat "-[" org-time-clocksum-format " (%s)]")
+	      h m org-clock-heading))
+    ))
+
 (defun org-clock-update-mode-line ()
-  (let* ((delta (- (time-to-seconds (current-time))
-		   (time-to-seconds org-clock-start-time)))
-	 (h (floor delta 3600))
-	 (m (floor (- delta (* 3600 h)) 60)))
-    (setq org-mode-line-string
-	  (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-line-map
-	   'mouse-face (if (featurep 'xemacs) 'highlight 'mode-line-highlight)))
-    (force-mode-line-update)))
+  (setq org-mode-line-string
+	(org-propertize
+	 (let ((clock-string (org-clock-get-clock-string))
+	       (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-line-map
+	 'mouse-face (if (featurep 'xemacs) 'highlight 'mode-line-highlight)))
+  (if org-clock-effort (org-clock-notify-once-if-expired))
+  (force-mode-line-update))
+
+(defvar org-clock-notification-was-shown nil
+  "Shows if we have shown notification already.")
+
+(defun org-clock-notify-once-if-expired ()
+  "Show notification if we spent more time then we estimated before.
+Notification is shown only once."
+  (let ((effort-in-minutes (org-hh:mm-string-to-minutes org-clock-effort))
+	(clocked-time (org-clock-get-clocked-time)))
+    (if (>= clocked-time effort-in-minutes)
+	(if (not org-clock-notification-was-shown)
+	    (progn (org-clock-play-sound)
+		   (show-notification (format "Task '%s' should be finished by now. (%s)"
+					      org-clock-heading org-clock-effort))
+		   (setq org-clock-notification-was-shown t)))
+      (setq org-clock-notification-was-shown nil) 
+      )
+    ))
+
+(setq org-clock-sound "/usr/share/sounds/purple/login.wav")
+
+(defun show-notification (notification)
+  "Show notification. Use libnotify, if available."
+  (if (program-exists "notify-send")
+      (start-process "emacs-timer-notification" nil "notify-send" notification)
+    (message notification)
+    ))
+
+
+(defun org-clock-play-sound ()
+  "Play sound.
+Use alsa's aplay tool if available."  
+  (if (not (eq nil org-clock-sound))
+      (if (program-exists "aplay")
+	  (start-process "org-clock-play-notification" nil "aplay" org-clock-sound)
+	(play-sound-file org-clock-sound))
+    (progn (beep t) (beep t)))
+  )
+
+(defun program-exists (program-name)
+  "Checks whenever we can locate program and launch it."
+  (if (eq system-type 'gnu/linux)
+      (= 0 (call-process "which" nil nil nil program-name))
+    ))
+
+
+(defun org-clock-get-clocked-time ()
+  "In minutes."
+  (let ((currently-clocked-time (floor (- (time-to-seconds (current-time))
+					  (time-to-seconds org-clock-start-time)) 60)))
+    ;; (if org-clock-show-total-time
+    ;; 	;; TODO: make total-clocked-time TOTAL, and not current clocked time :)
+    ;; 	currently-clocked-time
+    currently-clocked-time
+    ;; )					
+    ))
+
+
 
 (defvar org-clock-mode-line-entry nil
   "Information for the modeline about the running clock.")
@@ -387,6 +475,7 @@ the clocking selection, associated with the letter `d'."
 		(beginning-of-line 1)
 		(org-indent-line-to (- (org-get-indentation) 2)))
 	      (insert org-clock-string " ")
+	      (setq org-clock-effort (org-get-effort))
 	      (setq org-clock-start-time (current-time))
 	      (setq ts (org-insert-time-stamp org-clock-start-time 'with-hm 'inactive))))
 	    (move-marker org-clock-marker (point) (buffer-base-buffer))

[-- Attachment #3: Type: text/plain, Size: 204 bytes --]

_______________________________________________
Emacs-orgmode mailing list
Remember: use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode

  reply	other threads:[~2009-05-26 14:26 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-25  8:40 timer for a task Konstantin Antipin
2009-05-25  9:25 ` Daniel Clemente
2009-05-25 10:30   ` Konstantin Antipin
2009-05-25 10:44     ` Eraldo Helal
2009-05-25 15:43       ` Konstantin Antipin
2009-05-26 13:18         ` Carsten Dominik
2009-05-26 14:26           ` Konstantin Antipin [this message]
2009-05-26 14:45             ` Carsten Dominik
2009-05-26 22:13               ` Konstantin Antipin
2009-05-27  4:27                 ` Carsten Dominik
2009-05-27 13:32                   ` Bernt Hansen
2009-05-28  0:02                     ` Konstantin Antipin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=61176df0905260726g7397a370pdc30fb0b3cd067bb@mail.gmail.com \
    --to=antipin.konstantin@googlemail.com \
    --cc=carsten.dominik@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=n142857@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).