* Processor Run Time:: Getting the run time used by Emacs.
* Time Calculations:: Adding, subtracting, comparing times, etc.
* Timers:: Setting a timer to call a function at a certain time.
+* Idle Timers:: Setting a timer to call a function when Emacs has
+ been idle for a certain length of time.
* Terminal Input:: Accessing and recording terminal input.
* Terminal Output:: Controlling and recording terminal output.
* Sound Output:: Playing sounds on the computer's speaker.
changes from user commands' changes and prevent a single undo entry
from growing to be quite large.
+ Timer functions should also avoid calling functions that cause Emacs
+to wait, such as @code{sit-for} (@pxref{Waiting}). This can lead to
+unpredictable effects, since other timers (or even the same timer) can
+run while waiting. If a timer function needs to perform an action
+after a certain time has elapsed, it can do this by scheduling a new
+timer.
+
If a timer function calls functions that can change the match data,
it should save and restore the match data. @xref{Saving Match Data}.
a timer to avoid waiting too long for an answer. @xref{Yes-or-No
Queries}.
+@defun cancel-timer timer
+This cancels the requested action for @var{timer}, which should be a
+timer---usually, one previously returned by @code{run-at-time} or
+@code{run-with-idle-timer}. This cancels the effect of that call to
+one of these functions; the arrival of the specified time will not
+cause anything special to happen.
+@end defun
+
+@node Idle Timers
+@section Idle Timers
+
+ Here is how to set up a timer that runs when Emacs is idle for a
+certain length of time. Aside from how to set them up, idle timers
+work just like ordinary timers.
+
@deffn Command run-with-idle-timer secs repeat function &rest args
Set up a timer which runs when Emacs has been idle for @var{secs}
seconds. The value of @var{secs} may be an integer or a floating point
-number.
+number; a value of the type returned by @code{current-idle-time}
+is also allowed.
If @var{repeat} is @code{nil}, the timer runs just once, the first time
Emacs remains idle for a long enough time. More often @var{repeat} is
remains idle for @var{secs} seconds.
The function @code{run-with-idle-timer} returns a timer value which you
-can use in calling @code{cancel-timer} (see below).
+can use in calling @code{cancel-timer} (@pxref{Timers}).
@end deffn
@cindex idleness
input. Then it becomes idle again, and all the idle timers that are
set up to repeat will subsequently run another time, one by one.
-@defun cancel-timer timer
-Cancel the requested action for @var{timer}, which should be a value
-previously returned by @code{run-at-time} or @code{run-with-idle-timer}.
-This cancels the effect of that call to one of these functions; the
-arrival of the specified time will not cause anything special to happen.
+@c Emacs 19 feature
+@defun current-idle-time
+This function returns the length of time Emacs has been idle, as a
+list of three integers: @code{(@var{high} @var{low} @var{microsec})}.
+The integers @var{high} and @var{low} combine to give the number of
+seconds of idleness, which is
+@ifnottex
+@var{high} * 2**16 + @var{low}.
+@end ifnottex
+@tex
+$high*2^{16}+low$.
+@end tex
+
+The third element, @var{microsec}, gives the microseconds since the
+start of the current second (or 0 for systems that return time with
+the resolution of only one second).
+
+The main use of this function is when an idle timer function wants to
+``take a break'' for a while. It can set up another idle timer to
+call the same function again, after a few seconds more idleness.
+Here's an example:
+
+@smallexample
+(defvar resume-timer nil
+ "Timer that `timer-function' used to reschedule itself, or nil.")
+
+(defun timer-function ()
+ ;; @r{If the user types a command while @code{resume-timer}}
+ ;; @r{is active, the next time this function is called from}
+ ;; @r{its main idle timer, deactivate @code{resume-timer}.}
+ (when resume-timer
+ (cancel-timer resume-timer))
+ ...@var{do the work for a while}...
+ (when @var{taking-a-break}
+ (setq resume-timer
+ (run-with-idle-timer
+ ;; Compute an idle time @var{break-length}
+ ;; more than the current value.
+ (time-add (current-idle-time)
+ (seconds-to-time @var{break-length}))
+ nil
+ 'timer-function))))
+@end smallexample
@end defun
+ Some idle timer functions in user Lisp packages have a loop that
+does a certain amount of processing each time around, and exits when
+@code{(input-pending-p)} is non-@code{nil}. That approach seems very
+natural but has two problems:
+
+@itemize
+@item
+It blocks out all process output (since Emacs accepts process output
+only while waiting).
+
+@item
+It blocks out any idle timers that ought to run during that time.
+@end itemize
+
+@noindent
+To avoid these problems, don't use that technique. Instead, write
+such idle timers to reschedule themselves after a brief pause, using
+the method in the @code{timer-function} example above.
+
@node Terminal Input
@section Terminal Input
@cindex terminal input