Commit 6629638e authored by Stefan Monnier's avatar Stefan Monnier
Browse files

* src/keyboard.c (read_key_sequence_vs): New function.

(Fread_key_sequence_vector, Fread_key_sequence): Use it to factor out
common code.
parent d99760fa
2013-09-04 Stefan Monnier <monnier@iro.umontreal.ca>
* keyboard.c (read_key_sequence_vs): New function.
(Fread_key_sequence_vector, Fread_key_sequence): Use it to factor out
common code.
* callint.c (Fcall_interactively): Always return a vector for 'K'.
2013-09-04 Paul Eggert <eggert@cs.ucla.edu>
......
......@@ -9712,54 +9712,11 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt,
return t;
}
DEFUN ("read-key-sequence", Fread_key_sequence, Sread_key_sequence, 1, 5, 0,
doc: /* Read a sequence of keystrokes and return as a string or vector.
The sequence is sufficient to specify a non-prefix command in the
current local and global maps.
First arg PROMPT is a prompt string. If nil, do not prompt specially.
Second (optional) arg CONTINUE-ECHO, if non-nil, means this key echos
as a continuation of the previous key.
The third (optional) arg DONT-DOWNCASE-LAST, if non-nil, means do not
convert the last event to lower case. (Normally any upper case event
is converted to lower case if the original event is undefined and the lower
case equivalent is defined.) A non-nil value is appropriate for reading
a key sequence to be defined.
A C-g typed while in this function is treated like any other character,
and `quit-flag' is not set.
If the key sequence starts with a mouse click, then the sequence is read
using the keymaps of the buffer of the window clicked in, not the buffer
of the selected window as normal.
`read-key-sequence' drops unbound button-down events, since you normally
only care about the click or drag events which follow them. If a drag
or multi-click event is unbound, but the corresponding click event would
be bound, `read-key-sequence' turns the event into a click event at the
drag's starting position. This means that you don't have to distinguish
between click and drag, double, or triple events unless you want to.
`read-key-sequence' prefixes mouse events on mode lines, the vertical
lines separating windows, and scroll bars with imaginary keys
`mode-line', `vertical-line', and `vertical-scroll-bar'.
Optional fourth argument CAN-RETURN-SWITCH-FRAME non-nil means that this
function will process a switch-frame event if the user switches frames
before typing anything. If the user switches frames in the middle of a
key sequence, or at the start of the sequence but CAN-RETURN-SWITCH-FRAME
is nil, then the event will be put off until after the current key sequence.
`read-key-sequence' checks `function-key-map' for function key
sequences, where they wouldn't conflict with ordinary bindings. See
`function-key-map' for more details.
The optional fifth argument CMD-LOOP, if non-nil, means
that this key sequence is being read by something that will
read commands one after another. It should be nil if the caller
will read just one key sequence. */)
(Lisp_Object prompt, Lisp_Object continue_echo, Lisp_Object dont_downcase_last, Lisp_Object can_return_switch_frame, Lisp_Object cmd_loop)
static Lisp_Object
read_key_sequence_vs (Lisp_Object prompt, Lisp_Object continue_echo,
Lisp_Object dont_downcase_last,
Lisp_Object can_return_switch_frame,
Lisp_Object cmd_loop, bool allow_string)
{
Lisp_Object keybuf[30];
register int i;
......@@ -9810,60 +9767,71 @@ will read just one key sequence. */)
QUIT;
}
UNGCPRO;
return unbind_to (count, make_event_array (i, keybuf));
return unbind_to (count,
((allow_string ? make_event_array : Fvector)
(i, keybuf)));
}
DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,
Sread_key_sequence_vector, 1, 5, 0,
doc: /* Like `read-key-sequence' but always return a vector. */)
(Lisp_Object prompt, Lisp_Object continue_echo, Lisp_Object dont_downcase_last, Lisp_Object can_return_switch_frame, Lisp_Object cmd_loop)
{
Lisp_Object keybuf[30];
register int i;
struct gcpro gcpro1;
ptrdiff_t count = SPECPDL_INDEX ();
DEFUN ("read-key-sequence", Fread_key_sequence, Sread_key_sequence, 1, 5, 0,
doc: /* Read a sequence of keystrokes and return as a string or vector.
The sequence is sufficient to specify a non-prefix command in the
current local and global maps.
if (!NILP (prompt))
CHECK_STRING (prompt);
QUIT;
First arg PROMPT is a prompt string. If nil, do not prompt specially.
Second (optional) arg CONTINUE-ECHO, if non-nil, means this key echos
as a continuation of the previous key.
specbind (Qinput_method_exit_on_first_char,
(NILP (cmd_loop) ? Qt : Qnil));
specbind (Qinput_method_use_echo_area,
(NILP (cmd_loop) ? Qt : Qnil));
The third (optional) arg DONT-DOWNCASE-LAST, if non-nil, means do not
convert the last event to lower case. (Normally any upper case event
is converted to lower case if the original event is undefined and the lower
case equivalent is defined.) A non-nil value is appropriate for reading
a key sequence to be defined.
memset (keybuf, 0, sizeof keybuf);
GCPRO1 (keybuf[0]);
gcpro1.nvars = (sizeof keybuf / sizeof (keybuf[0]));
A C-g typed while in this function is treated like any other character,
and `quit-flag' is not set.
if (NILP (continue_echo))
{
this_command_key_count = 0;
this_command_key_count_reset = 0;
this_single_command_key_start = 0;
}
If the key sequence starts with a mouse click, then the sequence is read
using the keymaps of the buffer of the window clicked in, not the buffer
of the selected window as normal.
#ifdef HAVE_WINDOW_SYSTEM
if (display_hourglass_p)
cancel_hourglass ();
#endif
`read-key-sequence' drops unbound button-down events, since you normally
only care about the click or drag events which follow them. If a drag
or multi-click event is unbound, but the corresponding click event would
be bound, `read-key-sequence' turns the event into a click event at the
drag's starting position. This means that you don't have to distinguish
between click and drag, double, or triple events unless you want to.
i = read_key_sequence (keybuf, (sizeof keybuf / sizeof (keybuf[0])),
prompt, ! NILP (dont_downcase_last),
! NILP (can_return_switch_frame), 0);
`read-key-sequence' prefixes mouse events on mode lines, the vertical
lines separating windows, and scroll bars with imaginary keys
`mode-line', `vertical-line', and `vertical-scroll-bar'.
#ifdef HAVE_WINDOW_SYSTEM
if (display_hourglass_p)
start_hourglass ();
#endif
Optional fourth argument CAN-RETURN-SWITCH-FRAME non-nil means that this
function will process a switch-frame event if the user switches frames
before typing anything. If the user switches frames in the middle of a
key sequence, or at the start of the sequence but CAN-RETURN-SWITCH-FRAME
is nil, then the event will be put off until after the current key sequence.
if (i == -1)
{
Vquit_flag = Qt;
QUIT;
}
UNGCPRO;
return unbind_to (count, Fvector (i, keybuf));
`read-key-sequence' checks `function-key-map' for function key
sequences, where they wouldn't conflict with ordinary bindings. See
`function-key-map' for more details.
The optional fifth argument CMD-LOOP, if non-nil, means
that this key sequence is being read by something that will
read commands one after another. It should be nil if the caller
will read just one key sequence. */)
(Lisp_Object prompt, Lisp_Object continue_echo, Lisp_Object dont_downcase_last, Lisp_Object can_return_switch_frame, Lisp_Object cmd_loop)
{
return read_key_sequence_vs (prompt, continue_echo, dont_downcase_last,
can_return_switch_frame, cmd_loop, true);
}
DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,
Sread_key_sequence_vector, 1, 5, 0,
doc: /* Like `read-key-sequence' but always return a vector. */)
(Lisp_Object prompt, Lisp_Object continue_echo, Lisp_Object dont_downcase_last, Lisp_Object can_return_switch_frame, Lisp_Object cmd_loop)
{
return read_key_sequence_vs (prompt, continue_echo, dont_downcase_last,
can_return_switch_frame, cmd_loop, false);
}
/* Return true if input events are pending. */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment