diff --git a/.gitignore b/.gitignore index ab68b2ade..c21fc9147 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,4 @@ TODO # fill-column: 72 # mode: conf # End: +/UTILITIES/x11idle diff --git a/ChangeLog b/ChangeLog index 95387ea58..77cca37e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-10-21 James TD Smith + + * UTILITIES/x11idle.c: Add a small C program which outputs the X11 + idle time + 2009-09-16 Carsten Dominik * Makefile: Add dependencies for org-crypt.el. @@ -65,4 +70,3 @@ 2008-04-25 Carsten Dominik * Makefile (BATCH): Fix the path to the local lisp files. - diff --git a/UTILITIES/x11idle.c b/UTILITIES/x11idle.c new file mode 100644 index 000000000..33d0035eb --- /dev/null +++ b/UTILITIES/x11idle.c @@ -0,0 +1,21 @@ +#include +#include + +/* Based on code from + * http://coderrr.wordpress.com/2008/04/20/getting-idle-time-in-unix/ + * + * compile with 'gcc -l Xss x11idle.c -o x11idle' and copy x11idle into your + * path + */ +main() { + XScreenSaverInfo *info = XScreenSaverAllocInfo(); + Display *display = XOpenDisplay(0); + + //check that X11 is running or else you get a segafult/coredump + if (display != NULL) { + XScreenSaverQueryInfo(display, DefaultRootWindow(display), info); + } + XScreenSaverQueryInfo(display, DefaultRootWindow(display), info); + printf("%u\n", info->idle); + return 0; +} diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 0636763e8..32b569c30 100755 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -73,6 +73,12 @@ modeline when habits are being displayed (if that module is being loaded). +2009-10-21 James TD Smith + + * org-clock.el (org-x11-idle-seconds): Add a method to get the X11 + idle time using the xscreensaver extension. + (org-user-idle-seconds): Use X11 idle time if available. + 2009-10-20 Carsten Dominik * org-agenda.el (org-agenda-next-line): New command. @@ -197,7 +203,7 @@ currently active clock if the user has exceeded the time returned by `org-user-idle-seconds', based on the value of `org-clock-idle-time'. - (org-clock-in): If, after resolving clocks, + (org-clock-in): If, after resolving clocks, (org-clock-out): Cancel the `org-clock-idle-timer' on clock out. * org-clock.el (org-clock-resolve-clock): New function that diff --git a/lisp/org-clock.el b/lisp/org-clock.el index b6ca15c1a..7087dedcb 100644 --- a/lisp/org-clock.el +++ b/lisp/org-clock.el @@ -762,16 +762,22 @@ non-dangling (i.e., currently open and valid) clocks." "Return the current Mac idle time in seconds" (string-to-number (shell-command-to-string "ioreg -c IOHIDSystem | perl -ane 'if (/Idle/) {$idle=(pop @F)/1000000000; print $idle; last}'"))) +(defun org-x11-idle-seconds () + "Return the current X11 idle time in seconds" + (/ (string-to-number (shell-command-to-string "x11idle")) 1000)) + (defun org-user-idle-seconds () "Return the number of seconds the user has been idle for. This routine returns a floating point number." - (if (eq system-type 'darwin) + (if (or (eq system-type 'darwin) (eq window-system 'x)) (let ((emacs-idle (org-emacs-idle-seconds))) ;; If Emacs has been idle for longer than the user's ;; `org-clock-idle-time' value, check whether the whole system has ;; really been idle for that long. (if (> emacs-idle (* 60 org-clock-idle-time)) - (min emacs-idle (org-mac-idle-seconds)) + (min emacs-idle (if (eq system-type 'darwin) + (org-mac-idle-seconds) + (org-x11-idle-seconds))) emacs-idle)) (org-emacs-idle-seconds)))