annotate lisp/itimer.el @ 1601:442db3c3c43b

[xemacs-hg @ 2003-08-02 08:42:10 by michaels] 2003-07-31 Mike Sperber <mike@xemacs.org> * isearch-mode.el (isearch-mode-help): (isearch-update): (isearch-done): (isearch-edit-string): Change the way window configurations are handled: Formerly, the code would do `set-window-configuration' off `pre-command-hook' which isn't really allowed. (The old window-configuration code would quietly ignore this restriction.) Instead, save the window configuration only when someone asks for help, and restore afterwards, and otherwise leave it alone.
author michaels
date Sat, 02 Aug 2003 08:42:11 +0000
parents 023b83f4e54b
children 17dfe8e3aead
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 446
diff changeset
1 ;;; Interval timers for XEmacs
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 ;;; Copyright (C) 1988, 1991, 1993, 1997, 1998 Kyle E. Jones
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 ;;; This program is free software; you can redistribute it and/or modify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 ;;; it under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 ;;; the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ;;; any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 ;;; This program is distributed in the hope that it will be useful,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ;;; GNU General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ;;; A copy of the GNU General Public License can be obtained from this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ;;; program's author (send electronic mail to kyle@uunet.uu.net) or from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 ;;; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 ;;; 02139, USA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 ;;; Send bug reports to kyle_jones@wonderworks.com
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 (provide 'itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
23 (require 'lisp-float-type)
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
24
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;; `itimer' feature means Emacs-Lisp programmers get:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 ;; itimerp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 ;; itimer-live-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 ;; itimer-value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ;; itimer-restart
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 ;; itimer-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 ;; itimer-uses-arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 ;; itimer-function-arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 ;; set-itimer-value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ;; set-itimer-restart
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 ;; set-itimer-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 ;; set-itimer-uses-arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 ;; set-itimer-function-arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 ;; get-itimer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 ;; start-itimer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 ;; read-itimer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 ;; delete-itimer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 ;; activate-itimer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 ;; Interactive users get these commands:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 ;; edit-itimers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 ;; list-itimers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 ;; start-itimer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 ;; See the doc strings of these functions for more information.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 430
diff changeset
51 (defvar itimer-version "1.09"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 "Version number of the itimer package.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 (defvar itimer-list nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 "List of all active itimers.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 (defvar itimer-process nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 "Process that drives all itimers, if a subprocess is being used.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 (defvar itimer-timer nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 "Emacs internal timer that drives the itimer system, if a subprocess
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 is not being used to drive the system.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 (defvar itimer-timer-last-wakeup nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 "The time the timer driver function last ran.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
67 (defvar itimer-short-interval 1e-3
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 "Interval used for scheduling an event a very short time in the future.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 Used internally to make the scheduler wake up early.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 Unit is seconds.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 ;; This value is maintained internally; it does not determine
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 ;; itimer granularity. Itimer granularity is 1 second if your
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 ;; Emacs doesn't support floats or your system doesn't have a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 ;; clock with microsecond granularity. Otherwise granularity is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 ;; to the microsecond, although you can't possibly get timers to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 ;; executed with this kind of accuracy in practice. There will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 ;; be delays due to system and Emacs internal activity that delay
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 ;; dealing with synchronous events and process output.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 (defvar itimer-next-wakeup itimer-short-interval
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 "Itimer process will wakeup to service running itimers within this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 many seconds.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 (defvar itimer-edit-map nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 "Keymap used when in Itimer Edit mode.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 (if itimer-edit-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 (setq itimer-edit-map (make-sparse-keymap))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 (define-key itimer-edit-map "s" 'itimer-edit-set-field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 (define-key itimer-edit-map "d" 'itimer-edit-delete-itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 (define-key itimer-edit-map "q" 'itimer-edit-quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 (define-key itimer-edit-map "\t" 'itimer-edit-next-field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 (define-key itimer-edit-map " " 'next-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 (define-key itimer-edit-map "n" 'next-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 (define-key itimer-edit-map "p" 'previous-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 (define-key itimer-edit-map "\C-?" 'itimer-edit-previous-field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 (define-key itimer-edit-map "x" 'start-itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 (define-key itimer-edit-map "?" 'itimer-edit-help))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 (defvar itimer-inside-driver nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 (defvar itimer-edit-start-marker nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 ;; macros must come first... or byte-compile'd code will throw back its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 ;; head and scream.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 (defmacro itimer-decrement (variable)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 (list 'setq variable (list '1- variable)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 (defmacro itimer-increment (variable)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 (list 'setq variable (list '1+ variable)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 (defmacro itimer-signum (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 (list 'if (list '> n 0) 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 (list 'if (list 'zerop n) 0 -1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 ;; Itimer access functions should behave as if they were subrs. These
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 ;; macros are used to check the arguments to the itimer functions and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 ;; signal errors appropriately if the arguments are not valid.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 (defmacro check-itimer (var)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
123 "If VAR is not bound to an itimer, signal `wrong-type-argument'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 This is a macro."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 (list 'setq var
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 (list 'if (list 'itimerp var) var
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 (list 'signal ''wrong-type-argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 (list 'list ''itimerp var)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 (defmacro check-itimer-coerce-string (var)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 "If VAR is not bound to a string, look up the itimer that it names and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 bind VAR to it. Otherwise, if VAR is not bound to an itimer, signal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 wrong-type-argument. This is a macro."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 (list 'setq var
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 (list 'cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 (list (list 'itimerp var) var)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 (list (list 'stringp var) (list 'get-itimer var))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 (list t (list 'signal ''wrong-type-argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 (list 'list ''string-or-itimer-p var))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 (defmacro check-nonnegative-number (var)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
142 "If VAR is not bound to a number, signal `wrong-type-argument'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 If VAR is not bound to a positive number, signal args-out-of-range.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 This is a macro."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 (list 'setq var
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 (list 'if (list 'not (list 'numberp var))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 (list 'signal ''wrong-type-argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 (list 'list ''natnump var))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 (list 'if (list '< var 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 (list 'signal ''args-out-of-range (list 'list var))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 var))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 (defmacro check-string (var)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
154 "If VAR is not bound to a string, signal `wrong-type-argument'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 This is a macro."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 (list 'setq var
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 (list 'if (list 'stringp var) var
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 (list 'signal ''wrong-type-argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 (list 'list ''stringp var)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 ;; Functions to access and modify itimer attributes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
163 (defun itimerp (object)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
164 "Return non-nil if OBJECT is an itimer."
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
165 (and (consp object) (eq (length object) 8)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
167 (defun itimer-live-p (object)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
168 "Return non-nil if OBJECT is an itimer and is active.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 ``Active'' means Emacs will run it when it expires.
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
170 `activate-itimer' must be called on an itimer to make it active.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 Itimers started with `start-itimer' are automatically active."
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
172 (and (itimerp object) (memq object itimer-list)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 (defun itimer-name (itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 "Return the name of ITIMER."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 (car itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 (defun itimer-value (itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 "Return the number of seconds until ITIMER expires."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 (nth 1 itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 (defun itimer-restart (itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 "Return the value to which ITIMER will be set at restart.
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
186 The value nil is returned if this itimer isn't set to restart."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 (nth 2 itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 (defun itimer-function (itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 "Return the function of ITIMER.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 This function is called each time ITIMER expires."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 (nth 3 itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 (defun itimer-is-idle (itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 "Return non-nil if ITIMER is an idle timer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 Normal timers expire after a set interval. Idle timers expire
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
199 only after Emacs has been idle for a specific interval. ``Idle''
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
200 means no command events have occurred within the interval."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 (nth 4 itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 (defun itimer-uses-arguments (itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 "Return non-nil if the function of ITIMER will be called with arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 ITIMER's function is called with the arguments each time ITIMER expires.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 The arguments themselves are retrievable with `itimer-function-arguments'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 (nth 5 itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 (defun itimer-function-arguments (itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 "Return the function arguments of ITIMER as a list.
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
213 ITIMER's function is called with these arguments each time ITIMER expires."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 (nth 6 itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 (defun itimer-recorded-run-time (itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 (nth 7 itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 (defun set-itimer-value (itimer value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 "Set the timeout value of ITIMER to be VALUE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 Itimer will expire in this many seconds.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 If your version of Emacs supports floating point numbers then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 VALUE can be a floating point number. Otherwise it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 must be an integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 Returns VALUE."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 (check-nonnegative-number value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 (let ((inhibit-quit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 ;; If the itimer is in the active list, and under the new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 ;; timeout value would expire before we would normally
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 ;; wakeup, wakeup now and recompute a new wakeup time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 (or (and (< value itimer-next-wakeup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 (and (itimer-name itimer) (get-itimer (itimer-name itimer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 (progn (itimer-driver-wakeup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 (setcar (cdr itimer) value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 (itimer-driver-wakeup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 t ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 (setcar (cdr itimer) value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 ;; Same as set-itimer-value but does not wakeup the driver.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 ;; Only should be used by the drivers when processing expired timers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 (defun set-itimer-value-internal (itimer value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 (check-nonnegative-number value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 (setcar (cdr itimer) value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 (defun set-itimer-restart (itimer restart)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 "Set the restart value of ITIMER to be RESTART.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 If RESTART is nil, ITIMER will not restart when it expires.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 If your version of Emacs supports floating point numbers then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 RESTART can be a floating point number. Otherwise it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 must be an integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 Returns RESTART."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 (if restart (check-nonnegative-number restart))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 (setcar (cdr (cdr itimer)) restart))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 (defun set-itimer-function (itimer function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 "Set the function of ITIMER to be FUNCTION.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 FUNCTION will be called when itimer expires.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 Returns FUNCTION."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 (setcar (nthcdr 3 itimer) function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 (defun set-itimer-is-idle (itimer flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 "Set flag that says whether ITIMER is an idle timer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 If FLAG is non-nil, then ITIMER will be considered an idle timer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 Returns FLAG."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 (setcar (nthcdr 4 itimer) flag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 (defun set-itimer-uses-arguments (itimer flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 "Set flag that says whether the function of ITIMER is called with arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 If FLAG is non-nil, then the function will be called with one argument,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 otherwise the function will be called with no arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 Returns FLAG."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 (setcar (nthcdr 5 itimer) flag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 (defun set-itimer-function-arguments (itimer &optional arguments)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 "Set the function arguments of ITIMER to be ARGUMENTS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 The function of ITIMER will be called with ARGUMENTS when itimer expires.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 Returns ARGUMENTS."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 (setcar (nthcdr 6 itimer) arguments))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 (defun set-itimer-recorded-run-time (itimer time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 (setcar (nthcdr 7 itimer) time))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 (defun get-itimer (name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 "Return itimer named NAME, or nil if there is none."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 (check-string name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 (assoc name itimer-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 (defun read-itimer (prompt &optional initial-input)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 "Read the name of an itimer from the minibuffer and return the itimer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 associated with that name. The user is prompted with PROMPT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 Optional second arg INITIAL-INPUT non-nil is inserted into the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 minibuffer as initial user input."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 (get-itimer (completing-read prompt itimer-list nil 'confirm initial-input)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 (defun delete-itimer (itimer)
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
307 "Deletes ITIMER. ITIMER may be an itimer or the name of one."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 (check-itimer-coerce-string itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 (setq itimer-list (delq itimer itimer-list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 (defun start-itimer (name function value &optional restart
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 is-idle with-args &rest function-arguments)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 "Start an itimer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 Arguments are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 NAME, FUNCTION, VALUE &optional RESTART, IS-IDLE, WITH-ARGS, &rest FUNCTION-ARGUMENTS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 NAME is an identifier for the itimer. It must be a string. If an itimer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 already exists with this name, NAME will be modified slightly to make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 it unique.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 FUNCTION should be a function (or symbol naming one). It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 will be called each time the itimer expires with arguments of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 FUNCTION-ARGUMENTS. The function can access the itimer that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 invoked it through the variable `current-itimer'. If WITH-ARGS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 is nil then FUNCTION is called with no arguments. This is for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 backward compatibility with older versions of the itimer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 package which always called FUNCTION with no arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 VALUE is the number of seconds until this itimer expires.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 If your version of Emacs supports floating point numbers then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 VALUE can be a floating point number. Otherwise it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 must be an integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 Optional fourth arg RESTART non-nil means that this itimer should be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 restarted automatically after its function is called. Normally an itimer
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
332 is deleted at expiration after its function has returned.
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
333 If non-nil RESTART should be a number indicating the value at which the
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
334 itimer should be set at restart time.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 Optional fifth arg IS-IDLE specifies if this is an idle timer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 Normal timers expire after a set interval. Idle timers expire
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
337 only after Emacs has been idle for specific interval. ``Idle''
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
338 means no command events have occurred within the interval.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 Returns the newly created itimer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 (interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 (list (completing-read "Start itimer: " itimer-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 (read (completing-read "Itimer function: " obarray 'fboundp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 (let (value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 (while (or (not (numberp value)) (< value 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 (setq value (read-from-minibuffer "Itimer value: " nil nil t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 (let ((restart t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 (while (and restart (or (not (numberp restart)) (< restart 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 (setq restart (read-from-minibuffer "Itimer restart: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 nil nil t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 restart)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 ;; hard to imagine the user specifying these interactively
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 nil ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 (check-string name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 (check-nonnegative-number value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 (if restart (check-nonnegative-number restart))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 ;; Make proposed itimer name unique if it's not already.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 (let ((oname name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 (num 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 (while (get-itimer name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 (setq name (format "%s<%d>" oname num))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 (itimer-increment num)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 (activate-itimer (list name value restart function is-idle
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 with-args function-arguments (list 0 0 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 (car itimer-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 (defun make-itimer ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 "Create an unactivated itimer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 The itimer will not begin running until activated with `activate-itimer'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 Set the itimer's expire interval with `set-itimer-value'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 Set the itimer's function interval with `set-itimer-function'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 Once this is done, the timer can be activated."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 (list nil 0 nil 'ignore nil nil nil (list 0 0 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 (defun activate-itimer (itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 "Activate ITIMER, which was previously created with `make-itimer'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 ITIMER will be added to the global list of running itimers,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 its FUNCTION will be called when it expires, and so on."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 (check-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 (if (memq itimer itimer-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 (error "itimer already activated"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 (if (not (numberp (itimer-value itimer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 (error "itimer timeout value not a number: %s" (itimer-value itimer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 (if (<= (itimer-value itimer) 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 (error "itimer timeout value not positive: %s" (itimer-value itimer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 ;; If there's no itimer driver/process, start one now.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 ;; Otherwise wake up the itimer driver so that seconds slept before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 ;; the new itimer is created won't be counted against it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 (if (or itimer-process itimer-timer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 (itimer-driver-wakeup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 (itimer-driver-start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 ;; Roll a unique name for the timer if it doesn't have a name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 ;; already.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 (if (not (stringp (car itimer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 (let ((name "itimer-0")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 (oname "itimer-")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 (num 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 (while (get-itimer name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 (setq name (format "%s<%d>" oname num))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 (itimer-increment num))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 (setcar itimer name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 ;; signal an error if the timer's name matches an already
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 ;; activated timer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 (if (get-itimer (itimer-name itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 (error "itimer named \"%s\" already existing and activated"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 (itimer-name itimer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 (let ((inhibit-quit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 ;; add the itimer to the global list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 (setq itimer-list (cons itimer itimer-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 ;; If the itimer process is scheduled to wake up too late for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 ;; the itimer we wake it up to calculate a correct wakeup
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 ;; value giving consideration to the newly added itimer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 (if (< (itimer-value itimer) itimer-next-wakeup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 (itimer-driver-wakeup))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 ;; User level functions to list and modify existing itimers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 ;; Itimer Edit major mode, and the editing commands thereof.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 (defun list-itimers ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 "Pop up a buffer containing a list of all itimers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 The major mode of the buffer is Itimer Edit mode. This major mode provides
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 commands to manipulate itimers; see the documentation for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 `itimer-edit-mode' for more information."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 (let* ((buf (get-buffer-create "*Itimer List*"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 (opoint (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 (standard-output buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 (itimers (reverse itimer-list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 (set-buffer buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 (itimer-edit-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 (setq buffer-read-only nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 (erase-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 (insert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 "Name Value Restart Function Idle Arguments"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 "\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 "---- ----- ------- -------- ---- --------")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 (if (null itimer-edit-start-marker)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 (setq itimer-edit-start-marker (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 (while itimers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 (newline 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 (prin1 (itimer-name (car itimers)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 (tab-to-tab-stop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 (insert (itimer-truncate-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 (format "%5.5s" (itimer-value (car itimers))) 5))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 (tab-to-tab-stop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 (insert (itimer-truncate-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 (format "%5.5s" (itimer-restart (car itimers))) 5))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 (tab-to-tab-stop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 (insert (itimer-truncate-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 (format "%.19s" (itimer-function (car itimers))) 19))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 (tab-to-tab-stop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 (if (itimer-is-idle (car itimers))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 (insert "yes")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 (insert "no"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 (tab-to-tab-stop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 (if (itimer-uses-arguments (car itimers))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 (prin1 (itimer-function-arguments (car itimers)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 (prin1 'NONE))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 (setq itimers (cdr itimers)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 ;; restore point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 (goto-char opoint)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 (if (< (point) itimer-edit-start-marker)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 (goto-char itimer-edit-start-marker))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 (setq buffer-read-only t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 (display-buffer buf)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 (defun edit-itimers ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 "Display a list of all itimers and select it for editing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 The major mode of the buffer containing the listing is Itimer Edit mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 This major mode provides commands to manipulate itimers; see the documentation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 for `itimer-edit-mode' for more information."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 ;; since user is editing, make sure displayed data is reasonably up-to-date
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 (if (or itimer-process itimer-timer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 (itimer-driver-wakeup))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 (list-itimers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 (select-window (get-buffer-window "*Itimer List*"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 (goto-char itimer-edit-start-marker)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 (if itimer-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 (forward-sexp 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 (backward-sexp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 (message "type q to quit, ? for help"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 ;; no point in making this interactive.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 (defun itimer-edit-mode ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 "Major mode for manipulating itimers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 Attributes of running itimers are changed by moving the cursor to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 desired field and typing `s' to set that field. The field will then be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 set to the value read from the minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 Commands:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 TAB move forward a field
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 DEL move backward a field
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 s set a field
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 d delete the selected itimer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 x start a new itimer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 ? help"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 (kill-all-local-variables)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 (make-local-variable 'tab-stop-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 (setq major-mode 'itimer-edit-mode
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 mode-name "Itimer Edit"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 truncate-lines t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 tab-stop-list '(22 32 40 60 67))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 (abbrev-mode 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 (auto-fill-mode 0)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
508 (buffer-disable-undo (current-buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 (use-local-map itimer-edit-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 (set-syntax-table emacs-lisp-mode-syntax-table))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 (put 'itimer-edit-mode 'mode-class 'special)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 (defun itimer-edit-help ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 "Help function for Itimer Edit."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 (if (eq last-command 'itimer-edit-help)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 (describe-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 (message "TAB, DEL select fields, (s)et field, (d)elete itimer (type ? for more help)")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 (defun itimer-edit-quit ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 "End Itimer Edit."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 (bury-buffer (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 (if (one-window-p t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 (switch-to-buffer (other-buffer (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 (delete-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 (defun itimer-edit-set-field ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 ;; First two lines in list buffer are headers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 ;; Cry out against the luser who attempts to change a field there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 (if (<= (point) itimer-edit-start-marker)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 (error ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 ;; field-value must be initialized to be something other than a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 ;; number, symbol, or list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 (let (itimer field (field-value ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 (setq itimer (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 ;; read the name of the itimer from the beginning of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 ;; the current line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 (get-itimer (read (current-buffer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 field (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 (itimer-edit-beginning-of-field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 (let ((opoint (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 (n 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 ;; count the number of sexprs until we reach the cursor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 ;; and use this info to determine which field the user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 ;; wants to modify.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 (while (and (>= opoint (point)) (< n 6))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 (forward-sexp 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 (backward-sexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 (itimer-increment n))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 (cond ((eq n 1) (error "Cannot change itimer name."))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 ((eq n 2) 'value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 ((eq n 3) 'restart)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 ((eq n 4) 'function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 ((eq n 5) 'is-idle)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 (t 'function-argument)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 (cond ((eq field 'value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 (let ((prompt "Set itimer value: "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 (while (not (natnump field-value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 (setq field-value (read-from-minibuffer prompt nil nil t)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 ((eq field 'restart)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 (let ((prompt "Set itimer restart: "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 (while (and field-value (not (natnump field-value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 (setq field-value (read-from-minibuffer prompt nil nil t)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 ((eq field 'function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 (let ((prompt "Set itimer function: "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 (while (not (or (and (symbolp field-value) (fboundp field-value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 (and (consp field-value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 (memq (car field-value) '(lambda macro)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 (setq field-value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 (read (completing-read prompt obarray 'fboundp nil))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 ((eq field 'is-idle)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 (setq field-value (not (itimer-is-idle itimer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 ((eq field 'function-argument)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 (let ((prompt "Set itimer function argument: "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 (setq field-value (read-expression prompt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 (cond ((not (listp field-value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 (setq field-value (list field-value))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 (if (null field-value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 (set-itimer-uses-arguments itimer nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 (set-itimer-uses-arguments itimer t)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 ;; set the itimer field
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 (funcall (intern (concat "set-itimer-" (symbol-name field)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 itimer field-value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 ;; move to beginning of field to be changed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 (itimer-edit-beginning-of-field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 ;; modify the list buffer to reflect the change.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 (let (buffer-read-only kill-ring)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 (kill-sexp 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 (kill-region (point) (progn (skip-chars-forward " \t") (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 (prin1 field-value (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 (if (not (eolp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 (tab-to-tab-stop))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 (backward-sexp))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 (defun itimer-edit-delete-itimer ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 ;; First two lines in list buffer are headers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 ;; Cry out against the luser who attempts to change a field there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (if (<= (point) itimer-edit-start-marker)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 (error ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 (delete-itimer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 (read-itimer "Delete itimer: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 (save-excursion (beginning-of-line) (read (current-buffer)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 ;; update list information
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 (list-itimers))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 (defun itimer-edit-next-field (count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 (interactive "p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 (itimer-edit-beginning-of-field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 (cond ((> (itimer-signum count) 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 (while (not (zerop count))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 (forward-sexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 ;; wrap from eob to itimer-edit-start-marker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 (if (eobp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 (goto-char itimer-edit-start-marker)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 (forward-sexp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 (forward-sexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 (backward-sexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 ;; treat fields at beginning of line as if they weren't there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 (if (bolp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 (forward-sexp 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 (backward-sexp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 (itimer-decrement count)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 ((< (itimer-signum count) 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 (while (not (zerop count))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 (backward-sexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 ;; treat fields at beginning of line as if they weren't there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 (if (bolp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 (backward-sexp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 ;; wrap from itimer-edit-start-marker to field at eob.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 (if (<= (point) itimer-edit-start-marker)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 (goto-char (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 (backward-sexp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 (itimer-increment count)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 (defun itimer-edit-previous-field (count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 (interactive "p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 (itimer-edit-next-field (- count)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 (defun itimer-edit-beginning-of-field ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 (let ((forw-back (save-excursion (forward-sexp) (backward-sexp) (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 (back (save-excursion (backward-sexp) (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 (cond ((eq forw-back back) (backward-sexp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 ((eq forw-back (point)) t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 (t (backward-sexp)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 (defun itimer-truncate-string (str len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 (if (<= (length str) len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 str
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 (substring str 0 len)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 ;; internals of the itimer implementation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 (defun itimer-run-expired-timers (time-elapsed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 (let ((itimers (copy-sequence itimer-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 (itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 (next-wakeup 600)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 (idle-time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 (last-event-time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 (recorded-run-time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 ;; process filters can be hit by stray C-g's from the user,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 ;; so we must protect this stuff appropriately.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 ;; Quit's are allowed from within itimer functions, but we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 ;; catch them and print a message.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 (inhibit-quit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 (setq next-wakeup 600)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 (cond ((and (boundp 'last-command-event-time)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 430
diff changeset
676 (consp last-command-event-time))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 (setq last-event-time last-command-event-time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 idle-time (itimer-time-difference (current-time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 last-event-time)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 ((and (boundp 'last-input-time) (consp last-input-time))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 (setq last-event-time (list (car last-input-time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 (cdr last-input-time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 idle-time (itimer-time-difference (current-time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 last-event-time)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 ;; no way to do this under FSF Emacs yet.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 (t (setq last-event-time '(0 0 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 idle-time 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 (while itimers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 (setq itimer (car itimers))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 (if (itimer-is-idle itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 (setq recorded-run-time (itimer-recorded-run-time itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 (set-itimer-value-internal itimer (max 0 (- (itimer-value itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 time-elapsed))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 (if (if (itimer-is-idle itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 (or (> (itimer-time-difference recorded-run-time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 last-event-time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 (< idle-time (itimer-value itimer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 (> (itimer-value itimer) 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 (setq next-wakeup
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 (if (itimer-is-idle itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 (if (< idle-time (itimer-value itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 (min next-wakeup (- (itimer-value itimer) idle-time))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 (min next-wakeup (itimer-value itimer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 (min next-wakeup (itimer-value itimer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 (and (itimer-is-idle itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 (set-itimer-recorded-run-time itimer (current-time)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 ;; itimer has expired, we must call its function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 ;; protect our local vars from the itimer function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 ;; allow keyboard quit to occur, but catch and report it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 ;; provide the variable `current-itimer' in case the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 ;; is interested.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 (condition-case condition-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 (save-match-data
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
717 ;; Suppress warnings - see comment below.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
718 (defvar last-event-time)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
719 (defvar next-wakeup)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
720 (defvar itimer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
721 (defvar itimers)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
722 (defvar time-elapsed)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 (let* ((current-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 (quit-flag nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 (inhibit-quit nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 ;; for FSF Emacs timer.el emulation under XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 ;; eldoc expect this to be done, apparently.
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
728 (this-command nil)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
729 ;; bind these variables so that the itimer
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
730 ;; function can't screw with them.
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
731 last-event-time next-wakeup
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
732 itimer itimers time-elapsed)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 (if (itimer-uses-arguments current-itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 (apply (itimer-function current-itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 (itimer-function-arguments current-itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 (funcall (itimer-function current-itimer)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 (error (message "itimer \"%s\" signaled: %s" (itimer-name itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 (prin1-to-string condition-data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 (quit (message "itimer \"%s\" quit" (itimer-name itimer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 ;; restart the itimer if we should, otherwise delete it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 (if (null (itimer-restart itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 (delete-itimer itimer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 (set-itimer-value-internal itimer (itimer-restart itimer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 (setq next-wakeup (min next-wakeup (itimer-value itimer))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 (setq itimers (cdr itimers)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 ;; make another sweep through the list to catch any timers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 ;; that might have been added by timer functions above.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 (setq itimers itimer-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 (while itimers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 (setq next-wakeup (min next-wakeup (itimer-value (car itimers)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 itimers (cdr itimers)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 ;; if user is viewing the timer list, update displayed info.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 (let ((b (get-buffer "*Itimer List*")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 (if (and b (get-buffer-window b))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 (list-itimers))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 next-wakeup ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 (defun itimer-process-filter (process string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 ;; If the itimer process dies and generates output while doing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 ;; so, we may be called before the process-sentinel. Sanity
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 ;; check the output just in case...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 (if (not (string-match "^[0-9]" string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 (progn (message "itimer process gave odd output: %s" string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 ;; it may be still alive and waiting for input
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 (process-send-string itimer-process "3\n"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 ;; if there are no active itimers, return quickly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 (if itimer-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 (let ((wakeup nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 (setq wakeup (itimer-run-expired-timers (string-to-int string)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 (and (null wakeup) (process-send-string process "1\n")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 (setq itimer-next-wakeup wakeup))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 (setq itimer-next-wakeup 600))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 ;; tell itimer-process when to wakeup again
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 (process-send-string itimer-process
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 (concat (int-to-string itimer-next-wakeup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 "\n"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 (defun itimer-process-sentinel (process message)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 (let ((inhibit-quit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 (if (eq (process-status process) 'stop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 (continue-process process)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 ;; not stopped, so it must have died.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 ;; cleanup first...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 (delete-process process)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 (setq itimer-process nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 ;; now, if there are any active itimers then we need to immediately
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 ;; start another itimer process, otherwise we can wait until the next
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 ;; start-itimer call, which will start one automatically.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 (if (null itimer-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 ;; there may have been an error message in the echo area;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 ;; give the user at least a little time to read it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 (sit-for 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 (message "itimer process %s... respawning." (substring message 0 -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 (itimer-process-start)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 (defun itimer-process-start ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 (let ((inhibit-quit t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 (process-connection-type nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 (setq itimer-process (start-process "itimer" nil "itimer"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 (process-kill-without-query itimer-process)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 (set-process-filter itimer-process 'itimer-process-filter)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 (set-process-sentinel itimer-process 'itimer-process-sentinel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 ;; Tell itimer process to wake up quickly, so that a correct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 ;; wakeup time can be computed. Zero loses because of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 ;; underlying itimer implementations that use 0 to mean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 ;; `disable the itimer'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 (setq itimer-next-wakeup itimer-short-interval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 (process-send-string itimer-process
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 (format "%s\n" itimer-next-wakeup))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 (defun itimer-process-wakeup ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 (interrupt-process itimer-process)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 (accept-process-output))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 (defun itimer-timer-start ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 (let ((inhibit-quit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 (setq itimer-next-wakeup itimer-short-interval
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 itimer-timer-last-wakeup (current-time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 itimer-timer (add-timeout itimer-short-interval
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 'itimer-timer-driver nil nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 (defun itimer-disable-timeout (timeout)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 ;; Disgusting hack, but necessary because there is no other way
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 ;; to remove a timer that has a restart value from while that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 ;; timer's function is being run. (FSF Emacs only.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 (if (vectorp timeout)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 (aset timeout 4 nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 (disable-timeout timeout))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 (defun itimer-timer-wakeup ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 (let ((inhibit-quit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 (itimer-disable-timeout itimer-timer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 (setq itimer-timer (add-timeout itimer-short-interval
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 'itimer-timer-driver nil 5))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 (defun itimer-time-difference (t1 t2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 (let (usecs secs 65536-secs carry)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 (setq usecs (- (nth 2 t1) (nth 2 t2)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 (if (< usecs 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 (setq carry 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 usecs (+ usecs 1000000))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 (setq carry 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 (setq secs (- (nth 1 t1) (nth 1 t2) carry))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 (if (< secs 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 (setq carry 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 secs (+ secs 65536))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 (setq carry 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 (setq 65536-secs (- (nth 0 t1) (nth 0 t2) carry))
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
852 (+ (* 65536-secs 65536.0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 secs
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
854 (/ usecs 1000000.0))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 (defun itimer-timer-driver (&rest ignored)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 ;; inhibit quit because if the user quits at an inopportune
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 ;; time, the timer process won't be launched again and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 ;; system stops working. itimer-run-expired-timers allows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 ;; individual timer function to be aborted, so the user can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 ;; escape a feral timer function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 (if (not itimer-inside-driver)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 (let* ((inhibit-quit t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 (itimer-inside-driver t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 (now (current-time))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 (elapsed (itimer-time-difference now itimer-timer-last-wakeup))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 (sleep nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 (setq itimer-timer-last-wakeup now
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 sleep (itimer-run-expired-timers elapsed))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 (itimer-disable-timeout itimer-timer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 (setq itimer-next-wakeup sleep
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 itimer-timer (add-timeout sleep 'itimer-timer-driver nil 5)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 (defun itimer-driver-start ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 (if (fboundp 'add-timeout)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 (itimer-timer-start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 (itimer-process-start)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 (defun itimer-driver-wakeup ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 (if (fboundp 'add-timeout)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 (itimer-timer-wakeup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 (itimer-process-wakeup)))