Mercurial > emacs
changeset 72132:9ac2eb12b7f1
* lread.c (read_filtered_event): New arg SECONDS to wait until.
(Fread_char, Fread_event, Fread_char_exclusive): New arg SECONDS.
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Wed, 26 Jul 2006 18:13:49 +0000 |
parents | 3cc6bfe3a15d |
children | 995e57f32746 |
files | src/lread.c |
diffstat | 1 files changed, 51 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lread.c Wed Jul 26 18:13:33 2006 +0000 +++ b/src/lread.c Wed Jul 26 18:13:49 2006 +0000 @@ -455,14 +455,19 @@ character. If INPUT_METHOD is nonzero, we invoke the current input method - if the character warrants that. */ + if the character warrants that. + + If SECONDS is a number, we wait that many seconds for input, and + return Qnil if no input arrives within that time. */ Lisp_Object read_filtered_event (no_switch_frame, ascii_required, error_nonascii, - input_method) + input_method, seconds) int no_switch_frame, ascii_required, error_nonascii, input_method; + Lisp_Object seconds; { Lisp_Object val, delayed_switch_frame; + EMACS_TIME end_time; #ifdef HAVE_WINDOW_SYSTEM if (display_hourglass_p) @@ -471,11 +476,24 @@ delayed_switch_frame = Qnil; + /* Compute timeout. */ + if (NUMBERP (seconds)) + { + EMACS_TIME wait_time; + int sec, usec; + double duration = extract_float (seconds); + + sec = (int) duration; + usec = (duration - sec) * 1000000; + EMACS_GET_TIME (end_time); + EMACS_SET_SECS_USECS (wait_time, sec, usec); + EMACS_ADD_TIME (end_time, end_time, wait_time); + } + /* Read until we get an acceptable event. */ retry: - val = read_char (0, 0, 0, - (input_method ? Qnil : Qt), - 0); + val = read_char (0, 0, 0, (input_method ? Qnil : Qt), 0, + NUMBERP (seconds) ? &end_time : NULL); if (BUFFERP (val)) goto retry; @@ -493,7 +511,7 @@ goto retry; } - if (ascii_required) + if (ascii_required && !(NUMBERP (seconds) && NILP (val))) { /* Convert certain symbols to their ASCII equivalents. */ if (SYMBOLP (val)) @@ -538,7 +556,7 @@ return val; } -DEFUN ("read-char", Fread_char, Sread_char, 0, 2, 0, +DEFUN ("read-char", Fread_char, Sread_char, 0, 3, 0, doc: /* Read a character from the command input (keyboard or macro). It is returned as a number. If the user generates an event which is not a character (i.e. a mouse @@ -551,43 +569,55 @@ If the optional argument PROMPT is non-nil, display that as a prompt. If the optional argument INHERIT-INPUT-METHOD is non-nil and some input method is turned on in the current buffer, that input method -is used for reading a character. */) - (prompt, inherit_input_method) - Lisp_Object prompt, inherit_input_method; +is used for reading a character. +If the optional argument SECONDS is non-nil, it should be a number +specifying the maximum number of seconds to wait for input. If no +input arrives in that time, return nil. SECONDS may be a +floating-point value. */) + (prompt, inherit_input_method, seconds) + Lisp_Object prompt, inherit_input_method, seconds; { if (! NILP (prompt)) message_with_string ("%s", prompt, 0); - return read_filtered_event (1, 1, 1, ! NILP (inherit_input_method)); + return read_filtered_event (1, 1, 1, ! NILP (inherit_input_method), seconds); } -DEFUN ("read-event", Fread_event, Sread_event, 0, 2, 0, +DEFUN ("read-event", Fread_event, Sread_event, 0, 3, 0, doc: /* Read an event object from the input stream. If the optional argument PROMPT is non-nil, display that as a prompt. If the optional argument INHERIT-INPUT-METHOD is non-nil and some input method is turned on in the current buffer, that input method -is used for reading a character. */) - (prompt, inherit_input_method) - Lisp_Object prompt, inherit_input_method; +is used for reading a character. +If the optional argument SECONDS is non-nil, it should be a number +specifying the maximum number of seconds to wait for input. If no +input arrives in that time, return nil. SECONDS may be a +floating-point value. */) + (prompt, inherit_input_method, seconds) + Lisp_Object prompt, inherit_input_method, seconds; { if (! NILP (prompt)) message_with_string ("%s", prompt, 0); - return read_filtered_event (0, 0, 0, ! NILP (inherit_input_method)); + return read_filtered_event (0, 0, 0, ! NILP (inherit_input_method), seconds); } -DEFUN ("read-char-exclusive", Fread_char_exclusive, Sread_char_exclusive, 0, 2, 0, +DEFUN ("read-char-exclusive", Fread_char_exclusive, Sread_char_exclusive, 0, 3, 0, doc: /* Read a character from the command input (keyboard or macro). It is returned as a number. Non-character events are ignored. If the optional argument PROMPT is non-nil, display that as a prompt. If the optional argument INHERIT-INPUT-METHOD is non-nil and some input method is turned on in the current buffer, that input method -is used for reading a character. */) - (prompt, inherit_input_method) - Lisp_Object prompt, inherit_input_method; +is used for reading a character. +If the optional argument SECONDS is non-nil, it should be a number +specifying the maximum number of seconds to wait for input. If no +input arrives in that time, return nil. SECONDS may be a +floating-point value. */) + (prompt, inherit_input_method, seconds) + Lisp_Object prompt, inherit_input_method, seconds; { if (! NILP (prompt)) message_with_string ("%s", prompt, 0); - return read_filtered_event (1, 1, 0, ! NILP (inherit_input_method)); + return read_filtered_event (1, 1, 0, ! NILP (inherit_input_method), seconds); } DEFUN ("get-file-char", Fget_file_char, Sget_file_char, 0, 0, 0,