Refill some long/short copyright headers.
[bpt/emacs.git] / src / keyboard.c
CommitLineData
284f4730 1/* Keyboard and mouse input; editor command loop.
95df8112
GM
2
3Copyright (C) 1985-1989, 1993-1997, 1999-2011 Free Software Foundation, Inc.
284f4730
JB
4
5This file is part of GNU Emacs.
6
9ec0b715 7GNU Emacs is free software: you can redistribute it and/or modify
284f4730 8it under the terms of the GNU General Public License as published by
9ec0b715
GM
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
284f4730
JB
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9ec0b715 18along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
284f4730 19
18160b98 20#include <config.h>
68c45bf0 21#include <signal.h>
284f4730 22#include <stdio.h>
d7306fe6 23#include <setjmp.h>
9628b887 24#include "lisp.h"
284f4730
JB
25#include "termchar.h"
26#include "termopts.h"
428a555e 27#include "frame.h"
284f4730
JB
28#include "termhooks.h"
29#include "macros.h"
02639609 30#include "keyboard.h"
284f4730
JB
31#include "window.h"
32#include "commands.h"
33#include "buffer.h"
8b461910 34#include "character.h"
284f4730 35#include "disptab.h"
f4255cd1 36#include "dispextern.h"
e39da3d7 37#include "syntax.h"
497ba7a1 38#include "intervals.h"
bdb7aa47 39#include "keymap.h"
9ac0d9e0 40#include "blockinput.h"
e8886a1d 41#include "puresize.h"
8a9f5d3c
GM
42#include "systime.h"
43#include "atimer.h"
83380e65 44#include "process.h"
284f4730
JB
45#include <errno.h>
46
aa477689
JD
47#ifdef HAVE_GTK_AND_PTHREAD
48#include <pthread.h>
49#endif
80e4aa30
RS
50#ifdef MSDOS
51#include "msdos.h"
52#include <time.h>
53#else /* not MSDOS */
284f4730 54#include <sys/ioctl.h>
80e4aa30 55#endif /* not MSDOS */
284f4730 56
52baf19e 57#include "syssignal.h"
52baf19e 58
03cee6ae 59#include <sys/types.h>
03cee6ae 60#include <unistd.h>
e31d908f 61#include <fcntl.h>
e31d908f 62
c5e3b6c5
RS
63/* This is to get the definitions of the XK_ symbols. */
64#ifdef HAVE_X_WINDOWS
65#include "xterm.h"
66#endif
67
e98a93eb
GV
68#ifdef HAVE_NTGUI
69#include "w32term.h"
70#endif /* HAVE_NTGUI */
71
edfda783
AR
72#ifdef HAVE_NS
73#include "nsterm.h"
edfda783
AR
74#endif
75
9ac0d9e0
JB
76/* Variables for blockinput.h: */
77
78/* Non-zero if interrupt input is blocked right now. */
cf2db145 79volatile int interrupt_input_blocked;
9ac0d9e0
JB
80
81/* Nonzero means an input interrupt has arrived
82 during the current critical section. */
63927c41 83int interrupt_input_pending;
9ac0d9e0 84
ceb18827
CY
85/* This var should be (interrupt_input_pending || pending_atimers).
86 The QUIT macro checks this instead of interrupt_input_pending and
87 pending_atimers separately, to reduce code size. So, any code that
88 changes interrupt_input_pending or pending_atimers should update
89 this too. */
07a1e794 90#ifdef SYNC_INPUT
ceb18827 91int pending_signals;
07a1e794 92#endif
ceb18827 93
de11c1ea 94#define KBD_BUFFER_SIZE 4096
284f4730 95
c5fdd383
KH
96KBOARD *initial_kboard;
97KBOARD *current_kboard;
98KBOARD *all_kboards;
1e8bd3da 99int single_kboard;
612b78ef 100
284f4730 101/* Non-nil disable property on a command means
971e4c98
LT
102 do not execute it; call disabled-command-function's value instead. */
103Lisp_Object Qdisabled, Qdisabled_command_function;
284f4730 104
0721f230 105#define NUM_RECENT_KEYS (300)
284f4730
JB
106int recent_keys_index; /* Index for storing next element into recent_keys */
107int total_keys; /* Total number of elements stored into recent_keys */
0721f230 108Lisp_Object recent_keys; /* Vector holds the last NUM_RECENT_KEYS keystrokes */
284f4730 109
6569cc8d
JB
110/* Vector holding the key sequence that invoked the current command.
111 It is reused for each command, and it may be longer than the current
112 sequence; this_command_key_count indicates how many elements
113 actually mean something.
114 It's easier to staticpro a single Lisp_Object than an array. */
115Lisp_Object this_command_keys;
116int this_command_key_count;
284f4730 117
63020c46
RS
118/* 1 after calling Freset_this_command_lengths.
119 Usually it is 0. */
120int this_command_key_count_reset;
121
7d18f9ae
RS
122/* This vector is used as a buffer to record the events that were actually read
123 by read_key_sequence. */
124Lisp_Object raw_keybuf;
125int raw_keybuf_count;
126
127#define GROW_RAW_KEYBUF \
7189cad8 128 if (raw_keybuf_count == XVECTOR (raw_keybuf)->size) \
6bf377e2 129 raw_keybuf = larger_vector (raw_keybuf, raw_keybuf_count * 2, Qnil) \
7d18f9ae 130
6321824f
RS
131/* Number of elements of this_command_keys
132 that precede this key sequence. */
133int this_single_command_key_start;
134
71918b75
RS
135/* Record values of this_command_key_count and echo_length ()
136 before this command was read. */
137static int before_command_key_count;
138static int before_command_echo_length;
71918b75 139
284f4730 140/* For longjmp to where kbd input is being done. */
f0c1cc56 141
284f4730
JB
142static jmp_buf getcjmp;
143
144/* True while doing kbd input. */
145int waiting_for_input;
146
147/* True while displaying for echoing. Delays C-g throwing. */
985f9f66 148
c843d6c6 149int echoing;
284f4730 150
985f9f66
GM
151/* Non-null means we can start echoing at the next input pause even
152 though there is something in the echo area. */
153
154static struct kboard *ok_to_echo_at_next_pause;
155
59a84f8e
GM
156/* The kboard last echoing, or null for none. Reset to 0 in
157 cancel_echoing. If non-null, and a current echo area message
158 exists, and echo_message_buffer is eq to the current message
159 buffer, we know that the message comes from echo_kboard. */
985f9f66 160
f49aedfd 161struct kboard *echo_kboard;
1fc93d49 162
59a84f8e
GM
163/* The buffer used for echoing. Set in echo_now, reset in
164 cancel_echoing. */
165
c843d6c6 166Lisp_Object echo_message_buffer;
59a84f8e 167
80e4aa30 168/* Nonzero means C-g should cause immediate error-signal. */
284f4730
JB
169int immediate_quit;
170
284f4730
JB
171/* Character that causes a quit. Normally C-g.
172
173 If we are running on an ordinary terminal, this must be an ordinary
174 ASCII char, since we want to make it our interrupt character.
175
176 If we are not running on an ordinary terminal, it still needs to be
177 an ordinary ASCII char. This character needs to be recognized in
178 the input interrupt handler. At this point, the keystroke is
179 represented as a struct input_event, while the desired quit
180 character is specified as a lispy event. The mapping from struct
181 input_events to lispy events cannot run in an interrupt handler,
182 and the reverse mapping is difficult for anything but ASCII
183 keystrokes.
184
185 FOR THESE ELABORATE AND UNSATISFYING REASONS, quit_char must be an
186 ASCII character. */
187int quit_char;
188
284f4730
JB
189/* Current depth in recursive edits. */
190int command_loop_level;
191
cd21b839
JB
192/* If not Qnil, this is a switch-frame event which we decided to put
193 off until the end of a key sequence. This should be read as the
dbc4e1c1 194 next command input, after any unread_command_events.
8f805655
JB
195
196 read_key_sequence uses this to delay switch-frame events until the
197 end of the key sequence; Fread_char uses it to put off switch-frame
198 events until a non-ASCII event is acceptable as input. */
199Lisp_Object unread_switch_frame;
cd21b839 200
284f4730 201/* Last size recorded for a current buffer which is not a minibuffer. */
41118bd3 202static EMACS_INT last_non_minibuf_size;
284f4730 203
284f4730 204/* Total number of times read_char has returned. */
4abfba1f 205int num_input_events;
284f4730 206
c43b1734 207/* Value of num_nonmacro_input_events as of last auto save. */
284f4730
JB
208
209int last_auto_save;
210
d5eecefb
RS
211/* This is like Vthis_command, except that commands never set it. */
212Lisp_Object real_this_command;
284f4730 213
bb0e1d19 214/* The value of point when the last command was started. */
41118bd3 215EMACS_INT last_point_position;
b453f72e 216
047688cb
RS
217/* The buffer that was current when the last command was started. */
218Lisp_Object last_point_position_buffer;
219
bb0e1d19
RS
220/* The window that was selected when the last command was started. */
221Lisp_Object last_point_position_window;
222
4c52b668
KH
223/* The frame in which the last input event occurred, or Qmacro if the
224 last event came from a macro. We use this to determine when to
225 generate switch-frame events. This may be cleared by functions
226 like Fselect_frame, to make sure that a switch-frame event is
227 generated by the next character. */
228Lisp_Object internal_last_event_frame;
4c52b668 229
1113d9db
JB
230/* The timestamp of the last input event we received from the X server.
231 X Windows wants this for selection ownership. */
284f4730
JB
232unsigned long last_event_timestamp;
233
1c409d0b 234Lisp_Object Qx_set_selection, QPRIMARY, Qhandle_switch_frame;
9852377f 235
284f4730
JB
236Lisp_Object Qself_insert_command;
237Lisp_Object Qforward_char;
238Lisp_Object Qbackward_char;
e58aa385 239Lisp_Object Qundefined;
d925fb39 240Lisp_Object Qtimer_event_handler;
284f4730
JB
241
242/* read_key_sequence stores here the command definition of the
243 key sequence that it reads. */
244Lisp_Object read_key_sequence_cmd;
245
7d18f9ae
RS
246Lisp_Object Qinput_method_function;
247
5c4cc82a 248Lisp_Object Qdeactivate_mark;
86e5706b 249
48e416d4
RS
250Lisp_Object Qrecompute_lucid_menubar, Qactivate_menubar_hook;
251
cf24f894 252Lisp_Object Qecho_area_clear_hook;
cdb9d665 253
86e5706b 254/* Hooks to run before and after each command. */
29208e82
TT
255Lisp_Object Qpre_command_hook;
256Lisp_Object Qpost_command_hook;
257Lisp_Object Qcommand_hook_internal;
ac09dc1e 258
3ef14e46 259Lisp_Object Qdeferred_action_function;
8a792f3a 260
d5eecefb
RS
261Lisp_Object Qinput_method_exit_on_first_char;
262Lisp_Object Qinput_method_use_echo_area;
263
284f4730
JB
264/* File in which we write all commands we read. */
265FILE *dribble;
266
267/* Nonzero if input is available. */
268int input_pending;
269
beecf6a1 270/* Circular buffer for pre-read keyboard input. */
da8f7368 271
beecf6a1
KH
272static struct input_event kbd_buffer[KBD_BUFFER_SIZE];
273
beecf6a1
KH
274/* Pointer to next available character in kbd_buffer.
275 If kbd_fetch_ptr == kbd_store_ptr, the buffer is empty.
5cb6905d 276 This may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the
beecf6a1
KH
277 next available char is in kbd_buffer[0]. */
278static struct input_event *kbd_fetch_ptr;
279
280/* Pointer to next place to store character in kbd_buffer. This
281 may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the next
282 character should go in kbd_buffer[0]. */
7ee32cda 283static struct input_event * volatile kbd_store_ptr;
beecf6a1
KH
284
285/* The above pair of variables forms a "queue empty" flag. When we
286 enqueue a non-hook event, we increment kbd_store_ptr. When we
287 dequeue a non-hook event, we increment kbd_fetch_ptr. We say that
e0f24100 288 there is input available if the two pointers are not equal.
beecf6a1
KH
289
290 Why not just have a flag set and cleared by the enqueuing and
291 dequeuing functions? Such a flag could be screwed up by interrupts
292 at inopportune times. */
293
284f4730
JB
294/* Symbols to head events. */
295Lisp_Object Qmouse_movement;
3c370943 296Lisp_Object Qscroll_bar_movement;
cd21b839 297Lisp_Object Qswitch_frame;
bbdc2092 298Lisp_Object Qdelete_frame;
af17bd2b
KH
299Lisp_Object Qiconify_frame;
300Lisp_Object Qmake_frame_visible;
a697f886 301Lisp_Object Qselect_window;
7ee32cda 302Lisp_Object Qhelp_echo;
cd21b839 303
ae372f41 304#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
c22237f7
KS
305Lisp_Object Qmouse_fixup_help_message;
306#endif
307
284f4730
JB
308/* Symbols to denote kinds of events. */
309Lisp_Object Qfunction_key;
310Lisp_Object Qmouse_click;
9e2a2647 311#if defined (WINDOWSNT)
1161d367 312Lisp_Object Qlanguage_change;
07de30b9 313#endif
a24dc617 314Lisp_Object Qdrag_n_drop;
4ebc27a5 315Lisp_Object Qsave_session;
033b73e2
MA
316#ifdef HAVE_DBUS
317Lisp_Object Qdbus_event;
318#endif
637fa988
JD
319Lisp_Object Qconfig_changed_event;
320
284f4730 321/* Lisp_Object Qmouse_movement; - also an event header */
284f4730
JB
322
323/* Properties of event headers. */
324Lisp_Object Qevent_kind;
88cb0656 325Lisp_Object Qevent_symbol_elements;
284f4730 326
d2bd5189 327/* menu and tool bar item parts */
598a9fa7 328Lisp_Object Qmenu_enable;
74c1de23 329Lisp_Object QCenable, QCvisible, QChelp, QCfilter, QCkeys, QCkey_sequence;
d2bd5189 330Lisp_Object QCbutton, QCtoggle, QCradio, QClabel, QCvert_only;
598a9fa7 331
0a7f1fc0
JB
332/* An event header symbol HEAD may have a property named
333 Qevent_symbol_element_mask, which is of the form (BASE MODIFIERS);
334 BASE is the base, unmodified version of HEAD, and MODIFIERS is the
335 mask of modifiers applied to it. If present, this is used to help
336 speed up parse_modifiers. */
337Lisp_Object Qevent_symbol_element_mask;
338
339/* An unmodified event header BASE may have a property named
340 Qmodifier_cache, which is an alist mapping modifier masks onto
341 modified versions of BASE. If present, this helps speed up
342 apply_modifiers. */
343Lisp_Object Qmodifier_cache;
344
5ec75a55 345/* Symbols to use for parts of windows. */
284f4730 346Lisp_Object Qmode_line;
e5d77022 347Lisp_Object Qvertical_line;
3c370943 348Lisp_Object Qvertical_scroll_bar;
5ec75a55
RS
349Lisp_Object Qmenu_bar;
350
d3da34e0
JB
351Lisp_Object recursive_edit_unwind (Lisp_Object buffer), command_loop (void);
352Lisp_Object Fthis_command_keys (void);
03b4122a 353Lisp_Object Qextended_command_history;
d3da34e0 354EMACS_TIME timer_check (int do_it_now);
284f4730 355
d3da34e0
JB
356static void record_menu_key (Lisp_Object c);
357static int echo_length (void);
8eb4d8ef 358
f4eef8b4
RS
359Lisp_Object Qpolling_period;
360
87dd9b9b
RS
361/* Incremented whenever a timer is run. */
362int timers_run;
363
ffd56f97
JB
364/* Address (if not 0) of EMACS_TIME to zero out if a SIGIO interrupt
365 happens. */
366EMACS_TIME *input_available_clear_time;
284f4730
JB
367
368/* Nonzero means use SIGIO interrupts; zero means use CBREAK mode.
369 Default is 1 if INTERRUPT_INPUT is defined. */
370int interrupt_input;
371
372/* Nonzero while interrupts are temporarily deferred during redisplay. */
373int interrupts_deferred;
374
284f4730
JB
375/* Allow m- file to inhibit use of FIONREAD. */
376#ifdef BROKEN_FIONREAD
377#undef FIONREAD
378#endif
379
380/* We are unable to use interrupts if FIONREAD is not available,
381 so flush SIGIO so we won't try. */
fc7a70cc 382#if !defined (FIONREAD)
284f4730
JB
383#ifdef SIGIO
384#undef SIGIO
385#endif
386#endif
387
e98a93eb 388/* If we support a window system, turn on the code to poll periodically
34f04431 389 to detect C-g. It isn't actually used when doing interrupt input. */
742fbed7 390#if defined(HAVE_WINDOW_SYSTEM) && !defined(USE_ASYNC_EVENTS)
284f4730
JB
391#define POLL_FOR_INPUT
392#endif
adf5cb9c 393
fdbb67fe
GM
394/* The time when Emacs started being idle. */
395
396static EMACS_TIME timer_idleness_start_time;
397
3021d3a9
RS
398/* After Emacs stops being idle, this saves the last value
399 of timer_idleness_start_time from when it was idle. */
400
401static EMACS_TIME timer_last_idleness_start_time;
402
284f4730
JB
403\f
404/* Global variable declarations. */
405
a2d5fca0
JD
406/* Flags for readable_events. */
407#define READABLE_EVENTS_DO_TIMERS_NOW (1 << 0)
408#define READABLE_EVENTS_FILTER_EVENTS (1 << 1)
409#define READABLE_EVENTS_IGNORE_SQUEEZABLES (1 << 2)
410
284f4730 411/* Function for init_keyboard to call with no args (if nonzero). */
d2aa42f8 412void (*keyboard_init_hook) (void);
284f4730 413
f57e2426
J
414static int read_avail_input (int);
415static void get_input_pending (int *, int);
416static int readable_events (int);
417static Lisp_Object read_char_x_menu_prompt (int, Lisp_Object *,
418 Lisp_Object, int *);
f57e2426
J
419static Lisp_Object read_char_minibuf_menu_prompt (int, int,
420 Lisp_Object *);
421static Lisp_Object make_lispy_event (struct input_event *);
ae372f41 422#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
f57e2426
J
423static Lisp_Object make_lispy_movement (struct frame *, Lisp_Object,
424 enum scroll_bar_part,
425 Lisp_Object, Lisp_Object,
426 unsigned long);
514354e9 427#endif
41118bd3 428static Lisp_Object modify_event_symbol (EMACS_INT, unsigned, Lisp_Object,
24021b38 429 Lisp_Object, const char *const *,
f57e2426
J
430 Lisp_Object *, unsigned);
431static Lisp_Object make_lispy_switch_frame (Lisp_Object);
432static void save_getcjmp (jmp_buf);
f57e2426
J
433static void restore_getcjmp (jmp_buf);
434static Lisp_Object apply_modifiers (int, Lisp_Object);
435static void clear_event (struct input_event *);
436static Lisp_Object restore_kboard_configuration (Lisp_Object);
437static SIGTYPE interrupt_signal (int signalnum);
361358ea 438#ifdef SIGIO
cb768704 439static SIGTYPE input_available_signal (int signo);
361358ea 440#endif
f57e2426
J
441static void handle_interrupt (void);
442static void timer_start_idle (void);
443static void timer_stop_idle (void);
444static void timer_resume_idle (void);
445static SIGTYPE handle_user_signal (int);
446static char *find_user_signal_name (int);
447static int store_user_signal_events (void);
284f4730 448
29204e13 449\f
df0f2ba1 450/* Add C to the echo string, if echoing is going on.
284f4730
JB
451 C can be a character, which is printed prettily ("M-C-x" and all that
452 jazz), or a symbol, whose name is printed. */
453
dfcf069d 454void
d3da34e0 455echo_char (Lisp_Object c)
284f4730 456{
c5fdd383 457 if (current_kboard->immediate_echo)
284f4730 458 {
678e9d18
GM
459 int size = KEY_DESCRIPTION_SIZE + 100;
460 char *buffer = (char *) alloca (size);
461 char *ptr = buffer;
462 Lisp_Object echo_string;
284f4730 463
0d121f7c 464 echo_string = current_kboard->echo_string;
c60ee5e7 465
284f4730 466 /* If someone has passed us a composite event, use its head symbol. */
88cb0656 467 c = EVENT_HEAD (c);
284f4730 468
8c18cbfb 469 if (INTEGERP (c))
284f4730 470 {
678e9d18 471 ptr = push_key_description (XINT (c), ptr, 1);
284f4730 472 }
8c18cbfb 473 else if (SYMBOLP (c))
284f4730 474 {
1b049b51
KR
475 Lisp_Object name = SYMBOL_NAME (c);
476 int nbytes = SBYTES (name);
c60ee5e7 477
0d121f7c 478 if (size - (ptr - buffer) < nbytes)
678e9d18
GM
479 {
480 int offset = ptr - buffer;
0d121f7c 481 size = max (2 * size, size + nbytes);
678e9d18
GM
482 buffer = (char *) alloca (size);
483 ptr = buffer + offset;
484 }
485
1b049b51
KR
486 ptr += copy_text (SDATA (name), ptr, nbytes,
487 STRING_MULTIBYTE (name), 1);
284f4730
JB
488 }
489
0d121f7c 490 if ((NILP (echo_string) || SCHARS (echo_string) == 0)
ecb7cb34 491 && help_char_p (c))
284f4730 492 {
678e9d18
GM
493 const char *text = " (Type ? for further options)";
494 int len = strlen (text);
c60ee5e7 495
678e9d18
GM
496 if (size - (ptr - buffer) < len)
497 {
498 int offset = ptr - buffer;
499 size += len;
500 buffer = (char *) alloca (size);
501 ptr = buffer + offset;
502 }
503
72af86bd 504 memcpy (ptr, text, len);
678e9d18 505 ptr += len;
284f4730
JB
506 }
507
0d121f7c
GM
508 /* Replace a dash from echo_dash with a space, otherwise
509 add a space at the end as a separator between keys. */
678e9d18 510 if (STRINGP (echo_string)
2ff4d3d9 511 && SCHARS (echo_string) > 1)
0d121f7c 512 {
2ff4d3d9
RS
513 Lisp_Object last_char, prev_char, idx;
514
515 idx = make_number (SCHARS (echo_string) - 2);
516 prev_char = Faref (echo_string, idx);
0d121f7c
GM
517
518 idx = make_number (SCHARS (echo_string) - 1);
519 last_char = Faref (echo_string, idx);
520
2ff4d3d9
RS
521 /* We test PREV_CHAR to make sure this isn't the echoing
522 of a minus-sign. */
523 if (XINT (last_char) == '-' && XINT (prev_char) != ' ')
0d121f7c
GM
524 Faset (echo_string, idx, make_number (' '));
525 else
526 echo_string = concat2 (echo_string, build_string (" "));
527 }
c3be81c7
RS
528 else if (STRINGP (echo_string))
529 echo_string = concat2 (echo_string, build_string (" "));
678e9d18
GM
530
531 current_kboard->echo_string
532 = concat2 (echo_string, make_string (buffer, ptr - buffer));
284f4730 533
3dbd9ee4 534 echo_now ();
284f4730
JB
535 }
536}
537
538/* Temporarily add a dash to the end of the echo string if it's not
539 empty, so that it serves as a mini-prompt for the very next character. */
540
dfcf069d 541void
d3da34e0 542echo_dash (void)
284f4730 543{
678e9d18
GM
544 /* Do nothing if not echoing at all. */
545 if (NILP (current_kboard->echo_string))
546 return;
547
51b403bd
CY
548 if (this_command_key_count == 0)
549 return;
550
c5fdd383 551 if (!current_kboard->immediate_echo
0d121f7c 552 && SCHARS (current_kboard->echo_string) == 0)
284f4730 553 return;
c60ee5e7 554
7a80a6f6 555 /* Do nothing if we just printed a prompt. */
c5fdd383 556 if (current_kboard->echo_after_prompt
0d121f7c 557 == SCHARS (current_kboard->echo_string))
4bafa972 558 return;
c60ee5e7 559
366511da
MB
560 /* Do nothing if we have already put a dash at the end. */
561 if (SCHARS (current_kboard->echo_string) > 1)
562 {
c3be81c7 563 Lisp_Object last_char, prev_char, idx;
366511da 564
c3be81c7
RS
565 idx = make_number (SCHARS (current_kboard->echo_string) - 2);
566 prev_char = Faref (current_kboard->echo_string, idx);
366511da 567
c3be81c7
RS
568 idx = make_number (SCHARS (current_kboard->echo_string) - 1);
569 last_char = Faref (current_kboard->echo_string, idx);
366511da 570
c3be81c7
RS
571 if (XINT (last_char) == '-' && XINT (prev_char) != ' ')
572 return;
366511da
MB
573 }
574
284f4730
JB
575 /* Put a dash at the end of the buffer temporarily,
576 but make it go away when the next character is added. */
678e9d18
GM
577 current_kboard->echo_string = concat2 (current_kboard->echo_string,
578 build_string ("-"));
3dbd9ee4 579 echo_now ();
284f4730
JB
580}
581
582/* Display the current echo string, and begin echoing if not already
583 doing so. */
584
07a59269 585void
d3da34e0 586echo_now (void)
284f4730 587{
c5fdd383 588 if (!current_kboard->immediate_echo)
284f4730
JB
589 {
590 int i;
c5fdd383 591 current_kboard->immediate_echo = 1;
284f4730
JB
592
593 for (i = 0; i < this_command_key_count; i++)
d0a57728
RS
594 {
595 Lisp_Object c;
22b94eeb
RS
596
597 /* Set before_command_echo_length to the value that would
598 have been saved before the start of this subcommand in
599 command_loop_1, if we had already been echoing then. */
600 if (i == this_single_command_key_start)
601 before_command_echo_length = echo_length ();
602
d0a57728
RS
603 c = XVECTOR (this_command_keys)->contents[i];
604 if (! (EVENT_HAS_PARAMETERS (c)
605 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_movement)))
606 echo_char (c);
607 }
22b94eeb
RS
608
609 /* Set before_command_echo_length to the value that would
610 have been saved before the start of this subcommand in
611 command_loop_1, if we had already been echoing then. */
612 if (this_command_key_count == this_single_command_key_start)
613 before_command_echo_length = echo_length ();
614
615 /* Put a dash at the end to invite the user to type more. */
284f4730
JB
616 echo_dash ();
617 }
618
619 echoing = 1;
678e9d18 620 message3_nolog (current_kboard->echo_string,
0d121f7c 621 SBYTES (current_kboard->echo_string),
d5db4077 622 STRING_MULTIBYTE (current_kboard->echo_string));
284f4730
JB
623 echoing = 0;
624
59a84f8e
GM
625 /* Record in what buffer we echoed, and from which kboard. */
626 echo_message_buffer = echo_area_buffer[0];
627 echo_kboard = current_kboard;
628
284f4730
JB
629 if (waiting_for_input && !NILP (Vquit_flag))
630 quit_throw_to_read_char ();
631}
632
633/* Turn off echoing, for the start of a new command. */
634
dfcf069d 635void
d3da34e0 636cancel_echoing (void)
284f4730 637{
c5fdd383 638 current_kboard->immediate_echo = 0;
c5fdd383 639 current_kboard->echo_after_prompt = -1;
678e9d18 640 current_kboard->echo_string = Qnil;
59a84f8e
GM
641 ok_to_echo_at_next_pause = NULL;
642 echo_kboard = NULL;
643 echo_message_buffer = Qnil;
284f4730
JB
644}
645
646/* Return the length of the current echo string. */
647
648static int
d3da34e0 649echo_length (void)
284f4730 650{
678e9d18 651 return (STRINGP (current_kboard->echo_string)
0d121f7c 652 ? SCHARS (current_kboard->echo_string)
678e9d18 653 : 0);
284f4730
JB
654}
655
656/* Truncate the current echo message to its first LEN chars.
657 This and echo_char get used by read_key_sequence when the user
ff11dfa1 658 switches frames while entering a key sequence. */
284f4730
JB
659
660static void
41118bd3 661echo_truncate (EMACS_INT nchars)
678e9d18
GM
662{
663 if (STRINGP (current_kboard->echo_string))
664 current_kboard->echo_string
665 = Fsubstring (current_kboard->echo_string,
666 make_number (0), make_number (nchars));
667 truncate_echo_area (nchars);
284f4730
JB
668}
669
670\f
671/* Functions for manipulating this_command_keys. */
672static void
d3da34e0 673add_command_key (Lisp_Object key)
284f4730 674{
22b94eeb
RS
675#if 0 /* Not needed after we made Freset_this_command_lengths
676 do the job immediately. */
71918b75
RS
677 /* If reset-this-command-length was called recently, obey it now.
678 See the doc string of that function for an explanation of why. */
679 if (before_command_restore_flag)
680 {
681 this_command_key_count = before_command_key_count_1;
6321824f
RS
682 if (this_command_key_count < this_single_command_key_start)
683 this_single_command_key_start = this_command_key_count;
71918b75
RS
684 echo_truncate (before_command_echo_length_1);
685 before_command_restore_flag = 0;
686 }
22b94eeb 687#endif
71918b75 688
f4e05d97
GM
689 if (this_command_key_count >= ASIZE (this_command_keys))
690 this_command_keys = larger_vector (this_command_keys,
691 2 * ASIZE (this_command_keys),
692 Qnil);
6569cc8d 693
b1ebcadb 694 ASET (this_command_keys, this_command_key_count, key);
f4e05d97 695 ++this_command_key_count;
284f4730 696}
f4e05d97 697
284f4730
JB
698\f
699Lisp_Object
d3da34e0 700recursive_edit_1 (void)
284f4730 701{
aed13378 702 int count = SPECPDL_INDEX ();
284f4730
JB
703 Lisp_Object val;
704
705 if (command_loop_level > 0)
706 {
707 specbind (Qstandard_output, Qt);
708 specbind (Qstandard_input, Qt);
709 }
710
d148e14d 711#ifdef HAVE_WINDOW_SYSTEM
526a058f 712 /* The command loop has started an hourglass timer, so we have to
84265027 713 cancel it here, otherwise it will fire because the recursive edit
d8e2d5ba
PJ
714 can take some time. Do not check for display_hourglass_p here,
715 because it could already be nil. */
526a058f 716 cancel_hourglass ();
84265027
GM
717#endif
718
980a2d69
GM
719 /* This function may have been called from a debugger called from
720 within redisplay, for instance by Edebugging a function called
721 from fontification-functions. We want to allow redisplay in
722 the debugging session.
723
724 The recursive edit is left with a `(throw exit ...)'. The `exit'
725 tag is not caught anywhere in redisplay, i.e. when we leave the
726 recursive edit, the original redisplay leading to the recursive
727 edit will be unwound. The outcome should therefore be safe. */
728 specbind (Qinhibit_redisplay, Qnil);
729 redisplaying_p = 0;
730
284f4730
JB
731 val = command_loop ();
732 if (EQ (val, Qt))
733 Fsignal (Qquit, Qnil);
cb252880
RS
734 /* Handle throw from read_minibuf when using minibuffer
735 while it's active but we're in another window. */
736 if (STRINGP (val))
43cae48c 737 xsignal1 (Qerror, val);
284f4730 738
cb5df6ae 739 return unbind_to (count, Qnil);
284f4730
JB
740}
741
742/* When an auto-save happens, record the "time", and don't do again soon. */
5846638c 743
07a59269 744void
d3da34e0 745record_auto_save (void)
284f4730 746{
c43b1734 747 last_auto_save = num_nonmacro_input_events;
284f4730 748}
5846638c
RS
749
750/* Make an auto save happen as soon as possible at command level. */
751
dfcf069d 752void
d3da34e0 753force_auto_save_soon (void)
5846638c
RS
754{
755 last_auto_save = - auto_save_interval - 1;
241ceaf7
RS
756
757 record_asynch_buffer_change ();
5846638c 758}
284f4730 759\f
284f4730 760DEFUN ("recursive-edit", Frecursive_edit, Srecursive_edit, 0, 0, "",
4707d2d0
PJ
761 doc: /* Invoke the editor command loop recursively.
762To get out of the recursive edit, a command can do `(throw 'exit nil)';
763that tells this function to return.
6e604a9b 764Alternatively, `(throw 'exit t)' makes this function signal an error.
4707d2d0 765This function is called by the editor initialization to begin editing. */)
5842a27b 766 (void)
284f4730 767{
aed13378 768 int count = SPECPDL_INDEX ();
9ce50b1e 769 Lisp_Object buffer;
284f4730 770
96edd5d4
KS
771 /* If we enter while input is blocked, don't lock up here.
772 This may happen through the debugger during redisplay. */
773 if (INPUT_BLOCKED_P)
774 return Qnil;
775
284f4730
JB
776 command_loop_level++;
777 update_mode_lines = 1;
778
9ce50b1e
GM
779 if (command_loop_level
780 && current_buffer != XBUFFER (XWINDOW (selected_window)->buffer))
781 buffer = Fcurrent_buffer ();
782 else
783 buffer = Qnil;
784
785 /* If we leave recursive_edit_1 below with a `throw' for instance,
786 like it is done in the splash screen display, we have to
787 make sure that we restore single_kboard as command_loop_1
788 would have done if it were left normally. */
b3e6f69c
KL
789 if (command_loop_level > 0)
790 temporarily_switch_to_single_kboard (SELECTED_FRAME ());
256c9c3a 791 record_unwind_protect (recursive_edit_unwind, buffer);
9ce50b1e 792
284f4730
JB
793 recursive_edit_1 ();
794 return unbind_to (count, Qnil);
795}
796
797Lisp_Object
d3da34e0 798recursive_edit_unwind (Lisp_Object buffer)
284f4730 799{
256c9c3a
KL
800 if (BUFFERP (buffer))
801 Fset_buffer (buffer);
c60ee5e7 802
284f4730
JB
803 command_loop_level--;
804 update_mode_lines = 1;
805 return Qnil;
806}
9ce50b1e 807
284f4730 808\f
b3e6f69c
KL
809#if 0 /* These two functions are now replaced with
810 temporarily_switch_to_single_kboard. */
604ccd1d 811static void
1e8bd3da 812any_kboard_state ()
604ccd1d 813{
1e8bd3da
RS
814#if 0 /* Theory: if there's anything in Vunread_command_events,
815 it will right away be read by read_key_sequence,
816 and then if we do switch KBOARDS, it will go into the side
817 queue then. So we don't need to do anything special here -- rms. */
604ccd1d 818 if (CONSP (Vunread_command_events))
4524b161 819 {
c5fdd383
KH
820 current_kboard->kbd_queue
821 = nconc2 (Vunread_command_events, current_kboard->kbd_queue);
822 current_kboard->kbd_queue_has_data = 1;
4524b161 823 }
604ccd1d 824 Vunread_command_events = Qnil;
1e8bd3da
RS
825#endif
826 single_kboard = 0;
604ccd1d 827}
1e8bd3da
RS
828
829/* Switch to the single-kboard state, making current_kboard
830 the only KBOARD from which further input is accepted. */
831
832void
833single_kboard_state ()
834{
1e8bd3da 835 single_kboard = 1;
1e8bd3da 836}
b3e6f69c 837#endif
1e8bd3da 838
0c1c1b93
RS
839/* If we're in single_kboard state for kboard KBOARD,
840 get out of it. */
841
842void
d3da34e0 843not_single_kboard_state (KBOARD *kboard)
0c1c1b93
RS
844{
845 if (kboard == current_kboard)
846 single_kboard = 0;
847}
848
1e8bd3da
RS
849/* Maintain a stack of kboards, so other parts of Emacs
850 can switch temporarily to the kboard of a given frame
851 and then revert to the previous status. */
852
853struct kboard_stack
854{
855 KBOARD *kboard;
856 struct kboard_stack *next;
857};
858
859static struct kboard_stack *kboard_stack;
860
861void
d3da34e0 862push_kboard (struct kboard *k)
1e8bd3da
RS
863{
864 struct kboard_stack *p
865 = (struct kboard_stack *) xmalloc (sizeof (struct kboard_stack));
866
867 p->next = kboard_stack;
868 p->kboard = current_kboard;
869 kboard_stack = p;
870
256c9c3a 871 current_kboard = k;
1e8bd3da
RS
872}
873
874void
d3da34e0 875pop_kboard (void)
1e8bd3da 876{
6ed8eeff 877 struct terminal *t;
1e8bd3da 878 struct kboard_stack *p = kboard_stack;
24f9525b 879 int found = 0;
6ed8eeff 880 for (t = terminal_list; t; t = t->next_terminal)
3fb8e5d7 881 {
6ed8eeff 882 if (t->kboard == p->kboard)
3fb8e5d7
KL
883 {
884 current_kboard = p->kboard;
24f9525b 885 found = 1;
3fb8e5d7
KL
886 break;
887 }
888 }
24f9525b 889 if (!found)
3fb8e5d7 890 {
6ed8eeff 891 /* The terminal we remembered has been deleted. */
3fb8e5d7 892 current_kboard = FRAME_KBOARD (SELECTED_FRAME ());
b3e6f69c 893 single_kboard = 0;
3fb8e5d7 894 }
1e8bd3da
RS
895 kboard_stack = p->next;
896 xfree (p);
897}
256c9c3a 898
b3e6f69c
KL
899/* Switch to single_kboard mode, making current_kboard the only KBOARD
900 from which further input is accepted. If F is non-nil, set its
901 KBOARD as the current keyboard.
902
903 This function uses record_unwind_protect to return to the previous
904 state later.
905
906 If Emacs is already in single_kboard mode, and F's keyboard is
907 locked, then this function will throw an errow. */
256c9c3a
KL
908
909void
d3da34e0 910temporarily_switch_to_single_kboard (struct frame *f)
256c9c3a 911{
256c9c3a 912 int was_locked = single_kboard;
24f9525b
KL
913 if (was_locked)
914 {
b3e6f69c
KL
915 if (f != NULL && FRAME_KBOARD (f) != current_kboard)
916 /* We can not switch keyboards while in single_kboard mode.
251bc578
KL
917 In rare cases, Lisp code may call `recursive-edit' (or
918 `read-minibuffer' or `y-or-n-p') after it switched to a
919 locked frame. For example, this is likely to happen
920 when server.el connects to a new terminal while Emacs is in
921 single_kboard mode. It is best to throw an error instead
922 of presenting the user with a frozen screen. */
b3e6f69c
KL
923 error ("Terminal %d is locked, cannot read from it",
924 FRAME_TERMINAL (f)->id);
24f9525b 925 else
b3e6f69c
KL
926 /* This call is unnecessary, but helps
927 `restore_kboard_configuration' discover if somebody changed
928 `current_kboard' behind our back. */
24f9525b
KL
929 push_kboard (current_kboard);
930 }
b3e6f69c
KL
931 else if (f != NULL)
932 current_kboard = FRAME_KBOARD (f);
933 single_kboard = 1;
256c9c3a
KL
934 record_unwind_protect (restore_kboard_configuration,
935 (was_locked ? Qt : Qnil));
256c9c3a
KL
936}
937
b3e6f69c 938#if 0 /* This function is not needed anymore. */
256c9c3a
KL
939void
940record_single_kboard_state ()
941{
24f9525b
KL
942 if (single_kboard)
943 push_kboard (current_kboard);
256c9c3a
KL
944 record_unwind_protect (restore_kboard_configuration,
945 (single_kboard ? Qt : Qnil));
946}
b3e6f69c 947#endif
256c9c3a
KL
948
949static Lisp_Object
d3da34e0 950restore_kboard_configuration (Lisp_Object was_locked)
256c9c3a 951{
256c9c3a 952 if (NILP (was_locked))
b3e6f69c 953 single_kboard = 0;
256c9c3a 954 else
24f9525b 955 {
b3e6f69c
KL
956 struct kboard *prev = current_kboard;
957 single_kboard = 1;
24f9525b 958 pop_kboard ();
b3e6f69c
KL
959 /* The pop should not change the kboard. */
960 if (single_kboard && current_kboard != prev)
961 abort ();
24f9525b 962 }
256c9c3a
KL
963 return Qnil;
964}
e2dc7ae5 965
1e8bd3da
RS
966\f
967/* Handle errors that are not handled at inner levels
968 by printing an error message and returning to the editor command loop. */
604ccd1d 969
284f4730 970Lisp_Object
d3da34e0 971cmd_error (Lisp_Object data)
a1341f75 972{
a9f16aa9 973 Lisp_Object old_level, old_length;
e881d8b2
RS
974 char macroerror[50];
975
d148e14d 976#ifdef HAVE_WINDOW_SYSTEM
160552c5
RS
977 if (display_hourglass_p)
978 cancel_hourglass ();
979#endif
980
649d952d 981 if (!NILP (executing_kbd_macro))
e881d8b2 982 {
649d952d 983 if (executing_kbd_macro_iterations == 1)
e881d8b2
RS
984 sprintf (macroerror, "After 1 kbd macro iteration: ");
985 else
986 sprintf (macroerror, "After %d kbd macro iterations: ",
649d952d 987 executing_kbd_macro_iterations);
e881d8b2
RS
988 }
989 else
990 *macroerror = 0;
a9f16aa9 991
a1341f75
RS
992 Vstandard_output = Qt;
993 Vstandard_input = Qt;
ce0d2858 994 Vexecuting_kbd_macro = Qnil;
649d952d 995 executing_kbd_macro = Qnil;
d8bcf58e 996 current_kboard->Vprefix_arg = Qnil;
75045dcb 997 current_kboard->Vlast_prefix_arg = Qnil;
df0f2ba1 998 cancel_echoing ();
a9f16aa9
KH
999
1000 /* Avoid unquittable loop if data contains a circular list. */
1001 old_level = Vprint_level;
1002 old_length = Vprint_length;
0c04a67e
RS
1003 XSETFASTINT (Vprint_level, 10);
1004 XSETFASTINT (Vprint_length, 10);
e881d8b2 1005 cmd_error_internal (data, macroerror);
a9f16aa9
KH
1006 Vprint_level = old_level;
1007 Vprint_length = old_length;
a1341f75
RS
1008
1009 Vquit_flag = Qnil;
1010
1011 Vinhibit_quit = Qnil;
b3e6f69c 1012#if 0 /* This shouldn't be necessary anymore. --lorentey */
e3ee34f0
RS
1013 if (command_loop_level == 0 && minibuf_level == 0)
1014 any_kboard_state ();
ff4b06d3 1015#endif
a1341f75
RS
1016
1017 return make_number (0);
1018}
1019
301738ed
RS
1020/* Take actions on handling an error. DATA is the data that describes
1021 the error.
1022
1023 CONTEXT is a C-string containing ASCII characters only which
1024 describes the context in which the error happened. If we need to
1025 generalize CONTEXT to allow multibyte characters, make it a Lisp
1026 string. */
1027
07a59269 1028void
a8fe7202 1029cmd_error_internal (Lisp_Object data, const char *context)
284f4730 1030{
788f89eb 1031 struct frame *sf = SELECTED_FRAME ();
284f4730 1032
04d8c47d
RS
1033 /* The immediate context is not interesting for Quits,
1034 since they are asyncronous. */
1035 if (EQ (XCAR (data), Qquit))
1036 Vsignaling_function = Qnil;
1037
284f4730
JB
1038 Vquit_flag = Qnil;
1039 Vinhibit_quit = Qt;
284f4730 1040
04d8c47d
RS
1041 /* Use user's specified output function if any. */
1042 if (!NILP (Vcommand_error_function))
1043 call3 (Vcommand_error_function, data,
fcd69a29 1044 context ? build_string (context) : empty_unibyte_string,
04d8c47d 1045 Vsignaling_function);
ff11dfa1 1046 /* If the window system or terminal frame hasn't been initialized
04d8c47d
RS
1047 yet, or we're not interactive, write the message to stderr and exit. */
1048 else if (!sf->glyphs_initialized_p
0dad7c6f
JR
1049 /* The initial frame is a special non-displaying frame. It
1050 will be current in daemon mode when there are no frames
1051 to display, and in non-daemon mode before the real frame
1052 has finished initializing. If an error is thrown in the
1053 latter case while creating the frame, then the frame
1054 will never be displayed, so the safest thing to do is
1055 write to stderr and quit. In daemon mode, there are
1056 many other potential errors that do not prevent frames
1057 from being created, so continuing as normal is better in
1058 that case. */
1059 || (!IS_DAEMON && FRAME_INITIAL_P (sf))
04d8c47d
RS
1060 || noninteractive)
1061 {
1062 print_error_message (data, Qexternal_debugging_output,
1063 context, Vsignaling_function);
1064 Fterpri (Qexternal_debugging_output);
1065 Fkill_emacs (make_number (-1));
7ee32cda 1066 }
284f4730
JB
1067 else
1068 {
04d8c47d 1069 clear_message (1, 0);
284f4730 1070 Fdiscard_input ();
dc4854ce 1071 message_log_maybe_newline ();
284f4730 1072 bitch_at_user ();
c60ee5e7 1073
04d8c47d
RS
1074 print_error_message (data, Qt, context, Vsignaling_function);
1075 }
a1341f75 1076
dc4854ce 1077 Vsignaling_function = Qnil;
284f4730
JB
1078}
1079\f
d3da34e0
JB
1080Lisp_Object command_loop_1 (void);
1081Lisp_Object command_loop_2 (Lisp_Object);
1082Lisp_Object top_level_1 (Lisp_Object);
284f4730
JB
1083
1084/* Entry to editor-command-loop.
1085 This level has the catches for exiting/returning to editor command loop.
1086 It returns nil to exit recursive edit, t to abort it. */
1087
1088Lisp_Object
d3da34e0 1089command_loop (void)
284f4730
JB
1090{
1091 if (command_loop_level > 0 || minibuf_level > 0)
1092 {
07ba902e
RS
1093 Lisp_Object val;
1094 val = internal_catch (Qexit, command_loop_2, Qnil);
649d952d 1095 executing_kbd_macro = Qnil;
68c46464 1096 return val;
284f4730
JB
1097 }
1098 else
1099 while (1)
1100 {
1101 internal_catch (Qtop_level, top_level_1, Qnil);
b3e6f69c 1102#if 0 /* This shouldn't be necessary anymore. --lorentey */
c98e2d50
KL
1103 /* Reset single_kboard in case top-level set it while
1104 evaluating an -f option, or we are stuck there for some
1105 other reason. */
1106 any_kboard_state ();
b3e6f69c 1107#endif
284f4730 1108 internal_catch (Qtop_level, command_loop_2, Qnil);
649d952d 1109 executing_kbd_macro = Qnil;
df0f2ba1 1110
284f4730
JB
1111 /* End of file in -batch run causes exit here. */
1112 if (noninteractive)
1113 Fkill_emacs (Qt);
1114 }
1115}
1116
1117/* Here we catch errors in execution of commands within the
1118 editing loop, and reenter the editing loop.
1119 When there is an error, cmd_error runs and returns a non-nil
27fd22dc 1120 value to us. A value of nil means that command_loop_1 itself
284f4730
JB
1121 returned due to end of file (or end of kbd macro). */
1122
1123Lisp_Object
d3da34e0 1124command_loop_2 (Lisp_Object ignore)
284f4730
JB
1125{
1126 register Lisp_Object val;
1127
1128 do
1129 val = internal_condition_case (command_loop_1, Qerror, cmd_error);
1130 while (!NILP (val));
1131
1132 return Qnil;
1133}
1134
1135Lisp_Object
d3da34e0 1136top_level_2 (void)
284f4730
JB
1137{
1138 return Feval (Vtop_level);
1139}
1140
1141Lisp_Object
d3da34e0 1142top_level_1 (Lisp_Object ignore)
284f4730
JB
1143{
1144 /* On entry to the outer level, run the startup file */
1145 if (!NILP (Vtop_level))
1146 internal_condition_case (top_level_2, Qerror, cmd_error);
1147 else if (!NILP (Vpurify_flag))
1148 message ("Bare impure Emacs (standard Lisp code not loaded)");
1149 else
1150 message ("Bare Emacs (standard Lisp code not loaded)");
1151 return Qnil;
1152}
1153
1154DEFUN ("top-level", Ftop_level, Stop_level, 0, 0, "",
9252e0c0
CY
1155 doc: /* Exit all recursive editing levels.
1156This also exits all active minibuffers. */)
5842a27b 1157 (void)
284f4730 1158{
d148e14d 1159#ifdef HAVE_WINDOW_SYSTEM
526a058f
GM
1160 if (display_hourglass_p)
1161 cancel_hourglass ();
2c9cf2c8 1162#endif
96edd5d4 1163
a25e44b2
JD
1164 /* Unblock input if we enter with input blocked. This may happen if
1165 redisplay traps e.g. during tool-bar update with input blocked. */
1166 while (INPUT_BLOCKED_P)
1167 UNBLOCK_INPUT;
1168
977105dc 1169 Fthrow (Qtop_level, Qnil);
284f4730
JB
1170}
1171
1172DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, "",
4707d2d0 1173 doc: /* Exit from the innermost recursive edit or minibuffer. */)
5842a27b 1174 (void)
284f4730
JB
1175{
1176 if (command_loop_level > 0 || minibuf_level > 0)
1177 Fthrow (Qexit, Qnil);
1178
1179 error ("No recursive edit is in progress");
1180}
1181
1182DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 0, 0, "",
4707d2d0 1183 doc: /* Abort the command that requested this recursive edit or minibuffer input. */)
5842a27b 1184 (void)
284f4730
JB
1185{
1186 if (command_loop_level > 0 || minibuf_level > 0)
1187 Fthrow (Qexit, Qt);
1188
1189 error ("No recursive edit is in progress");
1190}
1191\f
ae372f41 1192#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
c5b76d6c
CY
1193
1194/* Restore mouse tracking enablement. See Ftrack_mouse for the only use
1195 of this function. */
1196
1197static Lisp_Object
d3da34e0 1198tracking_off (Lisp_Object old_value)
c5b76d6c
CY
1199{
1200 do_mouse_tracking = old_value;
1201 if (NILP (old_value))
1202 {
1203 /* Redisplay may have been preempted because there was input
1204 available, and it assumes it will be called again after the
1205 input has been processed. If the only input available was
1206 the sort that we have just disabled, then we need to call
1207 redisplay. */
1208 if (!readable_events (READABLE_EVENTS_DO_TIMERS_NOW))
1209 {
1210 redisplay_preserve_echo_area (6);
1211 get_input_pending (&input_pending,
1212 READABLE_EVENTS_DO_TIMERS_NOW);
1213 }
1214 }
1215 return Qnil;
1216}
1217
1218DEFUN ("track-mouse", Ftrack_mouse, Strack_mouse, 0, UNEVALLED, 0,
1219 doc: /* Evaluate BODY with mouse movement events enabled.
1220Within a `track-mouse' form, mouse motion generates input events that
1221you can read with `read-event'.
1222Normally, mouse motion is ignored.
d514369d 1223usage: (track-mouse BODY...) */)
5842a27b 1224 (Lisp_Object args)
c5b76d6c
CY
1225{
1226 int count = SPECPDL_INDEX ();
1227 Lisp_Object val;
1228
1229 record_unwind_protect (tracking_off, do_mouse_tracking);
1230
1231 do_mouse_tracking = Qt;
1232
1233 val = Fprogn (args);
1234 return unbind_to (count, val);
1235}
1236
1237/* If mouse has moved on some frame, return one of those frames.
3b0cdcef
KS
1238
1239 Return 0 otherwise.
1240
1241 If ignore_mouse_drag_p is non-zero, ignore (implicit) mouse movement
1242 after resizing the tool-bar window. */
1243
1244int ignore_mouse_drag_p;
c5b76d6c
CY
1245
1246static FRAME_PTR
d3da34e0 1247some_mouse_moved (void)
c5b76d6c
CY
1248{
1249 Lisp_Object tail, frame;
1250
3b0cdcef
KS
1251 if (ignore_mouse_drag_p)
1252 {
e2bb07db 1253 /* ignore_mouse_drag_p = 0; */
3b0cdcef
KS
1254 return 0;
1255 }
1256
c5b76d6c
CY
1257 FOR_EACH_FRAME (tail, frame)
1258 {
1259 if (XFRAME (frame)->mouse_moved)
1260 return XFRAME (frame);
1261 }
1262
1263 return 0;
1264}
1265
ae372f41 1266#endif /* HAVE_MOUSE || HAVE_GPM */
c5b76d6c 1267\f
284f4730
JB
1268/* This is the actual command reading loop,
1269 sans error-handling encapsulation. */
1270
f57e2426
J
1271static int read_key_sequence (Lisp_Object *, int, Lisp_Object,
1272 int, int, int);
1273void safe_run_hooks (Lisp_Object);
41118bd3 1274static void adjust_point_for_property (EMACS_INT, int);
284f4730 1275
0af912f0
JD
1276/* Cancel hourglass from protect_unwind.
1277 ARG is not used. */
d148e14d 1278#ifdef HAVE_WINDOW_SYSTEM
0af912f0 1279static Lisp_Object
d3da34e0 1280cancel_hourglass_unwind (Lisp_Object arg)
0af912f0
JD
1281{
1282 cancel_hourglass ();
3a0ae1f3 1283 return Qnil;
0af912f0 1284}
bb8db7e1 1285#endif
0af912f0 1286
b819f760
SM
1287/* FIXME: This is wrong rather than test window-system, we should call
1288 a new set-selection, which will then dispatch to x-set-selection, or
1289 tty-set-selection, or w32-set-selection, ... */
1290EXFUN (Fwindow_system, 1);
1291
284f4730 1292Lisp_Object
d3da34e0 1293command_loop_1 (void)
284f4730 1294{
03cee6ae 1295 Lisp_Object cmd;
284f4730
JB
1296 Lisp_Object keybuf[30];
1297 int i;
a53fe666 1298 int prev_modiff = 0;
8c907a56 1299 struct buffer *prev_buffer = NULL;
b3e6f69c 1300#if 0 /* This shouldn't be necessary anymore. --lorentey */
1e8bd3da 1301 int was_locked = single_kboard;
033b73e2 1302#endif
80d4c824 1303 int already_adjusted = 0;
284f4730 1304
d9b641bb 1305 current_kboard->Vprefix_arg = Qnil;
75045dcb 1306 current_kboard->Vlast_prefix_arg = Qnil;
86e5706b 1307 Vdeactivate_mark = Qnil;
284f4730 1308 waiting_for_input = 0;
df0f2ba1 1309 cancel_echoing ();
284f4730 1310
284f4730 1311 this_command_key_count = 0;
63020c46 1312 this_command_key_count_reset = 0;
6321824f 1313 this_single_command_key_start = 0;
284f4730 1314
325309f5 1315 if (NILP (Vmemory_full))
59aadc81 1316 {
10ffcb64
RS
1317 /* Make sure this hook runs after commands that get errors and
1318 throw to top level. */
1319 /* Note that the value cell will never directly contain nil
1320 if the symbol is a local variable. */
1321 if (!NILP (Vpost_command_hook) && !NILP (Vrun_hooks))
1322 safe_run_hooks (Qpost_command_hook);
1323
1324 /* If displaying a message, resize the echo area window to fit
1325 that message's size exactly. */
1326 if (!NILP (echo_area_buffer[0]))
1327 resize_echo_area_exactly ();
1328
1329 if (!NILP (Vdeferred_action_list))
0b5d283f 1330 safe_run_hooks (Qdeferred_action_function);
59aadc81
RS
1331 }
1332
51d5a2c9 1333 /* Do this after running Vpost_command_hook, for consistency. */
d5eecefb
RS
1334 current_kboard->Vlast_command = Vthis_command;
1335 current_kboard->Vreal_last_command = real_this_command;
4b09796d 1336 if (!CONSP (last_command_event))
d0d3a311 1337 current_kboard->Vlast_repeatable_command = real_this_command;
51d5a2c9 1338
284f4730
JB
1339 while (1)
1340 {
788f89eb 1341 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
a94a4335
KH
1342 Fkill_emacs (Qnil);
1343
284f4730
JB
1344 /* Make sure the current window's buffer is selected. */
1345 if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
1346 set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer));
1347
1348 /* Display any malloc warning that just came out. Use while because
1349 displaying one warning can cause another. */
1350
1351 while (pending_malloc_warning)
1352 display_malloc_warning ();
1353
86e5706b
RS
1354 Vdeactivate_mark = Qnil;
1355
284f4730 1356 /* If minibuffer on and echo area in use,
00392ce6 1357 wait a short time and redraw minibuffer. */
284f4730 1358
7ee32cda 1359 if (minibuf_level
985f9f66 1360 && !NILP (echo_area_buffer[0])
6a8128ef
CY
1361 && EQ (minibuf_window, echo_area_window)
1362 && NUMBERP (Vminibuffer_message_timeout))
284f4730 1363 {
f1bed6d8
RS
1364 /* Bind inhibit-quit to t so that C-g gets read in
1365 rather than quitting back to the minibuffer. */
aed13378 1366 int count = SPECPDL_INDEX ();
f1bed6d8 1367 specbind (Qinhibit_quit, Qt);
f1bed6d8 1368
6a8128ef 1369 sit_for (Vminibuffer_message_timeout, 0, 2);
666dc232 1370
e6aa7813 1371 /* Clear the echo area. */
301738ed 1372 message2 (0, 0, 0);
cdb9d665 1373 safe_run_hooks (Qecho_area_clear_hook);
e6aa7813 1374
db08707d
RS
1375 unbind_to (count, Qnil);
1376
e6aa7813 1377 /* If a C-g came in before, treat it as input now. */
284f4730
JB
1378 if (!NILP (Vquit_flag))
1379 {
1380 Vquit_flag = Qnil;
24597608 1381 Vunread_command_events = Fcons (make_number (quit_char), Qnil);
284f4730
JB
1382 }
1383 }
1384
8f805655 1385#if 0
8f805655
JB
1386 /* Select the frame that the last event came from. Usually,
1387 switch-frame events will take care of this, but if some lisp
1388 code swallows a switch-frame event, we'll fix things up here.
1389 Is this a good idea? */
8c18cbfb 1390 if (FRAMEP (internal_last_event_frame)
788f89eb 1391 && !EQ (internal_last_event_frame, selected_frame))
e630dfc6 1392 Fselect_frame (internal_last_event_frame, Qnil);
284f4730 1393#endif
48e416d4
RS
1394 /* If it has changed current-menubar from previous value,
1395 really recompute the menubar from the value. */
a646e520
RS
1396 if (! NILP (Vlucid_menu_bar_dirty_flag)
1397 && !NILP (Ffboundp (Qrecompute_lucid_menubar)))
48e416d4
RS
1398 call0 (Qrecompute_lucid_menubar);
1399
71918b75
RS
1400 before_command_key_count = this_command_key_count;
1401 before_command_echo_length = echo_length ();
1402
d5eecefb
RS
1403 Vthis_command = Qnil;
1404 real_this_command = Qnil;
9d138659 1405 Vthis_original_command = Qnil;
025ae953 1406 Vthis_command_keys_shift_translated = Qnil;
d7437ef6 1407
8f805655 1408 /* Read next key sequence; i gets its length. */
ce98e608 1409 i = read_key_sequence (keybuf, sizeof keybuf / sizeof keybuf[0],
f571ae0d 1410 Qnil, 0, 1, 1);
8f805655 1411
6fac1409 1412 /* A filter may have run while we were reading the input. */
788f89eb 1413 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
a94a4335 1414 Fkill_emacs (Qnil);
6fac1409
RS
1415 if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
1416 set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer));
1417
8f805655
JB
1418 ++num_input_keys;
1419
284f4730
JB
1420 /* Now we have read a key sequence of length I,
1421 or else I is 0 and we found end of file. */
1422
1423 if (i == 0) /* End of file -- happens only in */
1424 return Qnil; /* a kbd macro, at the end. */
dcc408a0
RS
1425 /* -1 means read_key_sequence got a menu that was rejected.
1426 Just loop around and read another command. */
1427 if (i == -1)
1428 {
1429 cancel_echoing ();
1430 this_command_key_count = 0;
63020c46 1431 this_command_key_count_reset = 0;
6321824f 1432 this_single_command_key_start = 0;
ff4b06d3 1433 goto finalize;
dcc408a0 1434 }
284f4730 1435
4b09796d 1436 last_command_event = keybuf[i - 1];
284f4730 1437
75c0b143
RS
1438 /* If the previous command tried to force a specific window-start,
1439 forget about that, in case this command moves point far away
c422836d
KH
1440 from that position. But also throw away beg_unchanged and
1441 end_unchanged information in that case, so that redisplay will
1442 update the whole window properly. */
1443 if (!NILP (XWINDOW (selected_window)->force_start))
1444 {
9351ebd0 1445 struct buffer *b;
c422836d 1446 XWINDOW (selected_window)->force_start = Qnil;
9351ebd0
GM
1447 b = XBUFFER (XWINDOW (selected_window)->buffer);
1448 BUF_BEG_UNCHANGED (b) = BUF_END_UNCHANGED (b) = 0;
c422836d 1449 }
75c0b143 1450
284f4730 1451 cmd = read_key_sequence_cmd;
ce0d2858 1452 if (!NILP (Vexecuting_kbd_macro))
284f4730
JB
1453 {
1454 if (!NILP (Vquit_flag))
1455 {
ce0d2858 1456 Vexecuting_kbd_macro = Qt;
284f4730
JB
1457 QUIT; /* Make some noise. */
1458 /* Will return since macro now empty. */
1459 }
1460 }
1461
1462 /* Do redisplay processing after this command except in special
e35b6123 1463 cases identified below. */
86e5706b
RS
1464 prev_buffer = current_buffer;
1465 prev_modiff = MODIFF;
8746da95 1466 last_point_position = PT;
bb0e1d19 1467 last_point_position_window = selected_window;
18cd2eeb 1468 XSETBUFFER (last_point_position_buffer, prev_buffer);
86e5706b 1469
adf5cb9c
KH
1470 /* By default, we adjust point to a boundary of a region that
1471 has such a property that should be treated intangible
1472 (e.g. composition, display). But, some commands will set
1473 this variable differently. */
1474 Vdisable_point_adjustment = Qnil;
a7b772c1 1475
be2488ca
GM
1476 /* Process filters and timers may have messed with deactivate-mark.
1477 reset it before we execute the command. */
1478 Vdeactivate_mark = Qnil;
1479
8b9940e6
KS
1480 /* Remap command through active keymaps */
1481 Vthis_original_command = cmd;
a34cb674 1482 if (SYMBOLP (cmd))
8b9940e6
KS
1483 {
1484 Lisp_Object cmd1;
9be34f7f 1485 if (cmd1 = Fcommand_remapping (cmd, Qnil, Qnil), !NILP (cmd1))
8b9940e6
KS
1486 cmd = cmd1;
1487 }
1488
284f4730
JB
1489 /* Execute the command. */
1490
d5eecefb
RS
1491 Vthis_command = cmd;
1492 real_this_command = cmd;
a98ea3f9
RS
1493 /* Note that the value cell will never directly contain nil
1494 if the symbol is a local variable. */
e98a93eb 1495 if (!NILP (Vpre_command_hook) && !NILP (Vrun_hooks))
a98ea3f9 1496 safe_run_hooks (Qpre_command_hook);
c60ee5e7 1497
2764bebd
RS
1498 already_adjusted = 0;
1499
d5eecefb 1500 if (NILP (Vthis_command))
284f4730
JB
1501 {
1502 /* nil means key is undefined. */
1bf0e604
SM
1503 Lisp_Object keys = Fvector (i, keybuf);
1504 keys = Fkey_description (keys, Qnil);
284f4730 1505 bitch_at_user ();
1bf0e604 1506 message_with_string ("%s is undefined", keys, 0);
c5fdd383 1507 current_kboard->defining_kbd_macro = Qnil;
284f4730 1508 update_mode_lines = 1;
d8bcf58e 1509 current_kboard->Vprefix_arg = Qnil;
284f4730
JB
1510 }
1511 else
1512 {
284f4730
JB
1513 /* Here for a command that isn't executed directly */
1514
d148e14d 1515#ifdef HAVE_WINDOW_SYSTEM
0af912f0
JD
1516 int scount = SPECPDL_INDEX ();
1517
1518 if (display_hourglass_p
ce0d2858 1519 && NILP (Vexecuting_kbd_macro))
0af912f0
JD
1520 {
1521 record_unwind_protect (cancel_hourglass_unwind, Qnil);
1522 start_hourglass ();
1523 }
7ee32cda
GM
1524#endif
1525
1ac9108a 1526 if (NILP (current_kboard->Vprefix_arg)) /* FIXME: Why? --Stef */
0af912f0
JD
1527 Fundo_boundary ();
1528 Fcommand_execute (Vthis_command, Qnil, Qnil, Qnil);
d0c48478 1529
d148e14d 1530#ifdef HAVE_WINDOW_SYSTEM
4fbcc9b1
PJ
1531 /* Do not check display_hourglass_p here, because
1532 Fcommand_execute could change it, but we should cancel
e1204d39
RS
1533 hourglass cursor anyway.
1534 But don't cancel the hourglass within a macro
1535 just because a command in the macro finishes. */
ce0d2858 1536 if (NILP (Vexecuting_kbd_macro))
0af912f0 1537 unbind_to (scount, Qnil);
d0c48478 1538#endif
0af912f0 1539 }
75045dcb 1540 current_kboard->Vlast_prefix_arg = Vcurrent_prefix_arg;
284f4730 1541
84ee6048
RS
1542 /* Note that the value cell will never directly contain nil
1543 if the symbol is a local variable. */
1544 if (!NILP (Vpost_command_hook) && !NILP (Vrun_hooks))
1545 safe_run_hooks (Qpost_command_hook);
1546
8f12e41d
GM
1547 /* If displaying a message, resize the echo area window to fit
1548 that message's size exactly. */
1549 if (!NILP (echo_area_buffer[0]))
f09c15ed 1550 resize_echo_area_exactly ();
8f12e41d 1551
84ee6048
RS
1552 if (!NILP (Vdeferred_action_list))
1553 safe_run_hooks (Qdeferred_action_function);
1554
284f4730 1555 /* If there is a prefix argument,
6c7178b9
KH
1556 1) We don't want Vlast_command to be ``universal-argument''
1557 (that would be dumb), so don't set Vlast_command,
284f4730
JB
1558 2) we want to leave echoing on so that the prefix will be
1559 echoed as part of this key sequence, so don't call
1560 cancel_echoing, and
1561 3) we want to leave this_command_key_count non-zero, so that
1562 read_char will realize that it is re-reading a character, and
217258d5
KH
1563 not echo it a second time.
1564
1565 If the command didn't actually create a prefix arg,
1566 but is merely a frame event that is transparent to prefix args,
1567 then the above doesn't apply. */
4b09796d 1568 if (NILP (current_kboard->Vprefix_arg) || CONSP (last_command_event))
284f4730 1569 {
d5eecefb
RS
1570 current_kboard->Vlast_command = Vthis_command;
1571 current_kboard->Vreal_last_command = real_this_command;
4b09796d 1572 if (!CONSP (last_command_event))
d0d3a311 1573 current_kboard->Vlast_repeatable_command = real_this_command;
284f4730
JB
1574 cancel_echoing ();
1575 this_command_key_count = 0;
63020c46 1576 this_command_key_count_reset = 0;
6321824f 1577 this_single_command_key_start = 0;
284f4730 1578 }
86e5706b 1579
6926550f
CY
1580 if (!NILP (current_buffer->mark_active)
1581 && !NILP (Vrun_hooks))
86e5706b 1582 {
12679e05
CY
1583 /* In Emacs 22, setting transient-mark-mode to `only' was a
1584 way of turning it on for just one command. This usage is
1585 obsolete, but support it anyway. */
1586 if (EQ (Vtransient_mark_mode, Qidentity))
1587 Vtransient_mark_mode = Qnil;
1588 else if (EQ (Vtransient_mark_mode, Qonly))
1589 Vtransient_mark_mode = Qidentity;
1590
5c4cc82a 1591 if (!NILP (Vdeactivate_mark))
7c23dd44
CY
1592 /* If `select-active-regions' is non-nil, this call to
1593 `deactivate-mark' also sets the PRIMARY selection. */
5c4cc82a 1594 call0 (Qdeactivate_mark);
7c23dd44
CY
1595 else
1596 {
1597 /* Even if not deactivating the mark, set PRIMARY if
1598 `select-active-regions' is non-nil. */
07fa68a7 1599 if (!NILP (Fwindow_system (Qnil))
6926550f
CY
1600 /* Even if mark_active is non-nil, the actual buffer
1601 marker may not have been set yet (Bug#7044). */
1602 && XMARKER (current_buffer->mark)->buffer
07fa68a7
CY
1603 && (EQ (Vselect_active_regions, Qonly)
1604 ? EQ (CAR_SAFE (Vtransient_mark_mode), Qonly)
1605 : (!NILP (Vselect_active_regions)
1606 && !NILP (Vtransient_mark_mode)))
1c409d0b 1607 && !EQ (Vthis_command, Qhandle_switch_frame))
7c23dd44 1608 {
413d18e7
EZ
1609 EMACS_INT beg =
1610 XINT (Fmarker_position (current_buffer->mark));
1611 EMACS_INT end = PT;
7c23dd44
CY
1612 if (beg < end)
1613 call2 (Qx_set_selection, QPRIMARY,
1614 make_buffer_string (beg, end, 0));
1615 else if (beg > end)
1616 call2 (Qx_set_selection, QPRIMARY,
1617 make_buffer_string (end, beg, 0));
1618 /* Don't set empty selections. */
1619 }
1620
1621 if (current_buffer != prev_buffer || MODIFF != prev_modiff)
1622 call1 (Vrun_hooks, intern ("activate-mark-hook"));
1623 }
9852377f
CY
1624
1625 Vsaved_region_selection = Qnil;
86e5706b 1626 }
ff4b06d3
KH
1627
1628 finalize:
adf5cb9c
KH
1629
1630 if (current_buffer == prev_buffer
1631 && last_point_position != PT
1632 && NILP (Vdisable_point_adjustment)
4abd35cb
KH
1633 && NILP (Vglobal_disable_point_adjustment))
1634 {
31f9c376
KH
1635 if (last_point_position > BEGV
1636 && last_point_position < ZV
1637 && (composition_adjust_point (last_point_position,
1638 last_point_position)
1639 != last_point_position))
4abd35cb
KH
1640 /* The last point was temporarily set within a grapheme
1641 cluster to prevent automatic composition. To recover
1642 the automatic composition, we must update the
1643 display. */
1644 windows_or_buffers_changed++;
1645 if (!already_adjusted)
1646 adjust_point_for_property (last_point_position,
1647 MODIFF != prev_modiff);
1648 }
adf5cb9c 1649
ff4b06d3
KH
1650 /* Install chars successfully executed in kbd macro. */
1651
d8bcf58e
KH
1652 if (!NILP (current_kboard->defining_kbd_macro)
1653 && NILP (current_kboard->Vprefix_arg))
ff4b06d3 1654 finalize_kbd_macro_chars ();
b3e6f69c 1655#if 0 /* This shouldn't be necessary anymore. --lorentey */
604ccd1d 1656 if (!was_locked)
b3e6f69c 1657 any_kboard_state ();
ff4b06d3 1658#endif
284f4730
JB
1659 }
1660}
1c9784c9 1661
adf5cb9c
KH
1662/* Adjust point to a boundary of a region that has such a property
1663 that should be treated intangible. For the moment, we check
7e16ef60
SM
1664 `composition', `display' and `invisible' properties.
1665 LAST_PT is the last position of point. */
adf5cb9c
KH
1666
1667static void
41118bd3 1668adjust_point_for_property (EMACS_INT last_pt, int modified)
adf5cb9c 1669{
2b95772c 1670 EMACS_INT beg, end;
7e16ef60 1671 Lisp_Object val, overlay, tmp;
4abd35cb
KH
1672 /* When called after buffer modification, we should temporarily
1673 suppress the point adjustment for automatic composition so that a
1674 user can keep inserting another character at point or keep
1675 deleting characters around point. */
1676 int check_composition = ! modified, check_display = 1, check_invisible = 1;
41118bd3 1677 EMACS_INT orig_pt = PT;
adf5cb9c 1678
0bbdffbd
SM
1679 /* FIXME: cycling is probably not necessary because these properties
1680 can't be usefully combined anyway. */
7e16ef60 1681 while (check_composition || check_display || check_invisible)
adf5cb9c 1682 {
5c4cc82a 1683 /* FIXME: check `intangible'. */
adf5cb9c
KH
1684 if (check_composition
1685 && PT > BEGV && PT < ZV
4abd35cb 1686 && (beg = composition_adjust_point (last_pt, PT)) != PT)
adf5cb9c 1687 {
db2f2cdc 1688 SET_PT (beg);
14e40288 1689 check_display = check_invisible = 1;
adf5cb9c
KH
1690 }
1691 check_composition = 0;
1692 if (check_display
1693 && PT > BEGV && PT < ZV
7e16ef60
SM
1694 && !NILP (val = get_char_property_and_overlay
1695 (make_number (PT), Qdisplay, Qnil, &overlay))
3e9ac4b7 1696 && display_prop_intangible_p (val)
7e16ef60
SM
1697 && (!OVERLAYP (overlay)
1698 ? get_property_and_range (PT, Qdisplay, &val, &beg, &end, Qnil)
1699 : (beg = OVERLAY_POSITION (OVERLAY_START (overlay)),
1700 end = OVERLAY_POSITION (OVERLAY_END (overlay))))
4ca39724
KS
1701 && (beg < PT /* && end > PT <- It's always the case. */
1702 || (beg <= PT && STRINGP (val) && SCHARS (val) == 0)))
adf5cb9c 1703 {
14e40288 1704 xassert (end > PT);
4ca39724
KS
1705 SET_PT (PT < last_pt
1706 ? (STRINGP (val) && SCHARS (val) == 0 ? beg - 1 : beg)
1707 : end);
14e40288 1708 check_composition = check_invisible = 1;
adf5cb9c
KH
1709 }
1710 check_display = 0;
14e40288 1711 if (check_invisible && PT > BEGV && PT < ZV)
7e16ef60 1712 {
14e40288
SM
1713 int inv, ellipsis = 0;
1714 beg = end = PT;
1715
1716 /* Find boundaries `beg' and `end' of the invisible area, if any. */
1717 while (end < ZV
0a0e7d49
CY
1718#if 0
1719 /* FIXME: We should stop if we find a spot between
1720 two runs of `invisible' where inserted text would
1721 be visible. This is important when we have two
1722 invisible boundaries that enclose an area: if the
1723 area is empty, we need this test in order to make
1724 it possible to place point in the middle rather
1725 than skip both boundaries. However, this code
1726 also stops anywhere in a non-sticky text-property,
1727 which breaks (e.g.) Org mode. */
51d861de
SM
1728 && (val = get_pos_property (make_number (end),
1729 Qinvisible, Qnil),
1730 TEXT_PROP_MEANS_INVISIBLE (val))
0a0e7d49 1731#endif
14e40288
SM
1732 && !NILP (val = get_char_property_and_overlay
1733 (make_number (end), Qinvisible, Qnil, &overlay))
1734 && (inv = TEXT_PROP_MEANS_INVISIBLE (val)))
1735 {
1736 ellipsis = ellipsis || inv > 1
1737 || (OVERLAYP (overlay)
1738 && (!NILP (Foverlay_get (overlay, Qafter_string))
1739 || !NILP (Foverlay_get (overlay, Qbefore_string))));
1740 tmp = Fnext_single_char_property_change
1741 (make_number (end), Qinvisible, Qnil, Qnil);
1742 end = NATNUMP (tmp) ? XFASTINT (tmp) : ZV;
1743 }
1744 while (beg > BEGV
0a0e7d49 1745#if 0
51d861de
SM
1746 && (val = get_pos_property (make_number (beg),
1747 Qinvisible, Qnil),
1748 TEXT_PROP_MEANS_INVISIBLE (val))
0a0e7d49 1749#endif
14e40288
SM
1750 && !NILP (val = get_char_property_and_overlay
1751 (make_number (beg - 1), Qinvisible, Qnil, &overlay))
1752 && (inv = TEXT_PROP_MEANS_INVISIBLE (val)))
1753 {
1754 ellipsis = ellipsis || inv > 1
1755 || (OVERLAYP (overlay)
1756 && (!NILP (Foverlay_get (overlay, Qafter_string))
1757 || !NILP (Foverlay_get (overlay, Qbefore_string))));
1758 tmp = Fprevious_single_char_property_change
1759 (make_number (beg), Qinvisible, Qnil, Qnil);
1760 beg = NATNUMP (tmp) ? XFASTINT (tmp) : BEGV;
1761 }
c60ee5e7 1762
14e40288
SM
1763 /* Move away from the inside area. */
1764 if (beg < PT && end > PT)
1765 {
0bbdffbd
SM
1766 SET_PT ((orig_pt == PT && (last_pt < beg || last_pt > end))
1767 /* We haven't moved yet (so we don't need to fear
1768 infinite-looping) and we were outside the range
1769 before (so either end of the range still corresponds
1770 to a move in the right direction): pretend we moved
1771 less than we actually did, so that we still have
1772 more freedom below in choosing which end of the range
1773 to go to. */
9465a86c 1774 ? (orig_pt = -1, PT < last_pt ? end : beg)
0bbdffbd
SM
1775 /* We either have moved already or the last point
1776 was already in the range: we don't get to choose
1777 which end of the range we have to go to. */
1778 : (PT < last_pt ? beg : end));
14e40288
SM
1779 check_composition = check_display = 1;
1780 }
6b61353c
KH
1781#if 0 /* This assertion isn't correct, because SET_PT may end up setting
1782 the point to something other than its argument, due to
1783 point-motion hooks, intangibility, etc. */
14e40288 1784 xassert (PT == beg || PT == end);
6b61353c
KH
1785#endif
1786
2a026b04
KH
1787 /* Pretend the area doesn't exist if the buffer is not
1788 modified. */
1789 if (!modified && !ellipsis && beg < end)
14e40288
SM
1790 {
1791 if (last_pt == beg && PT == end && end < ZV)
1792 (check_composition = check_display = 1, SET_PT (end + 1));
1793 else if (last_pt == end && PT == beg && beg > BEGV)
1794 (check_composition = check_display = 1, SET_PT (beg - 1));
1795 else if (PT == ((PT < last_pt) ? beg : end))
1796 /* We've already moved as far as we can. Trying to go
1797 to the other end would mean moving backwards and thus
1798 could lead to an infinite loop. */
1799 ;
1800 else if (val = get_pos_property (make_number (PT),
1801 Qinvisible, Qnil),
1802 TEXT_PROP_MEANS_INVISIBLE (val)
1803 && (val = get_pos_property
1804 (make_number (PT == beg ? end : beg),
1805 Qinvisible, Qnil),
1806 !TEXT_PROP_MEANS_INVISIBLE (val)))
1807 (check_composition = check_display = 1,
1808 SET_PT (PT == beg ? end : beg));
1809 }
7e16ef60
SM
1810 }
1811 check_invisible = 0;
adf5cb9c
KH
1812 }
1813}
1814
0bc3db2b
RS
1815/* Subroutine for safe_run_hooks: run the hook HOOK. */
1816
1817static Lisp_Object
d3da34e0 1818safe_run_hooks_1 (void)
0bc3db2b 1819{
5e093f44
RS
1820 if (NILP (Vrun_hooks))
1821 return Qnil;
0bc3db2b
RS
1822 return call1 (Vrun_hooks, Vinhibit_quit);
1823}
1824
1825/* Subroutine for safe_run_hooks: handle an error by clearing out the hook. */
1826
1827static Lisp_Object
d3da34e0 1828safe_run_hooks_error (Lisp_Object data)
0bc3db2b 1829{
adec392e
SM
1830 Lisp_Object args[3];
1831 args[0] = build_string ("Error in %s: %s");
1832 args[1] = Vinhibit_quit;
1833 args[2] = data;
1834 Fmessage (3, args);
30690496 1835 return Fset (Vinhibit_quit, Qnil);
0bc3db2b
RS
1836}
1837
1c9784c9
KH
1838/* If we get an error while running the hook, cause the hook variable
1839 to be nil. Also inhibit quits, so that C-g won't cause the hook
1840 to mysteriously evaporate. */
0bc3db2b 1841
68f297c5 1842void
d3da34e0 1843safe_run_hooks (Lisp_Object hook)
1c9784c9 1844{
aed13378 1845 int count = SPECPDL_INDEX ();
0bc3db2b
RS
1846 specbind (Qinhibit_quit, hook);
1847
e702932d 1848 internal_condition_case (safe_run_hooks_1, Qt, safe_run_hooks_error);
1c9784c9
KH
1849
1850 unbind_to (count, Qnil);
1851}
8a9f5d3c 1852
284f4730 1853\f
eb8c3be9 1854/* Nonzero means polling for input is temporarily suppressed. */
8a9f5d3c 1855
284f4730
JB
1856int poll_suppress_count;
1857
8a9f5d3c
GM
1858/* Asynchronous timer for polling. */
1859
1860struct atimer *poll_timer;
1861
284f4730 1862
36922b18
RS
1863#ifdef POLL_FOR_INPUT
1864
c96169a0 1865/* Poll for input, so that we catch a C-g if it comes in. This
8a9f5d3c
GM
1866 function is called from x_make_frame_visible, see comment
1867 there. */
284f4730 1868
8a9f5d3c 1869void
d3da34e0 1870poll_for_input_1 (void)
284f4730 1871{
c96169a0
AR
1872/* Tell ns_read_socket() it is being called asynchronously so it can avoid
1873 doing anything dangerous. */
1874#ifdef HAVE_NS
1875 ++handling_signal;
1876#endif
9ac0d9e0
JB
1877 if (interrupt_input_blocked == 0
1878 && !waiting_for_input)
1879 read_avail_input (0);
c96169a0
AR
1880#ifdef HAVE_NS
1881 --handling_signal;
1882#endif
284f4730
JB
1883}
1884
8a9f5d3c
GM
1885/* Timer callback function for poll_timer. TIMER is equal to
1886 poll_timer. */
1887
1888void
d3da34e0 1889poll_for_input (struct atimer *timer)
8a9f5d3c
GM
1890{
1891 if (poll_suppress_count == 0)
ceb18827 1892 {
a42bf890 1893#ifdef SYNC_INPUT
ceb18827
CY
1894 interrupt_input_pending = 1;
1895 pending_signals = 1;
a42bf890 1896#else
ceb18827 1897 poll_for_input_1 ();
a42bf890 1898#endif
ceb18827 1899 }
8a9f5d3c
GM
1900}
1901
1902#endif /* POLL_FOR_INPUT */
284f4730
JB
1903
1904/* Begin signals to poll for input, if they are appropriate.
1905 This function is called unconditionally from various places. */
1906
07a59269 1907void
d3da34e0 1908start_polling (void)
284f4730
JB
1909{
1910#ifdef POLL_FOR_INPUT
428a555e
KL
1911 /* XXX This condition was (read_socket_hook && !interrupt_input),
1912 but read_socket_hook is not global anymore. Let's pretend that
1913 it's always set. */
1914 if (!interrupt_input)
284f4730 1915 {
8a9f5d3c
GM
1916 /* Turn alarm handling on unconditionally. It might have
1917 been turned off in process.c. */
1918 turn_on_atimers (1);
c60ee5e7 1919
8a9f5d3c
GM
1920 /* If poll timer doesn't exist, are we need one with
1921 a different interval, start a new one. */
1922 if (poll_timer == NULL
1923 || EMACS_SECS (poll_timer->interval) != polling_period)
284f4730 1924 {
8a9f5d3c
GM
1925 EMACS_TIME interval;
1926
1927 if (poll_timer)
1928 cancel_atimer (poll_timer);
c60ee5e7 1929
8a9f5d3c
GM
1930 EMACS_SET_SECS_USECS (interval, polling_period, 0);
1931 poll_timer = start_atimer (ATIMER_CONTINUOUS, interval,
1932 poll_for_input, NULL);
284f4730 1933 }
8a9f5d3c
GM
1934
1935 /* Let the timer's callback function poll for input
1936 if this becomes zero. */
1937 --poll_suppress_count;
284f4730
JB
1938 }
1939#endif
1940}
1941
1d3195db
RS
1942/* Nonzero if we are using polling to handle input asynchronously. */
1943
1944int
d3da34e0 1945input_polling_used (void)
1d3195db
RS
1946{
1947#ifdef POLL_FOR_INPUT
428a555e
KL
1948 /* XXX This condition was (read_socket_hook && !interrupt_input),
1949 but read_socket_hook is not global anymore. Let's pretend that
1950 it's always set. */
1951 return !interrupt_input;
1d3195db
RS
1952#else
1953 return 0;
1954#endif
1955}
1956
284f4730
JB
1957/* Turn off polling. */
1958
07a59269 1959void
d3da34e0 1960stop_polling (void)
284f4730
JB
1961{
1962#ifdef POLL_FOR_INPUT
428a555e
KL
1963 /* XXX This condition was (read_socket_hook && !interrupt_input),
1964 but read_socket_hook is not global anymore. Let's pretend that
1965 it's always set. */
1966 if (!interrupt_input)
8a9f5d3c 1967 ++poll_suppress_count;
284f4730
JB
1968#endif
1969}
fe8aeef3
RS
1970
1971/* Set the value of poll_suppress_count to COUNT
1972 and start or stop polling accordingly. */
1973
1974void
d3da34e0 1975set_poll_suppress_count (int count)
fe8aeef3
RS
1976{
1977#ifdef POLL_FOR_INPUT
1978 if (count == 0 && poll_suppress_count != 0)
1979 {
1980 poll_suppress_count = 1;
1981 start_polling ();
1982 }
1983 else if (count != 0 && poll_suppress_count == 0)
1984 {
1985 stop_polling ();
1986 }
1987 poll_suppress_count = count;
1988#endif
1989}
f4eef8b4 1990
d0a57728
RS
1991/* Bind polling_period to a value at least N.
1992 But don't decrease it. */
1993
07a59269 1994void
d3da34e0 1995bind_polling_period (int n)
f4eef8b4
RS
1996{
1997#ifdef POLL_FOR_INPUT
d0a57728
RS
1998 int new = polling_period;
1999
2000 if (n > new)
2001 new = n;
2002
6fe007f7 2003 stop_other_atimers (poll_timer);
f4eef8b4 2004 stop_polling ();
d0a57728
RS
2005 specbind (Qpolling_period, make_number (new));
2006 /* Start a new alarm with the new period. */
f4eef8b4
RS
2007 start_polling ();
2008#endif
2009}
284f4730 2010\f
6da3dd3a
RS
2011/* Apply the control modifier to CHARACTER. */
2012
faf5e407 2013int
d3da34e0 2014make_ctrl_char (int c)
faf5e407 2015{
d205953b
JB
2016 /* Save the upper bits here. */
2017 int upper = c & ~0177;
2018
a32aad64
KH
2019 if (! ASCII_BYTE_P (c))
2020 return c |= ctrl_modifier;
2021
d205953b
JB
2022 c &= 0177;
2023
2024 /* Everything in the columns containing the upper-case letters
2025 denotes a control character. */
2026 if (c >= 0100 && c < 0140)
2027 {
2028 int oc = c;
2029 c &= ~0140;
2030 /* Set the shift modifier for a control char
2031 made from a shifted letter. But only for letters! */
2032 if (oc >= 'A' && oc <= 'Z')
2033 c |= shift_modifier;
2034 }
2035
2036 /* The lower-case letters denote control characters too. */
2037 else if (c >= 'a' && c <= 'z')
2038 c &= ~0140;
2039
2040 /* Include the bits for control and shift
2041 only if the basic ASCII code can't indicate them. */
2042 else if (c >= ' ')
2043 c |= ctrl_modifier;
2044
2045 /* Replace the high bits. */
2046 c |= (upper & ~ctrl_modifier);
faf5e407
JB
2047
2048 return c;
2049}
2050
bb8c4865
RS
2051/* Display the help-echo property of the character after the mouse pointer.
2052 Either show it in the echo area, or call show-help-function to display
2053 it by other means (maybe in a tooltip).
d4e68eea 2054
bb8c4865 2055 If HELP is nil, that means clear the previous help echo.
d4e68eea 2056
bb8c4865
RS
2057 If HELP is a string, display that string. If HELP is a function,
2058 call it with OBJECT and POS as arguments; the function should
2059 return a help string or nil for none. For all other types of HELP,
2060 evaluate it to obtain a string.
8dfd92c9 2061
2190735a
GM
2062 WINDOW is the window in which the help was generated, if any.
2063 It is nil if not in a window.
2064
5b2ec2d0
GM
2065 If OBJECT is a buffer, POS is the position in the buffer where the
2066 `help-echo' text property was found.
2067
2068 If OBJECT is an overlay, that overlay has a `help-echo' property,
2069 and POS is the position in the overlay's buffer under the mouse.
2070
2071 If OBJECT is a string (an overlay string or a string displayed with
2072 the `display' property). POS is the position in that string under
2073 the mouse.
d4e68eea 2074
27fd22dc 2075 OK_TO_OVERWRITE_KEYSTROKE_ECHO non-zero means it's okay if the help
d4e68eea
GM
2076 echo overwrites a keystroke echo currently displayed in the echo
2077 area.
2078
8dfd92c9
GM
2079 Note: this function may only be called with HELP nil or a string
2080 from X code running asynchronously. */
d4e68eea 2081
31f84d03 2082void
d3da34e0
JB
2083show_help_echo (Lisp_Object help, Lisp_Object window, Lisp_Object object,
2084 Lisp_Object pos, int ok_to_overwrite_keystroke_echo)
31f84d03 2085{
8dfd92c9 2086 if (!NILP (help) && !STRINGP (help))
d4e68eea 2087 {
8dfd92c9
GM
2088 if (FUNCTIONP (help))
2089 {
2190735a 2090 Lisp_Object args[4];
8dfd92c9 2091 args[0] = help;
2190735a
GM
2092 args[1] = window;
2093 args[2] = object;
2094 args[3] = pos;
1db0076e 2095 help = safe_call (4, args);
8dfd92c9
GM
2096 }
2097 else
1db0076e 2098 help = safe_eval (help);
c60ee5e7 2099
8dfd92c9 2100 if (!STRINGP (help))
d4e68eea 2101 return;
31f84d03
SM
2102 }
2103
ae372f41 2104#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
c22237f7 2105 if (!noninteractive && STRINGP (help))
c5b76d6c
CY
2106 {
2107 /* The mouse-fixup-help-message Lisp function can call
2108 mouse_position_hook, which resets the mouse_moved flags.
2109 This causes trouble if we are trying to read a mouse motion
2110 event (i.e., if we are inside a `track-mouse' form), so we
2111 restore the mouse_moved flag. */
2112 FRAME_PTR f = NILP (do_mouse_tracking) ? NULL : some_mouse_moved ();
2113 help = call1 (Qmouse_fixup_help_message, help);
2114 if (f)
2115 f->mouse_moved = 1;
2116 }
c22237f7
KS
2117#endif
2118
8dfd92c9 2119 if (STRINGP (help) || NILP (help))
d4e68eea
GM
2120 {
2121 if (!NILP (Vshow_help_function))
8dfd92c9 2122 call1 (Vshow_help_function, help);
5295a500 2123 help_echo_showing_p = STRINGP (help);
d4e68eea 2124 }
31f84d03
SM
2125}
2126
faf5e407
JB
2127
2128\f
284f4730
JB
2129/* Input of single characters from keyboard */
2130
d3da34e0
JB
2131Lisp_Object print_help (Lisp_Object object);
2132static Lisp_Object kbd_buffer_get_event (KBOARD **kbp, int *used_mouse_menu,
2133 struct timeval *end_time);
2134static void record_char (Lisp_Object c);
284f4730 2135
638d3da0
CY
2136static Lisp_Object help_form_saved_window_configs;
2137static Lisp_Object
63c125ab 2138read_char_help_form_unwind (Lisp_Object arg)
638d3da0
CY
2139{
2140 Lisp_Object window_config = XCAR (help_form_saved_window_configs);
2141 help_form_saved_window_configs = XCDR (help_form_saved_window_configs);
2142 if (!NILP (window_config))
2143 Fset_window_configuration (window_config);
2144 return Qnil;
2145}
2146
184c3d81
RS
2147#define STOP_POLLING \
2148do { if (! polling_stopped_here) stop_polling (); \
2149 polling_stopped_here = 1; } while (0)
2150
2151#define RESUME_POLLING \
2152do { if (polling_stopped_here) start_polling (); \
2153 polling_stopped_here = 0; } while (0)
2154
284f4730
JB
2155/* read a character from the keyboard; call the redisplay if needed */
2156/* commandflag 0 means do not do auto-saving, but do do redisplay.
2157 -1 means do not do redisplay, but do do autosaving.
2158 1 means do both. */
2159
7d6de002
RS
2160/* The arguments MAPS and NMAPS are for menu prompting.
2161 MAPS is an array of keymaps; NMAPS is the length of MAPS.
2162
2163 PREV_EVENT is the previous input event, or nil if we are reading
b638f328
RS
2164 the first event of a key sequence (or not reading a key sequence).
2165 If PREV_EVENT is t, that is a "magic" value that says
2166 not to run input methods, but in other respects to act as if
2167 not reading a key sequence.
7d6de002 2168
83d68044 2169 If USED_MOUSE_MENU is non-null, then we set *USED_MOUSE_MENU to 1
6569cc8d 2170 if we used a mouse menu to read the input, or zero otherwise. If
83d68044 2171 USED_MOUSE_MENU is null, we don't dereference it.
dcc408a0 2172
9688ff53 2173 Value is -2 when we find input on another keyboard. A second call
033b73e2 2174 to read_char will read it.
9688ff53 2175
179f689c
CY
2176 If END_TIME is non-null, it is a pointer to an EMACS_TIME
2177 specifying the maximum time to wait until. If no input arrives by
2178 that time, stop waiting and return nil.
2179
dcc408a0 2180 Value is t if we showed a menu and the user rejected it. */
7d6de002 2181
284f4730 2182Lisp_Object
d3da34e0
JB
2183read_char (int commandflag, int nmaps, Lisp_Object *maps, Lisp_Object prev_event,
2184 int *used_mouse_menu, struct timeval *end_time)
284f4730 2185{
8c907a56 2186 volatile Lisp_Object c;
092869b9 2187 int count, jmpcount;
410d4de9 2188 jmp_buf local_getcjmp;
284f4730 2189 jmp_buf save_jump;
8c907a56 2190 volatile int key_already_recorded = 0;
017c7cb6 2191 Lisp_Object tem, save;
8c907a56
GM
2192 volatile Lisp_Object previous_echo_area_message;
2193 volatile Lisp_Object also_record;
2194 volatile int reread;
d5eecefb 2195 struct gcpro gcpro1, gcpro2;
184c3d81 2196 int polling_stopped_here = 0;
b3e6f69c 2197 struct kboard *orig_kboard = current_kboard;
7c3bc944 2198
e4fe371d 2199 also_record = Qnil;
284f4730 2200
22b94eeb 2201#if 0 /* This was commented out as part of fixing echo for C-u left. */
71918b75
RS
2202 before_command_key_count = this_command_key_count;
2203 before_command_echo_length = echo_length ();
22b94eeb 2204#endif
ef6661f7 2205 c = Qnil;
7ee32cda 2206 previous_echo_area_message = Qnil;
71918b75 2207
7ee32cda 2208 GCPRO2 (c, previous_echo_area_message);
7c3bc944 2209
7f07d5ca
RS
2210 retry:
2211
7d18f9ae
RS
2212 reread = 0;
2213 if (CONSP (Vunread_post_input_method_events))
284f4730 2214 {
7539e11f 2215 c = XCAR (Vunread_post_input_method_events);
7d18f9ae 2216 Vunread_post_input_method_events
7539e11f 2217 = XCDR (Vunread_post_input_method_events);
284f4730 2218
2479e91e
RS
2219 /* Undo what read_char_x_menu_prompt did when it unread
2220 additional keys returned by Fx_popup_menu. */
2221 if (CONSP (c)
7539e11f
KR
2222 && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c)))
2223 && NILP (XCDR (c)))
2224 c = XCAR (c);
2479e91e 2225
7d18f9ae
RS
2226 reread = 1;
2227 goto reread_first;
284f4730
JB
2228 }
2229
86e5706b
RS
2230 if (unread_command_char != -1)
2231 {
18cd2eeb 2232 XSETINT (c, unread_command_char);
86e5706b
RS
2233 unread_command_char = -1;
2234
7d18f9ae
RS
2235 reread = 1;
2236 goto reread_first;
2237 }
2238
2239 if (CONSP (Vunread_command_events))
2240 {
a41240a3
MR
2241 int was_disabled = 0;
2242
7539e11f
KR
2243 c = XCAR (Vunread_command_events);
2244 Vunread_command_events = XCDR (Vunread_command_events);
7d18f9ae 2245
96f4f7ec
KS
2246 reread = 1;
2247
2248 /* Undo what sit-for did when it unread additional keys
2249 inside universal-argument. */
2250
2251 if (CONSP (c)
2252 && EQ (XCAR (c), Qt))
2253 {
2254 reread = 0;
2255 c = XCDR (c);
2256 }
2257
7d18f9ae
RS
2258 /* Undo what read_char_x_menu_prompt did when it unread
2259 additional keys returned by Fx_popup_menu. */
2260 if (CONSP (c)
f4e05d97
GM
2261 && EQ (XCDR (c), Qdisabled)
2262 && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c))))
a41240a3
MR
2263 {
2264 was_disabled = 1;
2265 c = XCAR (c);
2266 }
c60ee5e7 2267
d17e49a8
GM
2268 /* If the queued event is something that used the mouse,
2269 set used_mouse_menu accordingly. */
2270 if (used_mouse_menu
a41240a3
MR
2271 /* Also check was_disabled so last-nonmenu-event won't return
2272 a bad value when submenus are involved. (Bug#447) */
2273 && (EQ (c, Qtool_bar) || EQ (c, Qmenu_bar) || was_disabled))
d17e49a8 2274 *used_mouse_menu = 1;
c60ee5e7 2275
7d18f9ae
RS
2276 goto reread_for_input_method;
2277 }
2278
2279 if (CONSP (Vunread_input_method_events))
2280 {
7539e11f
KR
2281 c = XCAR (Vunread_input_method_events);
2282 Vunread_input_method_events = XCDR (Vunread_input_method_events);
7d18f9ae
RS
2283
2284 /* Undo what read_char_x_menu_prompt did when it unread
2285 additional keys returned by Fx_popup_menu. */
2286 if (CONSP (c)
7539e11f
KR
2287 && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c)))
2288 && NILP (XCDR (c)))
2289 c = XCAR (c);
7d18f9ae
RS
2290 reread = 1;
2291 goto reread_for_input_method;
86e5706b
RS
2292 }
2293
63020c46
RS
2294 this_command_key_count_reset = 0;
2295
ce0d2858 2296 if (!NILP (Vexecuting_kbd_macro))
284f4730 2297 {
fce33686
JB
2298 /* We set this to Qmacro; since that's not a frame, nobody will
2299 try to switch frames on us, and the selected window will
2300 remain unchanged.
2301
2302 Since this event came from a macro, it would be misleading to
eb8c3be9 2303 leave internal_last_event_frame set to wherever the last
3c370943
JB
2304 real event came from. Normally, a switch-frame event selects
2305 internal_last_event_frame after each command is read, but
2306 events read from a macro should never cause a new frame to be
2307 selected. */
4c52b668 2308 Vlast_event_frame = internal_last_event_frame = Qmacro;
fce33686 2309
663258f2
JB
2310 /* Exit the macro if we are at the end.
2311 Also, some things replace the macro with t
2312 to force an early exit. */
ce0d2858 2313 if (EQ (Vexecuting_kbd_macro, Qt)
649d952d 2314 || executing_kbd_macro_index >= XFASTINT (Flength (Vexecuting_kbd_macro)))
284f4730 2315 {
18cd2eeb 2316 XSETINT (c, -1);
184c3d81 2317 goto exit;
284f4730 2318 }
df0f2ba1 2319
649d952d 2320 c = Faref (Vexecuting_kbd_macro, make_number (executing_kbd_macro_index));
ce0d2858 2321 if (STRINGP (Vexecuting_kbd_macro)
d5161e8c 2322 && (XINT (c) & 0x80) && (XUINT (c) <= 0xff))
bb9e9bed 2323 XSETFASTINT (c, CHAR_META | (XINT (c) & ~0x80));
86e5706b 2324
649d952d 2325 executing_kbd_macro_index++;
284f4730
JB
2326
2327 goto from_macro;
2328 }
2329
cd21b839
JB
2330 if (!NILP (unread_switch_frame))
2331 {
2332 c = unread_switch_frame;
2333 unread_switch_frame = Qnil;
2334
2335 /* This event should make it into this_command_keys, and get echoed
7d18f9ae 2336 again, so we do not set `reread'. */
f4255cd1 2337 goto reread_first;
cd21b839
JB
2338 }
2339
adc1d5c8 2340 /* if redisplay was requested */
6e4e64a8
RS
2341 if (commandflag >= 0)
2342 {
0975aa24 2343 int echo_current = EQ (echo_message_buffer, echo_area_buffer[0]);
94f9b406 2344
adc1d5c8
RS
2345 /* If there is pending input, process any events which are not
2346 user-visible, such as X selection_request events. */
6e4e64a8
RS
2347 if (input_pending
2348 || detect_input_pending_run_timers (0))
adc1d5c8 2349 swallow_events (0); /* may clear input_pending */
6e4e64a8 2350
adc1d5c8
RS
2351 /* Redisplay if no pending input. */
2352 while (!input_pending)
2353 {
5295a500 2354 if (help_echo_showing_p && !EQ (selected_window, minibuf_window))
3007ebfb 2355 redisplay_preserve_echo_area (5);
5295a500
GM
2356 else
2357 redisplay ();
adc1d5c8
RS
2358
2359 if (!input_pending)
2360 /* Normal case: no input arrived during redisplay. */
2361 break;
2362
2363 /* Input arrived and pre-empted redisplay.
2364 Process any events which are not user-visible. */
2365 swallow_events (0);
2366 /* If that cleared input_pending, try again to redisplay. */
2367 }
94f9b406
RS
2368
2369 /* Prevent the redisplay we just did
2370 from messing up echoing of the input after the prompt. */
2371 if (commandflag == 0 && echo_current)
2372 echo_message_buffer = echo_area_buffer[0];
2373
6e4e64a8 2374 }
e9bf89a0 2375
59a84f8e 2376 /* Message turns off echoing unless more keystrokes turn it on again.
c60ee5e7 2377
59a84f8e
GM
2378 The code in 20.x for the condition was
2379
2380 1. echo_area_glyphs && *echo_area_glyphs
2381 2. && echo_area_glyphs != current_kboard->echobuf
2382 3. && ok_to_echo_at_next_pause != echo_area_glyphs
2383
2384 (1) means there's a current message displayed
c60ee5e7 2385
59a84f8e
GM
2386 (2) means it's not the message from echoing from the current
2387 kboard.
c60ee5e7 2388
59a84f8e
GM
2389 (3) There's only one place in 20.x where ok_to_echo_at_next_pause
2390 is set to a non-null value. This is done in read_char and it is
2391 set to echo_area_glyphs after a call to echo_char. That means
2392 ok_to_echo_at_next_pause is either null or
2393 current_kboard->echobuf with the appropriate current_kboard at
2394 that time.
2395
2396 So, condition (3) means in clear text ok_to_echo_at_next_pause
2397 must be either null, or the current message isn't from echoing at
2398 all, or it's from echoing from a different kboard than the
2399 current one. */
c60ee5e7 2400
27fd22dc 2401 if (/* There currently is something in the echo area. */
985f9f66 2402 !NILP (echo_area_buffer[0])
59a84f8e
GM
2403 && (/* And it's either not from echoing. */
2404 !EQ (echo_area_buffer[0], echo_message_buffer)
2405 /* Or it's an echo from a different kboard. */
2406 || echo_kboard != current_kboard
2407 /* Or we explicitly allow overwriting whatever there is. */
2408 || ok_to_echo_at_next_pause == NULL))
7ee32cda 2409 cancel_echoing ();
410d4de9 2410 else
410d4de9 2411 echo_dash ();
c60ee5e7 2412
410d4de9
RS
2413 /* Try reading a character via menu prompting in the minibuf.
2414 Try this before the sit-for, because the sit-for
2415 would do the wrong thing if we are supposed to do
2416 menu prompting. If EVENT_HAS_PARAMETERS then we are reading
2417 after a mouse event so don't try a minibuf menu. */
2418 c = Qnil;
2419 if (nmaps > 0 && INTERACTIVE
2420 && !NILP (prev_event) && ! EVENT_HAS_PARAMETERS (prev_event)
2421 /* Don't bring up a menu if we already have another event. */
2422 && NILP (Vunread_command_events)
2423 && unread_command_char < 0
4ec4ed6a 2424 && !detect_input_pending_run_timers (0))
410d4de9
RS
2425 {
2426 c = read_char_minibuf_menu_prompt (commandflag, nmaps, maps);
9688ff53
KL
2427
2428 if (INTEGERP (c) && XINT (c) == -2)
2429 return c; /* wrong_kboard_jmpbuf */
2430
410d4de9
RS
2431 if (! NILP (c))
2432 {
2433 key_already_recorded = 1;
2434 goto non_reread_1;
2435 }
2436 }
284f4730 2437
410d4de9
RS
2438 /* Make a longjmp point for quits to use, but don't alter getcjmp just yet.
2439 We will do that below, temporarily for short sections of code,
2440 when appropriate. local_getcjmp must be in effect
2441 around any call to sit_for or kbd_buffer_get_event;
2442 it *must not* be in effect when we call redisplay. */
284f4730 2443
092869b9 2444 jmpcount = SPECPDL_INDEX ();
410d4de9 2445 if (_setjmp (local_getcjmp))
284f4730 2446 {
d6805803 2447 /* Handle quits while reading the keyboard. */
dfbfad25
RS
2448 /* We must have saved the outer value of getcjmp here,
2449 so restore it now. */
2450 restore_getcjmp (save_jump);
092869b9 2451 unbind_to (jmpcount, Qnil);
18cd2eeb 2452 XSETINT (c, quit_char);
788f89eb 2453 internal_last_event_frame = selected_frame;
4c52b668 2454 Vlast_event_frame = internal_last_event_frame;
04904c29
RS
2455 /* If we report the quit char as an event,
2456 don't do so more than once. */
2457 if (!NILP (Vinhibit_quit))
2458 Vquit_flag = Qnil;
284f4730 2459
df0f2ba1 2460 {
788f89eb 2461 KBOARD *kb = FRAME_KBOARD (XFRAME (selected_frame));
c5fdd383 2462 if (kb != current_kboard)
df0f2ba1 2463 {
f3fbd155 2464 Lisp_Object link = kb->kbd_queue;
1e8bd3da
RS
2465 /* We shouldn't get here if we were in single-kboard mode! */
2466 if (single_kboard)
df0f2ba1 2467 abort ();
f3fbd155
KR
2468 if (CONSP (link))
2469 {
2470 while (CONSP (XCDR (link)))
2471 link = XCDR (link);
2472 if (!NILP (XCDR (link)))
2473 abort ();
2474 }
2475 if (!CONSP (link))
2476 kb->kbd_queue = Fcons (c, Qnil);
2477 else
2478 XSETCDR (link, Fcons (c, Qnil));
c5fdd383
KH
2479 kb->kbd_queue_has_data = 1;
2480 current_kboard = kb;
ef6661f7
RS
2481 /* This is going to exit from read_char
2482 so we had better get rid of this frame's stuff. */
2483 UNGCPRO;
9688ff53 2484 return make_number (-2); /* wrong_kboard_jmpbuf */
df0f2ba1
KH
2485 }
2486 }
284f4730
JB
2487 goto non_reread;
2488 }
2489
3236e6b8
CY
2490 /* Start idle timers if no time limit is supplied. We don't do it
2491 if a time limit is supplied to avoid an infinite recursion in the
2492 situation where an idle timer calls `sit-for'. */
70282fce 2493
3236e6b8 2494 if (!end_time)
70282fce 2495 timer_start_idle ();
d9d4c147 2496
284f4730
JB
2497 /* If in middle of key sequence and minibuffer not active,
2498 start echoing if enough time elapses. */
410d4de9 2499
c60ee5e7 2500 if (minibuf_level == 0
179f689c 2501 && !end_time
7ee32cda 2502 && !current_kboard->immediate_echo
6c6083a9 2503 && this_command_key_count > 0
27203ead 2504 && ! noninteractive
f2647d04
DL
2505 && (FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
2506 && NILP (Fzerop (Vecho_keystrokes))
985f9f66
GM
2507 && (/* No message. */
2508 NILP (echo_area_buffer[0])
2509 /* Or empty message. */
2510 || (BUF_BEG (XBUFFER (echo_area_buffer[0]))
2511 == BUF_Z (XBUFFER (echo_area_buffer[0])))
2512 /* Or already echoing from same kboard. */
2513 || (echo_kboard && ok_to_echo_at_next_pause == echo_kboard)
2514 /* Or not echoing before and echoing allowed. */
2515 || (!echo_kboard && ok_to_echo_at_next_pause)))
284f4730 2516 {
7d6de002
RS
2517 /* After a mouse event, start echoing right away.
2518 This is because we are probably about to display a menu,
2519 and we don't want to delay before doing so. */
dbc4e1c1 2520 if (EVENT_HAS_PARAMETERS (prev_event))
3dbd9ee4 2521 echo_now ();
7d6de002
RS
2522 else
2523 {
666dc232
KS
2524 Lisp_Object tem0;
2525
410d4de9
RS
2526 save_getcjmp (save_jump);
2527 restore_getcjmp (local_getcjmp);
666dc232 2528 tem0 = sit_for (Vecho_keystrokes, 1, 1);
410d4de9 2529 restore_getcjmp (save_jump);
303b5b3f
RS
2530 if (EQ (tem0, Qt)
2531 && ! CONSP (Vunread_command_events))
3dbd9ee4 2532 echo_now ();
7d6de002 2533 }
284f4730
JB
2534 }
2535
410d4de9 2536 /* Maybe auto save due to number of keystrokes. */
284f4730
JB
2537
2538 if (commandflag != 0
2539 && auto_save_interval > 0
c43b1734 2540 && num_nonmacro_input_events - last_auto_save > max (auto_save_interval, 20)
4ec4ed6a 2541 && !detect_input_pending_run_timers (0))
284f4730 2542 {
284f4730 2543 Fdo_auto_save (Qnil, Qnil);
ef8fd672
RS
2544 /* Hooks can actually change some buffers in auto save. */
2545 redisplay ();
284f4730
JB
2546 }
2547
8150596a 2548 /* Try reading using an X menu.
24597608
RS
2549 This is never confused with reading using the minibuf
2550 because the recursive call of read_char in read_char_minibuf_menu_prompt
2551 does not pass on any keymaps. */
410d4de9 2552
24597608 2553 if (nmaps > 0 && INTERACTIVE
5a8d99e0
KH
2554 && !NILP (prev_event)
2555 && EVENT_HAS_PARAMETERS (prev_event)
7539e11f
KR
2556 && !EQ (XCAR (prev_event), Qmenu_bar)
2557 && !EQ (XCAR (prev_event), Qtool_bar)
24597608
RS
2558 /* Don't bring up a menu if we already have another event. */
2559 && NILP (Vunread_command_events)
b8556aee 2560 && unread_command_char < 0)
8eb4d8ef
RS
2561 {
2562 c = read_char_x_menu_prompt (nmaps, maps, prev_event, used_mouse_menu);
2563
2564 /* Now that we have read an event, Emacs is not idle. */
3236e6b8
CY
2565 if (!end_time)
2566 timer_stop_idle ();
8eb4d8ef 2567
184c3d81 2568 goto exit;
8eb4d8ef 2569 }
7d6de002 2570
410d4de9
RS
2571 /* Maybe autosave and/or garbage collect due to idleness. */
2572
26c1639e 2573 if (INTERACTIVE && NILP (c))
7d6de002 2574 {
41118bd3
EZ
2575 int delay_level;
2576 EMACS_INT buffer_size;
7d6de002 2577
410d4de9
RS
2578 /* Slow down auto saves logarithmically in size of current buffer,
2579 and garbage collect while we're at it. */
7d6de002
RS
2580 if (! MINI_WINDOW_P (XWINDOW (selected_window)))
2581 last_non_minibuf_size = Z - BEG;
2582 buffer_size = (last_non_minibuf_size >> 8) + 1;
2583 delay_level = 0;
2584 while (buffer_size > 64)
2585 delay_level++, buffer_size -= buffer_size >> 2;
2586 if (delay_level < 4) delay_level = 4;
2587 /* delay_level is 4 for files under around 50k, 7 at 100k,
2588 9 at 200k, 11 at 300k, and 12 at 500k. It is 15 at 1 meg. */
2589
2590 /* Auto save if enough time goes by without input. */
2591 if (commandflag != 0
c43b1734 2592 && num_nonmacro_input_events > last_auto_save
8c18cbfb 2593 && INTEGERP (Vauto_save_timeout)
7d6de002
RS
2594 && XINT (Vauto_save_timeout) > 0)
2595 {
2596 Lisp_Object tem0;
666dc232 2597 int timeout = delay_level * XFASTINT (Vauto_save_timeout) / 4;
410d4de9
RS
2598
2599 save_getcjmp (save_jump);
2600 restore_getcjmp (local_getcjmp);
666dc232 2601 tem0 = sit_for (make_number (timeout), 1, 1);
410d4de9
RS
2602 restore_getcjmp (save_jump);
2603
303b5b3f
RS
2604 if (EQ (tem0, Qt)
2605 && ! CONSP (Vunread_command_events))
7d6de002 2606 {
7d6de002 2607 Fdo_auto_save (Qnil, Qnil);
7d6de002
RS
2608
2609 /* If we have auto-saved and there is still no input
2610 available, garbage collect if there has been enough
2611 consing going on to make it worthwhile. */
4ec4ed6a 2612 if (!detect_input_pending_run_timers (0)
c8e16a02 2613 && consing_since_gc > gc_cons_threshold / 2)
ef8fd672 2614 Fgarbage_collect ();
410d4de9 2615
ef8fd672 2616 redisplay ();
7d6de002
RS
2617 }
2618 }
2619 }
284f4730 2620
67ddbec3
KL
2621 /* Notify the caller if an autosave hook, or a timer, sentinel or
2622 filter in the sit_for calls above have changed the current
2623 kboard. This could happen if they use the minibuffer or start a
2624 recursive edit, like the fancy splash screen in server.el's
2625 filter. If this longjmp wasn't here, read_key_sequence would
2626 interpret the next key sequence using the wrong translation
2627 tables and function keymaps. */
b3e6f69c
KL
2628 if (NILP (c) && current_kboard != orig_kboard)
2629 {
2630 UNGCPRO;
9688ff53 2631 return make_number (-2); /* wrong_kboard_jmpbuf */
b3e6f69c
KL
2632 }
2633
303b5b3f
RS
2634 /* If this has become non-nil here, it has been set by a timer
2635 or sentinel or filter. */
2636 if (CONSP (Vunread_command_events))
2637 {
7539e11f
KR
2638 c = XCAR (Vunread_command_events);
2639 Vunread_command_events = XCDR (Vunread_command_events);
303b5b3f
RS
2640 }
2641
410d4de9
RS
2642 /* Read something from current KBOARD's side queue, if possible. */
2643
beecf6a1 2644 if (NILP (c))
1e12dd87 2645 {
c5fdd383 2646 if (current_kboard->kbd_queue_has_data)
beecf6a1 2647 {
c5fdd383 2648 if (!CONSP (current_kboard->kbd_queue))
4524b161 2649 abort ();
7539e11f 2650 c = XCAR (current_kboard->kbd_queue);
c5fdd383 2651 current_kboard->kbd_queue
7539e11f 2652 = XCDR (current_kboard->kbd_queue);
c5fdd383
KH
2653 if (NILP (current_kboard->kbd_queue))
2654 current_kboard->kbd_queue_has_data = 0;
d9d4c147 2655 input_pending = readable_events (0);
4c52b668
KH
2656 if (EVENT_HAS_PARAMETERS (c)
2657 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qswitch_frame))
7539e11f 2658 internal_last_event_frame = XCAR (XCDR (c));
4c52b668 2659 Vlast_event_frame = internal_last_event_frame;
beecf6a1 2660 }
1e8bd3da
RS
2661 }
2662
1e8bd3da
RS
2663 /* If current_kboard's side queue is empty check the other kboards.
2664 If one of them has data that we have not yet seen here,
2665 switch to it and process the data waiting for it.
2666
2667 Note: if the events queued up for another kboard
2668 have already been seen here, and therefore are not a complete command,
2669 the kbd_queue_has_data field is 0, so we skip that kboard here.
2670 That's to avoid an infinite loop switching between kboards here. */
2671 if (NILP (c) && !single_kboard)
2672 {
2673 KBOARD *kb;
2674 for (kb = all_kboards; kb; kb = kb->next_kboard)
2675 if (kb->kbd_queue_has_data)
2676 {
2677 current_kboard = kb;
ef6661f7
RS
2678 /* This is going to exit from read_char
2679 so we had better get rid of this frame's stuff. */
2680 UNGCPRO;
9688ff53 2681 return make_number (-2); /* wrong_kboard_jmpbuf */
1e8bd3da
RS
2682 }
2683 }
df0f2ba1 2684
410d4de9
RS
2685 wrong_kboard:
2686
184c3d81 2687 STOP_POLLING;
410d4de9 2688
1e8bd3da
RS
2689 /* Finally, we read from the main queue,
2690 and if that gives us something we can't use yet, we put it on the
2691 appropriate side queue and try again. */
410d4de9 2692
1e8bd3da
RS
2693 if (NILP (c))
2694 {
2695 KBOARD *kb;
2696
179f689c
CY
2697 if (end_time)
2698 {
2699 EMACS_TIME now;
2700 EMACS_GET_TIME (now);
2701 if (EMACS_TIME_GE (now, *end_time))
2702 goto exit;
2703 }
2704
1e8bd3da 2705 /* Actually read a character, waiting if necessary. */
410d4de9
RS
2706 save_getcjmp (save_jump);
2707 restore_getcjmp (local_getcjmp);
3236e6b8 2708 if (!end_time)
70282fce 2709 timer_start_idle ();
179f689c 2710 c = kbd_buffer_get_event (&kb, used_mouse_menu, end_time);
410d4de9
RS
2711 restore_getcjmp (save_jump);
2712
410d4de9 2713 if (! NILP (c) && (kb != current_kboard))
1e8bd3da 2714 {
f3fbd155
KR
2715 Lisp_Object link = kb->kbd_queue;
2716 if (CONSP (link))
2717 {
2718 while (CONSP (XCDR (link)))
2719 link = XCDR (link);
2720 if (!NILP (XCDR (link)))
2721 abort ();
2722 }
2723 if (!CONSP (link))
2724 kb->kbd_queue = Fcons (c, Qnil);
2725 else
2726 XSETCDR (link, Fcons (c, Qnil));
1e8bd3da 2727 kb->kbd_queue_has_data = 1;
46b84797 2728 c = Qnil;
1e8bd3da
RS
2729 if (single_kboard)
2730 goto wrong_kboard;
2731 current_kboard = kb;
ef6661f7
RS
2732 /* This is going to exit from read_char
2733 so we had better get rid of this frame's stuff. */
2734 UNGCPRO;
9688ff53 2735 return make_number (-2);
df0f2ba1 2736 }
beecf6a1 2737 }
1e8bd3da 2738
284f4730 2739 /* Terminate Emacs in batch mode if at eof. */
8c18cbfb 2740 if (noninteractive && INTEGERP (c) && XINT (c) < 0)
284f4730
JB
2741 Fkill_emacs (make_number (1));
2742
8c18cbfb 2743 if (INTEGERP (c))
80645119
JB
2744 {
2745 /* Add in any extra modifiers, where appropriate. */
2746 if ((extra_keyboard_modifiers & CHAR_CTL)
2747 || ((extra_keyboard_modifiers & 0177) < ' '
2748 && (extra_keyboard_modifiers & 0177) != 0))
faf5e407 2749 XSETINT (c, make_ctrl_char (XINT (c)));
80645119
JB
2750
2751 /* Transfer any other modifier bits directly from
2752 extra_keyboard_modifiers to c. Ignore the actual character code
2753 in the low 16 bits of extra_keyboard_modifiers. */
b8d9050d 2754 XSETINT (c, XINT (c) | (extra_keyboard_modifiers & ~0xff7f & ~CHAR_CTL));
80645119 2755 }
9fa4395d 2756
284f4730
JB
2757 non_reread:
2758
3236e6b8
CY
2759 if (!end_time)
2760 timer_stop_idle ();
184c3d81 2761 RESUME_POLLING;
284f4730 2762
410d4de9
RS
2763 if (NILP (c))
2764 {
2765 if (commandflag >= 0
4ec4ed6a 2766 && !input_pending && !detect_input_pending_run_timers (0))
410d4de9
RS
2767 redisplay ();
2768
2769 goto wrong_kboard;
2770 }
2771
2772 non_reread_1:
2773
dfd11da7 2774 /* Buffer switch events are only for internal wakeups
7c3bc944
RS
2775 so don't show them to the user.
2776 Also, don't record a key if we already did. */
2777 if (BUFFERP (c) || key_already_recorded)
184c3d81 2778 goto exit;
a1341f75 2779
7f07d5ca
RS
2780 /* Process special events within read_char
2781 and loop around to read another event. */
017c7cb6
RS
2782 save = Vquit_flag;
2783 Vquit_flag = Qnil;
02067692 2784 tem = access_keymap (get_keymap (Vspecial_event_map, 0, 1), c, 0, 0, 1);
017c7cb6 2785 Vquit_flag = save;
7f07d5ca
RS
2786
2787 if (!NILP (tem))
2788 {
4a00eaca 2789 struct buffer *prev_buffer = current_buffer;
b3e6f69c 2790#if 0 /* This shouldn't be necessary anymore. --lorentey */
ba8dfba8 2791 int was_locked = single_kboard;
b3e6f69c
KL
2792 int count = SPECPDL_INDEX ();
2793 record_single_kboard_state ();
2794#endif
033b73e2 2795
4b09796d
GM
2796 last_input_event = c;
2797 Fcommand_execute (tem, Qnil, Fvector (1, &last_input_event), Qt);
ba8dfba8 2798
3236e6b8 2799 if (CONSP (c) && EQ (XCAR (c), Qselect_window) && !end_time)
5d12f14d
EZ
2800 /* We stopped being idle for this event; undo that. This
2801 prevents automatic window selection (under
0b9a1d3d 2802 mouse_autoselect_window from acting as a real input event, for
5d12f14d 2803 example banishing the mouse under mouse-avoidance-mode. */
5c12e63f 2804 timer_resume_idle ();
5d12f14d 2805
b3e6f69c 2806#if 0 /* This shouldn't be necessary anymore. --lorentey */
ba8dfba8
RS
2807 /* Resume allowing input from any kboard, if that was true before. */
2808 if (!was_locked)
2809 any_kboard_state ();
b3e6f69c
KL
2810 unbind_to (count, Qnil);
2811#endif
ba8dfba8 2812
4a00eaca
YM
2813 if (current_buffer != prev_buffer)
2814 {
2815 /* The command may have changed the keymaps. Pretend there
2816 is input in another keyboard and return. This will
2817 recalculate keymaps. */
2818 c = make_number (-2);
2819 goto exit;
2820 }
2821 else
2822 goto retry;
7f07d5ca
RS
2823 }
2824
284f4730 2825 /* Handle things that only apply to characters. */
8c18cbfb 2826 if (INTEGERP (c))
284f4730
JB
2827 {
2828 /* If kbd_buffer_get_event gave us an EOF, return that. */
86e5706b 2829 if (XINT (c) == -1)
184c3d81 2830 goto exit;
284f4730 2831
2e478293
KL
2832 if ((STRINGP (current_kboard->Vkeyboard_translate_table)
2833 && SCHARS (current_kboard->Vkeyboard_translate_table) > (unsigned) XFASTINT (c))
2834 || (VECTORP (current_kboard->Vkeyboard_translate_table)
2835 && XVECTOR (current_kboard->Vkeyboard_translate_table)->size > (unsigned) XFASTINT (c))
2836 || (CHAR_TABLE_P (current_kboard->Vkeyboard_translate_table)
dbcf4347 2837 && CHARACTERP (c)))
f9414d62
RS
2838 {
2839 Lisp_Object d;
2e478293 2840 d = Faref (current_kboard->Vkeyboard_translate_table, c);
f9414d62
RS
2841 /* nil in keyboard-translate-table means no translation. */
2842 if (!NILP (d))
2843 c = d;
2844 }
284f4730
JB
2845 }
2846
e4fe371d
RS
2847 /* If this event is a mouse click in the menu bar,
2848 return just menu-bar for now. Modify the mouse click event
2849 so we won't do this twice, then queue it up. */
2850 if (EVENT_HAS_PARAMETERS (c)
7539e11f 2851 && CONSP (XCDR (c))
e4fe371d 2852 && CONSP (EVENT_START (c))
7539e11f 2853 && CONSP (XCDR (EVENT_START (c))))
284f4730 2854 {
e4fe371d 2855 Lisp_Object posn;
284f4730 2856
6b61353c 2857 posn = POSN_POSN (EVENT_START (c));
e4fe371d
RS
2858 /* Handle menu-bar events:
2859 insert the dummy prefix event `menu-bar'. */
9ea173e8 2860 if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
e4fe371d
RS
2861 {
2862 /* Change menu-bar to (menu-bar) as the event "position". */
6b61353c 2863 POSN_SET_POSN (EVENT_START (c), Fcons (posn, Qnil));
284f4730 2864
e4fe371d
RS
2865 also_record = c;
2866 Vunread_command_events = Fcons (c, Vunread_command_events);
2867 c = posn;
284f4730 2868 }
284f4730
JB
2869 }
2870
7d18f9ae
RS
2871 /* Store these characters into recent_keys, the dribble file if any,
2872 and the keyboard macro being defined, if any. */
e4fe371d
RS
2873 record_char (c);
2874 if (! NILP (also_record))
2875 record_char (also_record);
51172b6d 2876
d5eecefb
RS
2877 /* Wipe the echo area.
2878 But first, if we are about to use an input method,
2879 save the echo area contents for it to refer to. */
2880 if (INTEGERP (c)
2881 && ! NILP (Vinput_method_function)
2882 && (unsigned) XINT (c) >= ' '
8d769115
KH
2883 && (unsigned) XINT (c) != 127
2884 && (unsigned) XINT (c) < 256)
7ee32cda
GM
2885 {
2886 previous_echo_area_message = Fcurrent_message ();
2887 Vinput_method_previous_message = previous_echo_area_message;
2888 }
d5eecefb 2889
1172eb8d
GM
2890 /* Now wipe the echo area, except for help events which do their
2891 own stuff with the echo area. */
4d2e9f95
GM
2892 if (!CONSP (c)
2893 || (!(EQ (Qhelp_echo, XCAR (c)))
2894 && !(EQ (Qswitch_frame, XCAR (c)))))
1172eb8d
GM
2895 {
2896 if (!NILP (echo_area_buffer[0]))
2897 safe_run_hooks (Qecho_area_clear_hook);
2898 clear_message (1, 0);
2899 }
d5eecefb 2900
7d18f9ae 2901 reread_for_input_method:
284f4730 2902 from_macro:
7d18f9ae 2903 /* Pass this to the input method, if appropriate. */
d5eecefb
RS
2904 if (INTEGERP (c)
2905 && ! NILP (Vinput_method_function)
b638f328
RS
2906 /* Don't run the input method within a key sequence,
2907 after the first event of the key sequence. */
2908 && NILP (prev_event)
d5eecefb 2909 && (unsigned) XINT (c) >= ' '
8d769115
KH
2910 && (unsigned) XINT (c) != 127
2911 && (unsigned) XINT (c) < 256)
d5eecefb 2912 {
c60ee5e7 2913 Lisp_Object keys;
63020c46 2914 int key_count, key_count_reset;
d5eecefb 2915 struct gcpro gcpro1;
aed13378 2916 int count = SPECPDL_INDEX ();
d5eecefb 2917
6e5742a0
RS
2918 /* Save the echo status. */
2919 int saved_immediate_echo = current_kboard->immediate_echo;
985f9f66 2920 struct kboard *saved_ok_to_echo = ok_to_echo_at_next_pause;
dc29116a 2921 Lisp_Object saved_echo_string = current_kboard->echo_string;
6e5742a0
RS
2922 int saved_echo_after_prompt = current_kboard->echo_after_prompt;
2923
22b94eeb 2924#if 0
6e5742a0
RS
2925 if (before_command_restore_flag)
2926 {
2927 this_command_key_count = before_command_key_count_1;
2928 if (this_command_key_count < this_single_command_key_start)
2929 this_single_command_key_start = this_command_key_count;
2930 echo_truncate (before_command_echo_length_1);
2931 before_command_restore_flag = 0;
2932 }
22b94eeb 2933#endif
6e5742a0
RS
2934
2935 /* Save the this_command_keys status. */
2936 key_count = this_command_key_count;
63020c46 2937 key_count_reset = this_command_key_count_reset;
6e5742a0
RS
2938
2939 if (key_count > 0)
2940 keys = Fcopy_sequence (this_command_keys);
2941 else
2942 keys = Qnil;
d5eecefb 2943 GCPRO1 (keys);
6e5742a0
RS
2944
2945 /* Clear out this_command_keys. */
2946 this_command_key_count = 0;
63020c46 2947 this_command_key_count_reset = 0;
6e5742a0
RS
2948
2949 /* Now wipe the echo area. */
985f9f66 2950 if (!NILP (echo_area_buffer[0]))
6e5742a0 2951 safe_run_hooks (Qecho_area_clear_hook);
985f9f66 2952 clear_message (1, 0);
6e5742a0
RS
2953 echo_truncate (0);
2954
b638f328
RS
2955 /* If we are not reading a key sequence,
2956 never use the echo area. */
2957 if (maps == 0)
2958 {
b638f328
RS
2959 specbind (Qinput_method_use_echo_area, Qt);
2960 }
2961
6e5742a0 2962 /* Call the input method. */
d5eecefb 2963 tem = call1 (Vinput_method_function, c);
b638f328
RS
2964
2965 tem = unbind_to (count, tem);
2966
6e5742a0
RS
2967 /* Restore the saved echoing state
2968 and this_command_keys state. */
2969 this_command_key_count = key_count;
63020c46 2970 this_command_key_count_reset = key_count_reset;
6e5742a0
RS
2971 if (key_count > 0)
2972 this_command_keys = keys;
2973
2974 cancel_echoing ();
2975 ok_to_echo_at_next_pause = saved_ok_to_echo;
dc29116a 2976 current_kboard->echo_string = saved_echo_string;
6e5742a0
RS
2977 current_kboard->echo_after_prompt = saved_echo_after_prompt;
2978 if (saved_immediate_echo)
2979 echo_now ();
2980
d5eecefb 2981 UNGCPRO;
6e5742a0 2982
d5eecefb
RS
2983 /* The input method can return no events. */
2984 if (! CONSP (tem))
7d18f9ae 2985 {
d5eecefb 2986 /* Bring back the previous message, if any. */
7ee32cda
GM
2987 if (! NILP (previous_echo_area_message))
2988 message_with_string ("%s", previous_echo_area_message, 0);
d5eecefb 2989 goto retry;
7d18f9ae 2990 }
d5eecefb 2991 /* It returned one event or more. */
7539e11f 2992 c = XCAR (tem);
d5eecefb 2993 Vunread_post_input_method_events
7539e11f 2994 = nconc2 (XCDR (tem), Vunread_post_input_method_events);
7d18f9ae 2995 }
7c3bc944 2996
7d18f9ae 2997 reread_first:
284f4730 2998
7ee32cda 2999 /* Display help if not echoing. */
1172eb8d 3000 if (CONSP (c) && EQ (XCAR (c), Qhelp_echo))
7ee32cda 3001 {
2190735a 3002 /* (help-echo FRAME HELP WINDOW OBJECT POS). */
d31053f9
RS
3003 Lisp_Object help, object, position, window, tem;
3004
3005 tem = Fcdr (XCDR (c));
3006 help = Fcar (tem);
3007 tem = Fcdr (tem);
3008 window = Fcar (tem);
3009 tem = Fcdr (tem);
3010 object = Fcar (tem);
3011 tem = Fcdr (tem);
3012 position = Fcar (tem);
3013
2190735a 3014 show_help_echo (help, window, object, position, 0);
fdbb67fe
GM
3015
3016 /* We stopped being idle for this event; undo that. */
3236e6b8
CY
3017 if (!end_time)
3018 timer_resume_idle ();
7ee32cda
GM
3019 goto retry;
3020 }
c60ee5e7 3021
4c0240d2
RS
3022 if ((! reread || this_command_key_count == 0
3023 || this_command_key_count_reset)
3024 && !end_time)
e4fe371d 3025 {
7d18f9ae
RS
3026
3027 /* Don't echo mouse motion events. */
f2647d04
DL
3028 if ((FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
3029 && NILP (Fzerop (Vecho_keystrokes))
7d18f9ae
RS
3030 && ! (EVENT_HAS_PARAMETERS (c)
3031 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_movement)))
3032 {
3033 echo_char (c);
3034 if (! NILP (also_record))
3035 echo_char (also_record);
3036 /* Once we reread a character, echoing can happen
3037 the next time we pause to read a new one. */
985f9f66 3038 ok_to_echo_at_next_pause = current_kboard;
7d18f9ae
RS
3039 }
3040
3041 /* Record this character as part of the current key. */
3042 add_command_key (c);
e4fe371d 3043 if (! NILP (also_record))
7d18f9ae 3044 add_command_key (also_record);
e4fe371d 3045 }
b8556aee 3046
4b09796d 3047 last_input_event = c;
c43b1734 3048 num_input_events++;
284f4730
JB
3049
3050 /* Process the help character specially if enabled */
ecb7cb34 3051 if (!NILP (Vhelp_form) && help_char_p (c))
284f4730
JB
3052 {
3053 Lisp_Object tem0;
aed13378 3054 count = SPECPDL_INDEX ();
284f4730 3055
638d3da0
CY
3056 help_form_saved_window_configs
3057 = Fcons (Fcurrent_window_configuration (Qnil),
3058 help_form_saved_window_configs);
3059 record_unwind_protect (read_char_help_form_unwind, Qnil);
284f4730
JB
3060
3061 tem0 = Feval (Vhelp_form);
8c18cbfb 3062 if (STRINGP (tem0))
284f4730
JB
3063 internal_with_output_to_temp_buffer ("*Help*", print_help, tem0);
3064
3065 cancel_echoing ();
3cb81011 3066 do
638d3da0
CY
3067 {
3068 c = read_char (0, 0, 0, Qnil, 0, NULL);
3069 if (EVENT_HAS_PARAMETERS (c)
3070 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_click))
3071 XSETCAR (help_form_saved_window_configs, Qnil);
3072 }
8c18cbfb 3073 while (BUFFERP (c));
ff11dfa1 3074 /* Remove the help from the frame */
284f4730 3075 unbind_to (count, Qnil);
410d4de9 3076
284f4730
JB
3077 redisplay ();
3078 if (EQ (c, make_number (040)))
3079 {
3080 cancel_echoing ();
3cb81011 3081 do
179f689c 3082 c = read_char (0, 0, 0, Qnil, 0, NULL);
8c18cbfb 3083 while (BUFFERP (c));
284f4730
JB
3084 }
3085 }
3086
184c3d81
RS
3087 exit:
3088 RESUME_POLLING;
7c3bc944 3089 RETURN_UNGCPRO (c);
284f4730
JB
3090}
3091
8eb4d8ef
RS
3092/* Record a key that came from a mouse menu.
3093 Record it for echoing, for this-command-keys, and so on. */
3094
3095static void
d3da34e0 3096record_menu_key (Lisp_Object c)
8eb4d8ef
RS
3097{
3098 /* Wipe the echo area. */
985f9f66 3099 clear_message (1, 0);
8eb4d8ef
RS
3100
3101 record_char (c);
3102
22b94eeb 3103#if 0
8eb4d8ef
RS
3104 before_command_key_count = this_command_key_count;
3105 before_command_echo_length = echo_length ();
22b94eeb 3106#endif
8eb4d8ef
RS
3107
3108 /* Don't echo mouse motion events. */
f2647d04
DL
3109 if ((FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
3110 && NILP (Fzerop (Vecho_keystrokes)))
8eb4d8ef
RS
3111 {
3112 echo_char (c);
3113
3114 /* Once we reread a character, echoing can happen
3115 the next time we pause to read a new one. */
3116 ok_to_echo_at_next_pause = 0;
3117 }
3118
3119 /* Record this character as part of the current key. */
3120 add_command_key (c);
3121
3122 /* Re-reading in the middle of a command */
4b09796d 3123 last_input_event = c;
c43b1734 3124 num_input_events++;
8eb4d8ef
RS
3125}
3126
ecb7cb34
KH
3127/* Return 1 if should recognize C as "the help character". */
3128
3129int
d3da34e0 3130help_char_p (Lisp_Object c)
ecb7cb34
KH
3131{
3132 Lisp_Object tail;
3133
3134 if (EQ (c, Vhelp_char))
3135 return 1;
7539e11f
KR
3136 for (tail = Vhelp_event_list; CONSP (tail); tail = XCDR (tail))
3137 if (EQ (c, XCAR (tail)))
ecb7cb34
KH
3138 return 1;
3139 return 0;
3140}
3141
e4fe371d
RS
3142/* Record the input event C in various ways. */
3143
3144static void
d3da34e0 3145record_char (Lisp_Object c)
e4fe371d 3146{
090c68b9 3147 int recorded = 0;
52be17cc 3148
090c68b9
KS
3149 if (CONSP (c) && (EQ (XCAR (c), Qhelp_echo) || EQ (XCAR (c), Qmouse_movement)))
3150 {
3151 /* To avoid filling recent_keys with help-echo and mouse-movement
3152 events, we filter out repeated help-echo events, only store the
3153 first and last in a series of mouse-movement events, and don't
3154 store repeated help-echo events which are only separated by
3155 mouse-movement events. */
3156
3157 Lisp_Object ev1, ev2, ev3;
3158 int ix1, ix2, ix3;
c60ee5e7 3159
090c68b9
KS
3160 if ((ix1 = recent_keys_index - 1) < 0)
3161 ix1 = NUM_RECENT_KEYS - 1;
3162 ev1 = AREF (recent_keys, ix1);
c60ee5e7 3163
090c68b9
KS
3164 if ((ix2 = ix1 - 1) < 0)
3165 ix2 = NUM_RECENT_KEYS - 1;
3166 ev2 = AREF (recent_keys, ix2);
c60ee5e7 3167
090c68b9
KS
3168 if ((ix3 = ix2 - 1) < 0)
3169 ix3 = NUM_RECENT_KEYS - 1;
3170 ev3 = AREF (recent_keys, ix3);
c60ee5e7 3171
090c68b9
KS
3172 if (EQ (XCAR (c), Qhelp_echo))
3173 {
3174 /* Don't record `help-echo' in recent_keys unless it shows some help
a978004d 3175 message, and a different help than the previously recorded
090c68b9
KS
3176 event. */
3177 Lisp_Object help, last_help;
3178
3179 help = Fcar_safe (Fcdr_safe (XCDR (c)));
3180 if (!STRINGP (help))
3181 recorded = 1;
3182 else if (CONSP (ev1) && EQ (XCAR (ev1), Qhelp_echo)
3183 && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev1))), EQ (last_help, help)))
3184 recorded = 1;
3185 else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
3186 && CONSP (ev2) && EQ (XCAR (ev2), Qhelp_echo)
3187 && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev2))), EQ (last_help, help)))
3188 recorded = -1;
3189 else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
3190 && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
3191 && CONSP (ev3) && EQ (XCAR (ev3), Qhelp_echo)
3192 && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev3))), EQ (last_help, help)))
3193 recorded = -2;
3194 }
3195 else if (EQ (XCAR (c), Qmouse_movement))
52be17cc 3196 {
090c68b9
KS
3197 /* Only record one pair of `mouse-movement' on a window in recent_keys.
3198 So additional mouse movement events replace the last element. */
3199 Lisp_Object last_window, window;
3200
3201 window = Fcar_safe (Fcar_safe (XCDR (c)));
3202 if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
3203 && (last_window = Fcar_safe (Fcar_safe (XCDR (ev1))), EQ (last_window, window))
3204 && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
3205 && (last_window = Fcar_safe (Fcar_safe (XCDR (ev2))), EQ (last_window, window)))
52be17cc 3206 {
090c68b9
KS
3207 ASET (recent_keys, ix1, c);
3208 recorded = 1;
52be17cc
GM
3209 }
3210 }
3211 }
3212 else
090c68b9
KS
3213 store_kbd_macro_char (c);
3214
3215 if (!recorded)
e8a50785
GM
3216 {
3217 total_keys++;
3218 ASET (recent_keys, recent_keys_index, c);
3219 if (++recent_keys_index >= NUM_RECENT_KEYS)
3220 recent_keys_index = 0;
3221 }
090c68b9
KS
3222 else if (recorded < 0)
3223 {
3224 /* We need to remove one or two events from recent_keys.
3225 To do this, we simply put nil at those events and move the
3226 recent_keys_index backwards over those events. Usually,
3227 users will never see those nil events, as they will be
3228 overwritten by the command keys entered to see recent_keys
3229 (e.g. C-h l). */
3230
3231 while (recorded++ < 0 && total_keys > 0)
3232 {
3233 if (total_keys < NUM_RECENT_KEYS)
3234 total_keys--;
3235 if (--recent_keys_index < 0)
3236 recent_keys_index = NUM_RECENT_KEYS - 1;
3237 ASET (recent_keys, recent_keys_index, Qnil);
3238 }
3239 }
3240
3241 num_nonmacro_input_events++;
c60ee5e7 3242
e4fe371d
RS
3243 /* Write c to the dribble file. If c is a lispy event, write
3244 the event's symbol to the dribble file, in <brackets>. Bleaugh.
3245 If you, dear reader, have a better idea, you've got the source. :-) */
3246 if (dribble)
3247 {
34f5c10f 3248 BLOCK_INPUT;
e4fe371d
RS
3249 if (INTEGERP (c))
3250 {
3251 if (XUINT (c) < 0x100)
3252 putc (XINT (c), dribble);
3253 else
6de34814 3254 fprintf (dribble, " 0x%x", (int) XUINT (c));
e4fe371d
RS
3255 }
3256 else
3257 {
3258 Lisp_Object dribblee;
3259
3260 /* If it's a structured event, take the event header. */
3261 dribblee = EVENT_HEAD (c);
3262
3263 if (SYMBOLP (dribblee))
3264 {
3265 putc ('<', dribble);
d5db4077
KR
3266 fwrite (SDATA (SYMBOL_NAME (dribblee)), sizeof (char),
3267 SBYTES (SYMBOL_NAME (dribblee)),
e4fe371d
RS
3268 dribble);
3269 putc ('>', dribble);
3270 }
3271 }
3272
3273 fflush (dribble);
34f5c10f 3274 UNBLOCK_INPUT;
e4fe371d 3275 }
e4fe371d
RS
3276}
3277
284f4730 3278Lisp_Object
d3da34e0 3279print_help (Lisp_Object object)
284f4730 3280{
622de3e9 3281 struct buffer *old = current_buffer;
284f4730 3282 Fprinc (object, Qnil);
622de3e9
KH
3283 set_buffer_internal (XBUFFER (Vstandard_output));
3284 call0 (intern ("help-mode"));
3285 set_buffer_internal (old);
284f4730
JB
3286 return Qnil;
3287}
3288
3289/* Copy out or in the info on where C-g should throw to.
3290 This is used when running Lisp code from within get_char,
3291 in case get_char is called recursively.
3292 See read_process_output. */
3293
dfcf069d 3294static void
d3da34e0 3295save_getcjmp (jmp_buf temp)
284f4730 3296{
72af86bd 3297 memcpy (temp, getcjmp, sizeof getcjmp);
284f4730
JB
3298}
3299
dfcf069d 3300static void
d3da34e0 3301restore_getcjmp (jmp_buf temp)
284f4730 3302{
72af86bd 3303 memcpy (getcjmp, temp, sizeof getcjmp);
284f4730 3304}
284f4730 3305\f
a612e298
RS
3306/* Low level keyboard/mouse input.
3307 kbd_buffer_store_event places events in kbd_buffer, and
0646c0dd 3308 kbd_buffer_get_event retrieves them. */
a612e298 3309
e0f24100 3310/* Return true if there are any events in the queue that read-char
a612e298
RS
3311 would return. If this returns false, a read-char would block. */
3312static int
d3da34e0 3313readable_events (int flags)
a612e298 3314{
a2d5fca0
JD
3315 if (flags & READABLE_EVENTS_DO_TIMERS_NOW)
3316 timer_check (1);
4ec4ed6a 3317
a2d5fca0
JD
3318 /* If the buffer contains only FOCUS_IN_EVENT events, and
3319 READABLE_EVENTS_FILTER_EVENTS is set, report it as empty. */
beecf6a1 3320 if (kbd_fetch_ptr != kbd_store_ptr)
a0ba8995 3321 {
354344a2
YM
3322 if (flags & (READABLE_EVENTS_FILTER_EVENTS
3323#ifdef USE_TOOLKIT_SCROLL_BARS
3324 | READABLE_EVENTS_IGNORE_SQUEEZABLES
3325#endif
3326 ))
20057d52
JD
3327 {
3328 struct input_event *event;
3329
3330 event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
3331 ? kbd_fetch_ptr
3332 : kbd_buffer);
3333
354344a2
YM
3334 do
3335 {
3336 if (!(
3337#ifdef USE_TOOLKIT_SCROLL_BARS
3338 (flags & READABLE_EVENTS_FILTER_EVENTS) &&
3339#endif
3340 event->kind == FOCUS_IN_EVENT)
3341#ifdef USE_TOOLKIT_SCROLL_BARS
3342 && !((flags & READABLE_EVENTS_IGNORE_SQUEEZABLES)
3343 && event->kind == SCROLL_BAR_CLICK_EVENT
3344 && event->part == scroll_bar_handle
3345 && event->modifiers == 0)
3346#endif
3347 )
3348 return 1;
3349 event++;
20057d52
JD
3350 if (event == kbd_buffer + KBD_BUFFER_SIZE)
3351 event = kbd_buffer;
354344a2
YM
3352 }
3353 while (event != kbd_store_ptr);
20057d52 3354 }
354344a2
YM
3355 else
3356 return 1;
a0ba8995
RS
3357 }
3358
ae372f41 3359#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
a2d5fca0
JD
3360 if (!(flags & READABLE_EVENTS_IGNORE_SQUEEZABLES)
3361 && !NILP (do_mouse_tracking) && some_mouse_moved ())
beecf6a1
KH
3362 return 1;
3363#endif
1e8bd3da 3364 if (single_kboard)
4c52b668 3365 {
c5fdd383 3366 if (current_kboard->kbd_queue_has_data)
4c52b668
KH
3367 return 1;
3368 }
3369 else
3370 {
c5fdd383
KH
3371 KBOARD *kb;
3372 for (kb = all_kboards; kb; kb = kb->next_kboard)
3373 if (kb->kbd_queue_has_data)
4c52b668
KH
3374 return 1;
3375 }
beecf6a1 3376 return 0;
a612e298
RS
3377}
3378
3379/* Set this for debugging, to have a way to get out */
3380int stop_character;
284f4730 3381
c5fdd383 3382static KBOARD *
d3da34e0 3383event_to_kboard (struct input_event *event)
5798cf15
KH
3384{
3385 Lisp_Object frame;
3386 frame = event->frame_or_window;
3387 if (CONSP (frame))
7539e11f 3388 frame = XCAR (frame);
5798cf15
KH
3389 else if (WINDOWP (frame))
3390 frame = WINDOW_FRAME (XWINDOW (frame));
3391
3392 /* There are still some events that don't set this field.
f5b56972
KH
3393 For now, just ignore the problem.
3394 Also ignore dead frames here. */
3395 if (!FRAMEP (frame) || !FRAME_LIVE_P (XFRAME (frame)))
5798cf15
KH
3396 return 0;
3397 else
c5fdd383 3398 return FRAME_KBOARD (XFRAME (frame));
5798cf15 3399}
5798cf15 3400
86520d8c 3401#ifdef subprocesses
cb768704
J
3402/* Return the number of slots occupied in kbd_buffer. */
3403
3404static int
6f704c76 3405kbd_buffer_nr_stored (void)
cb768704
J
3406{
3407 return kbd_fetch_ptr == kbd_store_ptr
3408 ? 0
3409 : (kbd_fetch_ptr < kbd_store_ptr
3410 ? kbd_store_ptr - kbd_fetch_ptr
3411 : ((kbd_buffer + KBD_BUFFER_SIZE) - kbd_fetch_ptr
3412 + (kbd_store_ptr - kbd_buffer)));
3413}
29208e82 3414#endif /* Store an event obtained at interrupt level into kbd_buffer, fifo */
284f4730
JB
3415
3416void
d3da34e0 3417kbd_buffer_store_event (register struct input_event *event)
6b61353c
KH
3418{
3419 kbd_buffer_store_event_hold (event, 0);
3420}
3421
3422/* Store EVENT obtained at interrupt level into kbd_buffer, fifo.
3423
3424 If HOLD_QUIT is 0, just stuff EVENT into the fifo.
3425 Else, if HOLD_QUIT.kind != NO_EVENT, discard EVENT.
3426 Else, if EVENT is a quit event, store the quit event
3427 in HOLD_QUIT, and return (thus ignoring further events).
3428
3429 This is used in read_avail_input to postpone the processing
3430 of the quit event until all subsequent input events have been
3431 parsed (and discarded).
3432 */
3433
3434void
d3da34e0
JB
3435kbd_buffer_store_event_hold (register struct input_event *event,
3436 struct input_event *hold_quit)
284f4730 3437{
3b8f9651 3438 if (event->kind == NO_EVENT)
284f4730
JB
3439 abort ();
3440
6b61353c
KH
3441 if (hold_quit && hold_quit->kind != NO_EVENT)
3442 return;
3443
3b8f9651 3444 if (event->kind == ASCII_KEYSTROKE_EVENT)
284f4730 3445 {
e9bf89a0 3446 register int c = event->code & 0377;
284f4730 3447
faf5e407
JB
3448 if (event->modifiers & ctrl_modifier)
3449 c = make_ctrl_char (c);
3450
9fd7d808
RS
3451 c |= (event->modifiers
3452 & (meta_modifier | alt_modifier
3453 | hyper_modifier | super_modifier));
3454
86e5706b 3455 if (c == quit_char)
284f4730 3456 {
d6805803 3457 KBOARD *kb = FRAME_KBOARD (XFRAME (event->frame_or_window));
5798cf15
KH
3458 struct input_event *sp;
3459
d6805803 3460 if (single_kboard && kb != current_kboard)
5798cf15 3461 {
c5fdd383 3462 kb->kbd_queue
5798cf15
KH
3463 = Fcons (make_lispy_switch_frame (event->frame_or_window),
3464 Fcons (make_number (c), Qnil));
c5fdd383 3465 kb->kbd_queue_has_data = 1;
5798cf15
KH
3466 for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++)
3467 {
3468 if (sp == kbd_buffer + KBD_BUFFER_SIZE)
3469 sp = kbd_buffer;
3470
c5fdd383 3471 if (event_to_kboard (sp) == kb)
5798cf15 3472 {
3b8f9651 3473 sp->kind = NO_EVENT;
5798cf15 3474 sp->frame_or_window = Qnil;
da8f7368 3475 sp->arg = Qnil;
5798cf15
KH
3476 }
3477 }
3478 return;
3479 }
3e51c7b7 3480
6b61353c
KH
3481 if (hold_quit)
3482 {
72af86bd 3483 memcpy (hold_quit, event, sizeof (*event));
6b61353c
KH
3484 return;
3485 }
3486
284f4730 3487 /* If this results in a quit_char being returned to Emacs as
3c370943 3488 input, set Vlast_event_frame properly. If this doesn't
284f4730 3489 get returned to Emacs as an event, the next event read
ff11dfa1 3490 will set Vlast_event_frame again, so this is safe to do. */
4bb994d1 3491 {
9b8eb840 3492 Lisp_Object focus;
4bb994d1 3493
9b8eb840 3494 focus = FRAME_FOCUS_FRAME (XFRAME (event->frame_or_window));
4bb994d1 3495 if (NILP (focus))
beecf6a1 3496 focus = event->frame_or_window;
4c52b668
KH
3497 internal_last_event_frame = focus;
3498 Vlast_event_frame = focus;
4bb994d1 3499 }
3e51c7b7 3500
ffd56f97 3501 last_event_timestamp = event->timestamp;
114a8b8c 3502 handle_interrupt ();
284f4730
JB
3503 return;
3504 }
3505
3506 if (c && c == stop_character)
3507 {
3508 sys_suspend ();
3509 return;
3510 }
284f4730 3511 }
3b8f9651 3512 /* Don't insert two BUFFER_SWITCH_EVENT's in a row.
3fe8e9a2 3513 Just ignore the second one. */
3b8f9651 3514 else if (event->kind == BUFFER_SWITCH_EVENT
3fe8e9a2 3515 && kbd_fetch_ptr != kbd_store_ptr
6b61353c
KH
3516 && ((kbd_store_ptr == kbd_buffer
3517 ? kbd_buffer + KBD_BUFFER_SIZE - 1
3518 : kbd_store_ptr - 1)->kind) == BUFFER_SWITCH_EVENT)
3fe8e9a2 3519 return;
284f4730 3520
beecf6a1
KH
3521 if (kbd_store_ptr - kbd_buffer == KBD_BUFFER_SIZE)
3522 kbd_store_ptr = kbd_buffer;
284f4730
JB
3523
3524 /* Don't let the very last slot in the buffer become full,
3525 since that would make the two pointers equal,
3526 and that is indistinguishable from an empty buffer.
3527 Discard the event if it would fill the last slot. */
beecf6a1 3528 if (kbd_fetch_ptr - 1 != kbd_store_ptr)
284f4730 3529 {
e3f6e7c7
KS
3530 *kbd_store_ptr = *event;
3531 ++kbd_store_ptr;
86520d8c 3532#ifdef subprocesses
cb768704
J
3533 if (kbd_buffer_nr_stored () > KBD_BUFFER_SIZE/2 && ! kbd_on_hold_p ())
3534 {
3535 /* Don't read keyboard input until we have processed kbd_buffer.
3536 This happens when pasting text longer than KBD_BUFFER_SIZE/2. */
3537 hold_keyboard_input ();
3538#ifdef SIGIO
3539 if (!noninteractive)
3540 signal (SIGIO, SIG_IGN);
3541#endif
3542 stop_polling ();
3543 }
86520d8c 3544#endif /* subprocesses */
e3f6e7c7 3545 }
2a84c6da 3546
85e7f477
RS
3547 /* If we're inside while-no-input, and this event qualifies
3548 as input, set quit-flag to cause an interrupt. */
2a84c6da
KS
3549 if (!NILP (Vthrow_on_input)
3550 && event->kind != FOCUS_IN_EVENT
3551 && event->kind != HELP_EVENT
b809d9e7 3552 && event->kind != DEICONIFY_EVENT)
85e7f477
RS
3553 {
3554 Vquit_flag = Vthrow_on_input;
3555 /* If we're inside a function that wants immediate quits,
3556 do it now. */
3557 if (immediate_quit && NILP (Vinhibit_quit))
3558 {
3559 immediate_quit = 0;
3560 sigfree ();
3561 QUIT;
3562 }
3563 }
e3f6e7c7 3564}
c60ee5e7 3565
da8f7368 3566
e3f6e7c7 3567/* Put an input event back in the head of the event queue. */
284f4730 3568
e3f6e7c7 3569void
d3da34e0 3570kbd_buffer_unget_event (register struct input_event *event)
e3f6e7c7
KS
3571{
3572 if (kbd_fetch_ptr == kbd_buffer)
3573 kbd_fetch_ptr = kbd_buffer + KBD_BUFFER_SIZE;
3574
3575 /* Don't let the very last slot in the buffer become full, */
3576 if (kbd_fetch_ptr - 1 != kbd_store_ptr)
3577 {
3578 --kbd_fetch_ptr;
3579 *kbd_fetch_ptr = *event;
284f4730
JB
3580 }
3581}
8dfd92c9
GM
3582
3583
41118bd3
EZ
3584/* Generate a HELP_EVENT input_event and store it in the keyboard
3585 buffer.
8dfd92c9
GM
3586
3587 HELP is the help form.
3588
40b1a3a9 3589 FRAME and WINDOW are the frame and window where the help is
41118bd3
EZ
3590 generated. OBJECT is the Lisp object where the help was found (a
3591 buffer, a string, an overlay, or nil if neither from a string nor
3592 from a buffer). POS is the position within OBJECT where the help
3593 was found. */
8dfd92c9 3594
6b61353c 3595void
d3da34e0 3596gen_help_event (Lisp_Object help, Lisp_Object frame, Lisp_Object window,
41118bd3 3597 Lisp_Object object, EMACS_INT pos)
8dfd92c9 3598{
6b61353c
KH
3599 struct input_event event;
3600
3601 EVENT_INIT (event);
3602
3603 event.kind = HELP_EVENT;
3604 event.frame_or_window = frame;
3605 event.arg = object;
3606 event.x = WINDOWP (window) ? window : frame;
3607 event.y = help;
3608 event.code = pos;
3609 kbd_buffer_store_event (&event);
8dfd92c9
GM
3610}
3611
3612
3613/* Store HELP_EVENTs for HELP on FRAME in the input queue. */
3614
3615void
d3da34e0 3616kbd_buffer_store_help_event (Lisp_Object frame, Lisp_Object help)
8dfd92c9
GM
3617{
3618 struct input_event event;
3619
3620 event.kind = HELP_EVENT;
3621 event.frame_or_window = frame;
3622 event.arg = Qnil;
2e1a49ad
SM
3623 event.x = Qnil;
3624 event.y = help;
8dfd92c9
GM
3625 event.code = 0;
3626 kbd_buffer_store_event (&event);
8dfd92c9
GM
3627}
3628
a612e298 3629\f
07de30b9 3630/* Discard any mouse events in the event buffer by setting them to
3b8f9651 3631 NO_EVENT. */
07de30b9 3632void
d3da34e0 3633discard_mouse_events (void)
07de30b9
GV
3634{
3635 struct input_event *sp;
3636 for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++)
3637 {
3638 if (sp == kbd_buffer + KBD_BUFFER_SIZE)
3639 sp = kbd_buffer;
3640
3b8f9651 3641 if (sp->kind == MOUSE_CLICK_EVENT
8006e4bb 3642 || sp->kind == WHEEL_EVENT
13899bc1 3643 || sp->kind == HORIZ_WHEEL_EVENT
e416374c
NR
3644#ifdef HAVE_GPM
3645 || sp->kind == GPM_CLICK_EVENT
07de30b9 3646#endif
3b8f9651 3647 || sp->kind == SCROLL_BAR_CLICK_EVENT)
07de30b9 3648 {
3b8f9651 3649 sp->kind = NO_EVENT;
07de30b9
GV
3650 }
3651 }
3652}
eeabfe76 3653
0bbfdc25
GM
3654
3655/* Return non-zero if there are any real events waiting in the event
3b8f9651 3656 buffer, not counting `NO_EVENT's.
0bbfdc25 3657
3b8f9651 3658 If DISCARD is non-zero, discard NO_EVENT events at the front of
0bbfdc25
GM
3659 the input queue, possibly leaving the input queue empty if there
3660 are no real input events. */
3661
eeabfe76 3662int
d3da34e0 3663kbd_buffer_events_waiting (int discard)
eeabfe76
EZ
3664{
3665 struct input_event *sp;
c60ee5e7 3666
0bbfdc25 3667 for (sp = kbd_fetch_ptr;
3b8f9651 3668 sp != kbd_store_ptr && sp->kind == NO_EVENT;
0bbfdc25 3669 ++sp)
eeabfe76
EZ
3670 {
3671 if (sp == kbd_buffer + KBD_BUFFER_SIZE)
3672 sp = kbd_buffer;
eeabfe76 3673 }
0bbfdc25 3674
eeabfe76
EZ
3675 if (discard)
3676 kbd_fetch_ptr = sp;
0bbfdc25 3677
3b8f9651 3678 return sp != kbd_store_ptr && sp->kind != NO_EVENT;
eeabfe76 3679}
0bbfdc25 3680
07de30b9 3681\f
0bbfdc25
GM
3682/* Clear input event EVENT. */
3683
3684static INLINE void
d3da34e0 3685clear_event (struct input_event *event)
0bbfdc25 3686{
3b8f9651 3687 event->kind = NO_EVENT;
0bbfdc25
GM
3688}
3689
3690
a612e298
RS
3691/* Read one event from the event buffer, waiting if necessary.
3692 The value is a Lisp object representing the event.
3693 The value is nil for an event that should be ignored,
3694 or that was handled here.
3695 We always read and discard one event. */
284f4730
JB
3696
3697static Lisp_Object
cb768704
J
3698kbd_buffer_get_event (KBOARD **kbp,
3699 int *used_mouse_menu,
3700 struct timeval *end_time)
284f4730
JB
3701{
3702 register int c;
3703 Lisp_Object obj;
361358ea 3704
86520d8c 3705#ifdef subprocesses
cb768704
J
3706 if (kbd_on_hold_p () && kbd_buffer_nr_stored () < KBD_BUFFER_SIZE/4)
3707 {
3708 /* Start reading input again, we have processed enough so we can
3709 accept new events again. */
3710 unhold_keyboard_input ();
3711#ifdef SIGIO
3712 if (!noninteractive)
3713 signal (SIGIO, input_available_signal);
3714#endif /* SIGIO */
3715 start_polling ();
3716 }
86520d8c 3717#endif /* subprocesses */
284f4730 3718
a3b1a468
DN
3719 if (noninteractive
3720 /* In case we are running as a daemon, only do this before
3721 detaching from the terminal. */
3722 || (IS_DAEMON && daemon_pipe[1] >= 0))
284f4730
JB
3723 {
3724 c = getchar ();
18cd2eeb 3725 XSETINT (obj, c);
f5b56972 3726 *kbp = current_kboard;
284f4730
JB
3727 return obj;
3728 }
3729
3730 /* Wait until there is input available. */
3731 for (;;)
3732 {
15d81484
MR
3733 /* Break loop if there's an unread command event. Needed in
3734 moused window autoselection which uses a timer to insert such
3735 events. */
3736 if (CONSP (Vunread_command_events))
3737 break;
033b73e2 3738
beecf6a1
KH
3739 if (kbd_fetch_ptr != kbd_store_ptr)
3740 break;
ae372f41 3741#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
f3253854 3742 if (!NILP (do_mouse_tracking) && some_mouse_moved ())
284f4730 3743 break;
beecf6a1 3744#endif
284f4730
JB
3745
3746 /* If the quit flag is set, then read_char will return
3747 quit_char, so that counts as "available input." */
3748 if (!NILP (Vquit_flag))
3749 quit_throw_to_read_char ();
3750
3751 /* One way or another, wait until input is available; then, if
3752 interrupt handlers have not read it, read it now. */
3753
284f4730
JB
3754/* Note SIGIO has been undef'd if FIONREAD is missing. */
3755#ifdef SIGIO
3756 gobble_input (0);
3757#endif /* SIGIO */
beecf6a1
KH
3758 if (kbd_fetch_ptr != kbd_store_ptr)
3759 break;
ae372f41 3760#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
f3253854 3761 if (!NILP (do_mouse_tracking) && some_mouse_moved ())
beecf6a1
KH
3762 break;
3763#endif
179f689c
CY
3764 if (end_time)
3765 {
3766 EMACS_TIME duration;
3767 EMACS_GET_TIME (duration);
6b657e42
EZ
3768 if (EMACS_TIME_GE (duration, *end_time))
3769 return Qnil; /* finished waiting */
179f689c 3770 else
6b657e42
EZ
3771 {
3772 EMACS_SUB_TIME (duration, *end_time, duration);
3773 wait_reading_process_output (EMACS_SECS (duration),
3774 EMACS_USECS (duration),
3775 -1, 1, Qnil, NULL, 0);
3776 }
179f689c
CY
3777 }
3778 else
d64b707c 3779 wait_reading_process_output (0, 0, -1, 1, Qnil, NULL, 0);
284f4730 3780
179f689c
CY
3781 if (!interrupt_input && kbd_fetch_ptr == kbd_store_ptr)
3782 /* Pass 1 for EXPECT since we just waited to have input. */
3783 read_avail_input (1);
284f4730
JB
3784 }
3785
303b5b3f
RS
3786 if (CONSP (Vunread_command_events))
3787 {
3788 Lisp_Object first;
7539e11f
KR
3789 first = XCAR (Vunread_command_events);
3790 Vunread_command_events = XCDR (Vunread_command_events);
303b5b3f
RS
3791 *kbp = current_kboard;
3792 return first;
3793 }
3794
284f4730
JB
3795 /* At this point, we know that there is a readable event available
3796 somewhere. If the event queue is empty, then there must be a
3797 mouse movement enabled and available. */
beecf6a1 3798 if (kbd_fetch_ptr != kbd_store_ptr)
284f4730 3799 {
cd21b839 3800 struct input_event *event;
3e51c7b7 3801
beecf6a1
KH
3802 event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
3803 ? kbd_fetch_ptr
3804 : kbd_buffer);
3e51c7b7 3805
cd21b839 3806 last_event_timestamp = event->timestamp;
cd21b839 3807
c5fdd383
KH
3808 *kbp = event_to_kboard (event);
3809 if (*kbp == 0)
3810 *kbp = current_kboard; /* Better than returning null ptr? */
beecf6a1 3811
4bb994d1
JB
3812 obj = Qnil;
3813
48e416d4 3814 /* These two kinds of events get special handling
a612e298
RS
3815 and don't actually appear to the command loop.
3816 We return nil for them. */
e3f6e7c7
KS
3817 if (event->kind == SELECTION_REQUEST_EVENT
3818 || event->kind == SELECTION_CLEAR_EVENT)
48e416d4 3819 {
598a9fa7 3820#ifdef HAVE_X11
1e8bd3da
RS
3821 struct input_event copy;
3822
4581e928
RS
3823 /* Remove it from the buffer before processing it,
3824 since otherwise swallow_events will see it
3825 and process it again. */
1e8bd3da 3826 copy = *event;
beecf6a1 3827 kbd_fetch_ptr = event + 1;
d9d4c147 3828 input_pending = readable_events (0);
e3f6e7c7 3829 x_handle_selection_event (&copy);
598a9fa7
JB
3830#else
3831 /* We're getting selection request events, but we don't have
3832 a window system. */
3833 abort ();
3834#endif
48e416d4
RS
3835 }
3836
8612b71a
AR
3837#if defined (HAVE_NS)
3838 else if (event->kind == NS_TEXT_EVENT)
3839 {
3840 if (event->code == KEY_NS_PUT_WORKING_TEXT)
3841 obj = Fcons (intern ("ns-put-working-text"), Qnil);
3842 else
3843 obj = Fcons (intern ("ns-unput-working-text"), Qnil);
3844 kbd_fetch_ptr = event + 1;
5acf9d90
AR
3845 if (used_mouse_menu)
3846 *used_mouse_menu = 1;
8612b71a
AR
3847 }
3848#endif
3849
9e2a2647 3850#if defined (HAVE_X11) || defined (HAVE_NTGUI) \
edfda783 3851 || defined (HAVE_NS)
3b8f9651 3852 else if (event->kind == DELETE_WINDOW_EVENT)
990acea3 3853 {
bbdc2092
RS
3854 /* Make an event (delete-frame (FRAME)). */
3855 obj = Fcons (event->frame_or_window, Qnil);
af17bd2b 3856 obj = Fcons (Qdelete_frame, Fcons (obj, Qnil));
beecf6a1 3857 kbd_fetch_ptr = event + 1;
af17bd2b 3858 }
1a578e9b 3859#endif
9e2a2647 3860#if defined (HAVE_X11) || defined (HAVE_NTGUI) \
edfda783 3861 || defined (HAVE_NS)
3b8f9651 3862 else if (event->kind == ICONIFY_EVENT)
af17bd2b
KH
3863 {
3864 /* Make an event (iconify-frame (FRAME)). */
3865 obj = Fcons (event->frame_or_window, Qnil);
3866 obj = Fcons (Qiconify_frame, Fcons (obj, Qnil));
beecf6a1 3867 kbd_fetch_ptr = event + 1;
af17bd2b 3868 }
3b8f9651 3869 else if (event->kind == DEICONIFY_EVENT)
af17bd2b
KH
3870 {
3871 /* Make an event (make-frame-visible (FRAME)). */
3872 obj = Fcons (event->frame_or_window, Qnil);
3873 obj = Fcons (Qmake_frame_visible, Fcons (obj, Qnil));
beecf6a1 3874 kbd_fetch_ptr = event + 1;
990acea3
RS
3875 }
3876#endif
3b8f9651 3877 else if (event->kind == BUFFER_SWITCH_EVENT)
a8015ab5
KH
3878 {
3879 /* The value doesn't matter here; only the type is tested. */
18cd2eeb 3880 XSETBUFFER (obj, current_buffer);
beecf6a1 3881 kbd_fetch_ptr = event + 1;
a8015ab5 3882 }
9e2a2647 3883#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
edfda783 3884 || defined(HAVE_NS) || defined (USE_GTK)
3b8f9651 3885 else if (event->kind == MENU_BAR_ACTIVATE_EVENT)
099787c1
RS
3886 {
3887 kbd_fetch_ptr = event + 1;
d9d4c147 3888 input_pending = readable_events (0);
e649d076
RS
3889 if (FRAME_LIVE_P (XFRAME (event->frame_or_window)))
3890 x_activate_menubar (XFRAME (event->frame_or_window));
099787c1 3891 }
1161d367 3892#endif
9e2a2647 3893#if defined (WINDOWSNT)
3b8f9651 3894 else if (event->kind == LANGUAGE_CHANGE_EVENT)
1161d367
GV
3895 {
3896 /* Make an event (language-change (FRAME CHARSET LCID)). */
d352abdf 3897 obj = Fcons (event->frame_or_window, Qnil);
1161d367
GV
3898 obj = Fcons (Qlanguage_change, Fcons (obj, Qnil));
3899 kbd_fetch_ptr = event + 1;
3900 }
099787c1 3901#endif
3b8f9651 3902 else if (event->kind == SAVE_SESSION_EVENT)
4ebc27a5 3903 {
0b9fc69a 3904 obj = Fcons (Qsave_session, Fcons (event->arg, Qnil));
4ebc27a5
JD
3905 kbd_fetch_ptr = event + 1;
3906 }
a612e298 3907 /* Just discard these, by returning nil.
c5fdd383 3908 With MULTI_KBOARD, these events are used as placeholders
5798cf15
KH
3909 when we need to randomly delete events from the queue.
3910 (They shouldn't otherwise be found in the buffer,
3911 but on some machines it appears they do show up
c5fdd383 3912 even without MULTI_KBOARD.) */
3b8f9651 3913 /* On Windows NT/9X, NO_EVENT is used to delete extraneous
07de30b9 3914 mouse events during a popup-menu call. */
3b8f9651 3915 else if (event->kind == NO_EVENT)
beecf6a1 3916 kbd_fetch_ptr = event + 1;
7ee32cda
GM
3917 else if (event->kind == HELP_EVENT)
3918 {
2190735a 3919 Lisp_Object object, position, help, frame, window;
e4457b09 3920
8dfd92c9
GM
3921 frame = event->frame_or_window;
3922 object = event->arg;
2e1a49ad
SM
3923 position = make_number (event->code);
3924 window = event->x;
3925 help = event->y;
0bbfdc25 3926 clear_event (event);
e4457b09
GM
3927
3928 kbd_fetch_ptr = event + 1;
2190735a
GM
3929 if (!WINDOWP (window))
3930 window = Qnil;
3931 obj = Fcons (Qhelp_echo,
3932 list5 (frame, help, window, object, position));
7ee32cda 3933 }
c51c7093
GM
3934 else if (event->kind == FOCUS_IN_EVENT)
3935 {
3936 /* Notification of a FocusIn event. The frame receiving the
3937 focus is in event->frame_or_window. Generate a
3938 switch-frame event if necessary. */
3939 Lisp_Object frame, focus;
3940
3941 frame = event->frame_or_window;
3942 focus = FRAME_FOCUS_FRAME (XFRAME (frame));
3943 if (FRAMEP (focus))
3944 frame = focus;
3945
3946 if (!EQ (frame, internal_last_event_frame)
3947 && !EQ (frame, selected_frame))
3948 obj = make_lispy_switch_frame (frame);
3949 internal_last_event_frame = frame;
3950 kbd_fetch_ptr = event + 1;
3951 }
033b73e2
MA
3952#ifdef HAVE_DBUS
3953 else if (event->kind == DBUS_EVENT)
3954 {
3955 obj = make_lispy_event (event);
3956 kbd_fetch_ptr = event + 1;
3957 }
3958#endif
637fa988
JD
3959 else if (event->kind == CONFIG_CHANGED_EVENT)
3960 {
3961 obj = make_lispy_event (event);
3962 kbd_fetch_ptr = event + 1;
3963 }
1e12dd87
RS
3964 else
3965 {
c51c7093
GM
3966 /* If this event is on a different frame, return a switch-frame this
3967 time, and leave the event in the queue for next time. */
9b8eb840 3968 Lisp_Object frame;
1e12dd87 3969 Lisp_Object focus;
7b4aedb9 3970
9b8eb840 3971 frame = event->frame_or_window;
2470a66f 3972 if (CONSP (frame))
7539e11f 3973 frame = XCAR (frame);
2470a66f 3974 else if (WINDOWP (frame))
1e12dd87 3975 frame = WINDOW_FRAME (XWINDOW (frame));
4bb994d1 3976
1e12dd87
RS
3977 focus = FRAME_FOCUS_FRAME (XFRAME (frame));
3978 if (! NILP (focus))
3979 frame = focus;
07d2b8de 3980
4c52b668 3981 if (! EQ (frame, internal_last_event_frame)
788f89eb 3982 && !EQ (frame, selected_frame))
1e12dd87 3983 obj = make_lispy_switch_frame (frame);
4c52b668 3984 internal_last_event_frame = frame;
4bb994d1 3985
1e12dd87
RS
3986 /* If we didn't decide to make a switch-frame event, go ahead
3987 and build a real event from the queue entry. */
cd21b839 3988
1e12dd87
RS
3989 if (NILP (obj))
3990 {
3991 obj = make_lispy_event (event);
c60ee5e7 3992
9e2a2647 3993#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
edfda783 3994 || defined(HAVE_NS) || defined (USE_GTK)
83d68044
KH
3995 /* If this was a menu selection, then set the flag to inhibit
3996 writing to last_nonmenu_event. Don't do this if the event
3997 we're returning is (menu-bar), though; that indicates the
3998 beginning of the menu sequence, and we might as well leave
3999 that as the `event with parameters' for this selection. */
da8f7368
GM
4000 if (used_mouse_menu
4001 && !EQ (event->frame_or_window, event->arg)
4002 && (event->kind == MENU_BAR_EVENT
4003 || event->kind == TOOL_BAR_EVENT))
83d68044
KH
4004 *used_mouse_menu = 1;
4005#endif
83d92ee0
DR
4006#ifdef HAVE_NS
4007 /* certain system events are non-key events */
5acf9d90
AR
4008 if (used_mouse_menu
4009 && event->kind == NS_NONKEY_EVENT)
83d92ee0
DR
4010 *used_mouse_menu = 1;
4011#endif
1e12dd87
RS
4012
4013 /* Wipe out this event, to catch bugs. */
0bbfdc25 4014 clear_event (event);
beecf6a1 4015 kbd_fetch_ptr = event + 1;
1e12dd87 4016 }
4bb994d1 4017 }
284f4730 4018 }
ae372f41 4019#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
a612e298 4020 /* Try generating a mouse motion event. */
f3253854 4021 else if (!NILP (do_mouse_tracking) && some_mouse_moved ())
284f4730 4022 {
f3253854 4023 FRAME_PTR f = some_mouse_moved ();
7b4aedb9 4024 Lisp_Object bar_window;
3c370943 4025 enum scroll_bar_part part;
e5d77022
JB
4026 Lisp_Object x, y;
4027 unsigned long time;
284f4730 4028
c5fdd383 4029 *kbp = current_kboard;
6ed8eeff 4030 /* Note that this uses F to determine which terminal to look at.
e177ac3a
RS
4031 If there is no valid info, it does not store anything
4032 so x remains nil. */
4033 x = Qnil;
3b7fbceb 4034
c3b4957f 4035 /* XXX Can f or mouse_position_hook be NULL here? */
6ed8eeff
KL
4036 if (f && FRAME_TERMINAL (f)->mouse_position_hook)
4037 (*FRAME_TERMINAL (f)->mouse_position_hook) (&f, 0, &bar_window,
4038 &part, &x, &y, &time);
4bb994d1
JB
4039
4040 obj = Qnil;
284f4730 4041
4bb994d1
JB
4042 /* Decide if we should generate a switch-frame event. Don't
4043 generate switch-frame events for motion outside of all Emacs
4044 frames. */
e177ac3a 4045 if (!NILP (x) && f)
cd21b839 4046 {
9b8eb840 4047 Lisp_Object frame;
4bb994d1 4048
9b8eb840 4049 frame = FRAME_FOCUS_FRAME (f);
4bb994d1 4050 if (NILP (frame))
18cd2eeb 4051 XSETFRAME (frame, f);
4bb994d1 4052
4c52b668 4053 if (! EQ (frame, internal_last_event_frame)
788f89eb 4054 && !EQ (frame, selected_frame))
764cb3f9 4055 obj = make_lispy_switch_frame (frame);
4c52b668 4056 internal_last_event_frame = frame;
cd21b839 4057 }
4bb994d1 4058
df0f2ba1 4059 /* If we didn't decide to make a switch-frame event, go ahead and
4bb994d1 4060 return a mouse-motion event. */
e177ac3a 4061 if (!NILP (x) && NILP (obj))
7b4aedb9 4062 obj = make_lispy_movement (f, bar_window, part, x, y, time);
6cbff1cb 4063 }
ae372f41 4064#endif /* HAVE_MOUSE || HAVE GPM */
284f4730
JB
4065 else
4066 /* We were promised by the above while loop that there was
4067 something for us to read! */
4068 abort ();
4069
d9d4c147 4070 input_pending = readable_events (0);
284f4730 4071
4c52b668 4072 Vlast_event_frame = internal_last_event_frame;
3c370943 4073
284f4730
JB
4074 return (obj);
4075}
a612e298
RS
4076\f
4077/* Process any events that are not user-visible,
4078 then return, without reading any user-visible events. */
3a3b9632
RS
4079
4080void
d3da34e0 4081swallow_events (int do_display)
3a3b9632 4082{
87dd9b9b
RS
4083 int old_timers_run;
4084
beecf6a1 4085 while (kbd_fetch_ptr != kbd_store_ptr)
3a3b9632
RS
4086 {
4087 struct input_event *event;
4088
beecf6a1
KH
4089 event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
4090 ? kbd_fetch_ptr
4091 : kbd_buffer);
3a3b9632
RS
4092
4093 last_event_timestamp = event->timestamp;
4094
4095 /* These two kinds of events get special handling
4096 and don't actually appear to the command loop. */
e3f6e7c7
KS
4097 if (event->kind == SELECTION_REQUEST_EVENT
4098 || event->kind == SELECTION_CLEAR_EVENT)
3a3b9632
RS
4099 {
4100#ifdef HAVE_X11
4581e928 4101 struct input_event copy;
e0301c07
RS
4102
4103 /* Remove it from the buffer before processing it,
4104 since otherwise swallow_events called recursively could see it
4105 and process it again. */
4581e928 4106 copy = *event;
beecf6a1 4107 kbd_fetch_ptr = event + 1;
d9d4c147 4108 input_pending = readable_events (0);
e3f6e7c7 4109 x_handle_selection_event (&copy);
3a3b9632
RS
4110#else
4111 /* We're getting selection request events, but we don't have
4112 a window system. */
4113 abort ();
4114#endif
4115 }
4116 else
4117 break;
4118 }
4119
87dd9b9b 4120 old_timers_run = timers_run;
a2d5fca0 4121 get_input_pending (&input_pending, READABLE_EVENTS_DO_TIMERS_NOW);
87dd9b9b
RS
4122
4123 if (timers_run != old_timers_run && do_display)
3007ebfb 4124 redisplay_preserve_echo_area (7);
3a3b9632 4125}
a612e298 4126\f
d9d4c147
KH
4127/* Record the start of when Emacs is idle,
4128 for the sake of running idle-time timers. */
4129
5c12e63f 4130static void
d3da34e0 4131timer_start_idle (void)
d9d4c147
KH
4132{
4133 Lisp_Object timers;
4134
4135 /* If we are already in the idle state, do nothing. */
4136 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4137 return;
4138
4139 EMACS_GET_TIME (timer_idleness_start_time);
4140
3021d3a9
RS
4141 timer_last_idleness_start_time = timer_idleness_start_time;
4142
d9d4c147 4143 /* Mark all idle-time timers as once again candidates for running. */
7539e11f 4144 for (timers = Vtimer_idle_list; CONSP (timers); timers = XCDR (timers))
d9d4c147
KH
4145 {
4146 Lisp_Object timer;
4147
7539e11f 4148 timer = XCAR (timers);
d9d4c147
KH
4149
4150 if (!VECTORP (timer) || XVECTOR (timer)->size != 8)
4151 continue;
4152 XVECTOR (timer)->contents[0] = Qnil;
4153 }
4154}
4155
4156/* Record that Emacs is no longer idle, so stop running idle-time timers. */
4157
5c12e63f 4158static void
d3da34e0 4159timer_stop_idle (void)
d9d4c147
KH
4160{
4161 EMACS_SET_SECS_USECS (timer_idleness_start_time, -1, -1);
4162}
4163
5c12e63f
KS
4164/* Resume idle timer from last idle start time. */
4165
4166static void
d3da34e0 4167timer_resume_idle (void)
5c12e63f
KS
4168{
4169 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4170 return;
4171
4172 timer_idleness_start_time = timer_last_idleness_start_time;
4173}
4174
e044e87c
RS
4175/* This is only for debugging. */
4176struct input_event last_timer_event;
4177
58555d81
SM
4178/* List of elisp functions to call, delayed because they were generated in
4179 a context where Elisp could not be safely run (e.g. redisplay, signal,
864660a2 4180 ...). Each element has the form (FUN . ARGS). */
58555d81
SM
4181Lisp_Object pending_funcalls;
4182
c04cbc3b
RS
4183/* Check whether a timer has fired. To prevent larger problems we simply
4184 disregard elements that are not proper timers. Do not make a circular
4185 timer list for the time being.
4186
e90292a9
JD
4187 Returns the time to wait until the next timer fires. If a
4188 timer is triggering now, return zero.
4189 If no timer is active, return -1.
c04cbc3b 4190
4ec4ed6a 4191 If a timer is ripe, we run it, with quitting turned off.
e90292a9
JD
4192 In that case we return 0 to indicate that a new timer_check_2 call
4193 should be done. */
4ec4ed6a 4194
e90292a9 4195static EMACS_TIME
d3da34e0 4196timer_check_2 (void)
c04cbc3b
RS
4197{
4198 EMACS_TIME nexttime;
9291c072
RS
4199 EMACS_TIME now, idleness_now;
4200 Lisp_Object timers, idle_timers, chosen_timer;
9291c072 4201 struct gcpro gcpro1, gcpro2, gcpro3;
c04cbc3b 4202
c04cbc3b
RS
4203 EMACS_SET_SECS (nexttime, -1);
4204 EMACS_SET_USECS (nexttime, -1);
4205
9291c072 4206 /* Always consider the ordinary timers. */
7ea13e12 4207 timers = Vtimer_list;
9291c072
RS
4208 /* Consider the idle timers only if Emacs is idle. */
4209 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4210 idle_timers = Vtimer_idle_list;
4211 else
4212 idle_timers = Qnil;
4213 chosen_timer = Qnil;
4214 GCPRO3 (timers, idle_timers, chosen_timer);
7ea13e12 4215
58555d81
SM
4216 /* First run the code that was delayed. */
4217 while (CONSP (pending_funcalls))
4218 {
4219 Lisp_Object funcall = XCAR (pending_funcalls);
4220 pending_funcalls = XCDR (pending_funcalls);
4221 safe_call2 (Qapply, XCAR (funcall), XCDR (funcall));
4222 }
4223
9291c072 4224 if (CONSP (timers) || CONSP (idle_timers))
c04cbc3b 4225 {
9291c072
RS
4226 EMACS_GET_TIME (now);
4227 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4228 EMACS_SUB_TIME (idleness_now, now, timer_idleness_start_time);
4229 }
c04cbc3b 4230
9291c072
RS
4231 while (CONSP (timers) || CONSP (idle_timers))
4232 {
9291c072 4233 Lisp_Object *vector;
8c907a56 4234 Lisp_Object timer = Qnil, idle_timer = Qnil;
9291c072
RS
4235 EMACS_TIME timer_time, idle_timer_time;
4236 EMACS_TIME difference, timer_difference, idle_timer_difference;
4237
4238 /* Skip past invalid timers and timers already handled. */
4239 if (!NILP (timers))
c04cbc3b 4240 {
7539e11f 4241 timer = XCAR (timers);
9291c072
RS
4242 if (!VECTORP (timer) || XVECTOR (timer)->size != 8)
4243 {
7539e11f 4244 timers = XCDR (timers);
9291c072
RS
4245 continue;
4246 }
4247 vector = XVECTOR (timer)->contents;
d9d4c147 4248
9291c072
RS
4249 if (!INTEGERP (vector[1]) || !INTEGERP (vector[2])
4250 || !INTEGERP (vector[3])
4251 || ! NILP (vector[0]))
4252 {
7539e11f 4253 timers = XCDR (timers);
9291c072
RS
4254 continue;
4255 }
4256 }
4257 if (!NILP (idle_timers))
4258 {
7539e11f 4259 timer = XCAR (idle_timers);
d9d4c147 4260 if (!VECTORP (timer) || XVECTOR (timer)->size != 8)
9291c072 4261 {
7539e11f 4262 idle_timers = XCDR (idle_timers);
9291c072
RS
4263 continue;
4264 }
d9d4c147
KH
4265 vector = XVECTOR (timer)->contents;
4266
4267 if (!INTEGERP (vector[1]) || !INTEGERP (vector[2])
9291c072
RS
4268 || !INTEGERP (vector[3])
4269 || ! NILP (vector[0]))
4270 {
7539e11f 4271 idle_timers = XCDR (idle_timers);
9291c072
RS
4272 continue;
4273 }
4274 }
d9d4c147 4275
9291c072
RS
4276 /* Set TIMER, TIMER_TIME and TIMER_DIFFERENCE
4277 based on the next ordinary timer.
4278 TIMER_DIFFERENCE is the distance in time from NOW to when
4279 this timer becomes ripe (negative if it's already ripe). */
4280 if (!NILP (timers))
4281 {
7539e11f 4282 timer = XCAR (timers);
9291c072 4283 vector = XVECTOR (timer)->contents;
d9d4c147
KH
4284 EMACS_SET_SECS (timer_time,
4285 (XINT (vector[1]) << 16) | (XINT (vector[2])));
4286 EMACS_SET_USECS (timer_time, XINT (vector[3]));
9291c072
RS
4287 EMACS_SUB_TIME (timer_difference, timer_time, now);
4288 }
ba8dfba8 4289
9291c072
RS
4290 /* Set IDLE_TIMER, IDLE_TIMER_TIME and IDLE_TIMER_DIFFERENCE
4291 based on the next idle timer. */
4292 if (!NILP (idle_timers))
4293 {
7539e11f 4294 idle_timer = XCAR (idle_timers);
9291c072
RS
4295 vector = XVECTOR (idle_timer)->contents;
4296 EMACS_SET_SECS (idle_timer_time,
4297 (XINT (vector[1]) << 16) | (XINT (vector[2])));
4298 EMACS_SET_USECS (idle_timer_time, XINT (vector[3]));
4299 EMACS_SUB_TIME (idle_timer_difference, idle_timer_time, idleness_now);
4300 }
ba8dfba8 4301
9291c072
RS
4302 /* Decide which timer is the next timer,
4303 and set CHOSEN_TIMER, VECTOR and DIFFERENCE accordingly.
4304 Also step down the list where we found that timer. */
d9d4c147 4305
9291c072
RS
4306 if (! NILP (timers) && ! NILP (idle_timers))
4307 {
4308 EMACS_TIME temp;
4309 EMACS_SUB_TIME (temp, timer_difference, idle_timer_difference);
4310 if (EMACS_TIME_NEG_P (temp))
4311 {
4312 chosen_timer = timer;
7539e11f 4313 timers = XCDR (timers);
9291c072 4314 difference = timer_difference;
c04cbc3b 4315 }
d9d4c147 4316 else
d9d4c147 4317 {
9291c072 4318 chosen_timer = idle_timer;
7539e11f 4319 idle_timers = XCDR (idle_timers);
9291c072 4320 difference = idle_timer_difference;
d9d4c147 4321 }
7ea13e12 4322 }
9291c072
RS
4323 else if (! NILP (timers))
4324 {
4325 chosen_timer = timer;
7539e11f 4326 timers = XCDR (timers);
9291c072
RS
4327 difference = timer_difference;
4328 }
4329 else
4330 {
4331 chosen_timer = idle_timer;
7539e11f 4332 idle_timers = XCDR (idle_timers);
9291c072
RS
4333 difference = idle_timer_difference;
4334 }
4335 vector = XVECTOR (chosen_timer)->contents;
c60ee5e7 4336
bd55b860 4337 /* If timer is ripe, run it if it hasn't been run. */
9291c072
RS
4338 if (EMACS_TIME_NEG_P (difference)
4339 || (EMACS_SECS (difference) == 0
4340 && EMACS_USECS (difference) == 0))
4341 {
4342 if (NILP (vector[0]))
4343 {
331379bf 4344 int count = SPECPDL_INDEX ();
d0bbfc99 4345 Lisp_Object old_deactivate_mark = Vdeactivate_mark;
d925fb39 4346
9291c072
RS
4347 /* Mark the timer as triggered to prevent problems if the lisp
4348 code fails to reschedule it right. */
4349 vector[0] = Qt;
4350
d925fb39 4351 specbind (Qinhibit_quit, Qt);
c60ee5e7 4352
d925fb39 4353 call1 (Qtimer_event_handler, chosen_timer);
d0bbfc99 4354 Vdeactivate_mark = old_deactivate_mark;
d925fb39 4355 timers_run++;
d925fb39 4356 unbind_to (count, Qnil);
4ec4ed6a 4357
d925fb39
RS
4358 /* Since we have handled the event,
4359 we don't need to tell the caller to wake up and do it. */
e90292a9
JD
4360 /* But the caller must still wait for the next timer, so
4361 return 0 to indicate that. */
9291c072 4362 }
e90292a9
JD
4363
4364 EMACS_SET_SECS (nexttime, 0);
4365 EMACS_SET_USECS (nexttime, 0);
9291c072
RS
4366 }
4367 else
4368 /* When we encounter a timer that is still waiting,
4369 return the amount of time to wait before it is ripe. */
4370 {
4371 UNGCPRO;
9291c072
RS
4372 return difference;
4373 }
c04cbc3b 4374 }
9291c072 4375
7ea13e12
RS
4376 /* No timers are pending in the future. */
4377 /* Return 0 if we generated an event, and -1 if not. */
4378 UNGCPRO;
c04cbc3b
RS
4379 return nexttime;
4380}
ff458d81 4381
e90292a9
JD
4382
4383/* Check whether a timer has fired. To prevent larger problems we simply
4384 disregard elements that are not proper timers. Do not make a circular
4385 timer list for the time being.
4386
4387 Returns the time to wait until the next timer fires.
4388 If no timer is active, return -1.
4389
4390 As long as any timer is ripe, we run it.
4391
4392 DO_IT_NOW is now ignored. It used to mean that we should
4393 run the timer directly instead of queueing a timer-event.
4394 Now we always run timers directly. */
4395
4396EMACS_TIME
d3da34e0 4397timer_check (int do_it_now)
e90292a9
JD
4398{
4399 EMACS_TIME nexttime;
4400
d3da34e0 4401 do
e90292a9
JD
4402 {
4403 nexttime = timer_check_2 ();
4404 }
4405 while (EMACS_SECS (nexttime) == 0 && EMACS_USECS (nexttime) == 0);
4406
4407 return nexttime;
4408}
4409
ff458d81 4410DEFUN ("current-idle-time", Fcurrent_idle_time, Scurrent_idle_time, 0, 0, 0,
3a704bd7 4411 doc: /* Return the current length of Emacs idleness, or nil.
f761d6b6
JB
4412The value when Emacs is idle is a list of three integers. The first has
4413the most significant 16 bits of the seconds, while the second has the least
4414significant 16 bits. The third integer gives the microsecond count.
ff458d81 4415
3a704bd7
RS
4416The value when Emacs is not idle is nil.
4417
ff458d81
RS
4418The microsecond count is zero on systems that do not provide
4419resolution finer than a second. */)
5842a27b 4420 (void)
ff458d81 4421{
ff458d81
RS
4422 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4423 {
966949b0 4424 EMACS_TIME now, idleness_now;
ff458d81 4425
966949b0
KS
4426 EMACS_GET_TIME (now);
4427 EMACS_SUB_TIME (idleness_now, now, timer_idleness_start_time);
ff458d81 4428
966949b0
KS
4429 return list3 (make_number ((EMACS_SECS (idleness_now) >> 16) & 0xffff),
4430 make_number ((EMACS_SECS (idleness_now) >> 0) & 0xffff),
4431 make_number (EMACS_USECS (idleness_now)));
ff458d81
RS
4432 }
4433
4434 return Qnil;
4435}
c04cbc3b 4436\f
284f4730 4437/* Caches for modify_event_symbol. */
e9bf89a0 4438static Lisp_Object accent_key_syms;
284f4730
JB
4439static Lisp_Object func_key_syms;
4440static Lisp_Object mouse_syms;
8006e4bb 4441static Lisp_Object wheel_syms;
a24dc617 4442static Lisp_Object drag_n_drop_syms;
284f4730 4443
e9bf89a0
RS
4444/* This is a list of keysym codes for special "accent" characters.
4445 It parallels lispy_accent_keys. */
4446
91433552 4447static const int lispy_accent_codes[] =
e9bf89a0 4448{
79a7046c 4449#ifdef XK_dead_circumflex
e9bf89a0 4450 XK_dead_circumflex,
79a7046c
RS
4451#else
4452 0,
4453#endif
4454#ifdef XK_dead_grave
e9bf89a0 4455 XK_dead_grave,
79a7046c
RS
4456#else
4457 0,
4458#endif
4459#ifdef XK_dead_tilde
e9bf89a0 4460 XK_dead_tilde,
79a7046c
RS
4461#else
4462 0,
4463#endif
4464#ifdef XK_dead_diaeresis
e9bf89a0 4465 XK_dead_diaeresis,
79a7046c
RS
4466#else
4467 0,
4468#endif
4469#ifdef XK_dead_macron
e9bf89a0 4470 XK_dead_macron,
79a7046c
RS
4471#else
4472 0,
4473#endif
4474#ifdef XK_dead_degree
e9bf89a0 4475 XK_dead_degree,
79a7046c
RS
4476#else
4477 0,
4478#endif
4479#ifdef XK_dead_acute
e9bf89a0 4480 XK_dead_acute,
79a7046c
RS
4481#else
4482 0,
4483#endif
4484#ifdef XK_dead_cedilla
e9bf89a0 4485 XK_dead_cedilla,
79a7046c
RS
4486#else
4487 0,
4488#endif
4489#ifdef XK_dead_breve
e9bf89a0 4490 XK_dead_breve,
79a7046c
RS
4491#else
4492 0,
4493#endif
4494#ifdef XK_dead_ogonek
e9bf89a0 4495 XK_dead_ogonek,
79a7046c
RS
4496#else
4497 0,
4498#endif
4499#ifdef XK_dead_caron
e9bf89a0 4500 XK_dead_caron,
79a7046c
RS
4501#else
4502 0,
4503#endif
4504#ifdef XK_dead_doubleacute
e9bf89a0 4505 XK_dead_doubleacute,
79a7046c
RS
4506#else
4507 0,
4508#endif
4509#ifdef XK_dead_abovedot
e9bf89a0 4510 XK_dead_abovedot,
79a7046c
RS
4511#else
4512 0,
4513#endif
ed3230db
DL
4514#ifdef XK_dead_abovering
4515 XK_dead_abovering,
4516#else
4517 0,
4518#endif
4519#ifdef XK_dead_iota
4520 XK_dead_iota,
4521#else
4522 0,
4523#endif
4524#ifdef XK_dead_belowdot
4525 XK_dead_belowdot,
4526#else
4527 0,
4528#endif
4529#ifdef XK_dead_voiced_sound
4530 XK_dead_voiced_sound,
4531#else
4532 0,
4533#endif
4534#ifdef XK_dead_semivoiced_sound
4535 XK_dead_semivoiced_sound,
4536#else
4537 0,
4538#endif
4539#ifdef XK_dead_hook
4540 XK_dead_hook,
4541#else
4542 0,
4543#endif
4544#ifdef XK_dead_horn
4545 XK_dead_horn,
4546#else
4547 0,
4548#endif
e9bf89a0
RS
4549};
4550
4551/* This is a list of Lisp names for special "accent" characters.
4552 It parallels lispy_accent_codes. */
4553
24021b38 4554static const char *const lispy_accent_keys[] =
e9bf89a0
RS
4555{
4556 "dead-circumflex",
4557 "dead-grave",
4558 "dead-tilde",
4559 "dead-diaeresis",
4560 "dead-macron",
4561 "dead-degree",
4562 "dead-acute",
4563 "dead-cedilla",
4564 "dead-breve",
4565 "dead-ogonek",
4566 "dead-caron",
4567 "dead-doubleacute",
4568 "dead-abovedot",
ed3230db
DL
4569 "dead-abovering",
4570 "dead-iota",
4571 "dead-belowdot",
4572 "dead-voiced-sound",
4573 "dead-semivoiced-sound",
4574 "dead-hook",
4575 "dead-horn",
e9bf89a0
RS
4576};
4577
e98a93eb
GV
4578#ifdef HAVE_NTGUI
4579#define FUNCTION_KEY_OFFSET 0x0
4580
24021b38 4581const char *const lispy_function_keys[] =
e98a93eb
GV
4582 {
4583 0, /* 0 */
c60ee5e7 4584
e98a93eb
GV
4585 0, /* VK_LBUTTON 0x01 */
4586 0, /* VK_RBUTTON 0x02 */
4587 "cancel", /* VK_CANCEL 0x03 */
4588 0, /* VK_MBUTTON 0x04 */
c60ee5e7 4589
e98a93eb 4590 0, 0, 0, /* 0x05 .. 0x07 */
c60ee5e7 4591
e98a93eb
GV
4592 "backspace", /* VK_BACK 0x08 */
4593 "tab", /* VK_TAB 0x09 */
c60ee5e7 4594
e98a93eb 4595 0, 0, /* 0x0A .. 0x0B */
c60ee5e7 4596
e98a93eb
GV
4597 "clear", /* VK_CLEAR 0x0C */
4598 "return", /* VK_RETURN 0x0D */
c60ee5e7 4599
e98a93eb 4600 0, 0, /* 0x0E .. 0x0F */
c60ee5e7 4601
1161d367
GV
4602 0, /* VK_SHIFT 0x10 */
4603 0, /* VK_CONTROL 0x11 */
4604 0, /* VK_MENU 0x12 */
e98a93eb 4605 "pause", /* VK_PAUSE 0x13 */
1161d367 4606 "capslock", /* VK_CAPITAL 0x14 */
ba991a0e
JR
4607 "kana", /* VK_KANA/VK_HANGUL 0x15 */
4608 0, /* 0x16 */
4609 "junja", /* VK_JUNJA 0x17 */
4610 "final", /* VK_FINAL 0x18 */
4611 "kanji", /* VK_KANJI/VK_HANJA 0x19 */
4612 0, /* 0x1A */
1161d367 4613 "escape", /* VK_ESCAPE 0x1B */
ba991a0e
JR
4614 "convert", /* VK_CONVERT 0x1C */
4615 "non-convert", /* VK_NONCONVERT 0x1D */
4616 "accept", /* VK_ACCEPT 0x1E */
4617 "mode-change", /* VK_MODECHANGE 0x1F */
e98a93eb
GV
4618 0, /* VK_SPACE 0x20 */
4619 "prior", /* VK_PRIOR 0x21 */
4620 "next", /* VK_NEXT 0x22 */
4621 "end", /* VK_END 0x23 */
4622 "home", /* VK_HOME 0x24 */
4623 "left", /* VK_LEFT 0x25 */
4624 "up", /* VK_UP 0x26 */
4625 "right", /* VK_RIGHT 0x27 */
4626 "down", /* VK_DOWN 0x28 */
4627 "select", /* VK_SELECT 0x29 */
4628 "print", /* VK_PRINT 0x2A */
4629 "execute", /* VK_EXECUTE 0x2B */
4630 "snapshot", /* VK_SNAPSHOT 0x2C */
4631 "insert", /* VK_INSERT 0x2D */
4632 "delete", /* VK_DELETE 0x2E */
4633 "help", /* VK_HELP 0x2F */
c60ee5e7 4634
e98a93eb 4635 /* VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
c60ee5e7 4636
e98a93eb 4637 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
c60ee5e7 4638
e98a93eb 4639 0, 0, 0, 0, 0, 0, 0, /* 0x3A .. 0x40 */
c60ee5e7 4640
e98a93eb 4641 /* VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
c60ee5e7
JB
4642
4643 0, 0, 0, 0, 0, 0, 0, 0, 0,
4644 0, 0, 0, 0, 0, 0, 0, 0, 0,
e98a93eb 4645 0, 0, 0, 0, 0, 0, 0, 0,
c60ee5e7 4646
e376f90d
RS
4647 "lwindow", /* VK_LWIN 0x5B */
4648 "rwindow", /* VK_RWIN 0x5C */
4649 "apps", /* VK_APPS 0x5D */
ba991a0e
JR
4650 0, /* 0x5E */
4651 "sleep",
e98a93eb
GV
4652 "kp-0", /* VK_NUMPAD0 0x60 */
4653 "kp-1", /* VK_NUMPAD1 0x61 */
4654 "kp-2", /* VK_NUMPAD2 0x62 */
4655 "kp-3", /* VK_NUMPAD3 0x63 */
4656 "kp-4", /* VK_NUMPAD4 0x64 */
4657 "kp-5", /* VK_NUMPAD5 0x65 */
4658 "kp-6", /* VK_NUMPAD6 0x66 */
4659 "kp-7", /* VK_NUMPAD7 0x67 */
4660 "kp-8", /* VK_NUMPAD8 0x68 */
4661 "kp-9", /* VK_NUMPAD9 0x69 */
4662 "kp-multiply", /* VK_MULTIPLY 0x6A */
4663 "kp-add", /* VK_ADD 0x6B */
4664 "kp-separator", /* VK_SEPARATOR 0x6C */
4665 "kp-subtract", /* VK_SUBTRACT 0x6D */
4666 "kp-decimal", /* VK_DECIMAL 0x6E */
4667 "kp-divide", /* VK_DIVIDE 0x6F */
4668 "f1", /* VK_F1 0x70 */
4669 "f2", /* VK_F2 0x71 */
4670 "f3", /* VK_F3 0x72 */
4671 "f4", /* VK_F4 0x73 */
4672 "f5", /* VK_F5 0x74 */
4673 "f6", /* VK_F6 0x75 */
4674 "f7", /* VK_F7 0x76 */
4675 "f8", /* VK_F8 0x77 */
4676 "f9", /* VK_F9 0x78 */
4677 "f10", /* VK_F10 0x79 */
4678 "f11", /* VK_F11 0x7A */
4679 "f12", /* VK_F12 0x7B */
4680 "f13", /* VK_F13 0x7C */
4681 "f14", /* VK_F14 0x7D */
4682 "f15", /* VK_F15 0x7E */
4683 "f16", /* VK_F16 0x7F */
4684 "f17", /* VK_F17 0x80 */
4685 "f18", /* VK_F18 0x81 */
4686 "f19", /* VK_F19 0x82 */
4687 "f20", /* VK_F20 0x83 */
4688 "f21", /* VK_F21 0x84 */
4689 "f22", /* VK_F22 0x85 */
4690 "f23", /* VK_F23 0x86 */
4691 "f24", /* VK_F24 0x87 */
c60ee5e7 4692
e98a93eb
GV
4693 0, 0, 0, 0, /* 0x88 .. 0x8B */
4694 0, 0, 0, 0, /* 0x8C .. 0x8F */
c60ee5e7 4695
e98a93eb
GV
4696 "kp-numlock", /* VK_NUMLOCK 0x90 */
4697 "scroll", /* VK_SCROLL 0x91 */
ba991a0e
JR
4698 /* Not sure where the following block comes from.
4699 Windows headers have NEC and Fujitsu specific keys in
4700 this block, but nothing generic. */
e376f90d
RS
4701 "kp-space", /* VK_NUMPAD_CLEAR 0x92 */
4702 "kp-enter", /* VK_NUMPAD_ENTER 0x93 */
4703 "kp-prior", /* VK_NUMPAD_PRIOR 0x94 */
4704 "kp-next", /* VK_NUMPAD_NEXT 0x95 */
4705 "kp-end", /* VK_NUMPAD_END 0x96 */
4706 "kp-home", /* VK_NUMPAD_HOME 0x97 */
4707 "kp-left", /* VK_NUMPAD_LEFT 0x98 */
4708 "kp-up", /* VK_NUMPAD_UP 0x99 */
4709 "kp-right", /* VK_NUMPAD_RIGHT 0x9A */
4710 "kp-down", /* VK_NUMPAD_DOWN 0x9B */
4711 "kp-insert", /* VK_NUMPAD_INSERT 0x9C */
4712 "kp-delete", /* VK_NUMPAD_DELETE 0x9D */
4713
4714 0, 0, /* 0x9E .. 0x9F */
4715
e98a93eb
GV
4716 /*
4717 * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
e8886a1d 4718 * Used only as parameters to GetAsyncKeyState and GetKeyState.
e98a93eb 4719 * No other API or message will distinguish left and right keys this way.
ba991a0e 4720 * 0xA0 .. 0xA5
e98a93eb 4721 */
ba991a0e 4722 0, 0, 0, 0, 0, 0,
c60ee5e7 4723
ba991a0e
JR
4724 /* Multimedia keys. These are handled as WM_APPCOMMAND, which allows us
4725 to enable them selectively, and gives access to a few more functions.
4726 See lispy_multimedia_keys below. */
4727 0, 0, 0, 0, 0, 0, 0, /* 0xA6 .. 0xAC Browser */
4728 0, 0, 0, /* 0xAD .. 0xAF Volume */
4729 0, 0, 0, 0, /* 0xB0 .. 0xB3 Media */
4730 0, 0, 0, 0, /* 0xB4 .. 0xB7 Apps */
c60ee5e7 4731
ba991a0e
JR
4732 /* 0xB8 .. 0xC0 "OEM" keys - all seem to be punctuation. */
4733 0, 0, 0, 0, 0, 0, 0, 0, 0,
c60ee5e7 4734
ba991a0e
JR
4735 /* 0xC1 - 0xDA unallocated, 0xDB-0xDF more OEM keys */
4736 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4737 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
c60ee5e7 4738
ba991a0e
JR
4739 0, /* 0xE0 */
4740 "ax", /* VK_OEM_AX 0xE1 */
4741 0, /* VK_OEM_102 0xE2 */
4742 "ico-help", /* VK_ICO_HELP 0xE3 */
4743 "ico-00", /* VK_ICO_00 0xE4 */
e66f9a1b 4744 0, /* VK_PROCESSKEY 0xE5 - used by IME */
ba991a0e 4745 "ico-clear", /* VK_ICO_CLEAR 0xE6 */
e66f9a1b 4746 0, /* VK_PACKET 0xE7 - used to pass unicode chars */
ba991a0e
JR
4747 0, /* 0xE8 */
4748 "reset", /* VK_OEM_RESET 0xE9 */
4749 "jump", /* VK_OEM_JUMP 0xEA */
4750 "oem-pa1", /* VK_OEM_PA1 0xEB */
4751 "oem-pa2", /* VK_OEM_PA2 0xEC */
4752 "oem-pa3", /* VK_OEM_PA3 0xED */
4753 "wsctrl", /* VK_OEM_WSCTRL 0xEE */
4754 "cusel", /* VK_OEM_CUSEL 0xEF */
4755 "oem-attn", /* VK_OEM_ATTN 0xF0 */
4756 "finish", /* VK_OEM_FINISH 0xF1 */
4757 "copy", /* VK_OEM_COPY 0xF2 */
4758 "auto", /* VK_OEM_AUTO 0xF3 */
4759 "enlw", /* VK_OEM_ENLW 0xF4 */
4760 "backtab", /* VK_OEM_BACKTAB 0xF5 */
e98a93eb
GV
4761 "attn", /* VK_ATTN 0xF6 */
4762 "crsel", /* VK_CRSEL 0xF7 */
4763 "exsel", /* VK_EXSEL 0xF8 */
4764 "ereof", /* VK_EREOF 0xF9 */
4765 "play", /* VK_PLAY 0xFA */
4766 "zoom", /* VK_ZOOM 0xFB */
4767 "noname", /* VK_NONAME 0xFC */
4768 "pa1", /* VK_PA1 0xFD */
4769 "oem_clear", /* VK_OEM_CLEAR 0xFE */
1161d367 4770 0 /* 0xFF */
e98a93eb
GV
4771 };
4772
ba991a0e
JR
4773/* Some of these duplicate the "Media keys" on newer keyboards,
4774 but they are delivered to the application in a different way. */
24021b38 4775static const char *const lispy_multimedia_keys[] =
ba991a0e
JR
4776 {
4777 0,
4778 "browser-back",
4779 "browser-forward",
4780 "browser-refresh",
4781 "browser-stop",
4782 "browser-search",
4783 "browser-favorites",
4784 "browser-home",
4785 "volume-mute",
4786 "volume-down",
4787 "volume-up",
4788 "media-next",
4789 "media-previous",
4790 "media-stop",
4791 "media-play-pause",
4792 "mail",
4793 "media-select",
4794 "app-1",
4795 "app-2",
4796 "bass-down",
4797 "bass-boost",
4798 "bass-up",
4799 "treble-down",
4800 "treble-up",
4801 "mic-volume-mute",
4802 "mic-volume-down",
4803 "mic-volume-up",
4804 "help",
4805 "find",
4806 "new",
4807 "open",
4808 "close",
4809 "save",
4810 "print",
4811 "undo",
4812 "redo",
4813 "copy",
4814 "cut",
4815 "paste",
4816 "mail-reply",
4817 "mail-forward",
4818 "mail-send",
4819 "spell-check",
4820 "toggle-dictate-command",
4821 "mic-toggle",
4822 "correction-list",
4823 "media-play",
4824 "media-pause",
4825 "media-record",
4826 "media-fast-forward",
4827 "media-rewind",
4828 "media-channel-up",
4829 "media-channel-down"
4830 };
4831
04f215f0 4832#else /* not HAVE_NTGUI */
e98a93eb 4833
ed3230db
DL
4834/* This should be dealt with in XTread_socket now, and that doesn't
4835 depend on the client system having the Kana syms defined. See also
4836 the XK_kana_A case below. */
4837#if 0
37cd9f30 4838#ifdef XK_kana_A
24021b38 4839static const char *const lispy_kana_keys[] =
37cd9f30
KH
4840 {
4841 /* X Keysym value */
4842 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x400 .. 0x40f */
4843 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x410 .. 0x41f */
4844 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x420 .. 0x42f */
4845 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x430 .. 0x43f */
4846 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x440 .. 0x44f */
4847 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x450 .. 0x45f */
4848 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x460 .. 0x46f */
4849 0,0,0,0,0,0,0,0,0,0,0,0,0,0,"overline",0,
4850 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x480 .. 0x48f */
4851 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x490 .. 0x49f */
c60ee5e7 4852 0, "kana-fullstop", "kana-openingbracket", "kana-closingbracket",
37cd9f30
KH
4853 "kana-comma", "kana-conjunctive", "kana-WO", "kana-a",
4854 "kana-i", "kana-u", "kana-e", "kana-o",
4855 "kana-ya", "kana-yu", "kana-yo", "kana-tsu",
4856 "prolongedsound", "kana-A", "kana-I", "kana-U",
4857 "kana-E", "kana-O", "kana-KA", "kana-KI",
4858 "kana-KU", "kana-KE", "kana-KO", "kana-SA",
4859 "kana-SHI", "kana-SU", "kana-SE", "kana-SO",
4860 "kana-TA", "kana-CHI", "kana-TSU", "kana-TE",
4861 "kana-TO", "kana-NA", "kana-NI", "kana-NU",
4862 "kana-NE", "kana-NO", "kana-HA", "kana-HI",
4863 "kana-FU", "kana-HE", "kana-HO", "kana-MA",
4864 "kana-MI", "kana-MU", "kana-ME", "kana-MO",
4865 "kana-YA", "kana-YU", "kana-YO", "kana-RA",
4866 "kana-RI", "kana-RU", "kana-RE", "kana-RO",
4867 "kana-WA", "kana-N", "voicedsound", "semivoicedsound",
4868 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x4e0 .. 0x4ef */
4869 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x4f0 .. 0x4ff */
4870 };
4871#endif /* XK_kana_A */
ed3230db 4872#endif /* 0 */
37cd9f30 4873
04f215f0
RS
4874#define FUNCTION_KEY_OFFSET 0xff00
4875
284f4730
JB
4876/* You'll notice that this table is arranged to be conveniently
4877 indexed by X Windows keysym values. */
24021b38 4878static const char *const lispy_function_keys[] =
284f4730
JB
4879 {
4880 /* X Keysym value */
4881
75045dcb
RS
4882 0, 0, 0, 0, 0, 0, 0, 0, /* 0xff00...0f */
4883 "backspace", "tab", "linefeed", "clear",
4884 0, "return", 0, 0,
4885 0, 0, 0, "pause", /* 0xff10...1f */
4886 0, 0, 0, 0, 0, 0, 0, "escape",
86e5706b 4887 0, 0, 0, 0,
75045dcb
RS
4888 0, "kanji", "muhenkan", "henkan", /* 0xff20...2f */
4889 "romaji", "hiragana", "katakana", "hiragana-katakana",
4890 "zenkaku", "hankaku", "zenkaku-hankaku", "touroku",
4891 "massyo", "kana-lock", "kana-shift", "eisu-shift",
4892 "eisu-toggle", /* 0xff30...3f */
4893 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86e5706b
RS
4894 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xff40...4f */
4895
75045dcb
RS
4896 "home", "left", "up", "right", /* 0xff50 */ /* IsCursorKey */
4897 "down", "prior", "next", "end",
4898 "begin", 0, 0, 0, 0, 0, 0, 0,
284f4730
JB
4899 "select", /* 0xff60 */ /* IsMiscFunctionKey */
4900 "print",
4901 "execute",
4902 "insert",
4903 0, /* 0xff64 */
4904 "undo",
4905 "redo",
4906 "menu",
4907 "find",
4908 "cancel",
4909 "help",
4910 "break", /* 0xff6b */
4911
75045dcb
RS
4912 0, 0, 0, 0,
4913 0, 0, 0, 0, "backtab", 0, 0, 0, /* 0xff70... */
4914 0, 0, 0, 0, 0, 0, 0, "kp-numlock", /* 0xff78... */
284f4730
JB
4915 "kp-space", /* 0xff80 */ /* IsKeypadKey */
4916 0, 0, 0, 0, 0, 0, 0, 0,
4917 "kp-tab", /* 0xff89 */
4918 0, 0, 0,
4919 "kp-enter", /* 0xff8d */
4920 0, 0, 0,
4921 "kp-f1", /* 0xff91 */
4922 "kp-f2",
4923 "kp-f3",
4924 "kp-f4",
872157e7
RS
4925 "kp-home", /* 0xff95 */
4926 "kp-left",
4927 "kp-up",
4928 "kp-right",
4929 "kp-down",
4930 "kp-prior", /* kp-page-up */
4931 "kp-next", /* kp-page-down */
4932 "kp-end",
4933 "kp-begin",
4934 "kp-insert",
4935 "kp-delete",
4936 0, /* 0xffa0 */
4937 0, 0, 0, 0, 0, 0, 0, 0, 0,
284f4730
JB
4938 "kp-multiply", /* 0xffaa */
4939 "kp-add",
4940 "kp-separator",
4941 "kp-subtract",
4942 "kp-decimal",
4943 "kp-divide", /* 0xffaf */
4944 "kp-0", /* 0xffb0 */
4945 "kp-1", "kp-2", "kp-3", "kp-4", "kp-5", "kp-6", "kp-7", "kp-8", "kp-9",
4946 0, /* 0xffba */
4947 0, 0,
4948 "kp-equal", /* 0xffbd */
4949 "f1", /* 0xffbe */ /* IsFunctionKey */
86e5706b
RS
4950 "f2",
4951 "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", /* 0xffc0 */
4952 "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18",
4953 "f19", "f20", "f21", "f22", "f23", "f24", "f25", "f26", /* 0xffd0 */
4954 "f27", "f28", "f29", "f30", "f31", "f32", "f33", "f34",
4955 "f35", 0, 0, 0, 0, 0, 0, 0, /* 0xffe0 */
4956 0, 0, 0, 0, 0, 0, 0, 0,
4957 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfff0 */
4958 0, 0, 0, 0, 0, 0, 0, "delete"
04f215f0 4959 };
284f4730 4960
04f215f0
RS
4961/* ISO 9995 Function and Modifier Keys; the first byte is 0xFE. */
4962#define ISO_FUNCTION_KEY_OFFSET 0xfe00
4963
24021b38 4964static const char *const iso_lispy_function_keys[] =
04f215f0
RS
4965 {
4966 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe00 */
4967 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe08 */
4968 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe10 */
4969 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe18 */
4970 "iso-lefttab", /* 0xfe20 */
c60ee5e7
JB
4971 "iso-move-line-up", "iso-move-line-down",
4972 "iso-partial-line-up", "iso-partial-line-down",
4973 "iso-partial-space-left", "iso-partial-space-right",
04f215f0
RS
4974 "iso-set-margin-left", "iso-set-margin-right", /* 0xffe27, 28 */
4975 "iso-release-margin-left", "iso-release-margin-right",
4976 "iso-release-both-margins",
4977 "iso-fast-cursor-left", "iso-fast-cursor-right",
4978 "iso-fast-cursor-up", "iso-fast-cursor-down",
4979 "iso-continuous-underline", "iso-discontinuous-underline", /* 0xfe30, 31 */
4980 "iso-emphasize", "iso-center-object", "iso-enter", /* ... 0xfe34 */
4981 };
4982
4983#endif /* not HAVE_NTGUI */
e98a93eb 4984
8e1e4240 4985Lisp_Object Vlispy_mouse_stem;
284f4730 4986
24021b38 4987static const char *const lispy_wheel_names[] =
8006e4bb 4988{
13899bc1 4989 "wheel-up", "wheel-down", "wheel-left", "wheel-right"
8006e4bb
JR
4990};
4991
a24dc617
RS
4992/* drag-n-drop events are generated when a set of selected files are
4993 dragged from another application and dropped onto an Emacs window. */
24021b38 4994static const char *const lispy_drag_n_drop_names[] =
a24dc617
RS
4995{
4996 "drag-n-drop"
4997};
4998
3c370943 4999/* Scroll bar parts. */
4bb994d1 5000Lisp_Object Qabove_handle, Qhandle, Qbelow_handle;
7ee32cda 5001Lisp_Object Qup, Qdown, Qbottom, Qend_scroll;
eef28553 5002Lisp_Object Qtop, Qratio;
4bb994d1 5003
3c370943 5004/* An array of scroll bar parts, indexed by an enum scroll_bar_part value. */
24021b38 5005static Lisp_Object *const scroll_bar_parts[] = {
db08707d 5006 &Qabove_handle, &Qhandle, &Qbelow_handle,
eef28553 5007 &Qup, &Qdown, &Qtop, &Qbottom, &Qend_scroll, &Qratio
4bb994d1
JB
5008};
5009
7b4aedb9 5010/* A vector, indexed by button number, giving the down-going location
3c370943 5011 of currently depressed buttons, both scroll bar and non-scroll bar.
7b4aedb9
JB
5012
5013 The elements have the form
5014 (BUTTON-NUMBER MODIFIER-MASK . REST)
5015 where REST is the cdr of a position as it would be reported in the event.
5016
5017 The make_lispy_event function stores positions here to tell the
5018 difference between click and drag events, and to store the starting
5019 location to be included in drag events. */
5020
5021static Lisp_Object button_down_location;
88cb0656 5022
fbcd35bd
JB
5023/* Information about the most recent up-going button event: Which
5024 button, what location, and what time. */
5025
559f9d04
RS
5026static int last_mouse_button;
5027static int last_mouse_x;
5028static int last_mouse_y;
5029static unsigned long button_down_time;
fbcd35bd 5030
fbcd35bd
JB
5031/* The number of clicks in this multiple-click. */
5032
5033int double_click_count;
5034
9173a8fb
CY
5035/* X and Y are frame-relative coordinates for a click or wheel event.
5036 Return a Lisp-style event list. */
6b61353c
KH
5037
5038static Lisp_Object
9173a8fb 5039make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y,
d3da34e0 5040 unsigned long time)
6b61353c 5041{
6b61353c
KH
5042 enum window_part part;
5043 Lisp_Object posn = Qnil;
5044 Lisp_Object extra_info = Qnil;
9173a8fb
CY
5045 /* Coordinate pixel positions to return. */
5046 int xret = 0, yret = 0;
5047 /* The window under frame pixel coordinates (x,y) */
5048 Lisp_Object window = f
5049 ? window_from_coordinates (f, XINT (x), XINT (y), &part, 0)
5050 : Qnil;
6b61353c
KH
5051
5052 if (WINDOWP (window))
5053 {
5054 /* It's a click in window window at frame coordinates (x,y) */
5055 struct window *w = XWINDOW (window);
5056 Lisp_Object string_info = Qnil;
ace1712c 5057 EMACS_INT textpos = -1;
9173a8fb
CY
5058 int col = -1, row = -1;
5059 int dx = -1, dy = -1;
6b61353c
KH
5060 int width = -1, height = -1;
5061 Lisp_Object object = Qnil;
5062
9173a8fb
CY
5063 /* Pixel coordinates relative to the window corner. */
5064 int wx = XINT (x) - WINDOW_LEFT_EDGE_X (w);
5065 int wy = XINT (y) - WINDOW_TOP_EDGE_Y (w);
6b61353c 5066
9173a8fb
CY
5067 /* For text area clicks, return X, Y relative to the corner of
5068 this text area. Note that dX, dY etc are set below, by
5069 buffer_posn_from_coords. */
6507c4c7
KS
5070 if (part == ON_TEXT)
5071 {
9173a8fb
CY
5072 xret = XINT (x) - window_box_left (w, TEXT_AREA);
5073 yret = wy - WINDOW_HEADER_LINE_HEIGHT (w);
6507c4c7 5074 }
8547874a
EZ
5075 /* For mode line and header line clicks, return X, Y relative to
5076 the left window edge. Use mode_line_string to look for a
5077 string on the click position. */
6507c4c7 5078 else if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
6b61353c 5079 {
6b61353c 5080 Lisp_Object string;
ace1712c 5081 EMACS_INT charpos;
6b61353c 5082
9173a8fb
CY
5083 posn = (part == ON_MODE_LINE) ? Qmode_line : Qheader_line;
5084 /* Note that mode_line_string takes COL, ROW as pixels and
5085 converts them to characters. */
5086 col = wx;
5087 row = wy;
5088 string = mode_line_string (w, part, &col, &row, &charpos,
6b61353c
KH
5089 &object, &dx, &dy, &width, &height);
5090 if (STRINGP (string))
5091 string_info = Fcons (string, make_number (charpos));
9173a8fb
CY
5092 textpos = (w == XWINDOW (selected_window)
5093 && current_buffer == XBUFFER (w->buffer))
5094 ? PT : XMARKER (w->pointm)->charpos;
5095
5096 xret = wx;
8547874a 5097 yret = wy;
6b61353c 5098 }
9173a8fb
CY
5099 /* For fringes and margins, Y is relative to the area's (and the
5100 window's) top edge, while X is meaningless. */
6b61353c
KH
5101 else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
5102 {
5103 Lisp_Object string;
ace1712c 5104 EMACS_INT charpos;
6b61353c
KH
5105
5106 posn = (part == ON_LEFT_MARGIN) ? Qleft_margin : Qright_margin;
9173a8fb
CY
5107 col = wx;
5108 row = wy;
5109 string = marginal_area_string (w, part, &col, &row, &charpos,
6b61353c
KH
5110 &object, &dx, &dy, &width, &height);
5111 if (STRINGP (string))
5112 string_info = Fcons (string, make_number (charpos));
9173a8fb 5113 yret = wy - WINDOW_HEADER_LINE_HEIGHT (w);
6b61353c 5114 }
a65fc2c3 5115 else if (part == ON_LEFT_FRINGE)
6b61353c 5116 {
a65fc2c3 5117 posn = Qleft_fringe;
9173a8fb
CY
5118 col = 0;
5119 dx = wx
5120 - (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
5121 ? 0 : window_box_width (w, LEFT_MARGIN_AREA));
5122 dy = yret = wy - WINDOW_HEADER_LINE_HEIGHT (w);
3d566707 5123 }
a65fc2c3 5124 else if (part == ON_RIGHT_FRINGE)
3d566707 5125 {
a65fc2c3 5126 posn = Qright_fringe;
9173a8fb
CY
5127 col = 0;
5128 dx = wx
5129 - window_box_width (w, LEFT_MARGIN_AREA)
5130 - window_box_width (w, TEXT_AREA)
5131 - (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
5132 ? window_box_width (w, RIGHT_MARGIN_AREA)
5133 : 0);
5134 dy = yret = wy - WINDOW_HEADER_LINE_HEIGHT (w);
a65fc2c3 5135 }
9173a8fb 5136 else if (part == ON_VERTICAL_BORDER)
a65fc2c3 5137 {
9173a8fb
CY
5138 posn = Qvertical_line;
5139 width = 1;
5140 dx = 0;
5141 dy = yret = wy;
6b61353c 5142 }
9173a8fb 5143 /* Nothing special for part == ON_SCROLL_BAR. */
6b61353c 5144
9173a8fb
CY
5145 /* For clicks in the text area, fringes, or margins, call
5146 buffer_posn_from_coords to extract TEXTPOS, the buffer
5147 position nearest to the click. */
6b61353c
KH
5148 if (textpos < 0)
5149 {
5150 Lisp_Object string2, object2 = Qnil;
5151 struct display_pos p;
5152 int dx2, dy2;
5153 int width2, height2;
9173a8fb
CY
5154 /* The pixel X coordinate passed to buffer_posn_from_coords
5155 is the X coordinate relative to the text area for
5156 text-area clicks, zero otherwise. */
5157 int x2 = (part == ON_TEXT) ? xret : 0;
5158 int y2 = wy;
5159
5160 string2 = buffer_posn_from_coords (w, &x2, &y2, &p,
6b61353c
KH
5161 &object2, &dx2, &dy2,
5162 &width2, &height2);
5163 textpos = CHARPOS (p.pos);
9173a8fb
CY
5164 if (col < 0) col = x2;
5165 if (row < 0) row = y2;
6b61353c
KH
5166 if (dx < 0) dx = dx2;
5167 if (dy < 0) dy = dy2;
5168 if (width < 0) width = width2;
5169 if (height < 0) height = height2;
5170
5171 if (NILP (posn))
5172 {
5173 posn = make_number (textpos);
5174 if (STRINGP (string2))
5175 string_info = Fcons (string2,
5176 make_number (CHARPOS (p.string_pos)));
5177 }
5178 if (NILP (object))
5179 object = object2;
5180 }
5181
5182#ifdef HAVE_WINDOW_SYSTEM
5183 if (IMAGEP (object))
5184 {
5185 Lisp_Object image_map, hotspot;
5186 if ((image_map = Fplist_get (XCDR (object), QCmap),
5187 !NILP (image_map))
5188 && (hotspot = find_hot_spot (image_map, dx, dy),
5189 CONSP (hotspot))
5190 && (hotspot = XCDR (hotspot), CONSP (hotspot)))
5191 posn = XCAR (hotspot);
5192 }
5193#endif
5194
5195 /* Object info */
9173a8fb
CY
5196 extra_info
5197 = list3 (object,
5198 Fcons (make_number (dx), make_number (dy)),
5199 Fcons (make_number (width), make_number (height)));
6b61353c
KH
5200
5201 /* String info */
5202 extra_info = Fcons (string_info,
5203 Fcons (make_number (textpos),
9173a8fb
CY
5204 Fcons (Fcons (make_number (col),
5205 make_number (row)),
6b61353c
KH
5206 extra_info)));
5207 }
5208 else if (f != 0)
9173a8fb 5209 XSETFRAME (window, f);
6b61353c 5210 else
9173a8fb 5211 window = Qnil;
6b61353c
KH
5212
5213 return Fcons (window,
5214 Fcons (posn,
9173a8fb
CY
5215 Fcons (Fcons (make_number (xret),
5216 make_number (yret)),
6b61353c
KH
5217 Fcons (make_number (time),
5218 extra_info))));
5219}
5220
284f4730
JB
5221/* Given a struct input_event, build the lisp event which represents
5222 it. If EVENT is 0, build a mouse movement event from the mouse
88cb0656
JB
5223 movement buffer, which should have a movement event in it.
5224
5225 Note that events must be passed to this function in the order they
5226 are received; this function stores the location of button presses
5227 in order to build drag events when the button is released. */
284f4730
JB
5228
5229static Lisp_Object
d3da34e0 5230make_lispy_event (struct input_event *event)
284f4730 5231{
79a7046c
RS
5232 int i;
5233
0220c518 5234 switch (SWITCH_ENUM_CAST (event->kind))
284f4730 5235 {
284f4730 5236 /* A simple keystroke. */
3b8f9651 5237 case ASCII_KEYSTROKE_EVENT:
3b8f9651 5238 case MULTIBYTE_CHAR_KEYSTROKE_EVENT:
a50e723f
KH
5239 {
5240 Lisp_Object lispy_c;
41118bd3 5241 EMACS_INT c = event->code;
6d0867e5
SM
5242 if (event->kind == ASCII_KEYSTROKE_EVENT)
5243 {
5244 c &= 0377;
5245 eassert (c == event->code);
5246 /* Turn ASCII characters into control characters
5247 when proper. */
5248 if (event->modifiers & ctrl_modifier)
5249 {
5250 c = make_ctrl_char (c);
5251 event->modifiers &= ~ctrl_modifier;
5252 }
5253 }
a50e723f 5254
6d0867e5
SM
5255 /* Add in the other modifier bits. The shift key was taken care
5256 of by the X code. */
24d80a06
SM
5257 c |= (event->modifiers
5258 & (meta_modifier | alt_modifier
5259 | hyper_modifier | super_modifier | ctrl_modifier));
6d0867e5
SM
5260 /* Distinguish Shift-SPC from SPC. */
5261 if ((event->code) == 040
5262 && event->modifiers & shift_modifier)
5263 c |= shift_modifier;
24d80a06
SM
5264 button_down_time = 0;
5265 XSETFASTINT (lispy_c, c);
a50e723f
KH
5266 return lispy_c;
5267 }
5268
83d92ee0
DR
5269#ifdef HAVE_NS
5270 /* NS_NONKEY_EVENTs are just like NON_ASCII_KEYSTROKE_EVENTs,
5271 except that they are non-key events (last-nonmenu-event is nil). */
5272 case NS_NONKEY_EVENT:
5273#endif
5274
284f4730
JB
5275 /* A function key. The symbol may need to have modifier prefixes
5276 tacked onto it. */
3b8f9651 5277 case NON_ASCII_KEYSTROKE_EVENT:
559f9d04 5278 button_down_time = 0;
e9bf89a0
RS
5279
5280 for (i = 0; i < sizeof (lispy_accent_codes) / sizeof (int); i++)
5281 if (event->code == lispy_accent_codes[i])
5282 return modify_event_symbol (i,
5283 event->modifiers,
80e4aa30 5284 Qfunction_key, Qnil,
e9bf89a0
RS
5285 lispy_accent_keys, &accent_key_syms,
5286 (sizeof (lispy_accent_keys)
5287 / sizeof (lispy_accent_keys[0])));
5288
ed3230db 5289#if 0
37cd9f30
KH
5290#ifdef XK_kana_A
5291 if (event->code >= 0x400 && event->code < 0x500)
5292 return modify_event_symbol (event->code - 0x400,
5293 event->modifiers & ~shift_modifier,
5294 Qfunction_key, Qnil,
5295 lispy_kana_keys, &func_key_syms,
5296 (sizeof (lispy_kana_keys)
5297 / sizeof (lispy_kana_keys[0])));
5298#endif /* XK_kana_A */
ed3230db 5299#endif /* 0 */
37cd9f30 5300
111c4138 5301#ifdef ISO_FUNCTION_KEY_OFFSET
04f215f0
RS
5302 if (event->code < FUNCTION_KEY_OFFSET
5303 && event->code >= ISO_FUNCTION_KEY_OFFSET)
5304 return modify_event_symbol (event->code - ISO_FUNCTION_KEY_OFFSET,
5305 event->modifiers,
5306 Qfunction_key, Qnil,
5307 iso_lispy_function_keys, &func_key_syms,
5308 (sizeof (iso_lispy_function_keys)
5309 / sizeof (iso_lispy_function_keys[0])));
111c4138 5310#endif
656280a6 5311
4c8bc894
SM
5312 /* Handle system-specific or unknown keysyms. */
5313 if (event->code & (1 << 28)
5314 || event->code - FUNCTION_KEY_OFFSET < 0
656280a6 5315 || (event->code - FUNCTION_KEY_OFFSET
4c8bc894
SM
5316 >= sizeof lispy_function_keys / sizeof *lispy_function_keys)
5317 || !lispy_function_keys[event->code - FUNCTION_KEY_OFFSET])
656280a6 5318 {
4c8bc894
SM
5319 /* We need to use an alist rather than a vector as the cache
5320 since we can't make a vector long enuf. */
5321 if (NILP (current_kboard->system_key_syms))
5322 current_kboard->system_key_syms = Fcons (Qnil, Qnil);
5323 return modify_event_symbol (event->code,
5324 event->modifiers,
5325 Qfunction_key,
5326 current_kboard->Vsystem_key_alist,
5327 0, &current_kboard->system_key_syms,
5328 (unsigned) -1);
656280a6 5329 }
656280a6
GM
5330
5331 return modify_event_symbol (event->code - FUNCTION_KEY_OFFSET,
5332 event->modifiers,
5333 Qfunction_key, Qnil,
5334 lispy_function_keys, &func_key_syms,
5335 (sizeof (lispy_function_keys)
5336 / sizeof (lispy_function_keys[0])));
284f4730 5337
ba991a0e
JR
5338#ifdef WINDOWSNT
5339 case MULTIMEDIA_KEY_EVENT:
5340 if (event->code < (sizeof (lispy_multimedia_keys)
5341 / sizeof (lispy_multimedia_keys[0]))
5342 && event->code > 0 && lispy_multimedia_keys[event->code])
5343 {
5344 return modify_event_symbol (event->code, event->modifiers,
5345 Qfunction_key, Qnil,
5346 lispy_multimedia_keys, &func_key_syms,
5347 (sizeof (lispy_multimedia_keys)
5348 / sizeof (lispy_multimedia_keys[0])));
5349 }
5350 return Qnil;
5351#endif
5352
514354e9 5353#ifdef HAVE_MOUSE
df0f2ba1 5354 /* A mouse click. Figure out where it is, decide whether it's
88cb0656 5355 a press, click or drag, and build the appropriate structure. */
3b8f9651 5356 case MOUSE_CLICK_EVENT:
7ee32cda 5357#ifndef USE_TOOLKIT_SCROLL_BARS
3b8f9651 5358 case SCROLL_BAR_CLICK_EVENT:
7ee32cda 5359#endif
284f4730 5360 {
e9bf89a0 5361 int button = event->code;
559f9d04 5362 int is_double;
7b4aedb9 5363 Lisp_Object position;
dbc4e1c1
JB
5364 Lisp_Object *start_pos_ptr;
5365 Lisp_Object start_pos;
284f4730 5366
8c907a56
GM
5367 position = Qnil;
5368
7b4aedb9 5369 /* Build the position as appropriate for this mouse click. */
3b8f9651 5370 if (event->kind == MOUSE_CLICK_EVENT)
284f4730 5371 {
c5cf2109 5372 struct frame *f = XFRAME (event->frame_or_window);
edfda783 5373#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) && ! defined (HAVE_NS)
9e20143a 5374 int row, column;
6b61353c 5375#endif
9e20143a 5376
5da3133a
RS
5377 /* Ignore mouse events that were made on frame that
5378 have been deleted. */
5379 if (! FRAME_LIVE_P (f))
5380 return Qnil;
5381
edfda783 5382#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) && ! defined (HAVE_NS)
7ee32cda
GM
5383 /* EVENT->x and EVENT->y are frame-relative pixel
5384 coordinates at this place. Under old redisplay, COLUMN
5385 and ROW are set to frame relative glyph coordinates
5386 which are then used to determine whether this click is
5387 in a menu (non-toolkit version). */
5388 pixel_to_glyph_coords (f, XINT (event->x), XINT (event->y),
5389 &column, &row, NULL, 1);
7b4aedb9 5390
eef045bf
RS
5391 /* In the non-toolkit version, clicks on the menu bar
5392 are ordinary button events in the event buffer.
5393 Distinguish them, and invoke the menu.
5394
5395 (In the toolkit version, the toolkit handles the menu bar
5396 and Emacs doesn't know about it until after the user
5397 makes a selection.) */
2ee250ec
RS
5398 if (row >= 0 && row < FRAME_MENU_BAR_LINES (f)
5399 && (event->modifiers & down_modifier))
bb936752 5400 {
b7c49376 5401 Lisp_Object items, item;
0a0e8fe6
RS
5402 int hpos;
5403 int i;
5404
7ee32cda 5405 /* Find the menu bar item under `column'. */
f2ae6b3f 5406 item = Qnil;
5ec75a55 5407 items = FRAME_MENU_BAR_ITEMS (f);
35b3402f 5408 for (i = 0; i < XVECTOR (items)->size; i += 4)
5ec75a55
RS
5409 {
5410 Lisp_Object pos, string;
129004d3
GM
5411 string = AREF (items, i + 1);
5412 pos = AREF (items, i + 3);
b7c49376
RS
5413 if (NILP (string))
5414 break;
9e20143a 5415 if (column >= XINT (pos)
d5db4077 5416 && column < XINT (pos) + SCHARS (string))
b7c49376 5417 {
129004d3 5418 item = AREF (items, i);
b7c49376
RS
5419 break;
5420 }
5ec75a55 5421 }
9e20143a 5422
7ee32cda
GM
5423 /* ELisp manual 2.4b says (x y) are window relative but
5424 code says they are frame-relative. */
5ec75a55
RS
5425 position
5426 = Fcons (event->frame_or_window,
5427 Fcons (Qmenu_bar,
5428 Fcons (Fcons (event->x, event->y),
5429 Fcons (make_number (event->timestamp),
5430 Qnil))));
5431
b7c49376 5432 return Fcons (item, Fcons (position, Qnil));
5ec75a55 5433 }
edfda783 5434#endif /* not USE_X_TOOLKIT && not USE_GTK && not HAVE_NS */
0aafc975 5435
9173a8fb 5436 position = make_lispy_position (f, event->x, event->y,
6b61353c 5437 event->timestamp);
284f4730 5438 }
7ee32cda 5439#ifndef USE_TOOLKIT_SCROLL_BARS
7b4aedb9 5440 else
88cb0656 5441 {
7ee32cda 5442 /* It's a scrollbar click. */
6b61353c 5443 Lisp_Object window;
9e20143a
RS
5444 Lisp_Object portion_whole;
5445 Lisp_Object part;
5446
5447 window = event->frame_or_window;
5448 portion_whole = Fcons (event->x, event->y);
5449 part = *scroll_bar_parts[(int) event->part];
7b4aedb9 5450
db08707d
RS
5451 position
5452 = Fcons (window,
5453 Fcons (Qvertical_scroll_bar,
5454 Fcons (portion_whole,
5455 Fcons (make_number (event->timestamp),
5456 Fcons (part, Qnil)))));
88cb0656 5457 }
7ee32cda 5458#endif /* not USE_TOOLKIT_SCROLL_BARS */
88cb0656 5459
129004d3 5460 if (button >= ASIZE (button_down_location))
8e1e4240
GM
5461 {
5462 button_down_location = larger_vector (button_down_location,
5463 button + 1, Qnil);
5464 mouse_syms = larger_vector (mouse_syms, button + 1, Qnil);
5465 }
c60ee5e7 5466
129004d3 5467 start_pos_ptr = &AREF (button_down_location, button);
dbc4e1c1
JB
5468 start_pos = *start_pos_ptr;
5469 *start_pos_ptr = Qnil;
7b4aedb9 5470
c5cf2109
GM
5471 {
5472 /* On window-system frames, use the value of
5473 double-click-fuzz as is. On other frames, interpret it
5474 as a multiple of 1/8 characters. */
5475 struct frame *f;
5476 int fuzz;
5477
5478 if (WINDOWP (event->frame_or_window))
5479 f = XFRAME (XWINDOW (event->frame_or_window)->frame);
5480 else if (FRAMEP (event->frame_or_window))
5481 f = XFRAME (event->frame_or_window);
5482 else
5483 abort ();
5484
5485 if (FRAME_WINDOW_P (f))
5486 fuzz = double_click_fuzz;
5487 else
5488 fuzz = double_click_fuzz / 8;
5489
5490 is_double = (button == last_mouse_button
1ea40aa2
EZ
5491 && (eabs (XINT (event->x) - last_mouse_x) <= fuzz)
5492 && (eabs (XINT (event->y) - last_mouse_y) <= fuzz)
c5cf2109
GM
5493 && button_down_time != 0
5494 && (EQ (Vdouble_click_time, Qt)
5495 || (INTEGERP (Vdouble_click_time)
5496 && ((int)(event->timestamp - button_down_time)
5497 < XINT (Vdouble_click_time)))));
5498 }
c60ee5e7 5499
559f9d04
RS
5500 last_mouse_button = button;
5501 last_mouse_x = XINT (event->x);
5502 last_mouse_y = XINT (event->y);
5503
7b4aedb9
JB
5504 /* If this is a button press, squirrel away the location, so
5505 we can decide later whether it was a click or a drag. */
5506 if (event->modifiers & down_modifier)
559f9d04
RS
5507 {
5508 if (is_double)
5509 {
5510 double_click_count++;
5511 event->modifiers |= ((double_click_count > 2)
5512 ? triple_modifier
5513 : double_modifier);
5514 }
5515 else
5516 double_click_count = 1;
5517 button_down_time = event->timestamp;
5518 *start_pos_ptr = Fcopy_alist (position);
3b0cdcef 5519 ignore_mouse_drag_p = 0;
559f9d04 5520 }
7b4aedb9 5521
88cb0656 5522 /* Now we're releasing a button - check the co-ordinates to
7b4aedb9 5523 see if this was a click or a drag. */
88cb0656
JB
5524 else if (event->modifiers & up_modifier)
5525 {
129004d3
GM
5526 /* If we did not see a down before this up, ignore the up.
5527 Probably this happened because the down event chose a
5528 menu item. It would be an annoyance to treat the
5529 release of the button that chose the menu item as a
5530 separate event. */
48e416d4 5531
8c18cbfb 5532 if (!CONSP (start_pos))
48e416d4
RS
5533 return Qnil;
5534
88cb0656 5535 event->modifiers &= ~up_modifier;
9173a8fb 5536
dbc4e1c1 5537 {
9173a8fb 5538 Lisp_Object new_down, down;
d31053f9 5539 EMACS_INT xdiff = double_click_fuzz, ydiff = double_click_fuzz;
dbc4e1c1 5540
d31053f9
RS
5541 /* The third element of every position
5542 should be the (x,y) pair. */
5543 down = Fcar (Fcdr (Fcdr (start_pos)));
9173a8fb
CY
5544 new_down = Fcar (Fcdr (Fcdr (position)));
5545
7a6a97d7
SM
5546 if (CONSP (down)
5547 && INTEGERP (XCAR (down)) && INTEGERP (XCDR (down)))
d31053f9 5548 {
9173a8fb
CY
5549 xdiff = XINT (XCAR (new_down)) - XINT (XCAR (down));
5550 ydiff = XINT (XCDR (new_down)) - XINT (XCDR (down));
d31053f9
RS
5551 }
5552
3b0cdcef
KS
5553 if (ignore_mouse_drag_p)
5554 {
5555 event->modifiers |= click_modifier;
5556 ignore_mouse_drag_p = 0;
5557 }
5558 else if (xdiff < double_click_fuzz && xdiff > - double_click_fuzz
5559 && ydiff < double_click_fuzz && ydiff > - double_click_fuzz
4156359e
SM
5560 /* Maybe the mouse has moved a lot, caused scrolling, and
5561 eventually ended up at the same screen position (but
5562 not buffer position) in which case it is a drag, not
5563 a click. */
5564 /* FIXME: OTOH if the buffer position has changed
5565 because of a timer or process filter rather than
5566 because of mouse movement, it should be considered as
5567 a click. But mouse-drag-region completely ignores
5568 this case and it hasn't caused any real problem, so
5569 it's probably OK to ignore it as well. */
5570 && EQ (Fcar (Fcdr (start_pos)), Fcar (Fcdr (position))))
d31053f9 5571 /* Mouse hasn't moved (much). */
129004d3 5572 event->modifiers |= click_modifier;
fbcd35bd
JB
5573 else
5574 {
d31053f9
RS
5575 button_down_time = 0;
5576 event->modifiers |= drag_modifier;
fbcd35bd 5577 }
c60ee5e7 5578
bc536d84
RS
5579 /* Don't check is_double; treat this as multiple
5580 if the down-event was multiple. */
5581 if (double_click_count > 1)
5582 event->modifiers |= ((double_click_count > 2)
5583 ? triple_modifier
5584 : double_modifier);
dbc4e1c1 5585 }
88cb0656
JB
5586 }
5587 else
5588 /* Every mouse event should either have the down_modifier or
7b4aedb9 5589 the up_modifier set. */
88cb0656
JB
5590 abort ();
5591
88cb0656 5592 {
7b4aedb9 5593 /* Get the symbol we should use for the mouse click. */
9b8eb840
KH
5594 Lisp_Object head;
5595
5596 head = modify_event_symbol (button,
5597 event->modifiers,
8e1e4240
GM
5598 Qmouse_click, Vlispy_mouse_stem,
5599 NULL,
5600 &mouse_syms,
5601 XVECTOR (mouse_syms)->size);
88cb0656 5602 if (event->modifiers & drag_modifier)
dbc4e1c1
JB
5603 return Fcons (head,
5604 Fcons (start_pos,
5605 Fcons (position,
5606 Qnil)));
fbcd35bd
JB
5607 else if (event->modifiers & (double_modifier | triple_modifier))
5608 return Fcons (head,
5609 Fcons (position,
5610 Fcons (make_number (double_click_count),
5611 Qnil)));
88cb0656
JB
5612 else
5613 return Fcons (head,
7b4aedb9 5614 Fcons (position,
88cb0656
JB
5615 Qnil));
5616 }
284f4730 5617 }
db08707d 5618
8006e4bb 5619 case WHEEL_EVENT:
13899bc1 5620 case HORIZ_WHEEL_EVENT:
8006e4bb
JR
5621 {
5622 Lisp_Object position;
8006e4bb 5623 Lisp_Object head;
6b61353c 5624
87d386ff 5625 /* Build the position as appropriate for this mouse click. */
87d386ff 5626 struct frame *f = XFRAME (event->frame_or_window);
87d386ff
JR
5627
5628 /* Ignore wheel events that were made on frame that have been
5629 deleted. */
5630 if (! FRAME_LIVE_P (f))
5631 return Qnil;
5632
9173a8fb 5633 position = make_lispy_position (f, event->x, event->y,
6b61353c 5634 event->timestamp);
87d386ff 5635
db9cd97a 5636 /* Set double or triple modifiers to indicate the wheel speed. */
87d386ff
JR
5637 {
5638 /* On window-system frames, use the value of
5639 double-click-fuzz as is. On other frames, interpret it
5640 as a multiple of 1/8 characters. */
5641 struct frame *f;
5642 int fuzz;
3208cb35 5643 int symbol_num;
87d386ff
JR
5644 int is_double;
5645
5646 if (WINDOWP (event->frame_or_window))
5647 f = XFRAME (XWINDOW (event->frame_or_window)->frame);
5648 else if (FRAMEP (event->frame_or_window))
5649 f = XFRAME (event->frame_or_window);
5650 else
5651 abort ();
5652
9173a8fb
CY
5653 fuzz = FRAME_WINDOW_P (f)
5654 ? double_click_fuzz : double_click_fuzz / 8;
87d386ff 5655
3208cb35
YM
5656 if (event->modifiers & up_modifier)
5657 {
5658 /* Emit a wheel-up event. */
5659 event->modifiers &= ~up_modifier;
5660 symbol_num = 0;
5661 }
5662 else if (event->modifiers & down_modifier)
5663 {
5664 /* Emit a wheel-down event. */
5665 event->modifiers &= ~down_modifier;
5666 symbol_num = 1;
5667 }
5668 else
5669 /* Every wheel event should either have the down_modifier or
5670 the up_modifier set. */
5671 abort ();
5672
5673 if (event->kind == HORIZ_WHEEL_EVENT)
5674 symbol_num += 2;
5675
5676 is_double = (last_mouse_button == - (1 + symbol_num)
1ea40aa2
EZ
5677 && (eabs (XINT (event->x) - last_mouse_x) <= fuzz)
5678 && (eabs (XINT (event->y) - last_mouse_y) <= fuzz)
87d386ff
JR
5679 && button_down_time != 0
5680 && (EQ (Vdouble_click_time, Qt)
5681 || (INTEGERP (Vdouble_click_time)
5682 && ((int)(event->timestamp - button_down_time)
5683 < XINT (Vdouble_click_time)))));
5684 if (is_double)
5685 {
5686 double_click_count++;
5687 event->modifiers |= ((double_click_count > 2)
5688 ? triple_modifier
5689 : double_modifier);
5690 }
5691 else
5692 {
5693 double_click_count = 1;
5694 event->modifiers |= click_modifier;
5695 }
5696
5697 button_down_time = event->timestamp;
5698 /* Use a negative value to distinguish wheel from mouse button. */
3208cb35 5699 last_mouse_button = - (1 + symbol_num);
87d386ff
JR
5700 last_mouse_x = XINT (event->x);
5701 last_mouse_y = XINT (event->y);
13899bc1 5702
db9cd97a 5703 /* Get the symbol we should use for the wheel event. */
87d386ff
JR
5704 head = modify_event_symbol (symbol_num,
5705 event->modifiers,
5706 Qmouse_click,
5707 Qnil,
5708 lispy_wheel_names,
5709 &wheel_syms,
5710 ASIZE (wheel_syms));
5711 }
5712
5713 if (event->modifiers & (double_modifier | triple_modifier))
5714 return Fcons (head,
5715 Fcons (position,
5716 Fcons (make_number (double_click_count),
5717 Qnil)));
5718 else
5719 return Fcons (head,
5720 Fcons (position,
5721 Qnil));
8006e4bb
JR
5722 }
5723
5724
05be3964 5725#ifdef USE_TOOLKIT_SCROLL_BARS
7ee32cda
GM
5726
5727 /* We don't have down and up events if using toolkit scroll bars,
5728 so make this always a click event. Store in the `part' of
5729 the Lisp event a symbol which maps to the following actions:
5730
5731 `above_handle' page up
5732 `below_handle' page down
5733 `up' line up
5734 `down' line down
5735 `top' top of buffer
5736 `bottom' bottom of buffer
5737 `handle' thumb has been dragged.
5738 `end-scroll' end of interaction with scroll bar
5739
5740 The incoming input_event contains in its `part' member an
5741 index of type `enum scroll_bar_part' which we can use as an
5742 index in scroll_bar_parts to get the appropriate symbol. */
c60ee5e7 5743
3b8f9651 5744 case SCROLL_BAR_CLICK_EVENT:
7ee32cda
GM
5745 {
5746 Lisp_Object position, head, window, portion_whole, part;
5747
5748 window = event->frame_or_window;
5749 portion_whole = Fcons (event->x, event->y);
5750 part = *scroll_bar_parts[(int) event->part];
5751
5752 position
5753 = Fcons (window,
5754 Fcons (Qvertical_scroll_bar,
5755 Fcons (portion_whole,
5756 Fcons (make_number (event->timestamp),
5757 Fcons (part, Qnil)))));
5758
5759 /* Always treat scroll bar events as clicks. */
5760 event->modifiers |= click_modifier;
05be3964 5761 event->modifiers &= ~up_modifier;
7ee32cda 5762
257f40f2
JD
5763 if (event->code >= ASIZE (mouse_syms))
5764 mouse_syms = larger_vector (mouse_syms, event->code + 1, Qnil);
5765
7ee32cda
GM
5766 /* Get the symbol we should use for the mouse click. */
5767 head = modify_event_symbol (event->code,
5768 event->modifiers,
14e40288 5769 Qmouse_click,
8e1e4240
GM
5770 Vlispy_mouse_stem,
5771 NULL, &mouse_syms,
5772 XVECTOR (mouse_syms)->size);
7ee32cda
GM
5773 return Fcons (head, Fcons (position, Qnil));
5774 }
c60ee5e7 5775
7ee32cda
GM
5776#endif /* USE_TOOLKIT_SCROLL_BARS */
5777
3b8f9651 5778 case DRAG_N_DROP_EVENT:
a24dc617 5779 {
a24dc617 5780 FRAME_PTR f;
6b61353c 5781 Lisp_Object head, position;
a24dc617 5782 Lisp_Object files;
a24dc617 5783
82de1de9
YM
5784 f = XFRAME (event->frame_or_window);
5785 files = event->arg;
a24dc617
RS
5786
5787 /* Ignore mouse events that were made on frames that
5788 have been deleted. */
5789 if (! FRAME_LIVE_P (f))
5790 return Qnil;
afabdbe5 5791
9173a8fb 5792 position = make_lispy_position (f, event->x, event->y,
6b61353c
KH
5793 event->timestamp);
5794
5795 head = modify_event_symbol (0, event->modifiers,
5796 Qdrag_n_drop, Qnil,
5797 lispy_drag_n_drop_names,
5798 &drag_n_drop_syms, 1);
5799 return Fcons (head,
5800 Fcons (position,
5801 Fcons (files,
5802 Qnil)));
a24dc617 5803 }
514354e9 5804#endif /* HAVE_MOUSE */
284f4730 5805
9e2a2647 5806#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
edfda783 5807 || defined(HAVE_NS) || defined (USE_GTK)
da8f7368
GM
5808 case MENU_BAR_EVENT:
5809 if (EQ (event->arg, event->frame_or_window))
5810 /* This is the prefix key. We translate this to
5811 `(menu_bar)' because the code in keyboard.c for menu
5812 events, which we use, relies on this. */
5813 return Fcons (Qmenu_bar, Qnil);
5814 return event->arg;
2470a66f
KH
5815#endif
5816
a4e19f6e
SM
5817 case SELECT_WINDOW_EVENT:
5818 /* Make an event (select-window (WINDOW)). */
5819 return Fcons (Qselect_window,
5820 Fcons (Fcons (event->frame_or_window, Qnil),
5821 Qnil));
5822
9ea173e8 5823 case TOOL_BAR_EVENT:
da8f7368
GM
5824 if (EQ (event->arg, event->frame_or_window))
5825 /* This is the prefix key. We translate this to
27fd22dc 5826 `(tool_bar)' because the code in keyboard.c for tool bar
da8f7368
GM
5827 events, which we use, relies on this. */
5828 return Fcons (Qtool_bar, Qnil);
5829 else if (SYMBOLP (event->arg))
5830 return apply_modifiers (event->modifiers, event->arg);
5831 return event->arg;
5832
5833 case USER_SIGNAL_EVENT:
5bf68f6e 5834 /* A user signal. */
b809d9e7
KS
5835 {
5836 char *name = find_user_signal_name (event->code);
5837 if (!name)
5838 abort ();
5839 return intern (name);
5840 }
c60ee5e7 5841
3b8f9651 5842 case SAVE_SESSION_EVENT:
4ebc27a5 5843 return Qsave_session;
c60ee5e7 5844
033b73e2
MA
5845#ifdef HAVE_DBUS
5846 case DBUS_EVENT:
5847 {
5848 return Fcons (Qdbus_event, event->arg);
5849 }
5850#endif /* HAVE_DBUS */
5851
637fa988
JD
5852 case CONFIG_CHANGED_EVENT:
5853 return Fcons (Qconfig_changed_event,
5854 Fcons (event->arg,
5855 Fcons (event->frame_or_window, Qnil)));
7e5a23bd 5856#ifdef HAVE_GPM
ae372f41
NR
5857 case GPM_CLICK_EVENT:
5858 {
5859 FRAME_PTR f = XFRAME (event->frame_or_window);
5860 Lisp_Object head, position;
5861 Lisp_Object *start_pos_ptr;
5862 Lisp_Object start_pos;
5863 int button = event->code;
5864
5865 if (button >= ASIZE (button_down_location))
5866 {
5867 button_down_location = larger_vector (button_down_location,
5868 button + 1, Qnil);
5869 mouse_syms = larger_vector (mouse_syms, button + 1, Qnil);
5870 }
5871
5872 start_pos_ptr = &AREF (button_down_location, button);
5873 start_pos = *start_pos_ptr;
5874
9173a8fb
CY
5875 position = make_lispy_position (f, event->x, event->y,
5876 event->timestamp);
ae372f41
NR
5877
5878 if (event->modifiers & down_modifier)
5879 *start_pos_ptr = Fcopy_alist (position);
5880 else if (event->modifiers & (up_modifier | drag_modifier))
5881 {
5882 if (!CONSP (start_pos))
5883 return Qnil;
5884 event->modifiers &= ~up_modifier;
5885 }
5886
5887 head = modify_event_symbol (button,
5888 event->modifiers,
5889 Qmouse_click, Vlispy_mouse_stem,
5890 NULL,
5891 &mouse_syms,
5892 XVECTOR (mouse_syms)->size);
5893
5894 if (event->modifiers & drag_modifier)
5895 return Fcons (head,
5896 Fcons (start_pos,
5897 Fcons (position,
5898 Qnil)));
5899 else if (event->modifiers & double_modifier)
5900 return Fcons (head,
5901 Fcons (position,
5902 Fcons (make_number (2),
5903 Qnil)));
5904 else if (event->modifiers & triple_modifier)
5905 return Fcons (head,
5906 Fcons (position,
5907 Fcons (make_number (3),
5908 Qnil)));
5909 else
5910 return Fcons (head,
5911 Fcons (position,
5912 Qnil));
5913 }
7e5a23bd 5914#endif /* HAVE_GPM */
ae372f41 5915
284f4730
JB
5916 /* The 'kind' field of the event is something we don't recognize. */
5917 default:
48e416d4 5918 abort ();
284f4730
JB
5919 }
5920}
5921
bdb1e01d 5922#if defined(HAVE_MOUSE) || defined(HAVE_GPM)
6cbff1cb 5923
284f4730 5924static Lisp_Object
d3da34e0
JB
5925make_lispy_movement (FRAME_PTR frame, Lisp_Object bar_window, enum scroll_bar_part part,
5926 Lisp_Object x, Lisp_Object y, unsigned long time)
284f4730 5927{
3c370943 5928 /* Is it a scroll bar movement? */
7b4aedb9 5929 if (frame && ! NILP (bar_window))
4bb994d1 5930 {
9b8eb840 5931 Lisp_Object part_sym;
4bb994d1 5932
9b8eb840 5933 part_sym = *scroll_bar_parts[(int) part];
3c370943 5934 return Fcons (Qscroll_bar_movement,
9173a8fb
CY
5935 Fcons (list5 (bar_window,
5936 Qvertical_scroll_bar,
5937 Fcons (x, y),
5938 make_number (time),
5939 part_sym),
5940 Qnil));
4bb994d1 5941 }
4bb994d1 5942 /* Or is it an ordinary mouse movement? */
284f4730
JB
5943 else
5944 {
6b61353c 5945 Lisp_Object position;
9173a8fb
CY
5946 position = make_lispy_position (frame, x, y, time);
5947 return list2 (Qmouse_movement, position);
4bb994d1 5948 }
284f4730
JB
5949}
5950
bdb1e01d 5951#endif /* HAVE_MOUSE || HAVE GPM */
6cbff1cb 5952
cd21b839
JB
5953/* Construct a switch frame event. */
5954static Lisp_Object
d3da34e0 5955make_lispy_switch_frame (Lisp_Object frame)
cd21b839
JB
5956{
5957 return Fcons (Qswitch_frame, Fcons (frame, Qnil));
5958}
0a7f1fc0
JB
5959\f
5960/* Manipulating modifiers. */
284f4730 5961
0a7f1fc0 5962/* Parse the name of SYMBOL, and return the set of modifiers it contains.
284f4730 5963
0a7f1fc0
JB
5964 If MODIFIER_END is non-zero, set *MODIFIER_END to the position in
5965 SYMBOL's name of the end of the modifiers; the string from this
5966 position is the unmodified symbol name.
284f4730 5967
0a7f1fc0 5968 This doesn't use any caches. */
6da3dd3a 5969
0a7f1fc0 5970static int
d3da34e0 5971parse_modifiers_uncached (Lisp_Object symbol, int *modifier_end)
284f4730 5972{
1b049b51 5973 Lisp_Object name;
284f4730
JB
5974 int i;
5975 int modifiers;
284f4730 5976
b7826503 5977 CHECK_SYMBOL (symbol);
df0f2ba1 5978
284f4730 5979 modifiers = 0;
1b049b51 5980 name = SYMBOL_NAME (symbol);
284f4730 5981
1b049b51 5982 for (i = 0; i+2 <= SBYTES (name); )
6da3dd3a
RS
5983 {
5984 int this_mod_end = 0;
5985 int this_mod = 0;
284f4730 5986
6da3dd3a
RS
5987 /* See if the name continues with a modifier word.
5988 Check that the word appears, but don't check what follows it.
5989 Set this_mod and this_mod_end to record what we find. */
fce33686 5990
1b049b51 5991 switch (SREF (name, i))
6da3dd3a
RS
5992 {
5993#define SINGLE_LETTER_MOD(BIT) \
5994 (this_mod_end = i + 1, this_mod = BIT)
5995
6da3dd3a
RS
5996 case 'A':
5997 SINGLE_LETTER_MOD (alt_modifier);
5998 break;
284f4730 5999
6da3dd3a
RS
6000 case 'C':
6001 SINGLE_LETTER_MOD (ctrl_modifier);
6002 break;
284f4730 6003
6da3dd3a
RS
6004 case 'H':
6005 SINGLE_LETTER_MOD (hyper_modifier);
6006 break;
6007
6da3dd3a
RS
6008 case 'M':
6009 SINGLE_LETTER_MOD (meta_modifier);
6010 break;
6011
6da3dd3a
RS
6012 case 'S':
6013 SINGLE_LETTER_MOD (shift_modifier);
6014 break;
6015
6016 case 's':
6da3dd3a
RS
6017 SINGLE_LETTER_MOD (super_modifier);
6018 break;
6019
0a7f1fc0 6020#undef SINGLE_LETTER_MOD
65470b52
SM
6021
6022#define MULTI_LETTER_MOD(BIT, NAME, LEN) \
6023 if (i + LEN + 1 <= SBYTES (name) \
6024 && ! strncmp (SDATA (name) + i, NAME, LEN)) \
6025 { \
6026 this_mod_end = i + LEN; \
6027 this_mod = BIT; \
6028 }
6029
6030 case 'd':
6031 MULTI_LETTER_MOD (drag_modifier, "drag", 4);
6032 MULTI_LETTER_MOD (down_modifier, "down", 4);
6033 MULTI_LETTER_MOD (double_modifier, "double", 6);
6034 break;
6035
6036 case 't':
6037 MULTI_LETTER_MOD (triple_modifier, "triple", 6);
6038 break;
6039#undef MULTI_LETTER_MOD
6040
6da3dd3a
RS
6041 }
6042
6043 /* If we found no modifier, stop looking for them. */
6044 if (this_mod_end == 0)
6045 break;
6046
6047 /* Check there is a dash after the modifier, so that it
6048 really is a modifier. */
1b049b51
KR
6049 if (this_mod_end >= SBYTES (name)
6050 || SREF (name, this_mod_end) != '-')
6da3dd3a
RS
6051 break;
6052
6053 /* This modifier is real; look for another. */
6054 modifiers |= this_mod;
6055 i = this_mod_end + 1;
6056 }
284f4730 6057
0a7f1fc0 6058 /* Should we include the `click' modifier? */
fbcd35bd
JB
6059 if (! (modifiers & (down_modifier | drag_modifier
6060 | double_modifier | triple_modifier))
1b049b51
KR
6061 && i + 7 == SBYTES (name)
6062 && strncmp (SDATA (name) + i, "mouse-", 6) == 0
6063 && ('0' <= SREF (name, i + 6) && SREF (name, i + 6) <= '9'))
0a7f1fc0
JB
6064 modifiers |= click_modifier;
6065
a6d46bc1
JR
6066 if (! (modifiers & (double_modifier | triple_modifier))
6067 && i + 6 < SBYTES (name)
6068 && strncmp (SDATA (name) + i, "wheel-", 6) == 0)
6069 modifiers |= click_modifier;
6070
0a7f1fc0
JB
6071 if (modifier_end)
6072 *modifier_end = i;
6073
6074 return modifiers;
6075}
6076
0a7f1fc0
JB
6077/* Return a symbol whose name is the modifier prefixes for MODIFIERS
6078 prepended to the string BASE[0..BASE_LEN-1].
6079 This doesn't use any caches. */
6080static Lisp_Object
d3da34e0 6081apply_modifiers_uncached (int modifiers, char *base, int base_len, int base_len_byte)
0a7f1fc0
JB
6082{
6083 /* Since BASE could contain nulls, we can't use intern here; we have
6084 to use Fintern, which expects a genuine Lisp_String, and keeps a
6085 reference to it. */
301738ed
RS
6086 char *new_mods
6087 = (char *) alloca (sizeof ("A-C-H-M-S-s-down-drag-double-triple-"));
0a7f1fc0 6088 int mod_len;
284f4730 6089
284f4730 6090 {
0a7f1fc0
JB
6091 char *p = new_mods;
6092
6093 /* Only the event queue may use the `up' modifier; it should always
6094 be turned into a click or drag event before presented to lisp code. */
6095 if (modifiers & up_modifier)
6096 abort ();
6097
6098 if (modifiers & alt_modifier) { *p++ = 'A'; *p++ = '-'; }
6099 if (modifiers & ctrl_modifier) { *p++ = 'C'; *p++ = '-'; }
6100 if (modifiers & hyper_modifier) { *p++ = 'H'; *p++ = '-'; }
6101 if (modifiers & meta_modifier) { *p++ = 'M'; *p++ = '-'; }
6102 if (modifiers & shift_modifier) { *p++ = 'S'; *p++ = '-'; }
86e5706b 6103 if (modifiers & super_modifier) { *p++ = 's'; *p++ = '-'; }
fbcd35bd
JB
6104 if (modifiers & double_modifier) { strcpy (p, "double-"); p += 7; }
6105 if (modifiers & triple_modifier) { strcpy (p, "triple-"); p += 7; }
559f9d04
RS
6106 if (modifiers & down_modifier) { strcpy (p, "down-"); p += 5; }
6107 if (modifiers & drag_modifier) { strcpy (p, "drag-"); p += 5; }
0a7f1fc0
JB
6108 /* The click modifier is denoted by the absence of other modifiers. */
6109
6110 *p = '\0';
6111
6112 mod_len = p - new_mods;
6113 }
284f4730 6114
0a7f1fc0 6115 {
9b8eb840 6116 Lisp_Object new_name;
df0f2ba1 6117
301738ed
RS
6118 new_name = make_uninit_multibyte_string (mod_len + base_len,
6119 mod_len + base_len_byte);
72af86bd
AS
6120 memcpy (SDATA (new_name), new_mods, mod_len);
6121 memcpy (SDATA (new_name) + mod_len, base, base_len_byte);
284f4730
JB
6122
6123 return Fintern (new_name, Qnil);
6124 }
6125}
6126
6127
24021b38 6128static const char *const modifier_names[] =
0a7f1fc0 6129{
fbcd35bd 6130 "up", "down", "drag", "click", "double", "triple", 0, 0,
f335fabe 6131 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86e5706b 6132 0, 0, "alt", "super", "hyper", "shift", "control", "meta"
0a7f1fc0 6133};
80645119 6134#define NUM_MOD_NAMES (sizeof (modifier_names) / sizeof (modifier_names[0]))
0a7f1fc0
JB
6135
6136static Lisp_Object modifier_symbols;
6137
6138/* Return the list of modifier symbols corresponding to the mask MODIFIERS. */
6139static Lisp_Object
d3da34e0 6140lispy_modifier_list (int modifiers)
0a7f1fc0
JB
6141{
6142 Lisp_Object modifier_list;
6143 int i;
6144
6145 modifier_list = Qnil;
80645119 6146 for (i = 0; (1<<i) <= modifiers && i < NUM_MOD_NAMES; i++)
0a7f1fc0 6147 if (modifiers & (1<<i))
80645119
JB
6148 modifier_list = Fcons (XVECTOR (modifier_symbols)->contents[i],
6149 modifier_list);
0a7f1fc0
JB
6150
6151 return modifier_list;
6152}
6153
6154
6155/* Parse the modifiers on SYMBOL, and return a list like (UNMODIFIED MASK),
6156 where UNMODIFIED is the unmodified form of SYMBOL,
6157 MASK is the set of modifiers present in SYMBOL's name.
6158 This is similar to parse_modifiers_uncached, but uses the cache in
6159 SYMBOL's Qevent_symbol_element_mask property, and maintains the
6160 Qevent_symbol_elements property. */
3d31316f 6161
21ec2c43
SM
6162#define KEY_TO_CHAR(k) (XINT (k) & ((1 << CHARACTERBITS) - 1))
6163
1161d367 6164Lisp_Object
d3da34e0 6165parse_modifiers (Lisp_Object symbol)
0a7f1fc0 6166{
9b8eb840 6167 Lisp_Object elements;
0a7f1fc0 6168
21ec2c43
SM
6169 if (INTEGERP (symbol))
6170 return (Fcons (make_number (KEY_TO_CHAR (symbol)),
6171 Fcons (make_number (XINT (symbol) & CHAR_MODIFIER_MASK),
6172 Qnil)));
6173 else if (!SYMBOLP (symbol))
6174 return Qnil;
6175
9b8eb840 6176 elements = Fget (symbol, Qevent_symbol_element_mask);
0a7f1fc0
JB
6177 if (CONSP (elements))
6178 return elements;
6179 else
6180 {
6181 int end;
ec0faad2 6182 int modifiers = parse_modifiers_uncached (symbol, &end);
9b8eb840 6183 Lisp_Object unmodified;
0a7f1fc0
JB
6184 Lisp_Object mask;
6185
d5db4077
KR
6186 unmodified = Fintern (make_string (SDATA (SYMBOL_NAME (symbol)) + end,
6187 SBYTES (SYMBOL_NAME (symbol)) - end),
9b8eb840
KH
6188 Qnil);
6189
6b61353c 6190 if (modifiers & ~INTMASK)
734fef94 6191 abort ();
bb9e9bed 6192 XSETFASTINT (mask, modifiers);
0a7f1fc0
JB
6193 elements = Fcons (unmodified, Fcons (mask, Qnil));
6194
6195 /* Cache the parsing results on SYMBOL. */
6196 Fput (symbol, Qevent_symbol_element_mask,
6197 elements);
6198 Fput (symbol, Qevent_symbol_elements,
6199 Fcons (unmodified, lispy_modifier_list (modifiers)));
6200
6201 /* Since we know that SYMBOL is modifiers applied to unmodified,
6202 it would be nice to put that in unmodified's cache.
6203 But we can't, since we're not sure that parse_modifiers is
6204 canonical. */
6205
6206 return elements;
6207 }
6208}
6209
58da34c7
SM
6210DEFUN ("internal-event-symbol-parse-modifiers", Fevent_symbol_parse_modifiers,
6211 Sevent_symbol_parse_modifiers, 1, 1, 0,
6212 doc: /* Parse the event symbol. For internal use. */)
5842a27b 6213 (Lisp_Object symbol)
58da34c7
SM
6214{
6215 /* Fill the cache if needed. */
6216 parse_modifiers (symbol);
6217 /* Ignore the result (which is stored on Qevent_symbol_element_mask)
6218 and use the Lispier representation stored on Qevent_symbol_elements
6219 instead. */
6220 return Fget (symbol, Qevent_symbol_elements);
6221}
6222
0a7f1fc0
JB
6223/* Apply the modifiers MODIFIERS to the symbol BASE.
6224 BASE must be unmodified.
6225
6226 This is like apply_modifiers_uncached, but uses BASE's
6227 Qmodifier_cache property, if present. It also builds
cd21b839
JB
6228 Qevent_symbol_elements properties, since it has that info anyway.
6229
6230 apply_modifiers copies the value of BASE's Qevent_kind property to
6231 the modified symbol. */
0a7f1fc0 6232static Lisp_Object
d3da34e0 6233apply_modifiers (int modifiers, Lisp_Object base)
0a7f1fc0 6234{
7b4aedb9 6235 Lisp_Object cache, index, entry, new_symbol;
0a7f1fc0 6236
80645119 6237 /* Mask out upper bits. We don't know where this value's been. */
6b61353c 6238 modifiers &= INTMASK;
80645119 6239
21ec2c43 6240 if (INTEGERP (base))
4b7ab1c4 6241 return make_number (XINT (base) | modifiers);
21ec2c43 6242
0a7f1fc0 6243 /* The click modifier never figures into cache indices. */
0a7f1fc0 6244 cache = Fget (base, Qmodifier_cache);
bb9e9bed 6245 XSETFASTINT (index, (modifiers & ~click_modifier));
697e4895 6246 entry = assq_no_quit (index, cache);
0a7f1fc0
JB
6247
6248 if (CONSP (entry))
7539e11f 6249 new_symbol = XCDR (entry);
7b4aedb9
JB
6250 else
6251 {
df0f2ba1 6252 /* We have to create the symbol ourselves. */
7b4aedb9 6253 new_symbol = apply_modifiers_uncached (modifiers,
d5db4077
KR
6254 SDATA (SYMBOL_NAME (base)),
6255 SCHARS (SYMBOL_NAME (base)),
6256 SBYTES (SYMBOL_NAME (base)));
7b4aedb9
JB
6257
6258 /* Add the new symbol to the base's cache. */
6259 entry = Fcons (index, new_symbol);
6260 Fput (base, Qmodifier_cache, Fcons (entry, cache));
6261
35fb885d
SM
6262 /* We have the parsing info now for free, so we could add it to
6263 the caches:
6264 XSETFASTINT (index, modifiers);
6265 Fput (new_symbol, Qevent_symbol_element_mask,
6266 Fcons (base, Fcons (index, Qnil)));
6267 Fput (new_symbol, Qevent_symbol_elements,
6268 Fcons (base, lispy_modifier_list (modifiers)));
6269 Sadly, this is only correct if `base' is indeed a base event,
6270 which is not necessarily the case. -stef */
7b4aedb9 6271 }
0a7f1fc0 6272
df0f2ba1 6273 /* Make sure this symbol is of the same kind as BASE.
7b4aedb9
JB
6274
6275 You'd think we could just set this once and for all when we
6276 intern the symbol above, but reorder_modifiers may call us when
6277 BASE's property isn't set right; we can't assume that just
80645119
JB
6278 because it has a Qmodifier_cache property it must have its
6279 Qevent_kind set right as well. */
7b4aedb9
JB
6280 if (NILP (Fget (new_symbol, Qevent_kind)))
6281 {
9b8eb840 6282 Lisp_Object kind;
7b4aedb9 6283
9b8eb840 6284 kind = Fget (base, Qevent_kind);
7b4aedb9
JB
6285 if (! NILP (kind))
6286 Fput (new_symbol, Qevent_kind, kind);
6287 }
6288
6289 return new_symbol;
0a7f1fc0
JB
6290}
6291
6292
6293/* Given a symbol whose name begins with modifiers ("C-", "M-", etc),
6294 return a symbol with the modifiers placed in the canonical order.
6295 Canonical order is alphabetical, except for down and drag, which
6296 always come last. The 'click' modifier is never written out.
6297
6298 Fdefine_key calls this to make sure that (for example) C-M-foo
6299 and M-C-foo end up being equivalent in the keymap. */
6300
6301Lisp_Object
d3da34e0 6302reorder_modifiers (Lisp_Object symbol)
0a7f1fc0
JB
6303{
6304 /* It's hopefully okay to write the code this way, since everything
6305 will soon be in caches, and no consing will be done at all. */
9b8eb840 6306 Lisp_Object parsed;
0a7f1fc0 6307
9b8eb840 6308 parsed = parse_modifiers (symbol);
7539e11f
KR
6309 return apply_modifiers ((int) XINT (XCAR (XCDR (parsed))),
6310 XCAR (parsed));
0a7f1fc0
JB
6311}
6312
6313
284f4730
JB
6314/* For handling events, we often want to produce a symbol whose name
6315 is a series of modifier key prefixes ("M-", "C-", etcetera) attached
6316 to some base, like the name of a function key or mouse button.
6317 modify_event_symbol produces symbols of this sort.
6318
6319 NAME_TABLE should point to an array of strings, such that NAME_TABLE[i]
6320 is the name of the i'th symbol. TABLE_SIZE is the number of elements
6321 in the table.
6322
8e1e4240
GM
6323 Alternatively, NAME_ALIST_OR_STEM is either an alist mapping codes
6324 into symbol names, or a string specifying a name stem used to
a50e723f 6325 construct a symbol name or the form `STEM-N', where N is the decimal
8e1e4240
GM
6326 representation of SYMBOL_NUM. NAME_ALIST_OR_STEM is used if it is
6327 non-nil; otherwise NAME_TABLE is used.
80e4aa30 6328
284f4730
JB
6329 SYMBOL_TABLE should be a pointer to a Lisp_Object whose value will
6330 persist between calls to modify_event_symbol that it can use to
6331 store a cache of the symbols it's generated for this NAME_TABLE
80e4aa30 6332 before. The object stored there may be a vector or an alist.
284f4730
JB
6333
6334 SYMBOL_NUM is the number of the base name we want from NAME_TABLE.
df0f2ba1 6335
284f4730
JB
6336 MODIFIERS is a set of modifier bits (as given in struct input_events)
6337 whose prefixes should be applied to the symbol name.
6338
6339 SYMBOL_KIND is the value to be placed in the event_kind property of
df0f2ba1 6340 the returned symbol.
88cb0656
JB
6341
6342 The symbols we create are supposed to have an
eb8c3be9 6343 `event-symbol-elements' property, which lists the modifiers present
88cb0656
JB
6344 in the symbol's name. */
6345
284f4730 6346static Lisp_Object
41118bd3 6347modify_event_symbol (EMACS_INT symbol_num, unsigned int modifiers, Lisp_Object symbol_kind,
24021b38 6348 Lisp_Object name_alist_or_stem, const char *const *name_table,
d3da34e0 6349 Lisp_Object *symbol_table, unsigned int table_size)
284f4730 6350{
80e4aa30
RS
6351 Lisp_Object value;
6352 Lisp_Object symbol_int;
6353
2c834fb3
KH
6354 /* Get rid of the "vendor-specific" bit here. */
6355 XSETINT (symbol_int, symbol_num & 0xffffff);
284f4730
JB
6356
6357 /* Is this a request for a valid symbol? */
88cb0656 6358 if (symbol_num < 0 || symbol_num >= table_size)
0c2611c5 6359 return Qnil;
284f4730 6360
80e4aa30
RS
6361 if (CONSP (*symbol_table))
6362 value = Fcdr (assq_no_quit (symbol_int, *symbol_table));
6363
0a7f1fc0 6364 /* If *symbol_table doesn't seem to be initialized properly, fix that.
88cb0656 6365 *symbol_table should be a lisp vector TABLE_SIZE elements long,
4bb994d1
JB
6366 where the Nth element is the symbol for NAME_TABLE[N], or nil if
6367 we've never used that symbol before. */
80e4aa30 6368 else
88cb0656 6369 {
80e4aa30
RS
6370 if (! VECTORP (*symbol_table)
6371 || XVECTOR (*symbol_table)->size != table_size)
6372 {
6373 Lisp_Object size;
0a7f1fc0 6374
bb9e9bed 6375 XSETFASTINT (size, table_size);
80e4aa30
RS
6376 *symbol_table = Fmake_vector (size, Qnil);
6377 }
284f4730 6378
80e4aa30
RS
6379 value = XVECTOR (*symbol_table)->contents[symbol_num];
6380 }
284f4730 6381
0a7f1fc0 6382 /* Have we already used this symbol before? */
80e4aa30 6383 if (NILP (value))
284f4730 6384 {
0a7f1fc0 6385 /* No; let's create it. */
8e1e4240
GM
6386 if (CONSP (name_alist_or_stem))
6387 value = Fcdr_safe (Fassq (symbol_int, name_alist_or_stem));
6388 else if (STRINGP (name_alist_or_stem))
6389 {
d5db4077 6390 int len = SBYTES (name_alist_or_stem);
8e1e4240 6391 char *buf = (char *) alloca (len + 50);
987a3489
KL
6392 sprintf (buf, "%s-%ld", SDATA (name_alist_or_stem),
6393 (long) XINT (symbol_int) + 1);
8e1e4240
GM
6394 value = intern (buf);
6395 }
2ff6714d 6396 else if (name_table != 0 && name_table[symbol_num])
80e4aa30 6397 value = intern (name_table[symbol_num]);
b64b4075 6398
e98a93eb 6399#ifdef HAVE_WINDOW_SYSTEM
2c834fb3
KH
6400 if (NILP (value))
6401 {
6402 char *name = x_get_keysym_name (symbol_num);
6403 if (name)
6404 value = intern (name);
6405 }
6406#endif
6407
b64b4075 6408 if (NILP (value))
d1f50460
RS
6409 {
6410 char buf[20];
41118bd3 6411 sprintf (buf, "key-%ld", (long)symbol_num);
80e4aa30 6412 value = intern (buf);
d1f50460 6413 }
0a7f1fc0 6414
80e4aa30 6415 if (CONSP (*symbol_table))
4205cb08 6416 *symbol_table = Fcons (Fcons (symbol_int, value), *symbol_table);
80e4aa30
RS
6417 else
6418 XVECTOR (*symbol_table)->contents[symbol_num] = value;
6419
df0f2ba1 6420 /* Fill in the cache entries for this symbol; this also
0a7f1fc0
JB
6421 builds the Qevent_symbol_elements property, which the user
6422 cares about. */
80e4aa30
RS
6423 apply_modifiers (modifiers & click_modifier, value);
6424 Fput (value, Qevent_kind, symbol_kind);
284f4730 6425 }
88cb0656 6426
0a7f1fc0 6427 /* Apply modifiers to that symbol. */
80e4aa30 6428 return apply_modifiers (modifiers, value);
284f4730 6429}
6da3dd3a
RS
6430\f
6431/* Convert a list that represents an event type,
6432 such as (ctrl meta backspace), into the usual representation of that
6433 event type as a number or a symbol. */
6434
a1706c30 6435DEFUN ("event-convert-list", Fevent_convert_list, Sevent_convert_list, 1, 1, 0,
4707d2d0
PJ
6436 doc: /* Convert the event description list EVENT-DESC to an event type.
6437EVENT-DESC should contain one base event type (a character or symbol)
6438and zero or more modifier names (control, meta, hyper, super, shift, alt,
6439drag, down, double or triple). The base must be last.
6440The return value is an event type (a character or symbol) which
6441has the same base event type and all the specified modifiers. */)
5842a27b 6442 (Lisp_Object event_desc)
6da3dd3a
RS
6443{
6444 Lisp_Object base;
6445 int modifiers = 0;
6446 Lisp_Object rest;
6447
6448 base = Qnil;
e57d8fd8 6449 rest = event_desc;
6da3dd3a
RS
6450 while (CONSP (rest))
6451 {
6452 Lisp_Object elt;
6453 int this = 0;
6454
7539e11f
KR
6455 elt = XCAR (rest);
6456 rest = XCDR (rest);
6da3dd3a 6457
3d31316f 6458 /* Given a symbol, see if it is a modifier name. */
377f24f5 6459 if (SYMBOLP (elt) && CONSP (rest))
3d31316f 6460 this = parse_solitary_modifier (elt);
6da3dd3a
RS
6461
6462 if (this != 0)
6463 modifiers |= this;
6464 else if (!NILP (base))
6465 error ("Two bases given in one event");
6466 else
6467 base = elt;
6468
6da3dd3a
RS
6469 }
6470
3d31316f 6471 /* Let the symbol A refer to the character A. */
d5db4077 6472 if (SYMBOLP (base) && SCHARS (SYMBOL_NAME (base)) == 1)
4069e0f8 6473 XSETINT (base, SREF (SYMBOL_NAME (base), 0));
3d31316f 6474
6da3dd3a
RS
6475 if (INTEGERP (base))
6476 {
3d31316f
RS
6477 /* Turn (shift a) into A. */
6478 if ((modifiers & shift_modifier) != 0
6479 && (XINT (base) >= 'a' && XINT (base) <= 'z'))
6480 {
6481 XSETINT (base, XINT (base) - ('a' - 'A'));
6482 modifiers &= ~shift_modifier;
6483 }
6484
6485 /* Turn (control a) into C-a. */
6da3dd3a 6486 if (modifiers & ctrl_modifier)
3d31316f 6487 return make_number ((modifiers & ~ctrl_modifier)
6da3dd3a
RS
6488 | make_ctrl_char (XINT (base)));
6489 else
6490 return make_number (modifiers | XINT (base));
6491 }
6492 else if (SYMBOLP (base))
6493 return apply_modifiers (modifiers, base);
6494 else
8c907a56
GM
6495 {
6496 error ("Invalid base event");
6497 return Qnil;
6498 }
6da3dd3a
RS
6499}
6500
3d31316f
RS
6501/* Try to recognize SYMBOL as a modifier name.
6502 Return the modifier flag bit, or 0 if not recognized. */
6503
0bcfd7d7
SM
6504int
6505parse_solitary_modifier (Lisp_Object symbol)
3d31316f 6506{
1b049b51 6507 Lisp_Object name = SYMBOL_NAME (symbol);
3d31316f 6508
1b049b51 6509 switch (SREF (name, 0))
3d31316f
RS
6510 {
6511#define SINGLE_LETTER_MOD(BIT) \
1b049b51 6512 if (SBYTES (name) == 1) \
3d31316f
RS
6513 return BIT;
6514
6515#define MULTI_LETTER_MOD(BIT, NAME, LEN) \
1b049b51
KR
6516 if (LEN == SBYTES (name) \
6517 && ! strncmp (SDATA (name), NAME, LEN)) \
3d31316f
RS
6518 return BIT;
6519
6520 case 'A':
6521 SINGLE_LETTER_MOD (alt_modifier);
6522 break;
6523
6524 case 'a':
6525 MULTI_LETTER_MOD (alt_modifier, "alt", 3);
6526 break;
6527
6528 case 'C':
6529 SINGLE_LETTER_MOD (ctrl_modifier);
6530 break;
6531
6532 case 'c':
6533 MULTI_LETTER_MOD (ctrl_modifier, "ctrl", 4);
6534 MULTI_LETTER_MOD (ctrl_modifier, "control", 7);
6535 break;
6536
6537 case 'H':
6538 SINGLE_LETTER_MOD (hyper_modifier);
6539 break;
6540
6541 case 'h':
6542 MULTI_LETTER_MOD (hyper_modifier, "hyper", 5);
6543 break;
6544
6545 case 'M':
6546 SINGLE_LETTER_MOD (meta_modifier);
6547 break;
6548
6549 case 'm':
6550 MULTI_LETTER_MOD (meta_modifier, "meta", 4);
6551 break;
6552
6553 case 'S':
6554 SINGLE_LETTER_MOD (shift_modifier);
6555 break;
6556
6557 case 's':
6558 MULTI_LETTER_MOD (shift_modifier, "shift", 5);
6559 MULTI_LETTER_MOD (super_modifier, "super", 5);
6560 SINGLE_LETTER_MOD (super_modifier);
6561 break;
6562
6563 case 'd':
6564 MULTI_LETTER_MOD (drag_modifier, "drag", 4);
6565 MULTI_LETTER_MOD (down_modifier, "down", 4);
6566 MULTI_LETTER_MOD (double_modifier, "double", 6);
6567 break;
6568
6569 case 't':
6570 MULTI_LETTER_MOD (triple_modifier, "triple", 6);
6571 break;
6572
6573#undef SINGLE_LETTER_MOD
6574#undef MULTI_LETTER_MOD
6575 }
6576
6577 return 0;
6578}
6579
6da3dd3a
RS
6580/* Return 1 if EVENT is a list whose elements are all integers or symbols.
6581 Such a list is not valid as an event,
6582 but it can be a Lucid-style event type list. */
6583
6584int
d3da34e0 6585lucid_event_type_list_p (Lisp_Object object)
6da3dd3a
RS
6586{
6587 Lisp_Object tail;
6588
6589 if (! CONSP (object))
6590 return 0;
902ae620
GM
6591
6592 if (EQ (XCAR (object), Qhelp_echo)
6593 || EQ (XCAR (object), Qvertical_line)
6594 || EQ (XCAR (object), Qmode_line)
6595 || EQ (XCAR (object), Qheader_line))
6596 return 0;
6da3dd3a 6597
7539e11f 6598 for (tail = object; CONSP (tail); tail = XCDR (tail))
6da3dd3a
RS
6599 {
6600 Lisp_Object elt;
7539e11f 6601 elt = XCAR (tail);
6da3dd3a
RS
6602 if (! (INTEGERP (elt) || SYMBOLP (elt)))
6603 return 0;
6604 }
6605
6606 return NILP (tail);
6607}
284f4730 6608\f
284f4730
JB
6609/* Store into *addr a value nonzero if terminal input chars are available.
6610 Serves the purpose of ioctl (0, FIONREAD, addr)
6611 but works even if FIONREAD does not exist.
d9d4c147
KH
6612 (In fact, this may actually read some input.)
6613
a2d5fca0
JD
6614 If READABLE_EVENTS_DO_TIMERS_NOW is set in FLAGS, actually run
6615 timer events that are ripe.
6616 If READABLE_EVENTS_FILTER_EVENTS is set in FLAGS, ignore internal
6617 events (FOCUS_IN_EVENT).
6618 If READABLE_EVENTS_IGNORE_SQUEEZABLES is set in FLAGS, ignore mouse
354344a2 6619 movements and toolkit scroll bar thumb drags. */
284f4730
JB
6620
6621static void
d3da34e0 6622get_input_pending (int *addr, int flags)
284f4730
JB
6623{
6624 /* First of all, have we already counted some input? */
a2d5fca0 6625 *addr = (!NILP (Vquit_flag) || readable_events (flags));
284f4730
JB
6626
6627 /* If input is being read as it arrives, and we have none, there is none. */
6628 if (*addr > 0 || (interrupt_input && ! interrupts_deferred))
6629 return;
6630
6631 /* Try to read some input and see how much we get. */
6632 gobble_input (0);
a2d5fca0 6633 *addr = (!NILP (Vquit_flag) || readable_events (flags));
284f4730
JB
6634}
6635
81931ba1 6636/* Interface to read_avail_input, blocking SIGIO or SIGALRM if necessary. */
284f4730 6637
07a59269 6638void
d3da34e0 6639gobble_input (int expected)
284f4730 6640{
284f4730
JB
6641#ifdef SIGIO
6642 if (interrupt_input)
6643 {
32676c08 6644 SIGMASKTYPE mask;
4f8aaa74 6645 mask = sigblock (sigmask (SIGIO));
284f4730 6646 read_avail_input (expected);
e065a56e 6647 sigsetmask (mask);
284f4730
JB
6648 }
6649 else
81931ba1 6650#ifdef POLL_FOR_INPUT
428a555e
KL
6651 /* XXX This condition was (read_socket_hook && !interrupt_input),
6652 but read_socket_hook is not global anymore. Let's pretend that
6653 it's always set. */
6654 if (!interrupt_input && poll_suppress_count == 0)
81931ba1
RS
6655 {
6656 SIGMASKTYPE mask;
4f8aaa74 6657 mask = sigblock (sigmask (SIGALRM));
81931ba1
RS
6658 read_avail_input (expected);
6659 sigsetmask (mask);
6660 }
6661 else
284f4730 6662#endif
284f4730 6663#endif
12063bc5 6664 read_avail_input (expected);
284f4730 6665}
a8015ab5 6666
3b8f9651 6667/* Put a BUFFER_SWITCH_EVENT in the buffer
241ceaf7
RS
6668 so that read_key_sequence will notice the new current buffer. */
6669
07a59269 6670void
d3da34e0 6671record_asynch_buffer_change (void)
a8015ab5
KH
6672{
6673 struct input_event event;
a30f0615 6674 Lisp_Object tem;
1269a761 6675 EVENT_INIT (event);
a30f0615 6676
3b8f9651 6677 event.kind = BUFFER_SWITCH_EVENT;
a8015ab5 6678 event.frame_or_window = Qnil;
da8f7368 6679 event.arg = Qnil;
241ceaf7 6680
a30f0615
RS
6681 /* We don't need a buffer-switch event unless Emacs is waiting for input.
6682 The purpose of the event is to make read_key_sequence look up the
6683 keymaps again. If we aren't in read_key_sequence, we don't need one,
77defa9a
EZ
6684 and the event could cause trouble by messing up (input-pending-p).
6685 Note: Fwaiting_for_user_input_p always returns nil when async
6686 subprocesses aren't supported. */
a30f0615
RS
6687 tem = Fwaiting_for_user_input_p ();
6688 if (NILP (tem))
6689 return;
6690
241ceaf7
RS
6691 /* Make sure no interrupt happens while storing the event. */
6692#ifdef SIGIO
6693 if (interrupt_input)
6694 {
6695 SIGMASKTYPE mask;
4f8aaa74 6696 mask = sigblock (sigmask (SIGIO));
241ceaf7
RS
6697 kbd_buffer_store_event (&event);
6698 sigsetmask (mask);
6699 }
6700 else
6701#endif
6702 {
6703 stop_polling ();
6704 kbd_buffer_store_event (&event);
6705 start_polling ();
6706 }
a8015ab5 6707}
284f4730 6708\f
284f4730
JB
6709/* Read any terminal input already buffered up by the system
6710 into the kbd_buffer, but do not wait.
6711
6712 EXPECTED should be nonzero if the caller knows there is some input.
6713
284f4730
JB
6714 Returns the number of keyboard chars read, or -1 meaning
6715 this is a bad time to try to read input. */
6716
6717static int
d3da34e0 6718read_avail_input (int expected)
284f4730 6719{
6b61353c 6720 int nread = 0;
80d4c824 6721 int err = 0;
6ed8eeff 6722 struct terminal *t;
1269a761 6723
23479b40
YM
6724 /* Store pending user signal events, if any. */
6725 if (store_user_signal_events ())
6726 expected = 0;
6727
6ed8eeff
KL
6728 /* Loop through the available terminals, and call their input hooks. */
6729 t = terminal_list;
6730 while (t)
6b61353c 6731 {
6ed8eeff 6732 struct terminal *next = t->next_terminal;
6b61353c 6733
6ed8eeff 6734 if (t->read_socket_hook)
d448e982 6735 {
3b7fbceb 6736 int nr;
057a9ab4 6737 struct input_event hold_quit;
d448e982 6738
057a9ab4
KL
6739 EVENT_INIT (hold_quit);
6740 hold_quit.kind = NO_EVENT;
351d2e14 6741
057a9ab4 6742 /* No need for FIONREAD or fcntl; just say don't wait. */
6ed8eeff 6743 while (nr = (*t->read_socket_hook) (t, expected, &hold_quit), nr > 0)
057a9ab4
KL
6744 {
6745 nread += nr;
6746 expected = 0;
6747 }
033b73e2 6748
057a9ab4
KL
6749 if (nr == -1) /* Not OK to read input now. */
6750 {
6751 err = 1;
6752 }
6753 else if (nr == -2) /* Non-transient error. */
6754 {
6ed8eeff 6755 /* The terminal device terminated; it should be closed. */
033b73e2 6756
6ed8eeff
KL
6757 /* Kill Emacs if this was our last terminal. */
6758 if (!terminal_list->next_terminal)
057a9ab4
KL
6759 /* Formerly simply reported no input, but that
6760 sometimes led to a failure of Emacs to terminate.
6761 SIGHUP seems appropriate if we can't reach the
6762 terminal. */
6763 /* ??? Is it really right to send the signal just to
6764 this process rather than to the whole process
6765 group? Perhaps on systems with FIONREAD Emacs is
6766 alone in its group. */
6767 kill (getpid (), SIGHUP);
033b73e2 6768
e2749141 6769 /* XXX Is calling delete_terminal safe here? It calls delete_frame. */
adf6a429
SM
6770 {
6771 Lisp_Object tmp;
6772 XSETTERMINAL (tmp, t);
6773 Fdelete_terminal (tmp, Qnoelisp);
6774 }
057a9ab4 6775 }
351d2e14 6776
057a9ab4
KL
6777 if (hold_quit.kind != NO_EVENT)
6778 kbd_buffer_store_event (&hold_quit);
d448e982 6779 }
6b61353c 6780
6ed8eeff 6781 t = next;
6b61353c 6782 }
284f4730 6783
1cbfd764
KL
6784 if (err && !nread)
6785 nread = -1;
6786
e044e4fc
JD
6787 frame_make_pointer_visible ();
6788
8f1ce423
KL
6789 return nread;
6790}
6791
fd503d99
KH
6792static void
6793decode_keyboard_code (struct tty_display_info *tty,
6794 struct coding_system *coding,
6795 unsigned char *buf, int nbytes)
6796{
6797 unsigned char *src = buf;
6798 const unsigned char *p;
6799 int i;
6800
6801 if (nbytes == 0)
6802 return;
6803 if (tty->meta_key != 2)
6804 for (i = 0; i < nbytes; i++)
6805 buf[i] &= ~0x80;
6806 if (coding->carryover_bytes > 0)
6807 {
6808 src = alloca (coding->carryover_bytes + nbytes);
6809 memcpy (src, coding->carryover, coding->carryover_bytes);
6810 memcpy (src + coding->carryover_bytes, buf, nbytes);
6811 nbytes += coding->carryover_bytes;
6812 }
6813 coding->destination = alloca (nbytes * 4);
6814 coding->dst_bytes = nbytes * 4;
6815 decode_coding_c_string (coding, src, nbytes, Qnil);
6816 if (coding->produced_char == 0)
6817 return;
6818 for (i = 0, p = coding->destination; i < coding->produced_char; i++)
6819 {
6820 struct input_event buf;
6821
6822 EVENT_INIT (buf);
6823 buf.code = STRING_CHAR_ADVANCE (p);
6824 buf.kind = (ASCII_CHAR_P (buf.code)
6825 ? ASCII_KEYSTROKE_EVENT : MULTIBYTE_CHAR_KEYSTROKE_EVENT);
6826 /* See the comment in tty_read_avail_input. */
6827 buf.frame_or_window = tty->top_frame;
6828 buf.arg = Qnil;
6829 kbd_buffer_store_event (&buf);
6830 }
6831}
6832
8f1ce423
KL
6833/* This is the tty way of reading available input.
6834
6ed8eeff 6835 Note that each terminal device has its own `struct terminal' object,
8f1ce423 6836 and so this function is called once for each individual termcap
6ed8eeff 6837 terminal. The first parameter indicates which terminal to read from. */
d448e982 6838
8f1ce423 6839int
6ed8eeff 6840tty_read_avail_input (struct terminal *terminal,
057a9ab4
KL
6841 int expected,
6842 struct input_event *hold_quit)
8f1ce423 6843{
057a9ab4
KL
6844 /* Using KBD_BUFFER_SIZE - 1 here avoids reading more than
6845 the kbd_buffer can really hold. That may prevent loss
6846 of characters on some systems when input is stuffed at us. */
6847 unsigned char cbuf[KBD_BUFFER_SIZE - 1];
8f1ce423 6848 int n_to_read, i;
6ed8eeff 6849 struct tty_display_info *tty = terminal->display_info.tty;
8f1ce423 6850 int nread = 0;
86520d8c 6851#ifdef subprocesses
cb768704
J
6852 int buffer_free = KBD_BUFFER_SIZE - kbd_buffer_nr_stored () - 1;
6853
6854 if (kbd_on_hold_p () || buffer_free <= 0)
6855 return 0;
86520d8c 6856#endif /* subprocesses */
3b7fbceb 6857
bcc3646e 6858 if (!terminal->name) /* Don't read from a dead terminal. */
1bc973c2 6859 return 0;
ab797f65 6860
cb22456d
EZ
6861 if (terminal->type != output_termcap
6862 && terminal->type != output_msdos_raw)
8f1ce423 6863 abort ();
3b7fbceb 6864
ac3d2625 6865 /* XXX I think the following code should be moved to separate hook
8f1ce423 6866 functions in system-dependent files. */
bc536d84 6867#ifdef WINDOWSNT
8f1ce423 6868 return 0;
bc536d84 6869#else /* not WINDOWSNT */
cb22456d
EZ
6870 if (! tty->term_initted) /* In case we get called during bootstrap. */
6871 return 0;
6872
6873 if (! tty->input)
6874 return 0; /* The terminal is suspended. */
6875
80e4aa30 6876#ifdef MSDOS
8f1ce423
KL
6877 n_to_read = dos_keysns ();
6878 if (n_to_read == 0)
6879 return 0;
3b7fbceb 6880
8f1ce423
KL
6881 cbuf[0] = dos_keyread ();
6882 nread = 1;
3b7fbceb 6883
c3a2738c 6884#else /* not MSDOS */
7e5a23bd 6885#ifdef HAVE_GPM
71f44e7a 6886 if (gpm_tty == tty)
7be1c21a
MB
6887 {
6888 Gpm_Event event;
6889 struct input_event hold_quit;
d347e494 6890 int gpm, fd = gpm_fd;
ae372f41 6891
7be1c21a
MB
6892 EVENT_INIT (hold_quit);
6893 hold_quit.kind = NO_EVENT;
ae372f41 6894
d347e494
SM
6895 /* gpm==1 if event received.
6896 gpm==0 if the GPM daemon has closed the connection, in which case
6897 Gpm_GetEvent closes gpm_fd and clears it to -1, which is why
6898 we save it in `fd' so close_gpm can remove it from the
6899 select masks.
6900 gpm==-1 if a protocol error or EWOULDBLOCK; the latter is normal. */
7be1c21a
MB
6901 while (gpm = Gpm_GetEvent (&event), gpm == 1) {
6902 nread += handle_one_term_event (tty, &event, &hold_quit);
6903 }
d347e494 6904 if (gpm == 0)
ed5ff21d 6905 /* Presumably the GPM daemon has closed the connection. */
d347e494 6906 close_gpm (fd);
7be1c21a
MB
6907 if (hold_quit.kind != NO_EVENT)
6908 kbd_buffer_store_event (&hold_quit);
6909 if (nread)
6910 return nread;
6911 }
7e5a23bd 6912#endif /* HAVE_GPM */
ae372f41 6913
7be1c21a 6914/* Determine how many characters we should *try* to read. */
284f4730 6915#ifdef FIONREAD
8f1ce423 6916 /* Find out how much input is available. */
0b0d3e0b 6917 if (ioctl (fileno (tty->input), FIONREAD, &n_to_read) < 0)
8f1ce423
KL
6918 {
6919 if (! noninteractive)
6ed8eeff 6920 return -2; /* Close this terminal. */
8f1ce423 6921 else
d448e982 6922 n_to_read = 0;
8f1ce423
KL
6923 }
6924 if (n_to_read == 0)
6925 return 0;
6926 if (n_to_read > sizeof cbuf)
6927 n_to_read = sizeof cbuf;
284f4730 6928#else /* no FIONREAD */
e39a993c 6929#if defined (USG) || defined(CYGWIN)
8f1ce423
KL
6930 /* Read some input if available, but don't wait. */
6931 n_to_read = sizeof cbuf;
0b0d3e0b 6932 fcntl (fileno (tty->input), F_SETFL, O_NDELAY);
284f4730 6933#else
8f1ce423 6934 you lose;
284f4730
JB
6935#endif
6936#endif
6937
86520d8c 6938#ifdef subprocesses
cb768704
J
6939 /* Don't read more than we can store. */
6940 if (n_to_read > buffer_free)
6941 n_to_read = buffer_free;
86520d8c 6942#endif /* subprocesses */
cb768704 6943
8f1ce423
KL
6944 /* Now read; for one reason or another, this will not block.
6945 NREAD is set to the number of chars read. */
6946 do
6947 {
0b0d3e0b 6948 nread = emacs_read (fileno (tty->input), cbuf, n_to_read);
8f1ce423
KL
6949 /* POSIX infers that processes which are not in the session leader's
6950 process group won't get SIGHUP's at logout time. BSDI adheres to
6951 this part standard and returns -1 from read (0) with errno==EIO
6952 when the control tty is taken away.
ac3d2625 6953 Jeffrey Honig <jch@bsdi.com> says this is generally safe. */
8f1ce423 6954 if (nread == -1 && errno == EIO)
6ed8eeff 6955 return -2; /* Close this terminal. */
4624371d 6956#if defined (AIX) && defined (_BSD)
8f1ce423
KL
6957 /* The kernel sometimes fails to deliver SIGHUP for ptys.
6958 This looks incorrect, but it isn't, because _BSD causes
6959 O_NDELAY to be defined in fcntl.h as O_NONBLOCK,
6960 and that causes a value other than 0 when there is no input. */
6961 if (nread == 0)
6ed8eeff 6962 return -2; /* Close this terminal. */
284f4730 6963#endif
8f1ce423
KL
6964 }
6965 while (
6966 /* We used to retry the read if it was interrupted.
6967 But this does the wrong thing when O_NDELAY causes
6968 an EAGAIN error. Does anybody know of a situation
6969 where a retry is actually needed? */
791587ee 6970#if 0
8f1ce423 6971 nread < 0 && (errno == EAGAIN
6aec06f5 6972#ifdef EFAULT
8f1ce423 6973 || errno == EFAULT
80e4aa30 6974#endif
284f4730 6975#ifdef EBADSLT
8f1ce423 6976 || errno == EBADSLT
284f4730 6977#endif
8f1ce423 6978 )
791587ee 6979#else
8f1ce423 6980 0
791587ee 6981#endif
8f1ce423 6982 );
284f4730
JB
6983
6984#ifndef FIONREAD
e39a993c 6985#if defined (USG) || defined (CYGWIN)
0b0d3e0b 6986 fcntl (fileno (tty->input), F_SETFL, 0);
e39a993c 6987#endif /* USG or CYGWIN */
284f4730 6988#endif /* no FIONREAD */
3b7fbceb 6989
8f1ce423
KL
6990 if (nread <= 0)
6991 return nread;
3b7fbceb 6992
9628b887
KL
6993#endif /* not MSDOS */
6994#endif /* not WINDOWSNT */
3b7fbceb 6995
fd503d99
KH
6996 if (TERMINAL_KEYBOARD_CODING (terminal)->common_flags
6997 & CODING_REQUIRE_DECODING_MASK)
6998 {
6999 struct coding_system *coding = TERMINAL_KEYBOARD_CODING (terminal);
7000 int from;
485db0ba 7001
fd503d99
KH
7002 /* Decode the key sequence except for those with meta
7003 modifiers. */
7004 for (i = from = 0; ; i++)
7005 if (i == nread || (tty->meta_key == 1 && (cbuf[i] & 0x80)))
7006 {
7007 struct input_event buf;
7008
7009 decode_keyboard_code (tty, coding, cbuf + from, i - from);
7010 if (i == nread)
7011 break;
7012
7013 EVENT_INIT (buf);
7014 buf.kind = ASCII_KEYSTROKE_EVENT;
7015 buf.modifiers = meta_modifier;
7016 buf.code = cbuf[i] & ~0x80;
7017 /* See the comment below. */
7018 buf.frame_or_window = tty->top_frame;
7019 buf.arg = Qnil;
7020 kbd_buffer_store_event (&buf);
7021 from = i + 1;
7022 }
7023 return nread;
7024 }
7025
284f4730
JB
7026 for (i = 0; i < nread; i++)
7027 {
057a9ab4
KL
7028 struct input_event buf;
7029 EVENT_INIT (buf);
7030 buf.kind = ASCII_KEYSTROKE_EVENT;
7031 buf.modifiers = 0;
8f1ce423 7032 if (tty->meta_key == 1 && (cbuf[i] & 0x80))
057a9ab4 7033 buf.modifiers = meta_modifier;
8f1ce423
KL
7034 if (tty->meta_key != 2)
7035 cbuf[i] &= ~0x80;
033b73e2 7036
057a9ab4 7037 buf.code = cbuf[i];
ac3d2625
KL
7038 /* Set the frame corresponding to the active tty. Note that the
7039 value of selected_frame is not reliable here, redisplay tends
7040 to temporarily change it. */
057a9ab4
KL
7041 buf.frame_or_window = tty->top_frame;
7042 buf.arg = Qnil;
033b73e2 7043
057a9ab4
KL
7044 kbd_buffer_store_event (&buf);
7045 /* Don't look at input that follows a C-g too closely.
7046 This reduces lossage due to autorepeat on C-g. */
7047 if (buf.kind == ASCII_KEYSTROKE_EVENT
7048 && buf.code == quit_char)
7049 break;
284f4730
JB
7050 }
7051
7052 return nread;
7053}
284f4730 7054\f
6b61353c 7055void
d3da34e0 7056handle_async_input (void)
6b61353c 7057{
6b61353c 7058 interrupt_input_pending = 0;
07a1e794 7059#ifdef SYNC_INPUT
ceb18827 7060 pending_signals = pending_atimers;
07a1e794 7061#endif
c96169a0
AR
7062/* Tell ns_read_socket() it is being called asynchronously so it can avoid
7063 doing anything dangerous. */
7064#ifdef HAVE_NS
7065 ++handling_signal;
7066#endif
6b61353c
KH
7067 while (1)
7068 {
7069 int nread;
7070 nread = read_avail_input (1);
7071 /* -1 means it's not ok to read the input now.
7072 UNBLOCK_INPUT will read it later; now, avoid infinite loop.
7073 0 means there was no keyboard input available. */
7074 if (nread <= 0)
7075 break;
6b61353c 7076 }
c96169a0
AR
7077#ifdef HAVE_NS
7078 --handling_signal;
7079#endif
6b61353c
KH
7080}
7081
ceb18827 7082void
d3da34e0 7083process_pending_signals (void)
ceb18827
CY
7084{
7085 if (interrupt_input_pending)
7086 handle_async_input ();
7087 do_pending_atimers ();
7088}
7089
284f4730
JB
7090#ifdef SIGIO /* for entire page */
7091/* Note SIGIO has been undef'd if FIONREAD is missing. */
7092
4216b545 7093static SIGTYPE
d3da34e0 7094input_available_signal (int signo)
284f4730
JB
7095{
7096 /* Must preserve main program's value of errno. */
7097 int old_errno = errno;
c2623ee7
YM
7098 SIGNAL_THREAD_CHECK (signo);
7099
6b61353c
KH
7100#ifdef SYNC_INPUT
7101 interrupt_input_pending = 1;
ceb18827 7102 pending_signals = 1;
bd55c35c 7103#endif
a25f766a 7104
bd55c35c
JD
7105 if (input_available_clear_time)
7106 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
d7031edc 7107
bd55c35c 7108#ifndef SYNC_INPUT
6b61353c 7109 handle_async_input ();
284f4730 7110#endif
284f4730 7111
284f4730
JB
7112 errno = old_errno;
7113}
7114#endif /* SIGIO */
ad163903
JB
7115
7116/* Send ourselves a SIGIO.
7117
7118 This function exists so that the UNBLOCK_INPUT macro in
7119 blockinput.h can have some way to take care of input we put off
7120 dealing with, without assuming that every file which uses
7121 UNBLOCK_INPUT also has #included the files necessary to get SIGIO. */
7122void
d3da34e0 7123reinvoke_input_signal (void)
ad163903 7124{
df0f2ba1 7125#ifdef SIGIO
6b61353c 7126 handle_async_input ();
ad163903
JB
7127#endif
7128}
7129
7130
284f4730 7131\f
23479b40
YM
7132/* User signal events. */
7133
7134struct user_signal_info
7135{
7136 /* Signal number. */
7137 int sig;
7138
7139 /* Name of the signal. */
7140 char *name;
7141
7142 /* Number of pending signals. */
7143 int npending;
7144
7145 struct user_signal_info *next;
7146};
7147
7148/* List of user signals. */
7149static struct user_signal_info *user_signals = NULL;
7150
7151void
d3da34e0 7152add_user_signal (int sig, const char *name)
23479b40
YM
7153{
7154 struct user_signal_info *p;
7155
7156 for (p = user_signals; p; p = p->next)
7157 if (p->sig == sig)
7158 /* Already added. */
7159 return;
7160
7161 p = xmalloc (sizeof (struct user_signal_info));
7162 p->sig = sig;
7163 p->name = xstrdup (name);
7164 p->npending = 0;
7165 p->next = user_signals;
7166 user_signals = p;
7167
7168 signal (sig, handle_user_signal);
7169}
7170
7171static SIGTYPE
d3da34e0 7172handle_user_signal (int sig)
23479b40
YM
7173{
7174 int old_errno = errno;
7175 struct user_signal_info *p;
7176
23479b40
YM
7177 SIGNAL_THREAD_CHECK (sig);
7178
7179 for (p = user_signals; p; p = p->next)
7180 if (p->sig == sig)
7181 {
7182 p->npending++;
7183#ifdef SIGIO
7184 if (interrupt_input)
7185 kill (getpid (), SIGIO);
7186 else
7187#endif
7188 {
7189 /* Tell wait_reading_process_output that it needs to wake
7190 up and look around. */
7191 if (input_available_clear_time)
7192 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
7193 }
7194 break;
7195 }
7196
7197 errno = old_errno;
7198}
7199
7200static char *
d3da34e0 7201find_user_signal_name (int sig)
23479b40
YM
7202{
7203 struct user_signal_info *p;
7204
7205 for (p = user_signals; p; p = p->next)
7206 if (p->sig == sig)
7207 return p->name;
7208
7209 return NULL;
7210}
7211
7212static int
d3da34e0 7213store_user_signal_events (void)
23479b40
YM
7214{
7215 struct user_signal_info *p;
7216 struct input_event buf;
7217 int nstored = 0;
7218
7219 for (p = user_signals; p; p = p->next)
7220 if (p->npending > 0)
7221 {
7222 SIGMASKTYPE mask;
7223
7224 if (nstored == 0)
7225 {
72af86bd 7226 memset (&buf, 0, sizeof buf);
23479b40
YM
7227 buf.kind = USER_SIGNAL_EVENT;
7228 buf.frame_or_window = selected_frame;
7229 }
7230 nstored += p->npending;
7231
7232 mask = sigblock (sigmask (p->sig));
7233 do
7234 {
23479b40
YM
7235 buf.code = p->sig;
7236 kbd_buffer_store_event (&buf);
7237 p->npending--;
7238 }
7239 while (p->npending > 0);
7240 sigsetmask (mask);
7241 }
7242
7243 return nstored;
7244}
7245
7246\f
f57e2426 7247static void menu_bar_item (Lisp_Object, Lisp_Object, Lisp_Object, void*);
318ab85c 7248static Lisp_Object menu_bar_one_keymap_changed_items;
b7c49376
RS
7249
7250/* These variables hold the vector under construction within
7251 menu_bar_items and its subroutines, and the current index
7252 for storing into that vector. */
7253static Lisp_Object menu_bar_items_vector;
9343ab07 7254static int menu_bar_items_index;
5ec75a55 7255
4039c786
CY
7256
7257static const char* separator_names[] = {
7258 "space",
7259 "no-line",
7260 "single-line",
7261 "double-line",
7262 "single-dashed-line",
7263 "double-dashed-line",
7264 "shadow-etched-in",
7265 "shadow-etched-out",
7266 "shadow-etched-in-dash",
7267 "shadow-etched-out-dash",
7268 "shadow-double-etched-in",
7269 "shadow-double-etched-out",
7270 "shadow-double-etched-in-dash",
7271 "shadow-double-etched-out-dash",
7272 0,
7273};
7274
7275/* Return non-zero if LABEL specifies a separator. */
7276
7277int
7278menu_separator_name_p (const char *label)
7279{
7280 if (!label)
7281 return 0;
7282 else if (strlen (label) > 3
7283 && strncmp (label, "--", 2) == 0
7284 && label[2] != '-')
7285 {
7286 int i;
7287 label += 2;
7288 for (i = 0; separator_names[i]; ++i)
7289 if (strcmp (label, separator_names[i]) == 0)
7290 return 1;
7291 }
7292 else
7293 {
7294 /* It's a separator if it contains only dashes. */
7295 while (*label == '-')
7296 ++label;
7297 return (*label == 0);
7298 }
7299
7300 return 0;
7301}
7302
7303
b7c49376
RS
7304/* Return a vector of menu items for a menu bar, appropriate
7305 to the current buffer. Each item has three elements in the vector:
f5e09c8b 7306 KEY STRING MAPLIST.
b7c49376
RS
7307
7308 OLD is an old vector we can optionally reuse, or nil. */
5ec75a55
RS
7309
7310Lisp_Object
d3da34e0 7311menu_bar_items (Lisp_Object old)
5ec75a55
RS
7312{
7313 /* The number of keymaps we're scanning right now, and the number of
7314 keymaps we have allocated space for. */
7315 int nmaps;
7316
7317 /* maps[0..nmaps-1] are the prefix definitions of KEYBUF[0..t-1]
7318 in the current keymaps, or nil where it is not a prefix. */
7319 Lisp_Object *maps;
7320
aebfea68 7321 Lisp_Object def, tail;
5ec75a55
RS
7322
7323 Lisp_Object result;
7324
7325 int mapno;
47d319aa 7326 Lisp_Object oquit;
5ec75a55 7327
b7c49376
RS
7328 int i;
7329
db60d856
JB
7330 /* In order to build the menus, we need to call the keymap
7331 accessors. They all call QUIT. But this function is called
7332 during redisplay, during which a quit is fatal. So inhibit
47d319aa
RS
7333 quitting while building the menus.
7334 We do this instead of specbind because (1) errors will clear it anyway
7335 and (2) this avoids risk of specpdl overflow. */
7336 oquit = Vinhibit_quit;
df0f2ba1 7337 Vinhibit_quit = Qt;
db60d856 7338
b7c49376
RS
7339 if (!NILP (old))
7340 menu_bar_items_vector = old;
7341 else
7342 menu_bar_items_vector = Fmake_vector (make_number (24), Qnil);
7343 menu_bar_items_index = 0;
7344
5ec75a55
RS
7345 /* Build our list of keymaps.
7346 If we recognize a function key and replace its escape sequence in
7347 keybuf with its symbol, or if the sequence starts with a mouse
7348 click and we need to switch buffers, we jump back here to rebuild
7349 the initial keymaps from the current buffer. */
df0f2ba1 7350 {
5ec75a55
RS
7351 Lisp_Object *tmaps;
7352
217258d5 7353 /* Should overriding-terminal-local-map and overriding-local-map apply? */
d0a49716 7354 if (!NILP (Voverriding_local_map_menu_flag))
9dd3131c 7355 {
217258d5
KH
7356 /* Yes, use them (if non-nil) as well as the global map. */
7357 maps = (Lisp_Object *) alloca (3 * sizeof (maps[0]));
7358 nmaps = 0;
7359 if (!NILP (current_kboard->Voverriding_terminal_local_map))
7360 maps[nmaps++] = current_kboard->Voverriding_terminal_local_map;
7361 if (!NILP (Voverriding_local_map))
7362 maps[nmaps++] = Voverriding_local_map;
9dd3131c
RS
7363 }
7364 else
7365 {
fd646341
KS
7366 /* No, so use major and minor mode keymaps and keymap property.
7367 Note that menu-bar bindings in the local-map and keymap
7368 properties may not work reliable, as they are only
7369 recognized when the menu-bar (or mode-line) is updated,
7370 which does not normally happen after every command. */
7371 Lisp_Object tem;
7372 int nminor;
7373 nminor = current_minor_maps (NULL, &tmaps);
7374 maps = (Lisp_Object *) alloca ((nminor + 3) * sizeof (maps[0]));
7375 nmaps = 0;
7376 if (tem = get_local_map (PT, current_buffer, Qkeymap), !NILP (tem))
7377 maps[nmaps++] = tem;
72af86bd 7378 memcpy (maps + nmaps, tmaps, nminor * sizeof (maps[0]));
fd646341
KS
7379 nmaps += nminor;
7380 maps[nmaps++] = get_local_map (PT, current_buffer, Qlocal_map);
9dd3131c 7381 }
217258d5 7382 maps[nmaps++] = current_global_map;
5ec75a55
RS
7383 }
7384
7385 /* Look up in each map the dummy prefix key `menu-bar'. */
7386
7387 result = Qnil;
7388
e58aa385 7389 for (mapno = nmaps - 1; mapno >= 0; mapno--)
25126faa
GM
7390 if (!NILP (maps[mapno]))
7391 {
341a09cf
SM
7392 def = get_keymap (access_keymap (maps[mapno], Qmenu_bar, 1, 0, 1),
7393 0, 1);
02067692 7394 if (CONSP (def))
4216b545
SM
7395 {
7396 menu_bar_one_keymap_changed_items = Qnil;
7397 map_keymap (def, menu_bar_item, Qnil, NULL, 1);
7398 }
25126faa 7399 }
5ec75a55 7400
b7c49376
RS
7401 /* Move to the end those items that should be at the end. */
7402
7539e11f 7403 for (tail = Vmenu_bar_final_items; CONSP (tail); tail = XCDR (tail))
9f9c0e27 7404 {
b7c49376
RS
7405 int i;
7406 int end = menu_bar_items_index;
7407
35b3402f 7408 for (i = 0; i < end; i += 4)
7539e11f 7409 if (EQ (XCAR (tail), XVECTOR (menu_bar_items_vector)->contents[i]))
b7c49376 7410 {
35b3402f 7411 Lisp_Object tem0, tem1, tem2, tem3;
0301268e
RS
7412 /* Move the item at index I to the end,
7413 shifting all the others forward. */
7414 tem0 = XVECTOR (menu_bar_items_vector)->contents[i + 0];
7415 tem1 = XVECTOR (menu_bar_items_vector)->contents[i + 1];
7416 tem2 = XVECTOR (menu_bar_items_vector)->contents[i + 2];
35b3402f
RS
7417 tem3 = XVECTOR (menu_bar_items_vector)->contents[i + 3];
7418 if (end > i + 4)
72af86bd
AS
7419 memmove (&XVECTOR (menu_bar_items_vector)->contents[i],
7420 &XVECTOR (menu_bar_items_vector)->contents[i + 4],
7421 (end - i - 4) * sizeof (Lisp_Object));
35b3402f
RS
7422 XVECTOR (menu_bar_items_vector)->contents[end - 4] = tem0;
7423 XVECTOR (menu_bar_items_vector)->contents[end - 3] = tem1;
7424 XVECTOR (menu_bar_items_vector)->contents[end - 2] = tem2;
7425 XVECTOR (menu_bar_items_vector)->contents[end - 1] = tem3;
0301268e 7426 break;
b7c49376
RS
7427 }
7428 }
9f9c0e27 7429
0c9071cd 7430 /* Add nil, nil, nil, nil at the end. */
b7c49376 7431 i = menu_bar_items_index;
35b3402f 7432 if (i + 4 > XVECTOR (menu_bar_items_vector)->size)
6bf377e2 7433 menu_bar_items_vector = larger_vector (menu_bar_items_vector, 2 * i, Qnil);
b7c49376
RS
7434 /* Add this item. */
7435 XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
7436 XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
7437 XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
35b3402f 7438 XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
b7c49376 7439 menu_bar_items_index = i;
a73c5e29 7440
47d319aa 7441 Vinhibit_quit = oquit;
b7c49376 7442 return menu_bar_items_vector;
5ec75a55
RS
7443}
7444\f
f5e09c8b
RS
7445/* Add one item to menu_bar_items_vector, for KEY, ITEM_STRING and DEF.
7446 If there's already an item for KEY, add this DEF to it. */
7447
e8886a1d
RS
7448Lisp_Object item_properties;
7449
b7c49376 7450static void
d3da34e0 7451menu_bar_item (Lisp_Object key, Lisp_Object item, Lisp_Object dummy1, void *dummy2)
5ec75a55 7452{
e8886a1d 7453 struct gcpro gcpro1;
b7c49376 7454 int i;
759860a6 7455 Lisp_Object tem;
5ec75a55 7456
e8886a1d 7457 if (EQ (item, Qundefined))
e58aa385 7458 {
f5e09c8b 7459 /* If a map has an explicit `undefined' as definition,
e58aa385 7460 discard any previously made menu bar item. */
b7c49376 7461
35b3402f 7462 for (i = 0; i < menu_bar_items_index; i += 4)
b7c49376
RS
7463 if (EQ (key, XVECTOR (menu_bar_items_vector)->contents[i]))
7464 {
35b3402f 7465 if (menu_bar_items_index > i + 4)
72af86bd
AS
7466 memmove (&XVECTOR (menu_bar_items_vector)->contents[i],
7467 &XVECTOR (menu_bar_items_vector)->contents[i + 4],
7468 (menu_bar_items_index - i - 4) * sizeof (Lisp_Object));
35b3402f 7469 menu_bar_items_index -= 4;
b7c49376 7470 }
e58aa385
RS
7471 }
7472
759860a6
RS
7473 /* If this keymap has already contributed to this KEY,
7474 don't contribute to it a second time. */
7475 tem = Fmemq (key, menu_bar_one_keymap_changed_items);
9cd2ced7 7476 if (!NILP (tem) || NILP (item))
759860a6
RS
7477 return;
7478
7479 menu_bar_one_keymap_changed_items
7480 = Fcons (key, menu_bar_one_keymap_changed_items);
7481
9cd2ced7
SM
7482 /* We add to menu_bar_one_keymap_changed_items before doing the
7483 parse_menu_item, so that if it turns out it wasn't a menu item,
7484 it still correctly hides any further menu item. */
7485 GCPRO1 (key);
ef7417fd 7486 i = parse_menu_item (item, 1);
9cd2ced7
SM
7487 UNGCPRO;
7488 if (!i)
7489 return;
7490
e8886a1d
RS
7491 item = XVECTOR (item_properties)->contents[ITEM_PROPERTY_DEF];
7492
f5e09c8b 7493 /* Find any existing item for this KEY. */
35b3402f 7494 for (i = 0; i < menu_bar_items_index; i += 4)
b7c49376
RS
7495 if (EQ (key, XVECTOR (menu_bar_items_vector)->contents[i]))
7496 break;
7497
f5e09c8b 7498 /* If we did not find this KEY, add it at the end. */
b7c49376
RS
7499 if (i == menu_bar_items_index)
7500 {
7501 /* If vector is too small, get a bigger one. */
35b3402f 7502 if (i + 4 > XVECTOR (menu_bar_items_vector)->size)
6bf377e2 7503 menu_bar_items_vector = larger_vector (menu_bar_items_vector, 2 * i, Qnil);
b7c49376
RS
7504 /* Add this item. */
7505 XVECTOR (menu_bar_items_vector)->contents[i++] = key;
e8886a1d
RS
7506 XVECTOR (menu_bar_items_vector)->contents[i++]
7507 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME];
7508 XVECTOR (menu_bar_items_vector)->contents[i++] = Fcons (item, Qnil);
35b3402f 7509 XVECTOR (menu_bar_items_vector)->contents[i++] = make_number (0);
b7c49376
RS
7510 menu_bar_items_index = i;
7511 }
e8886a1d 7512 /* We did find an item for this KEY. Add ITEM to its list of maps. */
f5e09c8b
RS
7513 else
7514 {
7515 Lisp_Object old;
7516 old = XVECTOR (menu_bar_items_vector)->contents[i + 2];
4216b545
SM
7517 /* If the new and the old items are not both keymaps,
7518 the lookup will only find `item'. */
7519 item = Fcons (item, KEYMAPP (item) && KEYMAPP (XCAR (old)) ? old : Qnil);
7520 XVECTOR (menu_bar_items_vector)->contents[i + 2] = item;
f5e09c8b 7521 }
5ec75a55
RS
7522}
7523\f
e8886a1d
RS
7524 /* This is used as the handler when calling menu_item_eval_property. */
7525static Lisp_Object
d3da34e0 7526menu_item_eval_property_1 (Lisp_Object arg)
e8886a1d
RS
7527{
7528 /* If we got a quit from within the menu computation,
7529 quit all the way out of it. This takes care of C-] in the debugger. */
7539e11f 7530 if (CONSP (arg) && EQ (XCAR (arg), Qquit))
e8886a1d
RS
7531 Fsignal (Qquit, Qnil);
7532
7533 return Qnil;
7534}
7535
c60ee5e7 7536/* Evaluate an expression and return the result (or nil if something
e8886a1d 7537 went wrong). Used to evaluate dynamic parts of menu items. */
7ee32cda 7538Lisp_Object
d3da34e0 7539menu_item_eval_property (Lisp_Object sexpr)
e8886a1d 7540{
aed13378 7541 int count = SPECPDL_INDEX ();
e8886a1d 7542 Lisp_Object val;
44e553a3 7543 specbind (Qinhibit_redisplay, Qt);
e8886a1d
RS
7544 val = internal_condition_case_1 (Feval, sexpr, Qerror,
7545 menu_item_eval_property_1);
44e553a3 7546 return unbind_to (count, val);
e8886a1d
RS
7547}
7548
7549/* This function parses a menu item and leaves the result in the
7550 vector item_properties.
7551 ITEM is a key binding, a possible menu item.
fd3613d7 7552 INMENUBAR is > 0 when this is considered for an entry in a menu bar
e8886a1d 7553 top level.
fd3613d7 7554 INMENUBAR is < 0 when this is considered for an entry in a keyboard menu.
e8886a1d
RS
7555 parse_menu_item returns true if the item is a menu item and false
7556 otherwise. */
7557
7558int
d3da34e0 7559parse_menu_item (Lisp_Object item, int inmenubar)
e8886a1d 7560{
adc1d5c8 7561 Lisp_Object def, tem, item_string, start;
07ba902e
RS
7562 Lisp_Object filter;
7563 Lisp_Object keyhint;
e8886a1d 7564 int i;
74c1de23 7565
07ba902e
RS
7566 filter = Qnil;
7567 keyhint = Qnil;
7568
e8886a1d
RS
7569 if (!CONSP (item))
7570 return 0;
7571
e8886a1d
RS
7572 /* Create item_properties vector if necessary. */
7573 if (NILP (item_properties))
7574 item_properties
7575 = Fmake_vector (make_number (ITEM_PROPERTY_ENABLE + 1), Qnil);
7576
7577 /* Initialize optional entries. */
7578 for (i = ITEM_PROPERTY_DEF; i < ITEM_PROPERTY_ENABLE; i++)
b1ebcadb
SM
7579 ASET (item_properties, i, Qnil);
7580 ASET (item_properties, ITEM_PROPERTY_ENABLE, Qt);
c60ee5e7 7581
e8886a1d 7582 /* Save the item here to protect it from GC. */
b1ebcadb 7583 ASET (item_properties, ITEM_PROPERTY_ITEM, item);
e8886a1d 7584
7539e11f 7585 item_string = XCAR (item);
e8886a1d
RS
7586
7587 start = item;
7539e11f 7588 item = XCDR (item);
e8886a1d
RS
7589 if (STRINGP (item_string))
7590 {
7591 /* Old format menu item. */
b1ebcadb 7592 ASET (item_properties, ITEM_PROPERTY_NAME, item_string);
e8886a1d
RS
7593
7594 /* Maybe help string. */
7539e11f 7595 if (CONSP (item) && STRINGP (XCAR (item)))
e8886a1d 7596 {
b1ebcadb 7597 ASET (item_properties, ITEM_PROPERTY_HELP, XCAR (item));
e8886a1d 7598 start = item;
7539e11f 7599 item = XCDR (item);
e8886a1d 7600 }
c60ee5e7 7601
50d4ba39 7602 /* Maybe an obsolete key binding cache. */
7539e11f
KR
7603 if (CONSP (item) && CONSP (XCAR (item))
7604 && (NILP (XCAR (XCAR (item)))
7605 || VECTORP (XCAR (XCAR (item)))))
50d4ba39 7606 item = XCDR (item);
c60ee5e7 7607
e8886a1d 7608 /* This is the real definition--the function to run. */
b1ebcadb 7609 ASET (item_properties, ITEM_PROPERTY_DEF, item);
e8886a1d
RS
7610
7611 /* Get enable property, if any. */
7612 if (SYMBOLP (item))
7613 {
7614 tem = Fget (item, Qmenu_enable);
9d56e0da 7615 if (!NILP (Venable_disabled_menus_and_buttons))
b1ebcadb 7616 ASET (item_properties, ITEM_PROPERTY_ENABLE, Qt);
9d56e0da 7617 else if (!NILP (tem))
b1ebcadb 7618 ASET (item_properties, ITEM_PROPERTY_ENABLE, tem);
e8886a1d
RS
7619 }
7620 }
7621 else if (EQ (item_string, Qmenu_item) && CONSP (item))
7622 {
7623 /* New format menu item. */
b1ebcadb 7624 ASET (item_properties, ITEM_PROPERTY_NAME, XCAR (item));
7539e11f 7625 start = XCDR (item);
e8886a1d
RS
7626 if (CONSP (start))
7627 {
7628 /* We have a real binding. */
b1ebcadb 7629 ASET (item_properties, ITEM_PROPERTY_DEF, XCAR (start));
e8886a1d 7630
7539e11f 7631 item = XCDR (start);
50d4ba39 7632 /* Is there an obsolete cache list with key equivalences. */
7539e11f 7633 if (CONSP (item) && CONSP (XCAR (item)))
50d4ba39 7634 item = XCDR (item);
e8886a1d
RS
7635
7636 /* Parse properties. */
7539e11f 7637 while (CONSP (item) && CONSP (XCDR (item)))
e8886a1d 7638 {
7539e11f
KR
7639 tem = XCAR (item);
7640 item = XCDR (item);
e8886a1d
RS
7641
7642 if (EQ (tem, QCenable))
9d56e0da
EZ
7643 {
7644 if (!NILP (Venable_disabled_menus_and_buttons))
b1ebcadb 7645 ASET (item_properties, ITEM_PROPERTY_ENABLE, Qt);
9d56e0da 7646 else
b1ebcadb 7647 ASET (item_properties, ITEM_PROPERTY_ENABLE, XCAR (item));
9d56e0da 7648 }
ef7417fd 7649 else if (EQ (tem, QCvisible))
e8886a1d
RS
7650 {
7651 /* If got a visible property and that evaluates to nil
7652 then ignore this item. */
7539e11f 7653 tem = menu_item_eval_property (XCAR (item));
e8886a1d 7654 if (NILP (tem))
adc1d5c8 7655 return 0;
e8886a1d
RS
7656 }
7657 else if (EQ (tem, QChelp))
b1ebcadb 7658 ASET (item_properties, ITEM_PROPERTY_HELP, XCAR (item));
e8886a1d 7659 else if (EQ (tem, QCfilter))
74c1de23
RS
7660 filter = item;
7661 else if (EQ (tem, QCkey_sequence))
7662 {
7539e11f 7663 tem = XCAR (item);
50d4ba39 7664 if (SYMBOLP (tem) || STRINGP (tem) || VECTORP (tem))
74c1de23
RS
7665 /* Be GC protected. Set keyhint to item instead of tem. */
7666 keyhint = item;
7667 }
7668 else if (EQ (tem, QCkeys))
7669 {
7539e11f 7670 tem = XCAR (item);
50d4ba39 7671 if (CONSP (tem) || STRINGP (tem))
b1ebcadb 7672 ASET (item_properties, ITEM_PROPERTY_KEYEQ, tem);
74c1de23 7673 }
7539e11f 7674 else if (EQ (tem, QCbutton) && CONSP (XCAR (item)))
e8886a1d 7675 {
74c1de23 7676 Lisp_Object type;
7539e11f
KR
7677 tem = XCAR (item);
7678 type = XCAR (tem);
e8886a1d
RS
7679 if (EQ (type, QCtoggle) || EQ (type, QCradio))
7680 {
b1ebcadb
SM
7681 ASET (item_properties, ITEM_PROPERTY_SELECTED,
7682 XCDR (tem));
7683 ASET (item_properties, ITEM_PROPERTY_TYPE, type);
e8886a1d
RS
7684 }
7685 }
7539e11f 7686 item = XCDR (item);
e8886a1d
RS
7687 }
7688 }
7689 else if (inmenubar || !NILP (start))
adc1d5c8 7690 return 0;
e8886a1d
RS
7691 }
7692 else
adc1d5c8 7693 return 0; /* not a menu item */
e8886a1d
RS
7694
7695 /* If item string is not a string, evaluate it to get string.
7696 If we don't get a string, skip this item. */
3626fb1a 7697 item_string = AREF (item_properties, ITEM_PROPERTY_NAME);
ef7417fd 7698 if (!(STRINGP (item_string)))
e8886a1d
RS
7699 {
7700 item_string = menu_item_eval_property (item_string);
7701 if (!STRINGP (item_string))
adc1d5c8 7702 return 0;
b1ebcadb 7703 ASET (item_properties, ITEM_PROPERTY_NAME, item_string);
e8886a1d 7704 }
c60ee5e7 7705
e8886a1d 7706 /* If got a filter apply it on definition. */
3626fb1a 7707 def = AREF (item_properties, ITEM_PROPERTY_DEF);
e8886a1d
RS
7708 if (!NILP (filter))
7709 {
7539e11f 7710 def = menu_item_eval_property (list2 (XCAR (filter),
c5c5a6f8
RS
7711 list2 (Qquote, def)));
7712
b1ebcadb 7713 ASET (item_properties, ITEM_PROPERTY_DEF, def);
e8886a1d
RS
7714 }
7715
e8886a1d 7716 /* Enable or disable selection of item. */
3626fb1a 7717 tem = AREF (item_properties, ITEM_PROPERTY_ENABLE);
e8886a1d
RS
7718 if (!EQ (tem, Qt))
7719 {
ef7417fd 7720 tem = menu_item_eval_property (tem);
e8886a1d 7721 if (inmenubar && NILP (tem))
adc1d5c8 7722 return 0; /* Ignore disabled items in menu bar. */
b1ebcadb 7723 ASET (item_properties, ITEM_PROPERTY_ENABLE, tem);
e8886a1d
RS
7724 }
7725
7189cad8
SM
7726 /* If we got no definition, this item is just unselectable text which
7727 is OK in a submenu but not in the menubar. */
7728 if (NILP (def))
7729 return (inmenubar ? 0 : 1);
c60ee5e7 7730
e8886a1d 7731 /* See if this is a separate pane or a submenu. */
3626fb1a 7732 def = AREF (item_properties, ITEM_PROPERTY_DEF);
02067692 7733 tem = get_keymap (def, 0, 1);
9ac425d1 7734 /* For a subkeymap, just record its details and exit. */
02067692 7735 if (CONSP (tem))
e8886a1d 7736 {
b1ebcadb
SM
7737 ASET (item_properties, ITEM_PROPERTY_MAP, tem);
7738 ASET (item_properties, ITEM_PROPERTY_DEF, tem);
e8886a1d
RS
7739 return 1;
7740 }
c60ee5e7 7741
9ac425d1
RS
7742 /* At the top level in the menu bar, do likewise for commands also.
7743 The menu bar does not display equivalent key bindings anyway.
7744 ITEM_PROPERTY_DEF is already set up properly. */
7745 if (inmenubar > 0)
7746 return 1;
e8886a1d 7747
424d6179
SM
7748 { /* This is a command. See if there is an equivalent key binding. */
7749 Lisp_Object keyeq = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
74c1de23 7750
424d6179
SM
7751 /* The previous code preferred :key-sequence to :keys, so we
7752 preserve this behavior. */
7753 if (STRINGP (keyeq) && !CONSP (keyhint))
71fe378d 7754 keyeq = concat2 (build_string (" "), Fsubstitute_command_keys (keyeq));
424d6179
SM
7755 else
7756 {
7757 Lisp_Object prefix = keyeq;
7758 Lisp_Object keys = Qnil;
7759
7760 if (CONSP (prefix))
7761 {
7762 def = XCAR (prefix);
7763 prefix = XCDR (prefix);
7764 }
7765 else
7766 def = AREF (item_properties, ITEM_PROPERTY_DEF);
7767
7768 if (CONSP (keyhint) && !NILP (XCAR (keyhint)))
7769 {
7770 keys = XCAR (keyhint);
7771 tem = Fkey_binding (keys, Qnil, Qnil, Qnil);
7772
7773 /* We have a suggested key. Is it bound to the command? */
7774 if (NILP (tem)
7775 || (!EQ (tem, def)
7776 /* If the command is an alias for another
7777 (such as lmenu.el set it up), check if the
7778 original command matches the cached command. */
7779 && !(SYMBOLP (def) && EQ (tem, XSYMBOL (def)->function))))
7780 keys = Qnil;
7781 }
b25399ac 7782
424d6179
SM
7783 if (NILP (keys))
7784 keys = Fwhere_is_internal (def, Qnil, Qt, Qnil, Qnil);
b25399ac 7785
424d6179
SM
7786 if (!NILP (keys))
7787 {
7788 tem = Fkey_description (keys, Qnil);
7789 if (CONSP (prefix))
7790 {
7791 if (STRINGP (XCAR (prefix)))
7792 tem = concat2 (XCAR (prefix), tem);
7793 if (STRINGP (XCDR (prefix)))
7794 tem = concat2 (tem, XCDR (prefix));
7795 }
7796 keyeq = concat2 (build_string (" "), tem);
7797 /* keyeq = concat3(build_string(" ("),tem,build_string(")")); */
7798 }
7799 else
7800 keyeq = Qnil;
7801 }
e8886a1d 7802
424d6179
SM
7803 /* If we have an equivalent key binding, use that. */
7804 ASET (item_properties, ITEM_PROPERTY_KEYEQ, keyeq);
b25399ac 7805 }
adc1d5c8
RS
7806
7807 /* Include this when menu help is implemented.
7808 tem = XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP];
7809 if (!(NILP (tem) || STRINGP (tem)))
7810 {
7811 tem = menu_item_eval_property (tem);
7812 if (!STRINGP (tem))
7813 tem = Qnil;
7814 XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP] = tem;
7815 }
e8886a1d
RS
7816 */
7817
c60ee5e7 7818 /* Handle radio buttons or toggle boxes. */
3626fb1a 7819 tem = AREF (item_properties, ITEM_PROPERTY_SELECTED);
e8886a1d 7820 if (!NILP (tem))
b1ebcadb
SM
7821 ASET (item_properties, ITEM_PROPERTY_SELECTED,
7822 menu_item_eval_property (tem));
e8886a1d 7823
e8886a1d
RS
7824 return 1;
7825}
7ee32cda
GM
7826
7827
7828\f
7829/***********************************************************************
7830 Tool-bars
7831 ***********************************************************************/
7832
9ea173e8 7833/* A vector holding tool bar items while they are parsed in function
27fd22dc 7834 tool_bar_items. Each item occupies TOOL_BAR_ITEM_NSCLOTS elements
9ea173e8 7835 in the vector. */
7ee32cda 7836
9ea173e8 7837static Lisp_Object tool_bar_items_vector;
7ee32cda 7838
9ea173e8
GM
7839/* A vector holding the result of parse_tool_bar_item. Layout is like
7840 the one for a single item in tool_bar_items_vector. */
7ee32cda 7841
9ea173e8 7842static Lisp_Object tool_bar_item_properties;
7ee32cda 7843
9ea173e8 7844/* Next free index in tool_bar_items_vector. */
7ee32cda 7845
9ea173e8 7846static int ntool_bar_items;
7ee32cda 7847
04bab72c 7848/* The symbols `:image' and `:rtl'. */
7ee32cda 7849
7ee32cda 7850Lisp_Object QCimage;
cf0590c4 7851Lisp_Object Qrtl;
7ee32cda
GM
7852
7853/* Function prototypes. */
7854
f57e2426
J
7855static void init_tool_bar_items (Lisp_Object);
7856static void process_tool_bar_item (Lisp_Object, Lisp_Object, Lisp_Object, void*);
7857static int parse_tool_bar_item (Lisp_Object, Lisp_Object);
7858static void append_tool_bar_item (void);
7ee32cda
GM
7859
7860
9ea173e8 7861/* Return a vector of tool bar items for keymaps currently in effect.
7ee32cda 7862 Reuse vector REUSE if non-nil. Return in *NITEMS the number of
9ea173e8 7863 tool bar items found. */
7ee32cda
GM
7864
7865Lisp_Object
d3da34e0 7866tool_bar_items (Lisp_Object reuse, int *nitems)
7ee32cda
GM
7867{
7868 Lisp_Object *maps;
7869 int nmaps, i;
7870 Lisp_Object oquit;
7871 Lisp_Object *tmaps;
7ee32cda
GM
7872
7873 *nitems = 0;
7874
7875 /* In order to build the menus, we need to call the keymap
7876 accessors. They all call QUIT. But this function is called
7877 during redisplay, during which a quit is fatal. So inhibit
7878 quitting while building the menus. We do this instead of
7879 specbind because (1) errors will clear it anyway and (2) this
7880 avoids risk of specpdl overflow. */
7881 oquit = Vinhibit_quit;
7882 Vinhibit_quit = Qt;
c60ee5e7 7883
9ea173e8
GM
7884 /* Initialize tool_bar_items_vector and protect it from GC. */
7885 init_tool_bar_items (reuse);
7ee32cda
GM
7886
7887 /* Build list of keymaps in maps. Set nmaps to the number of maps
7888 to process. */
c60ee5e7 7889
7ee32cda
GM
7890 /* Should overriding-terminal-local-map and overriding-local-map apply? */
7891 if (!NILP (Voverriding_local_map_menu_flag))
7892 {
7893 /* Yes, use them (if non-nil) as well as the global map. */
7894 maps = (Lisp_Object *) alloca (3 * sizeof (maps[0]));
7895 nmaps = 0;
7896 if (!NILP (current_kboard->Voverriding_terminal_local_map))
7897 maps[nmaps++] = current_kboard->Voverriding_terminal_local_map;
7898 if (!NILP (Voverriding_local_map))
7899 maps[nmaps++] = Voverriding_local_map;
7900 }
7901 else
7902 {
fd646341
KS
7903 /* No, so use major and minor mode keymaps and keymap property.
7904 Note that tool-bar bindings in the local-map and keymap
7905 properties may not work reliable, as they are only
7906 recognized when the tool-bar (or mode-line) is updated,
7907 which does not normally happen after every command. */
7908 Lisp_Object tem;
7909 int nminor;
7910 nminor = current_minor_maps (NULL, &tmaps);
7911 maps = (Lisp_Object *) alloca ((nminor + 3) * sizeof (maps[0]));
7912 nmaps = 0;
7913 if (tem = get_local_map (PT, current_buffer, Qkeymap), !NILP (tem))
7914 maps[nmaps++] = tem;
72af86bd 7915 memcpy (maps + nmaps, tmaps, nminor * sizeof (maps[0]));
fd646341
KS
7916 nmaps += nminor;
7917 maps[nmaps++] = get_local_map (PT, current_buffer, Qlocal_map);
7ee32cda
GM
7918 }
7919
7920 /* Add global keymap at the end. */
7921 maps[nmaps++] = current_global_map;
7922
7923 /* Process maps in reverse order and look up in each map the prefix
9ea173e8 7924 key `tool-bar'. */
7ee32cda
GM
7925 for (i = nmaps - 1; i >= 0; --i)
7926 if (!NILP (maps[i]))
7927 {
7928 Lisp_Object keymap;
db785038 7929
341a09cf 7930 keymap = get_keymap (access_keymap (maps[i], Qtool_bar, 1, 0, 1), 0, 1);
02067692 7931 if (CONSP (keymap))
293bd733 7932 map_keymap (keymap, process_tool_bar_item, Qnil, NULL, 1);
7ee32cda
GM
7933 }
7934
7935 Vinhibit_quit = oquit;
9ea173e8
GM
7936 *nitems = ntool_bar_items / TOOL_BAR_ITEM_NSLOTS;
7937 return tool_bar_items_vector;
7ee32cda
GM
7938}
7939
7940
7941/* Process the definition of KEY which is DEF. */
7942
7943static void
d3da34e0 7944process_tool_bar_item (Lisp_Object key, Lisp_Object def, Lisp_Object data, void *args)
7ee32cda
GM
7945{
7946 int i;
7ee32cda
GM
7947 struct gcpro gcpro1, gcpro2;
7948
9ea173e8 7949 /* Protect KEY and DEF from GC because parse_tool_bar_item may call
7ee32cda
GM
7950 eval. */
7951 GCPRO2 (key, def);
7952
7953 if (EQ (def, Qundefined))
7954 {
7955 /* If a map has an explicit `undefined' as definition,
7956 discard any previously made item. */
9ea173e8 7957 for (i = 0; i < ntool_bar_items; i += TOOL_BAR_ITEM_NSLOTS)
7ee32cda 7958 {
9ea173e8 7959 Lisp_Object *v = XVECTOR (tool_bar_items_vector)->contents + i;
c60ee5e7 7960
9ea173e8 7961 if (EQ (key, v[TOOL_BAR_ITEM_KEY]))
7ee32cda 7962 {
9ea173e8 7963 if (ntool_bar_items > i + TOOL_BAR_ITEM_NSLOTS)
72af86bd
AS
7964 memmove (v, v + TOOL_BAR_ITEM_NSLOTS,
7965 ((ntool_bar_items - i - TOOL_BAR_ITEM_NSLOTS)
7966 * sizeof (Lisp_Object)));
9ea173e8 7967 ntool_bar_items -= TOOL_BAR_ITEM_NSLOTS;
7ee32cda
GM
7968 break;
7969 }
7970 }
7971 }
9ea173e8
GM
7972 else if (parse_tool_bar_item (key, def))
7973 /* Append a new tool bar item to tool_bar_items_vector. Accept
7ee32cda 7974 more than one definition for the same key. */
9ea173e8 7975 append_tool_bar_item ();
7ee32cda
GM
7976
7977 UNGCPRO;
7978}
7979
7980
9ea173e8
GM
7981/* Parse a tool bar item specification ITEM for key KEY and return the
7982 result in tool_bar_item_properties. Value is zero if ITEM is
7ee32cda
GM
7983 invalid.
7984
7985 ITEM is a list `(menu-item CAPTION BINDING PROPS...)'.
c60ee5e7 7986
7ee32cda
GM
7987 CAPTION is the caption of the item, If it's not a string, it is
7988 evaluated to get a string.
c60ee5e7 7989
9ea173e8 7990 BINDING is the tool bar item's binding. Tool-bar items with keymaps
7ee32cda
GM
7991 as binding are currently ignored.
7992
7993 The following properties are recognized:
7994
7995 - `:enable FORM'.
c60ee5e7 7996
9ea173e8
GM
7997 FORM is evaluated and specifies whether the tool bar item is
7998 enabled or disabled.
c60ee5e7 7999
7ee32cda 8000 - `:visible FORM'
c60ee5e7 8001
9ea173e8 8002 FORM is evaluated and specifies whether the tool bar item is visible.
c60ee5e7 8003
7ee32cda
GM
8004 - `:filter FUNCTION'
8005
8006 FUNCTION is invoked with one parameter `(quote BINDING)'. Its
8007 result is stored as the new binding.
c60ee5e7 8008
7ee32cda
GM
8009 - `:button (TYPE SELECTED)'
8010
8011 TYPE must be one of `:radio' or `:toggle'. SELECTED is evaluated
8012 and specifies whether the button is selected (pressed) or not.
c60ee5e7 8013
7ee32cda
GM
8014 - `:image IMAGES'
8015
8016 IMAGES is either a single image specification or a vector of four
9ea173e8 8017 image specifications. See enum tool_bar_item_images.
c60ee5e7 8018
7ee32cda 8019 - `:help HELP-STRING'.
c60ee5e7 8020
f904c0f9
JD
8021 Gives a help string to display for the tool bar item.
8022
8023 - `:label LABEL-STRING'.
8024
8025 A text label to show with the tool bar button if labels are enabled. */
7ee32cda
GM
8026
8027static int
d3da34e0 8028parse_tool_bar_item (Lisp_Object key, Lisp_Object item)
7ee32cda 8029{
9ea173e8
GM
8030 /* Access slot with index IDX of vector tool_bar_item_properties. */
8031#define PROP(IDX) XVECTOR (tool_bar_item_properties)->contents[IDX]
7ee32cda
GM
8032
8033 Lisp_Object filter = Qnil;
8034 Lisp_Object caption;
f904c0f9 8035 int i, have_label = 0;
7ee32cda 8036
8c907a56
GM
8037 /* Defininition looks like `(menu-item CAPTION BINDING PROPS...)'.
8038 Rule out items that aren't lists, don't start with
8039 `menu-item' or whose rest following `tool-bar-item' is not a
7ee32cda 8040 list. */
4039c786
CY
8041 if (!CONSP (item))
8042 return 0;
8043
8044 /* As an exception, allow old-style menu separators. */
8045 if (STRINGP (XCAR (item)))
8046 item = Fcons (XCAR (item), Qnil);
8047 else if (!EQ (XCAR (item), Qmenu_item)
8048 || (item = XCDR (item), !CONSP (item)))
7ee32cda
GM
8049 return 0;
8050
9ea173e8 8051 /* Create tool_bar_item_properties vector if necessary. Reset it to
7ee32cda 8052 defaults. */
9ea173e8 8053 if (VECTORP (tool_bar_item_properties))
7ee32cda 8054 {
9ea173e8 8055 for (i = 0; i < TOOL_BAR_ITEM_NSLOTS; ++i)
7ee32cda
GM
8056 PROP (i) = Qnil;
8057 }
8058 else
9ea173e8
GM
8059 tool_bar_item_properties
8060 = Fmake_vector (make_number (TOOL_BAR_ITEM_NSLOTS), Qnil);
c60ee5e7 8061
7ee32cda 8062 /* Set defaults. */
9ea173e8
GM
8063 PROP (TOOL_BAR_ITEM_KEY) = key;
8064 PROP (TOOL_BAR_ITEM_ENABLED_P) = Qt;
c60ee5e7 8065
7ee32cda
GM
8066 /* Get the caption of the item. If the caption is not a string,
8067 evaluate it to get a string. If we don't get a string, skip this
8068 item. */
8069 caption = XCAR (item);
8070 if (!STRINGP (caption))
8071 {
8072 caption = menu_item_eval_property (caption);
8073 if (!STRINGP (caption))
8074 return 0;
8075 }
9ea173e8 8076 PROP (TOOL_BAR_ITEM_CAPTION) = caption;
7ee32cda 8077
4039c786
CY
8078 /* If the rest following the caption is not a list, the menu item is
8079 either a separator, or invalid. */
7ee32cda
GM
8080 item = XCDR (item);
8081 if (!CONSP (item))
4039c786
CY
8082 {
8083 if (menu_separator_name_p (SDATA (caption)))
8084 {
8085 PROP (TOOL_BAR_ITEM_TYPE) = Qt;
94975270
CY
8086#if !defined (USE_GTK) && !defined (HAVE_NS)
8087 /* If we use build_desired_tool_bar_string to render the
8088 tool bar, the separator is rendered as an image. */
8089 PROP (TOOL_BAR_ITEM_IMAGES)
8090 = menu_item_eval_property (Vtool_bar_separator_image_expression);
8091 PROP (TOOL_BAR_ITEM_ENABLED_P) = Qnil;
8092 PROP (TOOL_BAR_ITEM_SELECTED_P) = Qnil;
8093 PROP (TOOL_BAR_ITEM_CAPTION) = Qnil;
8094#endif
4039c786
CY
8095 return 1;
8096 }
8097 return 0;
8098 }
7ee32cda
GM
8099
8100 /* Store the binding. */
9ea173e8 8101 PROP (TOOL_BAR_ITEM_BINDING) = XCAR (item);
7ee32cda
GM
8102 item = XCDR (item);
8103
8c907a56
GM
8104 /* Ignore cached key binding, if any. */
8105 if (CONSP (item) && CONSP (XCAR (item)))
8106 item = XCDR (item);
8107
7ee32cda
GM
8108 /* Process the rest of the properties. */
8109 for (; CONSP (item) && CONSP (XCDR (item)); item = XCDR (XCDR (item)))
8110 {
8111 Lisp_Object key, value;
8112
8113 key = XCAR (item);
8114 value = XCAR (XCDR (item));
8115
8116 if (EQ (key, QCenable))
9d56e0da
EZ
8117 {
8118 /* `:enable FORM'. */
8119 if (!NILP (Venable_disabled_menus_and_buttons))
8120 PROP (TOOL_BAR_ITEM_ENABLED_P) = Qt;
8121 else
8122 PROP (TOOL_BAR_ITEM_ENABLED_P) = value;
8123 }
7ee32cda
GM
8124 else if (EQ (key, QCvisible))
8125 {
8126 /* `:visible FORM'. If got a visible property and that
8127 evaluates to nil then ignore this item. */
8128 if (NILP (menu_item_eval_property (value)))
8129 return 0;
8130 }
4039c786 8131 else if (EQ (key, QChelp))
0005830c
J
8132 /* `:help HELP-STRING'. */
8133 PROP (TOOL_BAR_ITEM_HELP) = value;
4039c786 8134 else if (EQ (key, QCvert_only))
d2bd5189
JD
8135 /* `:vert-only t/nil'. */
8136 PROP (TOOL_BAR_ITEM_VERT_ONLY) = value;
f904c0f9
JD
8137 else if (EQ (key, QClabel))
8138 {
0005830c 8139 const char *bad_label = "!!?GARBLED ITEM?!!";
f904c0f9 8140 /* `:label LABEL-STRING'. */
e24ad6dd 8141 PROP (TOOL_BAR_ITEM_LABEL) = STRINGP (value)
0005830c
J
8142 ? value
8143 : make_string (bad_label, strlen (bad_label));
f904c0f9
JD
8144 have_label = 1;
8145 }
7ee32cda
GM
8146 else if (EQ (key, QCfilter))
8147 /* ':filter FORM'. */
8148 filter = value;
8149 else if (EQ (key, QCbutton) && CONSP (value))
8150 {
8151 /* `:button (TYPE . SELECTED)'. */
8152 Lisp_Object type, selected;
8153
8154 type = XCAR (value);
8155 selected = XCDR (value);
8156 if (EQ (type, QCtoggle) || EQ (type, QCradio))
8157 {
9ea173e8
GM
8158 PROP (TOOL_BAR_ITEM_SELECTED_P) = selected;
8159 PROP (TOOL_BAR_ITEM_TYPE) = type;
7ee32cda
GM
8160 }
8161 }
8162 else if (EQ (key, QCimage)
8163 && (CONSP (value)
8164 || (VECTORP (value) && XVECTOR (value)->size == 4)))
8165 /* Value is either a single image specification or a vector
27fd22dc 8166 of 4 such specifications for the different button states. */
9ea173e8 8167 PROP (TOOL_BAR_ITEM_IMAGES) = value;
cf0590c4
JD
8168 else if (EQ (key, Qrtl))
8169 /* ':rtl STRING' */
8170 PROP (TOOL_BAR_ITEM_RTL_IMAGE) = value;
7ee32cda
GM
8171 }
8172
f904c0f9
JD
8173
8174 if (!have_label)
8175 {
8176 /* Try to make one from caption and key. */
8177 Lisp_Object key = PROP (TOOL_BAR_ITEM_KEY);
8178 Lisp_Object capt = PROP (TOOL_BAR_ITEM_CAPTION);
51b59d79
PE
8179 const char *label = SYMBOLP (key) ? SSDATA (SYMBOL_NAME (key)) : "";
8180 const char *caption = STRINGP (capt) ? SSDATA (capt) : "";
603dfc72
AS
8181 EMACS_INT max_lbl = 2 * tool_bar_max_label_size;
8182 char *buf = (char *) xmalloc (max_lbl + 1);
f904c0f9 8183 Lisp_Object new_lbl;
603dfc72 8184 size_t caption_len = strlen (caption);
f904c0f9 8185
603dfc72 8186 if (caption_len <= max_lbl && caption[0] != '\0')
f904c0f9
JD
8187 {
8188 strcpy (buf, caption);
603dfc72
AS
8189 while (caption_len > 0 && buf[caption_len - 1] == '.')
8190 caption_len--;
8191 buf[caption_len] = '\0';
8192 label = caption = buf;
f904c0f9
JD
8193 }
8194
d3da34e0 8195 if (strlen (label) <= max_lbl && label[0] != '\0')
f904c0f9
JD
8196 {
8197 int i;
603dfc72
AS
8198 if (label != buf)
8199 strcpy (buf, label);
f904c0f9 8200
603dfc72
AS
8201 for (i = 0; buf[i] != '\0'; ++i)
8202 if (buf[i] == '-')
8203 buf[i] = ' ';
f904c0f9 8204 label = buf;
d3da34e0 8205
f904c0f9 8206 }
603dfc72
AS
8207 else
8208 label = "";
f904c0f9
JD
8209
8210 new_lbl = Fupcase_initials (make_string (label, strlen (label)));
8211 if (SCHARS (new_lbl) <= tool_bar_max_label_size)
8212 PROP (TOOL_BAR_ITEM_LABEL) = new_lbl;
c25ce9d0
J
8213 else
8214 PROP (TOOL_BAR_ITEM_LABEL) = make_string ("", 0);
8215 free (buf);
f904c0f9
JD
8216 }
8217
7ee32cda
GM
8218 /* If got a filter apply it on binding. */
8219 if (!NILP (filter))
9ea173e8 8220 PROP (TOOL_BAR_ITEM_BINDING)
7ee32cda
GM
8221 = menu_item_eval_property (list2 (filter,
8222 list2 (Qquote,
9ea173e8 8223 PROP (TOOL_BAR_ITEM_BINDING))));
7ee32cda
GM
8224
8225 /* See if the binding is a keymap. Give up if it is. */
02067692 8226 if (CONSP (get_keymap (PROP (TOOL_BAR_ITEM_BINDING), 0, 1)))
7ee32cda
GM
8227 return 0;
8228
8229 /* Enable or disable selection of item. */
9ea173e8
GM
8230 if (!EQ (PROP (TOOL_BAR_ITEM_ENABLED_P), Qt))
8231 PROP (TOOL_BAR_ITEM_ENABLED_P)
8232 = menu_item_eval_property (PROP (TOOL_BAR_ITEM_ENABLED_P));
7ee32cda 8233
c60ee5e7 8234 /* Handle radio buttons or toggle boxes. */
9ea173e8
GM
8235 if (!NILP (PROP (TOOL_BAR_ITEM_SELECTED_P)))
8236 PROP (TOOL_BAR_ITEM_SELECTED_P)
8237 = menu_item_eval_property (PROP (TOOL_BAR_ITEM_SELECTED_P));
7ee32cda
GM
8238
8239 return 1;
c60ee5e7 8240
7ee32cda
GM
8241#undef PROP
8242}
8243
8244
9ea173e8
GM
8245/* Initialize tool_bar_items_vector. REUSE, if non-nil, is a vector
8246 that can be reused. */
7ee32cda
GM
8247
8248static void
d3da34e0 8249init_tool_bar_items (Lisp_Object reuse)
7ee32cda
GM
8250{
8251 if (VECTORP (reuse))
9ea173e8 8252 tool_bar_items_vector = reuse;
7ee32cda 8253 else
9ea173e8
GM
8254 tool_bar_items_vector = Fmake_vector (make_number (64), Qnil);
8255 ntool_bar_items = 0;
7ee32cda
GM
8256}
8257
8258
9ea173e8
GM
8259/* Append parsed tool bar item properties from
8260 tool_bar_item_properties */
7ee32cda
GM
8261
8262static void
d3da34e0 8263append_tool_bar_item (void)
7ee32cda
GM
8264{
8265 Lisp_Object *to, *from;
c60ee5e7 8266
9ea173e8
GM
8267 /* Enlarge tool_bar_items_vector if necessary. */
8268 if (ntool_bar_items + TOOL_BAR_ITEM_NSLOTS
8269 >= XVECTOR (tool_bar_items_vector)->size)
219ccf1b
RS
8270 tool_bar_items_vector
8271 = larger_vector (tool_bar_items_vector,
8272 2 * XVECTOR (tool_bar_items_vector)->size, Qnil);
7ee32cda 8273
9ea173e8
GM
8274 /* Append entries from tool_bar_item_properties to the end of
8275 tool_bar_items_vector. */
8276 to = XVECTOR (tool_bar_items_vector)->contents + ntool_bar_items;
8277 from = XVECTOR (tool_bar_item_properties)->contents;
72af86bd 8278 memcpy (to, from, TOOL_BAR_ITEM_NSLOTS * sizeof *to);
9ea173e8 8279 ntool_bar_items += TOOL_BAR_ITEM_NSLOTS;
7ee32cda
GM
8280}
8281
8282
8283
8284
e8886a1d 8285\f
dcc408a0
RS
8286/* Read a character using menus based on maps in the array MAPS.
8287 NMAPS is the length of MAPS. Return nil if there are no menus in the maps.
8288 Return t if we displayed a menu but the user rejected it.
7d6de002
RS
8289
8290 PREV_EVENT is the previous input event, or nil if we are reading
8291 the first event of a key sequence.
8292
83d68044 8293 If USED_MOUSE_MENU is non-null, then we set *USED_MOUSE_MENU to 1
6569cc8d 8294 if we used a mouse menu to read the input, or zero otherwise. If
83d68044 8295 USED_MOUSE_MENU is null, we don't dereference it.
284f4730
JB
8296
8297 The prompting is done based on the prompt-string of the map
df0f2ba1 8298 and the strings associated with various map elements.
8150596a
RS
8299
8300 This can be done with X menus or with menus put in the minibuf.
8301 These are done in different ways, depending on how the input will be read.
8302 Menus using X are done after auto-saving in read-char, getting the input
8303 event from Fx_popup_menu; menus using the minibuf use read_char recursively
8304 and do auto-saving in the inner call of read_char. */
284f4730 8305
7617111f 8306static Lisp_Object
d3da34e0
JB
8307read_char_x_menu_prompt (int nmaps, Lisp_Object *maps, Lisp_Object prev_event,
8308 int *used_mouse_menu)
284f4730 8309{
7d6de002 8310 int mapno;
7d6de002 8311
6569cc8d
JB
8312 if (used_mouse_menu)
8313 *used_mouse_menu = 0;
284f4730
JB
8314
8315 /* Use local over global Menu maps */
8316
7d6de002
RS
8317 if (! menu_prompting)
8318 return Qnil;
8319
03361bcc
RS
8320 /* Optionally disregard all but the global map. */
8321 if (inhibit_local_menu_bar_menus)
8322 {
8323 maps += (nmaps - 1);
8324 nmaps = 1;
8325 }
8326
1f5b1641 8327#ifdef HAVE_MENUS
7d6de002
RS
8328 /* If we got to this point via a mouse click,
8329 use a real menu for mouse selection. */
5a8d99e0 8330 if (EVENT_HAS_PARAMETERS (prev_event)
7539e11f
KR
8331 && !EQ (XCAR (prev_event), Qmenu_bar)
8332 && !EQ (XCAR (prev_event), Qtool_bar))
7d6de002
RS
8333 {
8334 /* Display the menu and get the selection. */
8335 Lisp_Object *realmaps
8336 = (Lisp_Object *) alloca (nmaps * sizeof (Lisp_Object));
8337 Lisp_Object value;
8338 int nmaps1 = 0;
8339
8340 /* Use the maps that are not nil. */
8341 for (mapno = 0; mapno < nmaps; mapno++)
8342 if (!NILP (maps[mapno]))
8343 realmaps[nmaps1++] = maps[mapno];
8344
8345 value = Fx_popup_menu (prev_event, Flist (nmaps1, realmaps));
663258f2
JB
8346 if (CONSP (value))
8347 {
68f297c5
RS
8348 Lisp_Object tem;
8349
7539e11f 8350 record_menu_key (XCAR (value));
8eb4d8ef 8351
68f297c5
RS
8352 /* If we got multiple events, unread all but
8353 the first.
8354 There is no way to prevent those unread events
8355 from showing up later in last_nonmenu_event.
8356 So turn symbol and integer events into lists,
8357 to indicate that they came from a mouse menu,
8358 so that when present in last_nonmenu_event
8359 they won't confuse things. */
9beb8baa 8360 for (tem = XCDR (value); CONSP (tem); tem = XCDR (tem))
8eb4d8ef 8361 {
7539e11f
KR
8362 record_menu_key (XCAR (tem));
8363 if (SYMBOLP (XCAR (tem))
8364 || INTEGERP (XCAR (tem)))
f3fbd155 8365 XSETCAR (tem, Fcons (XCAR (tem), Qdisabled));
8eb4d8ef 8366 }
68f297c5 8367
663258f2
JB
8368 /* If we got more than one event, put all but the first
8369 onto this list to be read later.
8370 Return just the first event now. */
24597608 8371 Vunread_command_events
7539e11f
KR
8372 = nconc2 (XCDR (value), Vunread_command_events);
8373 value = XCAR (value);
663258f2 8374 }
1c90c381 8375 else if (NILP (value))
dcc408a0 8376 value = Qt;
6569cc8d
JB
8377 if (used_mouse_menu)
8378 *used_mouse_menu = 1;
7d6de002
RS
8379 return value;
8380 }
1f5b1641 8381#endif /* HAVE_MENUS */
8150596a
RS
8382 return Qnil ;
8383}
8384
af2b7cc9
KS
8385/* Buffer in use so far for the minibuf prompts for menu keymaps.
8386 We make this bigger when necessary, and never free it. */
8387static char *read_char_minibuf_menu_text;
8388/* Size of that buffer. */
8389static int read_char_minibuf_menu_width;
8390
8150596a 8391static Lisp_Object
d3da34e0 8392read_char_minibuf_menu_prompt (int commandflag, int nmaps, Lisp_Object *maps)
8150596a
RS
8393{
8394 int mapno;
8395 register Lisp_Object name;
af2b7cc9 8396 int nlength;
14e40288 8397 /* FIXME: Use the minibuffer's frame width. */
2cdbe73e 8398 int width = FRAME_COLS (SELECTED_FRAME ()) - 4;
8150596a 8399 int idx = -1;
af2b7cc9 8400 int nobindings = 1;
8150596a 8401 Lisp_Object rest, vector;
af2b7cc9 8402 char *menu;
8150596a 8403
8c907a56 8404 vector = Qnil;
7189cad8 8405 name = Qnil;
8c907a56 8406
8150596a
RS
8407 if (! menu_prompting)
8408 return Qnil;
8409
f6bb4883
CY
8410 /* Get the menu name from the first map that has one (a prompt string). */
8411 for (mapno = 0; mapno < nmaps; mapno++)
8412 {
8413 name = Fkeymap_prompt (maps[mapno]);
8414 if (!NILP (name))
8415 break;
8416 }
8417
8418 /* If we don't have any menus, just read a character normally. */
8419 if (!STRINGP (name))
8420 return Qnil;
8421
af2b7cc9 8422 /* Make sure we have a big enough buffer for the menu text. */
f6bb4883 8423 width = max (width, SBYTES (name));
af2b7cc9
KS
8424 if (read_char_minibuf_menu_text == 0)
8425 {
8426 read_char_minibuf_menu_width = width + 4;
8427 read_char_minibuf_menu_text = (char *) xmalloc (width + 4);
8428 }
8429 else if (width + 4 > read_char_minibuf_menu_width)
8430 {
8431 read_char_minibuf_menu_width = width + 4;
8432 read_char_minibuf_menu_text
8433 = (char *) xrealloc (read_char_minibuf_menu_text, width + 4);
8434 }
8435 menu = read_char_minibuf_menu_text;
8436
af2b7cc9 8437 /* Prompt string always starts with map's prompt, and a space. */
d5db4077
KR
8438 strcpy (menu, SDATA (name));
8439 nlength = SBYTES (name);
af2b7cc9
KS
8440 menu[nlength++] = ':';
8441 menu[nlength++] = ' ';
8442 menu[nlength] = 0;
8443
7d6de002
RS
8444 /* Start prompting at start of first map. */
8445 mapno = 0;
8446 rest = maps[mapno];
284f4730 8447
af2b7cc9
KS
8448 /* Present the documented bindings, a line at a time. */
8449 while (1)
284f4730 8450 {
af2b7cc9
KS
8451 int notfirst = 0;
8452 int i = nlength;
8453 Lisp_Object obj;
8454 int ch;
8455 Lisp_Object orig_defn_macro;
284f4730 8456
af2b7cc9
KS
8457 /* Loop over elements of map. */
8458 while (i < width)
284f4730 8459 {
af2b7cc9 8460 Lisp_Object elt;
284f4730 8461
af2b7cc9
KS
8462 /* If reached end of map, start at beginning of next map. */
8463 if (NILP (rest))
8464 {
8465 mapno++;
8466 /* At end of last map, wrap around to first map if just starting,
8467 or end this line if already have something on it. */
8468 if (mapno == nmaps)
8469 {
8470 mapno = 0;
8471 if (notfirst || nobindings) break;
8472 }
8473 rest = maps[mapno];
8474 }
7d6de002 8475
af2b7cc9
KS
8476 /* Look at the next element of the map. */
8477 if (idx >= 0)
8478 elt = XVECTOR (vector)->contents[idx];
8479 else
8480 elt = Fcar_safe (rest);
7d6de002 8481
af2b7cc9 8482 if (idx < 0 && VECTORP (elt))
284f4730 8483 {
af2b7cc9
KS
8484 /* If we found a dense table in the keymap,
8485 advanced past it, but start scanning its contents. */
8486 rest = Fcdr_safe (rest);
8487 vector = elt;
8488 idx = 0;
284f4730 8489 }
7d6de002
RS
8490 else
8491 {
af2b7cc9
KS
8492 /* An ordinary element. */
8493 Lisp_Object event, tem;
7d6de002 8494
af2b7cc9
KS
8495 if (idx < 0)
8496 {
8497 event = Fcar_safe (elt); /* alist */
8498 elt = Fcdr_safe (elt);
8499 }
8500 else
8501 {
8502 XSETINT (event, idx); /* vector */
8503 }
284f4730 8504
af2b7cc9 8505 /* Ignore the element if it has no prompt string. */
ef7417fd 8506 if (INTEGERP (event) && parse_menu_item (elt, -1))
af2b7cc9
KS
8507 {
8508 /* 1 if the char to type matches the string. */
8509 int char_matches;
8510 Lisp_Object upcased_event, downcased_event;
8511 Lisp_Object desc = Qnil;
8512 Lisp_Object s
8513 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME];
8514
8515 upcased_event = Fupcase (event);
8516 downcased_event = Fdowncase (event);
d5db4077
KR
8517 char_matches = (XINT (upcased_event) == SREF (s, 0)
8518 || XINT (downcased_event) == SREF (s, 0));
af2b7cc9
KS
8519 if (! char_matches)
8520 desc = Fsingle_key_description (event, Qnil);
8521
8522#if 0 /* It is redundant to list the equivalent key bindings because
8523 the prefix is what the user has already typed. */
8524 tem
8525 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_KEYEQ];
8526 if (!NILP (tem))
8527 /* Insert equivalent keybinding. */
8528 s = concat2 (s, tem);
8529#endif
8530 tem
8531 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE];
8532 if (EQ (tem, QCradio) || EQ (tem, QCtoggle))
8533 {
8534 /* Insert button prefix. */
8535 Lisp_Object selected
8536 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED];
8537 if (EQ (tem, QCradio))
8538 tem = build_string (NILP (selected) ? "(*) " : "( ) ");
8539 else
8540 tem = build_string (NILP (selected) ? "[X] " : "[ ] ");
8541 s = concat2 (tem, s);
8542 }
c60ee5e7 8543
af2b7cc9
KS
8544
8545 /* If we have room for the prompt string, add it to this line.
8546 If this is the first on the line, always add it. */
d5db4077
KR
8547 if ((SCHARS (s) + i + 2
8548 + (char_matches ? 0 : SCHARS (desc) + 3))
af2b7cc9
KS
8549 < width
8550 || !notfirst)
8551 {
8552 int thiswidth;
8553
8554 /* Punctuate between strings. */
8555 if (notfirst)
8556 {
8557 strcpy (menu + i, ", ");
8558 i += 2;
8559 }
8560 notfirst = 1;
8561 nobindings = 0 ;
8562
8563 /* If the char to type doesn't match the string's
8564 first char, explicitly show what char to type. */
8565 if (! char_matches)
8566 {
8567 /* Add as much of string as fits. */
d5db4077 8568 thiswidth = SCHARS (desc);
af2b7cc9
KS
8569 if (thiswidth + i > width)
8570 thiswidth = width - i;
72af86bd 8571 memcpy (menu + i, SDATA (desc), thiswidth);
af2b7cc9
KS
8572 i += thiswidth;
8573 strcpy (menu + i, " = ");
8574 i += 3;
8575 }
8576
8577 /* Add as much of string as fits. */
d5db4077 8578 thiswidth = SCHARS (s);
af2b7cc9
KS
8579 if (thiswidth + i > width)
8580 thiswidth = width - i;
72af86bd 8581 memcpy (menu + i, SDATA (s), thiswidth);
af2b7cc9
KS
8582 i += thiswidth;
8583 menu[i] = 0;
8584 }
8585 else
8586 {
8587 /* If this element does not fit, end the line now,
8588 and save the element for the next line. */
8589 strcpy (menu + i, "...");
8590 break;
8591 }
8592 }
8593
8594 /* Move past this element. */
8595 if (idx >= 0 && idx + 1 >= XVECTOR (vector)->size)
8596 /* Handle reaching end of dense table. */
8597 idx = -1;
8598 if (idx >= 0)
8599 idx++;
8600 else
8601 rest = Fcdr_safe (rest);
8602 }
325309f5 8603 }
8150596a 8604
af2b7cc9 8605 /* Prompt with that and read response. */
c60ee5e7 8606 message2_nolog (menu, strlen (menu),
af2b7cc9 8607 ! NILP (current_buffer->enable_multibyte_characters));
284f4730 8608
af2b7cc9
KS
8609 /* Make believe its not a keyboard macro in case the help char
8610 is pressed. Help characters are not recorded because menu prompting
8611 is not used on replay.
8612 */
8613 orig_defn_macro = current_kboard->defining_kbd_macro;
8614 current_kboard->defining_kbd_macro = Qnil;
8615 do
179f689c 8616 obj = read_char (commandflag, 0, 0, Qt, 0, NULL);
af2b7cc9
KS
8617 while (BUFFERP (obj));
8618 current_kboard->defining_kbd_macro = orig_defn_macro;
284f4730 8619
af2b7cc9
KS
8620 if (!INTEGERP (obj))
8621 return obj;
9688ff53
KL
8622 else if (XINT (obj) == -2)
8623 return obj;
af2b7cc9
KS
8624 else
8625 ch = XINT (obj);
8626
8627 if (! EQ (obj, menu_prompt_more_char)
8628 && (!INTEGERP (menu_prompt_more_char)
8629 || ! EQ (obj, make_number (Ctl (XINT (menu_prompt_more_char))))))
8630 {
8631 if (!NILP (current_kboard->defining_kbd_macro))
8632 store_kbd_macro_char (obj);
8633 return obj;
8634 }
8635 /* Help char - go round again */
8636 }
284f4730 8637}
284f4730
JB
8638\f
8639/* Reading key sequences. */
8640
8641/* Follow KEY in the maps in CURRENT[0..NMAPS-1], placing its bindings
8642 in DEFS[0..NMAPS-1]. Set NEXT[i] to DEFS[i] if DEFS[i] is a
8643 keymap, or nil otherwise. Return the index of the first keymap in
8644 which KEY has any binding, or NMAPS if no map has a binding.
8645
8646 If KEY is a meta ASCII character, treat it like meta-prefix-char
8647 followed by the corresponding non-meta character. Keymaps in
8648 CURRENT with non-prefix bindings for meta-prefix-char become nil in
8649 NEXT.
8650
88cb0656
JB
8651 If KEY has no bindings in any of the CURRENT maps, NEXT is left
8652 unmodified.
8653
569871d2 8654 NEXT may be the same array as CURRENT. */
284f4730
JB
8655
8656static int
d3da34e0
JB
8657follow_key (Lisp_Object key, int nmaps, Lisp_Object *current, Lisp_Object *defs,
8658 Lisp_Object *next)
284f4730
JB
8659{
8660 int i, first_binding;
8661
284f4730
JB
8662 first_binding = nmaps;
8663 for (i = nmaps - 1; i >= 0; i--)
8664 {
8665 if (! NILP (current[i]))
8666 {
fe5b94c5 8667 defs[i] = access_keymap (current[i], key, 1, 0, 1);
284f4730
JB
8668 if (! NILP (defs[i]))
8669 first_binding = i;
8670 }
8671 else
8672 defs[i] = Qnil;
8673 }
8674
284f4730 8675 /* Given the set of bindings we've found, produce the next set of maps. */
0a7f1fc0
JB
8676 if (first_binding < nmaps)
8677 for (i = 0; i < nmaps; i++)
02067692 8678 next[i] = NILP (defs[i]) ? Qnil : get_keymap (defs[i], 0, 1);
284f4730
JB
8679
8680 return first_binding;
8681}
8682
a7f26f28
SM
8683/* Structure used to keep track of partial application of key remapping
8684 such as Vfunction_key_map and Vkey_translation_map. */
8685typedef struct keyremap
8686{
c2028ac6
RS
8687 /* This is the map originally specified for this use. */
8688 Lisp_Object parent;
8689 /* This is a submap reached by looking up, in PARENT,
8690 the events from START to END. */
8691 Lisp_Object map;
8692 /* Positions [START, END) in the key sequence buffer
8693 are the key that we have scanned so far.
8694 Those events are the ones that we will replace
8695 if PAREHT maps them into a key sequence. */
a7f26f28
SM
8696 int start, end;
8697} keyremap;
8698
fe5b94c5
SM
8699/* Lookup KEY in MAP.
8700 MAP is a keymap mapping keys to key vectors or functions.
8701 If the mapping is a function and DO_FUNCTION is non-zero, then
8702 the function is called with PROMPT as parameter and its return
8703 value is used as the return value of this function (after checking
8704 that it is indeed a vector). */
8705
8706static Lisp_Object
d3da34e0
JB
8707access_keymap_keyremap (Lisp_Object map, Lisp_Object key, Lisp_Object prompt,
8708 int do_funcall)
fe5b94c5
SM
8709{
8710 Lisp_Object next;
6b61353c 8711
fe5b94c5
SM
8712 next = access_keymap (map, key, 1, 0, 1);
8713
8714 /* Handle symbol with autoload definition. */
8715 if (SYMBOLP (next) && !NILP (Ffboundp (next))
8716 && CONSP (XSYMBOL (next)->function)
8717 && EQ (XCAR (XSYMBOL (next)->function), Qautoload))
8718 do_autoload (XSYMBOL (next)->function, next);
8719
8720 /* Handle a symbol whose function definition is a keymap
8721 or an array. */
8722 if (SYMBOLP (next) && !NILP (Ffboundp (next))
592c0e80 8723 && (ARRAYP (XSYMBOL (next)->function)
fe5b94c5
SM
8724 || KEYMAPP (XSYMBOL (next)->function)))
8725 next = XSYMBOL (next)->function;
6b61353c 8726
fe5b94c5
SM
8727 /* If the keymap gives a function, not an
8728 array, then call the function with one arg and use
8729 its value instead. */
8730 if (SYMBOLP (next) && !NILP (Ffboundp (next)) && do_funcall)
8731 {
8732 Lisp_Object tem;
8733 tem = next;
8734
8735 next = call1 (next, prompt);
8736 /* If the function returned something invalid,
8737 barf--don't ignore it.
8738 (To ignore it safely, we would need to gcpro a bunch of
8739 other variables.) */
8740 if (! (VECTORP (next) || STRINGP (next)))
8741 error ("Function %s returns invalid key sequence", tem);
8742 }
8743 return next;
8744}
8745
8746/* Do one step of the key remapping used for function-key-map and
8747 key-translation-map:
8748 KEYBUF is the buffer holding the input events.
8749 BUFSIZE is its maximum size.
8750 FKEY is a pointer to the keyremap structure to use.
8751 INPUT is the index of the last element in KEYBUF.
8752 DOIT if non-zero says that the remapping can actually take place.
8753 DIFF is used to return the number of keys added/removed by the remapping.
8754 PARENT is the root of the keymap.
8755 PROMPT is the prompt to use if the remapping happens through a function.
8756 The return value is non-zero if the remapping actually took place. */
8757
8758static int
d3da34e0
JB
8759keyremap_step (Lisp_Object *keybuf, int bufsize, volatile keyremap *fkey,
8760 int input, int doit, int *diff, Lisp_Object prompt)
fe5b94c5
SM
8761{
8762 Lisp_Object next, key;
8763
8764 key = keybuf[fkey->end++];
c2028ac6
RS
8765
8766 if (KEYMAPP (fkey->parent))
8767 next = access_keymap_keyremap (fkey->map, key, prompt, doit);
8768 else
8769 next = Qnil;
fe5b94c5
SM
8770
8771 /* If keybuf[fkey->start..fkey->end] is bound in the
8772 map and we're in a position to do the key remapping, replace it with
8773 the binding and restart with fkey->start at the end. */
8774 if ((VECTORP (next) || STRINGP (next)) && doit)
8775 {
8776 int len = XFASTINT (Flength (next));
8777 int i;
8778
8779 *diff = len - (fkey->end - fkey->start);
8780
8781 if (input + *diff >= bufsize)
8782 error ("Key sequence too long");
8783
8784 /* Shift the keys that follow fkey->end. */
8785 if (*diff < 0)
8786 for (i = fkey->end; i < input; i++)
8787 keybuf[i + *diff] = keybuf[i];
8788 else if (*diff > 0)
8789 for (i = input - 1; i >= fkey->end; i--)
8790 keybuf[i + *diff] = keybuf[i];
8791 /* Overwrite the old keys with the new ones. */
8792 for (i = 0; i < len; i++)
8793 keybuf[fkey->start + i]
8794 = Faref (next, make_number (i));
8795
8796 fkey->start = fkey->end += *diff;
24d80a06 8797 fkey->map = fkey->parent;
fe5b94c5
SM
8798
8799 return 1;
8800 }
8801
8802 fkey->map = get_keymap (next, 0, 1);
8803
8804 /* If we no longer have a bound suffix, try a new position for
8805 fkey->start. */
8806 if (!CONSP (fkey->map))
8807 {
8808 fkey->end = ++fkey->start;
24d80a06 8809 fkey->map = fkey->parent;
fe5b94c5
SM
8810 }
8811 return 0;
8812}
a7f26f28 8813
df0f2ba1 8814/* Read a sequence of keys that ends with a non prefix character,
f4255cd1
JB
8815 storing it in KEYBUF, a buffer of size BUFSIZE.
8816 Prompt with PROMPT.
284f4730 8817 Return the length of the key sequence stored.
dcc408a0 8818 Return -1 if the user rejected a command menu.
284f4730 8819
f4255cd1
JB
8820 Echo starting immediately unless `prompt' is 0.
8821
8822 Where a key sequence ends depends on the currently active keymaps.
8823 These include any minor mode keymaps active in the current buffer,
8824 the current buffer's local map, and the global map.
8825
8826 If a key sequence has no other bindings, we check Vfunction_key_map
8827 to see if some trailing subsequence might be the beginning of a
8828 function key's sequence. If so, we try to read the whole function
8829 key, and substitute its symbolic name into the key sequence.
8830
fbcd35bd
JB
8831 We ignore unbound `down-' mouse clicks. We turn unbound `drag-' and
8832 `double-' events into similar click events, if that would make them
8833 bound. We try to turn `triple-' events first into `double-' events,
8834 then into clicks.
f4255cd1
JB
8835
8836 If we get a mouse click in a mode line, vertical divider, or other
8837 non-text area, we treat the click as if it were prefixed by the
8838 symbol denoting that area - `mode-line', `vertical-line', or
8839 whatever.
8840
8841 If the sequence starts with a mouse click, we read the key sequence
8842 with respect to the buffer clicked on, not the current buffer.
284f4730 8843
f4255cd1
JB
8844 If the user switches frames in the midst of a key sequence, we put
8845 off the switch-frame event until later; the next call to
f571ae0d
RS
8846 read_char will return it.
8847
8848 If FIX_CURRENT_BUFFER is nonzero, we restore current_buffer
8849 from the selected window's buffer. */
48e416d4 8850
284f4730 8851static int
d3da34e0
JB
8852read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt,
8853 int dont_downcase_last, int can_return_switch_frame,
8854 int fix_current_buffer)
284f4730 8855{
9d70a3fc
AS
8856 Lisp_Object from_string;
8857 int count = SPECPDL_INDEX ();
f4255cd1 8858
284f4730 8859 /* How many keys there are in the current key sequence. */
9d70a3fc 8860 int t;
284f4730 8861
284f4730
JB
8862 /* The length of the echo buffer when we started reading, and
8863 the length of this_command_keys when we started reading. */
9d70a3fc
AS
8864 int echo_start;
8865 int keys_start;
284f4730
JB
8866
8867 /* The number of keymaps we're scanning right now, and the number of
8868 keymaps we have allocated space for. */
9d70a3fc
AS
8869 int nmaps;
8870 int nmaps_allocated = 0;
284f4730 8871
284f4730
JB
8872 /* defs[0..nmaps-1] are the definitions of KEYBUF[0..t-1] in
8873 the current keymaps. */
9d70a3fc 8874 Lisp_Object *defs = NULL;
284f4730 8875
f4255cd1
JB
8876 /* submaps[0..nmaps-1] are the prefix definitions of KEYBUF[0..t-1]
8877 in the current keymaps, or nil where it is not a prefix. */
9d70a3fc 8878 Lisp_Object *submaps = NULL;
f4255cd1 8879
e0dff5f6 8880 /* The local map to start out with at start of key sequence. */
9d70a3fc 8881 Lisp_Object orig_local_map;
e0dff5f6 8882
30690496
DL
8883 /* The map from the `keymap' property to start out with at start of
8884 key sequence. */
9d70a3fc 8885 Lisp_Object orig_keymap;
30690496 8886
e0dff5f6
RS
8887 /* 1 if we have already considered switching to the local-map property
8888 of the place where a mouse click occurred. */
9d70a3fc 8889 int localized_local_map = 0;
e0dff5f6 8890
9de5eb68 8891 /* The index in submaps[] of the first keymap that has a binding for
f4255cd1 8892 this key sequence. In other words, the lowest i such that
9de5eb68 8893 submaps[i] is non-nil. */
9d70a3fc 8894 int first_binding;
7189cad8 8895 /* Index of the first key that has no binding.
a7f26f28 8896 It is useless to try fkey.start larger than that. */
9d70a3fc 8897 int first_unbound;
284f4730 8898
f4255cd1 8899 /* If t < mock_input, then KEYBUF[t] should be read as the next
253598e4
JB
8900 input key.
8901
8902 We use this to recover after recognizing a function key. Once we
8903 realize that a suffix of the current key sequence is actually a
8904 function key's escape sequence, we replace the suffix with the
8905 function key's binding from Vfunction_key_map. Now keybuf
f4255cd1
JB
8906 contains a new and different key sequence, so the echo area,
8907 this_command_keys, and the submaps and defs arrays are wrong. In
8908 this situation, we set mock_input to t, set t to 0, and jump to
8909 restart_sequence; the loop will read keys from keybuf up until
8910 mock_input, thus rebuilding the state; and then it will resume
8911 reading characters from the keyboard. */
9d70a3fc 8912 int mock_input = 0;
284f4730 8913
253598e4 8914 /* If the sequence is unbound in submaps[], then
a7f26f28
SM
8915 keybuf[fkey.start..fkey.end-1] is a prefix in Vfunction_key_map,
8916 and fkey.map is its binding.
253598e4 8917
f4255cd1
JB
8918 These might be > t, indicating that all function key scanning
8919 should hold off until t reaches them. We do this when we've just
8920 recognized a function key, to avoid searching for the function
8921 key's again in Vfunction_key_map. */
9d70a3fc 8922 keyremap fkey;
284f4730 8923
4f4a84ec 8924 /* Likewise, for key_translation_map and input-decode-map. */
9d70a3fc 8925 keyremap keytran, indec;
a612e298 8926
025ae953
CY
8927 /* Non-zero if we are trying to map a key by changing an upper-case
8928 letter to lower case, or a shifted function key to an unshifted
8929 one. */
9d70a3fc 8930 int shift_translated = 0;
025ae953 8931
fe5b94c5
SM
8932 /* If we receive a `switch-frame' or `select-window' event in the middle of
8933 a key sequence, we put it off for later.
8934 While we're reading, we keep the event here. */
9d70a3fc 8935 Lisp_Object delayed_switch_frame;
cd21b839 8936
51763820
BF
8937 /* See the comment below... */
8938#if defined (GOBBLE_FIRST_EVENT)
4efda7dd 8939 Lisp_Object first_event;
51763820 8940#endif
4efda7dd 8941
9d70a3fc
AS
8942 Lisp_Object original_uppercase;
8943 int original_uppercase_position = -1;
309b0fc8 8944
bc536d84 8945 /* Gets around Microsoft compiler limitations. */
309b0fc8 8946 int dummyflag = 0;
bc536d84 8947
3b9189f8
RS
8948 struct buffer *starting_buffer;
8949
2dc00208 8950 /* List of events for which a fake prefix key has been generated. */
9d70a3fc 8951 Lisp_Object fake_prefixed_keys = Qnil;
2dc00208 8952
03cee6ae 8953#if defined (GOBBLE_FIRST_EVENT)
4efda7dd 8954 int junk;
03cee6ae 8955#endif
4efda7dd 8956
2dc00208
GM
8957 struct gcpro gcpro1;
8958
8959 GCPRO1 (fake_prefixed_keys);
7d18f9ae
RS
8960 raw_keybuf_count = 0;
8961
4efda7dd
RS
8962 last_nonmenu_event = Qnil;
8963
8964 delayed_switch_frame = Qnil;
033b73e2 8965
284f4730
JB
8966 if (INTERACTIVE)
8967 {
84d91fda 8968 if (!NILP (prompt))
51b403bd
CY
8969 {
8970 /* Install the string STR as the beginning of the string of
8971 echoing, so that it serves as a prompt for the next
8972 character. */
8973 current_kboard->echo_string = prompt;
8974 current_kboard->echo_after_prompt = SCHARS (prompt);
8975 echo_now ();
8976 }
f2647d04
DL
8977 else if (cursor_in_echo_area
8978 && (FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
8979 && NILP (Fzerop (Vecho_keystrokes)))
284f4730
JB
8980 /* This doesn't put in a dash if the echo buffer is empty, so
8981 you don't always see a dash hanging out in the minibuffer. */
8982 echo_dash ();
284f4730
JB
8983 }
8984
f4255cd1
JB
8985 /* Record the initial state of the echo area and this_command_keys;
8986 we will need to restore them if we replay a key sequence. */
0a7f1fc0 8987 if (INTERACTIVE)
df0f2ba1 8988 echo_start = echo_length ();
f4255cd1 8989 keys_start = this_command_key_count;
6321824f 8990 this_single_command_key_start = keys_start;
0a7f1fc0 8991
51763820
BF
8992#if defined (GOBBLE_FIRST_EVENT)
8993 /* This doesn't quite work, because some of the things that read_char
8994 does cannot safely be bypassed. It seems too risky to try to make
df0f2ba1 8995 this work right. */
51763820 8996
4efda7dd
RS
8997 /* Read the first char of the sequence specially, before setting
8998 up any keymaps, in case a filter runs and switches buffers on us. */
84d91fda 8999 first_event = read_char (NILP (prompt), 0, submaps, last_nonmenu_event,
179f689c 9000 &junk, NULL);
51763820 9001#endif /* GOBBLE_FIRST_EVENT */
4efda7dd 9002
24a40fbb
GM
9003 orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
9004 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
db14cfc5 9005 from_string = Qnil;
e0dff5f6 9006
f1ba6ccd
CY
9007 /* We jump here when we need to reinitialize fkey and keytran; this
9008 happens if we switch keyboards between rescans. */
9009 replay_entire_sequence:
9010
4f4a84ec 9011 indec.map = indec.parent = current_kboard->Vinput_decode_map;
d6805803 9012 fkey.map = fkey.parent = current_kboard->Vlocal_function_key_map;
4f4a84ec
SM
9013 keytran.map = keytran.parent = Vkey_translation_map;
9014 indec.start = indec.end = 0;
3f87f67e
KL
9015 fkey.start = fkey.end = 0;
9016 keytran.start = keytran.end = 0;
d6805803 9017
3278f20e
SM
9018 /* We jump here when the key sequence has been thoroughly changed, and
9019 we need to rescan it starting from the beginning. When we jump here,
9020 keybuf[0..mock_input] holds the sequence we should reread. */
9021 replay_sequence:
9022
3b9189f8 9023 starting_buffer = current_buffer;
7189cad8 9024 first_unbound = bufsize + 1;
3b9189f8 9025
f4255cd1 9026 /* Build our list of keymaps.
07d2b8de
JB
9027 If we recognize a function key and replace its escape sequence in
9028 keybuf with its symbol, or if the sequence starts with a mouse
9029 click and we need to switch buffers, we jump back here to rebuild
9030 the initial keymaps from the current buffer. */
4cbedc16 9031 nmaps = 0;
284f4730 9032
4c0240d2 9033 if (!NILP (current_kboard->Voverriding_terminal_local_map))
4cbedc16 9034 {
4c0240d2 9035 if (2 > nmaps_allocated)
4cbedc16 9036 {
4c0240d2
RS
9037 submaps = (Lisp_Object *) alloca (2 * sizeof (submaps[0]));
9038 defs = (Lisp_Object *) alloca (2 * sizeof (defs[0]));
9039 nmaps_allocated = 2;
4cbedc16 9040 }
07024c43 9041 submaps[nmaps++] = current_kboard->Voverriding_terminal_local_map;
4c0240d2
RS
9042 }
9043 else if (!NILP (Voverriding_local_map))
9044 {
9045 if (2 > nmaps_allocated)
9046 {
9047 submaps = (Lisp_Object *) alloca (2 * sizeof (submaps[0]));
9048 defs = (Lisp_Object *) alloca (2 * sizeof (defs[0]));
9049 nmaps_allocated = 2;
9050 }
07024c43 9051 submaps[nmaps++] = Voverriding_local_map;
4cbedc16
RS
9052 }
9053 else
9054 {
4cbedc16
RS
9055 int nminor;
9056 int total;
9057 Lisp_Object *maps;
9058
9059 nminor = current_minor_maps (0, &maps);
9060 total = nminor + (!NILP (orig_keymap) ? 3 : 2);
9061
9062 if (total > nmaps_allocated)
9063 {
9064 submaps = (Lisp_Object *) alloca (total * sizeof (submaps[0]));
9065 defs = (Lisp_Object *) alloca (total * sizeof (defs[0]));
9066 nmaps_allocated = total;
9067 }
9068
9069 if (!NILP (orig_keymap))
9070 submaps[nmaps++] = orig_keymap;
9071
72af86bd 9072 memcpy (submaps + nmaps, maps, nminor * sizeof (submaps[0]));
4cbedc16
RS
9073
9074 nmaps += nminor;
9075
9076 submaps[nmaps++] = orig_local_map;
9077 }
9078 submaps[nmaps++] = current_global_map;
284f4730
JB
9079
9080 /* Find an accurate initial value for first_binding. */
9081 for (first_binding = 0; first_binding < nmaps; first_binding++)
253598e4 9082 if (! NILP (submaps[first_binding]))
284f4730
JB
9083 break;
9084
3b9189f8 9085 /* Start from the beginning in keybuf. */
f4255cd1
JB
9086 t = 0;
9087
9088 /* These are no-ops the first time through, but if we restart, they
9089 revert the echo area and this_command_keys to their original state. */
9090 this_command_key_count = keys_start;
df0f2ba1 9091 if (INTERACTIVE && t < mock_input)
f4255cd1
JB
9092 echo_truncate (echo_start);
9093
cca310da
JB
9094 /* If the best binding for the current key sequence is a keymap, or
9095 we may be looking at a function key's escape sequence, keep on
9096 reading. */
a7f26f28
SM
9097 while (first_binding < nmaps
9098 /* Keep reading as long as there's a prefix binding. */
9099 ? !NILP (submaps[first_binding])
e9bf89a0
RS
9100 /* Don't return in the middle of a possible function key sequence,
9101 if the only bindings we found were via case conversion.
9102 Thus, if ESC O a has a function-key-map translation
9103 and ESC o has a binding, don't return after ESC O,
9104 so that we can translate ESC O plus the next character. */
4f4a84ec 9105 : (/* indec.start < t || fkey.start < t || */ keytran.start < t))
284f4730
JB
9106 {
9107 Lisp_Object key;
7d6de002 9108 int used_mouse_menu = 0;
284f4730 9109
7b4aedb9
JB
9110 /* Where the last real key started. If we need to throw away a
9111 key that has expanded into more than one element of keybuf
9112 (say, a mouse click on the mode line which is being treated
9113 as [mode-line (mouse-...)], then we backtrack to this point
9114 of keybuf. */
9d70a3fc 9115 int last_real_key_start;
7b4aedb9 9116
0a7f1fc0
JB
9117 /* These variables are analogous to echo_start and keys_start;
9118 while those allow us to restart the entire key sequence,
9119 echo_local_start and keys_local_start allow us to throw away
9120 just one key. */
9d70a3fc 9121 int echo_local_start, keys_local_start, local_first_binding;
f4255cd1 9122
4f4a84ec
SM
9123 eassert (indec.end == t || (indec.end > t && indec.end <= mock_input));
9124 eassert (indec.start <= indec.end);
fe5b94c5
SM
9125 eassert (fkey.start <= fkey.end);
9126 eassert (keytran.start <= keytran.end);
4f4a84ec
SM
9127 /* key-translation-map is applied *after* function-key-map
9128 which is itself applied *after* input-decode-map. */
9129 eassert (fkey.end <= indec.start);
a7f26f28 9130 eassert (keytran.end <= fkey.start);
7189cad8 9131
4f4a84ec
SM
9132 if (/* first_unbound < indec.start && first_unbound < fkey.start && */
9133 first_unbound < keytran.start)
7189cad8
SM
9134 { /* The prefix upto first_unbound has no binding and has
9135 no translation left to do either, so we know it's unbound.
9136 If we don't stop now, we risk staying here indefinitely
9137 (if the user keeps entering fkey or keytran prefixes
9138 like C-c ESC ESC ESC ESC ...) */
9139 int i;
9140 for (i = first_unbound + 1; i < t; i++)
9141 keybuf[i - first_unbound - 1] = keybuf[i];
9142 mock_input = t - first_unbound - 1;
4f4a84ec
SM
9143 indec.end = indec.start -= first_unbound + 1;
9144 indec.map = indec.parent;
a7f26f28 9145 fkey.end = fkey.start -= first_unbound + 1;
24d80a06 9146 fkey.map = fkey.parent;
a7f26f28 9147 keytran.end = keytran.start -= first_unbound + 1;
24d80a06 9148 keytran.map = keytran.parent;
7189cad8
SM
9149 goto replay_sequence;
9150 }
9151
284f4730 9152 if (t >= bufsize)
3fe8e9a2 9153 error ("Key sequence too long");
284f4730 9154
f4255cd1
JB
9155 if (INTERACTIVE)
9156 echo_local_start = echo_length ();
9157 keys_local_start = this_command_key_count;
9158 local_first_binding = first_binding;
df0f2ba1 9159
f4255cd1 9160 replay_key:
0a7f1fc0 9161 /* These are no-ops, unless we throw away a keystroke below and
f4255cd1
JB
9162 jumped back up to replay_key; in that case, these restore the
9163 variables to their original state, allowing us to replay the
0a7f1fc0 9164 loop. */
40932d1a 9165 if (INTERACTIVE && t < mock_input)
f4255cd1 9166 echo_truncate (echo_local_start);
0a7f1fc0
JB
9167 this_command_key_count = keys_local_start;
9168 first_binding = local_first_binding;
9169
7e85b935
RS
9170 /* By default, assume each event is "real". */
9171 last_real_key_start = t;
9172
f4255cd1 9173 /* Does mock_input indicate that we are re-reading a key sequence? */
284f4730
JB
9174 if (t < mock_input)
9175 {
9176 key = keybuf[t];
9177 add_command_key (key);
f2647d04
DL
9178 if ((FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
9179 && NILP (Fzerop (Vecho_keystrokes)))
a98ea3f9 9180 echo_char (key);
284f4730 9181 }
253598e4
JB
9182
9183 /* If not, we should actually read a character. */
284f4730
JB
9184 else
9185 {
beecf6a1 9186 {
c5fdd383 9187 KBOARD *interrupted_kboard = current_kboard;
788f89eb 9188 struct frame *interrupted_frame = SELECTED_FRAME ();
9688ff53
KL
9189 key = read_char (NILP (prompt), nmaps,
9190 (Lisp_Object *) submaps, last_nonmenu_event,
251bc578 9191 &used_mouse_menu, NULL);
03f77f0a
CY
9192 if ((INTEGERP (key) && XINT (key) == -2) /* wrong_kboard_jmpbuf */
9193 /* When switching to a new tty (with a new keyboard),
9194 read_char returns the new buffer, rather than -2
9195 (Bug#5095). This is because `terminal-init-xterm'
9196 calls read-char, which eats the wrong_kboard_jmpbuf
9197 return. Any better way to fix this? -- cyd */
9198 || (interrupted_kboard != current_kboard))
beecf6a1 9199 {
e079ecf4
KL
9200 int found = 0;
9201 struct kboard *k;
b3e6f69c 9202
e079ecf4
KL
9203 for (k = all_kboards; k; k = k->next_kboard)
9204 if (k == interrupted_kboard)
9205 found = 1;
9206
9207 if (!found)
9208 {
9209 /* Don't touch interrupted_kboard when it's been
9210 deleted. */
9211 delayed_switch_frame = Qnil;
f1ba6ccd 9212 goto replay_entire_sequence;
e079ecf4 9213 }
b3e6f69c 9214
5798cf15
KH
9215 if (!NILP (delayed_switch_frame))
9216 {
c5fdd383 9217 interrupted_kboard->kbd_queue
5798cf15 9218 = Fcons (delayed_switch_frame,
c5fdd383 9219 interrupted_kboard->kbd_queue);
5798cf15
KH
9220 delayed_switch_frame = Qnil;
9221 }
e079ecf4 9222
beecf6a1 9223 while (t > 0)
c5fdd383
KH
9224 interrupted_kboard->kbd_queue
9225 = Fcons (keybuf[--t], interrupted_kboard->kbd_queue);
5798cf15
KH
9226
9227 /* If the side queue is non-empty, ensure it begins with a
9228 switch-frame, so we'll replay it in the right context. */
c5fdd383 9229 if (CONSP (interrupted_kboard->kbd_queue)
7539e11f 9230 && (key = XCAR (interrupted_kboard->kbd_queue),
5798cf15
KH
9231 !(EVENT_HAS_PARAMETERS (key)
9232 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (key)),
9233 Qswitch_frame))))
df0f2ba1
KH
9234 {
9235 Lisp_Object frame;
9236 XSETFRAME (frame, interrupted_frame);
c5fdd383 9237 interrupted_kboard->kbd_queue
df0f2ba1 9238 = Fcons (make_lispy_switch_frame (frame),
c5fdd383 9239 interrupted_kboard->kbd_queue);
df0f2ba1 9240 }
beecf6a1 9241 mock_input = 0;
24a40fbb
GM
9242 orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
9243 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
f1ba6ccd 9244 goto replay_entire_sequence;
beecf6a1 9245 }
beecf6a1 9246 }
284f4730 9247
dcc408a0
RS
9248 /* read_char returns t when it shows a menu and the user rejects it.
9249 Just return -1. */
9250 if (EQ (key, Qt))
7d18f9ae
RS
9251 {
9252 unbind_to (count, Qnil);
2dc00208 9253 UNGCPRO;
7d18f9ae
RS
9254 return -1;
9255 }
dcc408a0 9256
f4255cd1 9257 /* read_char returns -1 at the end of a macro.
284f4730
JB
9258 Emacs 18 handles this by returning immediately with a
9259 zero, so that's what we'll do. */
8c18cbfb 9260 if (INTEGERP (key) && XINT (key) == -1)
cd21b839 9261 {
f4255cd1 9262 t = 0;
bc536d84
RS
9263 /* The Microsoft C compiler can't handle the goto that
9264 would go here. */
309b0fc8 9265 dummyflag = 1;
bc536d84 9266 break;
cd21b839 9267 }
df0f2ba1 9268
3cb81011
KH
9269 /* If the current buffer has been changed from under us, the
9270 keymap may have changed, so replay the sequence. */
8c18cbfb 9271 if (BUFFERP (key))
3cb81011 9272 {
5c12e63f 9273 timer_resume_idle ();
3021d3a9 9274
3cb81011 9275 mock_input = t;
f571ae0d
RS
9276 /* Reset the current buffer from the selected window
9277 in case something changed the former and not the latter.
9278 This is to be more consistent with the behavior
9279 of the command_loop_1. */
9280 if (fix_current_buffer)
a94a4335 9281 {
788f89eb 9282 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
a94a4335
KH
9283 Fkill_emacs (Qnil);
9284 if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
9285 Fset_buffer (XWINDOW (selected_window)->buffer);
9286 }
f571ae0d 9287
24a40fbb
GM
9288 orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
9289 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
3cb81011
KH
9290 goto replay_sequence;
9291 }
9292
3b9189f8
RS
9293 /* If we have a quit that was typed in another frame, and
9294 quit_throw_to_read_char switched buffers,
9295 replay to get the right keymap. */
f4e05d97
GM
9296 if (INTEGERP (key)
9297 && XINT (key) == quit_char
9298 && current_buffer != starting_buffer)
3b9189f8 9299 {
7d18f9ae
RS
9300 GROW_RAW_KEYBUF;
9301 XVECTOR (raw_keybuf)->contents[raw_keybuf_count++] = key;
3b9189f8
RS
9302 keybuf[t++] = key;
9303 mock_input = t;
9304 Vquit_flag = Qnil;
24a40fbb
GM
9305 orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
9306 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
3b9189f8
RS
9307 goto replay_sequence;
9308 }
3cb81011 9309
284f4730 9310 Vquit_flag = Qnil;
7d18f9ae
RS
9311
9312 if (EVENT_HAS_PARAMETERS (key)
fe5b94c5 9313 /* Either a `switch-frame' or a `select-window' event. */
7d18f9ae
RS
9314 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (key)), Qswitch_frame))
9315 {
9316 /* If we're at the beginning of a key sequence, and the caller
9317 says it's okay, go ahead and return this event. If we're
9318 in the midst of a key sequence, delay it until the end. */
9319 if (t > 0 || !can_return_switch_frame)
9320 {
9321 delayed_switch_frame = key;
9322 goto replay_key;
9323 }
9324 }
9325
9326 GROW_RAW_KEYBUF;
4ed4b975
JB
9327 ASET (raw_keybuf, raw_keybuf_count, key);
9328 raw_keybuf_count++;
7e85b935 9329 }
284f4730 9330
df0f2ba1 9331 /* Clicks in non-text areas get prefixed by the symbol
7e85b935
RS
9332 in their CHAR-ADDRESS field. For example, a click on
9333 the mode line is prefixed by the symbol `mode-line'.
9334
9335 Furthermore, key sequences beginning with mouse clicks
9336 are read using the keymaps of the buffer clicked on, not
9337 the current buffer. So we may have to switch the buffer
9338 here.
9339
9340 When we turn one event into two events, we must make sure
9341 that neither of the two looks like the original--so that,
9342 if we replay the events, they won't be expanded again.
9343 If not for this, such reexpansion could happen either here
9344 or when user programs play with this-command-keys. */
9345 if (EVENT_HAS_PARAMETERS (key))
9346 {
9b8eb840 9347 Lisp_Object kind;
6b61353c 9348 Lisp_Object string;
cca310da 9349
9b8eb840 9350 kind = EVENT_HEAD_KIND (EVENT_HEAD (key));
7e85b935 9351 if (EQ (kind, Qmouse_click))
0a7f1fc0 9352 {
9b8eb840 9353 Lisp_Object window, posn;
f4255cd1 9354
4ed4b975 9355 window = POSN_WINDOW (EVENT_START (key));
6b61353c 9356 posn = POSN_POSN (EVENT_START (key));
7ee32cda 9357
2cf066c3
GM
9358 if (CONSP (posn)
9359 || (!NILP (fake_prefixed_keys)
9360 && !NILP (Fmemq (key, fake_prefixed_keys))))
0a7f1fc0 9361 {
2cf066c3
GM
9362 /* We're looking a second time at an event for which
9363 we generated a fake prefix key. Set
7e85b935
RS
9364 last_real_key_start appropriately. */
9365 if (t > 0)
9366 last_real_key_start = t - 1;
cd21b839 9367 }
7e85b935
RS
9368
9369 /* Key sequences beginning with mouse clicks are
9370 read using the keymaps in the buffer clicked on,
9371 not the current buffer. If we're at the
9372 beginning of a key sequence, switch buffers. */
9373 if (last_real_key_start == 0
8c18cbfb
KH
9374 && WINDOWP (window)
9375 && BUFFERP (XWINDOW (window)->buffer)
7e85b935 9376 && XBUFFER (XWINDOW (window)->buffer) != current_buffer)
cd21b839 9377 {
7d18f9ae 9378 XVECTOR (raw_keybuf)->contents[raw_keybuf_count++] = key;
7e85b935
RS
9379 keybuf[t] = key;
9380 mock_input = t + 1;
9381
9382 /* Arrange to go back to the original buffer once we're
9383 done reading the key sequence. Note that we can't
9384 use save_excursion_{save,restore} here, because they
9385 save point as well as the current buffer; we don't
9386 want to save point, because redisplay may change it,
9387 to accommodate a Fset_window_start or something. We
9388 don't want to do this at the top of the function,
9389 because we may get input from a subprocess which
9390 wants to change the selected window and stuff (say,
9391 emacsclient). */
9392 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
9393
788f89eb 9394 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
a94a4335 9395 Fkill_emacs (Qnil);
24a40fbb 9396 set_buffer_internal (XBUFFER (XWINDOW (window)->buffer));
30690496 9397 orig_local_map = get_local_map (PT, current_buffer,
24a40fbb
GM
9398 Qlocal_map);
9399 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
7e85b935 9400 goto replay_sequence;
0a7f1fc0 9401 }
c60ee5e7 9402
e0dff5f6
RS
9403 /* For a mouse click, get the local text-property keymap
9404 of the place clicked on, rather than point. */
7ee32cda 9405 if (last_real_key_start == 0
7539e11f 9406 && CONSP (XCDR (key))
e0dff5f6 9407 && ! localized_local_map)
5ec75a55 9408 {
e0dff5f6
RS
9409 Lisp_Object map_here, start, pos;
9410
9411 localized_local_map = 1;
9412 start = EVENT_START (key);
c60ee5e7 9413
6b61353c 9414 if (CONSP (start) && POSN_INBUFFER_P (start))
e0dff5f6
RS
9415 {
9416 pos = POSN_BUFFER_POSN (start);
b78ce8fb 9417 if (INTEGERP (pos)
602ae44c
CY
9418 && XINT (pos) >= BEGV
9419 && XINT (pos) <= ZV)
e0dff5f6 9420 {
30690496 9421 map_here = get_local_map (XINT (pos),
24a40fbb 9422 current_buffer, Qlocal_map);
e0dff5f6
RS
9423 if (!EQ (map_here, orig_local_map))
9424 {
9425 orig_local_map = map_here;
b74e16a3 9426 ++localized_local_map;
30690496 9427 }
b74e16a3 9428
30690496 9429 map_here = get_local_map (XINT (pos),
24a40fbb 9430 current_buffer, Qkeymap);
30690496
DL
9431 if (!EQ (map_here, orig_keymap))
9432 {
9433 orig_keymap = map_here;
b74e16a3
DK
9434 ++localized_local_map;
9435 }
9436
9437 if (localized_local_map > 1)
9438 {
30690496
DL
9439 keybuf[t] = key;
9440 mock_input = t + 1;
9441
e0dff5f6
RS
9442 goto replay_sequence;
9443 }
9444 }
9445 }
9446 }
9447
9448 /* Expand mode-line and scroll-bar events into two events:
9449 use posn as a fake prefix key. */
2dc00208
GM
9450 if (SYMBOLP (posn)
9451 && (NILP (fake_prefixed_keys)
9452 || NILP (Fmemq (key, fake_prefixed_keys))))
e0dff5f6 9453 {
7e85b935 9454 if (t + 1 >= bufsize)
3fe8e9a2 9455 error ("Key sequence too long");
c60ee5e7 9456
2dc00208
GM
9457 keybuf[t] = posn;
9458 keybuf[t + 1] = key;
9459 mock_input = t + 2;
9460
9461 /* Record that a fake prefix key has been generated
9462 for KEY. Don't modify the event; this would
9463 prevent proper action when the event is pushed
c7f4f573 9464 back into unread-command-events. */
2dc00208 9465 fake_prefixed_keys = Fcons (key, fake_prefixed_keys);
7ee32cda
GM
9466
9467 /* If on a mode line string with a local keymap,
9468 reconsider the key sequence with that keymap. */
6b61353c
KH
9469 if (string = POSN_STRING (EVENT_START (key)),
9470 (CONSP (string) && STRINGP (XCAR (string))))
7ee32cda 9471 {
6b61353c 9472 Lisp_Object pos, map, map2;
7ee32cda 9473
7ee32cda
GM
9474 pos = XCDR (string);
9475 string = XCAR (string);
52e386c2 9476 if (XINT (pos) >= 0
d5db4077 9477 && XINT (pos) < SCHARS (string))
30690496
DL
9478 {
9479 map = Fget_text_property (pos, Qlocal_map, string);
9480 if (!NILP (map))
9481 orig_local_map = map;
9482 map2 = Fget_text_property (pos, Qkeymap, string);
9483 if (!NILP (map2))
9484 orig_keymap = map2;
9485 if (!NILP (map) || !NILP (map2))
9486 goto replay_sequence;
9487 }
7ee32cda
GM
9488 }
9489
7e85b935 9490 goto replay_key;
5ec75a55 9491 }
6b61353c
KH
9492 else if (NILP (from_string)
9493 && (string = POSN_STRING (EVENT_START (key)),
9494 (CONSP (string) && STRINGP (XCAR (string)))))
db14cfc5
GM
9495 {
9496 /* For a click on a string, i.e. overlay string or a
9497 string displayed via the `display' property,
9498 consider `local-map' and `keymap' properties of
9499 that string. */
6b61353c 9500 Lisp_Object pos, map, map2;
db14cfc5 9501
db14cfc5
GM
9502 pos = XCDR (string);
9503 string = XCAR (string);
9504 if (XINT (pos) >= 0
d5db4077 9505 && XINT (pos) < SCHARS (string))
db14cfc5
GM
9506 {
9507 map = Fget_text_property (pos, Qlocal_map, string);
9508 if (!NILP (map))
9509 orig_local_map = map;
9510 map2 = Fget_text_property (pos, Qkeymap, string);
9511 if (!NILP (map2))
9512 orig_keymap = map2;
9513
9514 if (!NILP (map) || !NILP (map2))
9515 {
9516 from_string = string;
32949266
CY
9517 keybuf[t++] = key;
9518 mock_input = t;
db14cfc5
GM
9519 goto replay_sequence;
9520 }
9521 }
9522 }
0a7f1fc0 9523 }
7539e11f 9524 else if (CONSP (XCDR (key))
7a80a6f6 9525 && CONSP (EVENT_START (key))
7539e11f 9526 && CONSP (XCDR (EVENT_START (key))))
7e85b935 9527 {
9b8eb840 9528 Lisp_Object posn;
7e85b935 9529
6b61353c 9530 posn = POSN_POSN (EVENT_START (key));
7e85b935
RS
9531 /* Handle menu-bar events:
9532 insert the dummy prefix event `menu-bar'. */
9ea173e8 9533 if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
7e85b935
RS
9534 {
9535 if (t + 1 >= bufsize)
3fe8e9a2 9536 error ("Key sequence too long");
7e85b935
RS
9537 keybuf[t] = posn;
9538 keybuf[t+1] = key;
9539
9540 /* Zap the position in key, so we know that we've
9541 expanded it, and don't try to do so again. */
6b61353c
KH
9542 POSN_SET_POSN (EVENT_START (key),
9543 Fcons (posn, Qnil));
7e85b935
RS
9544
9545 mock_input = t + 2;
9546 goto replay_sequence;
9547 }
8c18cbfb 9548 else if (CONSP (posn))
7e85b935
RS
9549 {
9550 /* We're looking at the second event of a
9551 sequence which we expanded before. Set
9552 last_real_key_start appropriately. */
9553 if (last_real_key_start == t && t > 0)
9554 last_real_key_start = t - 1;
9555 }
a6d53864 9556 }
284f4730 9557 }
f4255cd1
JB
9558
9559 /* We have finally decided that KEY is something we might want
9560 to look up. */
284f4730
JB
9561 first_binding = (follow_key (key,
9562 nmaps - first_binding,
253598e4 9563 submaps + first_binding,
284f4730 9564 defs + first_binding,
4e50f26a 9565 submaps + first_binding)
284f4730 9566 + first_binding);
0a7f1fc0 9567
f4255cd1 9568 /* If KEY wasn't bound, we'll try some fallbacks. */
65e0fbbf
SM
9569 if (first_binding < nmaps)
9570 /* This is needed for the following scenario:
9571 event 0: a down-event that gets dropped by calling replay_key.
9572 event 1: some normal prefix like C-h.
4f4a84ec
SM
9573 After event 0, first_unbound is 0, after event 1 indec.start,
9574 fkey.start, and keytran.start are all 1, so when we see that
9575 C-h is bound, we need to update first_unbound. */
65e0fbbf
SM
9576 first_unbound = max (t + 1, first_unbound);
9577 else
0a7f1fc0 9578 {
9b8eb840 9579 Lisp_Object head;
c60ee5e7 9580
4f4a84ec 9581 /* Remember the position to put an upper bound on indec.start. */
7189cad8 9582 first_unbound = min (t, first_unbound);
0a7f1fc0 9583
9b8eb840 9584 head = EVENT_HEAD (key);
24736fbc 9585 if (help_char_p (head) && t > 0)
7e85b935
RS
9586 {
9587 read_key_sequence_cmd = Vprefix_help_command;
9588 keybuf[t++] = key;
9589 last_nonmenu_event = key;
bc536d84
RS
9590 /* The Microsoft C compiler can't handle the goto that
9591 would go here. */
309b0fc8 9592 dummyflag = 1;
0d882d52 9593 break;
7e85b935
RS
9594 }
9595
8c18cbfb 9596 if (SYMBOLP (head))
0a7f1fc0 9597 {
9b8eb840
KH
9598 Lisp_Object breakdown;
9599 int modifiers;
0a7f1fc0 9600
9b8eb840 9601 breakdown = parse_modifiers (head);
7539e11f 9602 modifiers = XINT (XCAR (XCDR (breakdown)));
559f9d04
RS
9603 /* Attempt to reduce an unbound mouse event to a simpler
9604 event that is bound:
9605 Drags reduce to clicks.
9606 Double-clicks reduce to clicks.
9607 Triple-clicks reduce to double-clicks, then to clicks.
9608 Down-clicks are eliminated.
9609 Double-downs reduce to downs, then are eliminated.
9610 Triple-downs reduce to double-downs, then to downs,
9611 then are eliminated. */
9612 if (modifiers & (down_modifier | drag_modifier
9613 | double_modifier | triple_modifier))
0a7f1fc0 9614 {
559f9d04
RS
9615 while (modifiers & (down_modifier | drag_modifier
9616 | double_modifier | triple_modifier))
fbcd35bd
JB
9617 {
9618 Lisp_Object new_head, new_click;
9619 if (modifiers & triple_modifier)
9620 modifiers ^= (double_modifier | triple_modifier);
bc536d84
RS
9621 else if (modifiers & double_modifier)
9622 modifiers &= ~double_modifier;
9623 else if (modifiers & drag_modifier)
9624 modifiers &= ~drag_modifier;
559f9d04
RS
9625 else
9626 {
9627 /* Dispose of this `down' event by simply jumping
9628 back to replay_key, to get another event.
9629
9630 Note that if this event came from mock input,
9631 then just jumping back to replay_key will just
9632 hand it to us again. So we have to wipe out any
9633 mock input.
9634
9635 We could delete keybuf[t] and shift everything
9636 after that to the left by one spot, but we'd also
9637 have to fix up any variable that points into
9638 keybuf, and shifting isn't really necessary
9639 anyway.
9640
9641 Adding prefixes for non-textual mouse clicks
9642 creates two characters of mock input, and both
9643 must be thrown away. If we're only looking at
9644 the prefix now, we can just jump back to
9645 replay_key. On the other hand, if we've already
9646 processed the prefix, and now the actual click
9647 itself is giving us trouble, then we've lost the
9648 state of the keymaps we want to backtrack to, and
9649 we need to replay the whole sequence to rebuild
9650 it.
9651
9652 Beyond that, only function key expansion could
9653 create more than two keys, but that should never
9654 generate mouse events, so it's okay to zero
9655 mock_input in that case too.
9656
65e0fbbf
SM
9657 FIXME: The above paragraph seems just plain
9658 wrong, if you consider things like
9659 xterm-mouse-mode. -stef
9660
559f9d04 9661 Isn't this just the most wonderful code ever? */
017be6c7
SM
9662
9663 /* If mock_input > t + 1, the above simplification
9664 will actually end up dropping keys on the floor.
9665 This is probably OK for now, but even
4f4a84ec
SM
9666 if mock_input <= t + 1, we need to adjust indec,
9667 fkey, and keytran.
017be6c7
SM
9668 Typical case [header-line down-mouse-N]:
9669 mock_input = 2, t = 1, fkey.end = 1,
9670 last_real_key_start = 0. */
4f4a84ec 9671 if (indec.end > last_real_key_start)
017be6c7 9672 {
4f4a84ec
SM
9673 indec.end = indec.start
9674 = min (last_real_key_start, indec.start);
9675 indec.map = indec.parent;
9676 if (fkey.end > last_real_key_start)
017be6c7 9677 {
4f4a84ec
SM
9678 fkey.end = fkey.start
9679 = min (last_real_key_start, fkey.start);
9680 fkey.map = fkey.parent;
9681 if (keytran.end > last_real_key_start)
9682 {
9683 keytran.end = keytran.start
9684 = min (last_real_key_start, keytran.start);
9685 keytran.map = keytran.parent;
9686 }
017be6c7
SM
9687 }
9688 }
559f9d04
RS
9689 if (t == last_real_key_start)
9690 {
9691 mock_input = 0;
9692 goto replay_key;
9693 }
9694 else
9695 {
9696 mock_input = last_real_key_start;
9697 goto replay_sequence;
9698 }
9699 }
9700
27203ead 9701 new_head
7539e11f 9702 = apply_modifiers (modifiers, XCAR (breakdown));
27203ead
RS
9703 new_click
9704 = Fcons (new_head, Fcons (EVENT_START (key), Qnil));
fbcd35bd
JB
9705
9706 /* Look for a binding for this new key. follow_key
9707 promises that it didn't munge submaps the
9708 last time we called it, since key was unbound. */
27203ead
RS
9709 first_binding
9710 = (follow_key (new_click,
9711 nmaps - local_first_binding,
9712 submaps + local_first_binding,
9713 defs + local_first_binding,
4e50f26a 9714 submaps + local_first_binding)
27203ead 9715 + local_first_binding);
fbcd35bd
JB
9716
9717 /* If that click is bound, go for it. */
9718 if (first_binding < nmaps)
9719 {
9720 key = new_click;
9721 break;
9722 }
9723 /* Otherwise, we'll leave key set to the drag event. */
9724 }
0a7f1fc0
JB
9725 }
9726 }
9727 }
9728
284f4730 9729 keybuf[t++] = key;
7d6de002
RS
9730 /* Normally, last_nonmenu_event gets the previous key we read.
9731 But when a mouse popup menu is being used,
9732 we don't update last_nonmenu_event; it continues to hold the mouse
9733 event that preceded the first level of menu. */
9734 if (!used_mouse_menu)
9735 last_nonmenu_event = key;
284f4730 9736
6321824f
RS
9737 /* Record what part of this_command_keys is the current key sequence. */
9738 this_single_command_key_start = this_command_key_count - t;
9739
4f4a84ec
SM
9740 /* Look for this sequence in input-decode-map.
9741 Scan from indec.end until we find a bound suffix. */
9742 while (indec.end < t)
9743 {
9744 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
9745 int done, diff;
9746
9747 GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
9748 done = keyremap_step (keybuf, bufsize, &indec, max (t, mock_input),
9749 1, &diff, prompt);
9750 UNGCPRO;
9751 if (done)
9752 {
9753 mock_input = diff + max (t, mock_input);
9754 goto replay_sequence;
9755 }
9756 }
9757
9758 if (first_binding < nmaps && NILP (submaps[first_binding])
9759 && indec.start >= t)
65e0fbbf 9760 /* There is a binding and it's not a prefix.
4f4a84ec 9761 (and it doesn't have any input-decode-map translation pending).
65e0fbbf
SM
9762 There is thus no function-key in this sequence.
9763 Moving fkey.start is important in this case to allow keytran.start
9764 to go over the sequence before we return (since we keep the
9765 invariant that keytran.end <= fkey.start). */
9766 {
a7f26f28 9767 if (fkey.start < t)
24d80a06 9768 (fkey.start = fkey.end = t, fkey.map = fkey.parent);
65e0fbbf
SM
9769 }
9770 else
9771 /* If the sequence is unbound, see if we can hang a function key
9772 off the end of it. */
fe5b94c5 9773 /* Continue scan from fkey.end until we find a bound suffix. */
4f4a84ec 9774 while (fkey.end < indec.start)
a612e298 9775 {
4f4a84ec 9776 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
fe5b94c5
SM
9777 int done, diff;
9778
4f4a84ec 9779 GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
fe5b94c5
SM
9780 done = keyremap_step (keybuf, bufsize, &fkey,
9781 max (t, mock_input),
9782 /* If there's a binding (i.e.
9783 first_binding >= nmaps) we don't want
9784 to apply this function-key-mapping. */
9785 fkey.end + 1 == t && first_binding >= nmaps,
24d80a06 9786 &diff, prompt);
fe5b94c5
SM
9787 UNGCPRO;
9788 if (done)
a612e298 9789 {
fe5b94c5 9790 mock_input = diff + max (t, mock_input);
4f4a84ec
SM
9791 /* Adjust the input-decode-map counters. */
9792 indec.end += diff;
9793 indec.start += diff;
9794
a612e298
RS
9795 goto replay_sequence;
9796 }
fe5b94c5 9797 }
a612e298 9798
fe5b94c5
SM
9799 /* Look for this sequence in key-translation-map.
9800 Scan from keytran.end until we find a bound suffix. */
9801 while (keytran.end < fkey.start)
9802 {
4f4a84ec 9803 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
fe5b94c5 9804 int done, diff;
a612e298 9805
4f4a84ec 9806 GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
fe5b94c5 9807 done = keyremap_step (keybuf, bufsize, &keytran, max (t, mock_input),
24d80a06 9808 1, &diff, prompt);
fe5b94c5
SM
9809 UNGCPRO;
9810 if (done)
9811 {
9812 mock_input = diff + max (t, mock_input);
4f4a84ec
SM
9813 /* Adjust the function-key-map and input-decode-map counters. */
9814 indec.end += diff;
9815 indec.start += diff;
fe5b94c5
SM
9816 fkey.end += diff;
9817 fkey.start += diff;
6b61353c 9818
fe5b94c5
SM
9819 goto replay_sequence;
9820 }
9821 }
4e50f26a
RS
9822
9823 /* If KEY is not defined in any of the keymaps,
9824 and cannot be part of a function key or translation,
9825 and is an upper case letter
9826 use the corresponding lower-case letter instead. */
65e0fbbf 9827 if (first_binding >= nmaps
4f4a84ec 9828 && /* indec.start >= t && fkey.start >= t && */ keytran.start >= t
8c18cbfb 9829 && INTEGERP (key)
c23cad0b 9830 && ((CHARACTERP (make_number (XINT (key) & ~CHAR_MODIFIER_MASK))
16747e03 9831 && UPPERCASEP (XINT (key) & ~CHAR_MODIFIER_MASK))
4e50f26a
RS
9832 || (XINT (key) & shift_modifier)))
9833 {
569871d2 9834 Lisp_Object new_key;
569871d2 9835
309b0fc8
RS
9836 original_uppercase = key;
9837 original_uppercase_position = t - 1;
9838
831f35a2 9839 if (XINT (key) & shift_modifier)
569871d2 9840 XSETINT (new_key, XINT (key) & ~shift_modifier);
4e50f26a 9841 else
16747e03 9842 XSETINT (new_key, (DOWNCASE (XINT (key) & ~CHAR_MODIFIER_MASK)
a864f6d6 9843 | (XINT (key) & CHAR_MODIFIER_MASK)));
569871d2 9844
3fe8e9a2
RS
9845 /* We have to do this unconditionally, regardless of whether
9846 the lower-case char is defined in the keymaps, because they
9847 might get translated through function-key-map. */
9848 keybuf[t - 1] = new_key;
2cf4b7b2 9849 mock_input = max (t, mock_input);
025ae953 9850 shift_translated = 1;
3fe8e9a2
RS
9851
9852 goto replay_sequence;
4e50f26a 9853 }
ef8fd672
RS
9854 /* If KEY is not defined in any of the keymaps,
9855 and cannot be part of a function key or translation,
9856 and is a shifted function key,
9857 use the corresponding unshifted function key instead. */
65e0fbbf 9858 if (first_binding >= nmaps
21ec2c43 9859 && /* indec.start >= t && fkey.start >= t && */ keytran.start >= t)
ef8fd672 9860 {
21ec2c43
SM
9861 Lisp_Object breakdown = parse_modifiers (key);
9862 int modifiers
9863 = CONSP (breakdown) ? (XINT (XCAR (XCDR (breakdown)))) : 0;
9864
9865 if (modifiers & shift_modifier
9866 /* Treat uppercase keys as shifted. */
9867 || (INTEGERP (key)
87df3c32
SM
9868 && (KEY_TO_CHAR (key)
9869 < XCHAR_TABLE (current_buffer->downcase_table)->size)
21ec2c43 9870 && UPPERCASEP (KEY_TO_CHAR (key))))
ef8fd672 9871 {
21ec2c43
SM
9872 Lisp_Object new_key
9873 = (modifiers & shift_modifier
9874 ? apply_modifiers (modifiers & ~shift_modifier,
9875 XCAR (breakdown))
9876 : make_number (DOWNCASE (KEY_TO_CHAR (key)) | modifiers));
3fe8e9a2
RS
9877
9878 original_uppercase = key;
9879 original_uppercase_position = t - 1;
ef8fd672 9880
21ec2c43
SM
9881 /* We have to do this unconditionally, regardless of whether
9882 the lower-case char is defined in the keymaps, because they
9883 might get translated through function-key-map. */
3fe8e9a2 9884 keybuf[t - 1] = new_key;
2cf4b7b2 9885 mock_input = max (t, mock_input);
21ec2c43
SM
9886 /* Reset fkey (and consequently keytran) to apply
9887 function-key-map on the result, so that S-backspace is
9888 correctly mapped to DEL (via backspace). OTOH,
9889 input-decode-map doesn't need to go through it again. */
9890 fkey.start = fkey.end = 0;
9891 keytran.start = keytran.end = 0;
025ae953 9892 shift_translated = 1;
21ec2c43 9893
3fe8e9a2 9894 goto replay_sequence;
ef8fd672
RS
9895 }
9896 }
284f4730 9897 }
309b0fc8 9898 if (!dummyflag)
bc536d84
RS
9899 read_key_sequence_cmd = (first_binding < nmaps
9900 ? defs[first_binding]
9901 : Qnil);
284f4730 9902
cd21b839 9903 unread_switch_frame = delayed_switch_frame;
f4255cd1 9904 unbind_to (count, Qnil);
07f76a14 9905
3fe8e9a2
RS
9906 /* Don't downcase the last character if the caller says don't.
9907 Don't downcase it if the result is undefined, either. */
9908 if ((dont_downcase_last || first_binding >= nmaps)
a53fe666 9909 && t > 0
3fe8e9a2 9910 && t - 1 == original_uppercase_position)
025ae953
CY
9911 {
9912 keybuf[t - 1] = original_uppercase;
9913 shift_translated = 0;
9914 }
9915
9916 if (shift_translated)
9917 Vthis_command_keys_shift_translated = Qt;
309b0fc8 9918
07f76a14
JB
9919 /* Occasionally we fabricate events, perhaps by expanding something
9920 according to function-key-map, or by adding a prefix symbol to a
9921 mouse click in the scroll bar or modeline. In this cases, return
9922 the entire generated key sequence, even if we hit an unbound
9923 prefix or a definition before the end. This means that you will
9924 be able to push back the event properly, and also means that
9925 read-key-sequence will always return a logical unit.
9926
9927 Better ideas? */
cca310da
JB
9928 for (; t < mock_input; t++)
9929 {
f2647d04
DL
9930 if ((FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
9931 && NILP (Fzerop (Vecho_keystrokes)))
a98ea3f9 9932 echo_char (keybuf[t]);
cca310da
JB
9933 add_command_key (keybuf[t]);
9934 }
07f76a14 9935
2dc00208 9936 UNGCPRO;
284f4730
JB
9937 return t;
9938}
9939
d5eecefb 9940DEFUN ("read-key-sequence", Fread_key_sequence, Sread_key_sequence, 1, 5, 0,
4707d2d0
PJ
9941 doc: /* Read a sequence of keystrokes and return as a string or vector.
9942The sequence is sufficient to specify a non-prefix command in the
9943current local and global maps.
9944
9945First arg PROMPT is a prompt string. If nil, do not prompt specially.
9946Second (optional) arg CONTINUE-ECHO, if non-nil, means this key echos
9947as a continuation of the previous key.
9948
9949The third (optional) arg DONT-DOWNCASE-LAST, if non-nil, means do not
9950convert the last event to lower case. (Normally any upper case event
9951is converted to lower case if the original event is undefined and the lower
9952case equivalent is defined.) A non-nil value is appropriate for reading
9953a key sequence to be defined.
9954
9955A C-g typed while in this function is treated like any other character,
9956and `quit-flag' is not set.
9957
9958If the key sequence starts with a mouse click, then the sequence is read
9959using the keymaps of the buffer of the window clicked in, not the buffer
9960of the selected window as normal.
9961
9962`read-key-sequence' drops unbound button-down events, since you normally
9963only care about the click or drag events which follow them. If a drag
9964or multi-click event is unbound, but the corresponding click event would
9965be bound, `read-key-sequence' turns the event into a click event at the
9966drag's starting position. This means that you don't have to distinguish
9967between click and drag, double, or triple events unless you want to.
9968
9969`read-key-sequence' prefixes mouse events on mode lines, the vertical
9970lines separating windows, and scroll bars with imaginary keys
9971`mode-line', `vertical-line', and `vertical-scroll-bar'.
9972
9973Optional fourth argument CAN-RETURN-SWITCH-FRAME non-nil means that this
9974function will process a switch-frame event if the user switches frames
9975before typing anything. If the user switches frames in the middle of a
9976key sequence, or at the start of the sequence but CAN-RETURN-SWITCH-FRAME
9977is nil, then the event will be put off until after the current key sequence.
9978
9979`read-key-sequence' checks `function-key-map' for function key
9980sequences, where they wouldn't conflict with ordinary bindings. See
9981`function-key-map' for more details.
9982
9983The optional fifth argument COMMAND-LOOP, if non-nil, means
9984that this key sequence is being read by something that will
9985read commands one after another. It should be nil if the caller
9986will read just one key sequence. */)
5842a27b 9987 (Lisp_Object prompt, Lisp_Object continue_echo, Lisp_Object dont_downcase_last, Lisp_Object can_return_switch_frame, Lisp_Object command_loop)
284f4730
JB
9988{
9989 Lisp_Object keybuf[30];
9990 register int i;
03cee6ae 9991 struct gcpro gcpro1;
aed13378 9992 int count = SPECPDL_INDEX ();
284f4730
JB
9993
9994 if (!NILP (prompt))
b7826503 9995 CHECK_STRING (prompt);
284f4730
JB
9996 QUIT;
9997
d5eecefb
RS
9998 specbind (Qinput_method_exit_on_first_char,
9999 (NILP (command_loop) ? Qt : Qnil));
10000 specbind (Qinput_method_use_echo_area,
10001 (NILP (command_loop) ? Qt : Qnil));
10002
72af86bd 10003 memset (keybuf, 0, sizeof keybuf);
284f4730
JB
10004 GCPRO1 (keybuf[0]);
10005 gcpro1.nvars = (sizeof keybuf/sizeof (keybuf[0]));
10006
daa37602 10007 if (NILP (continue_echo))
6321824f
RS
10008 {
10009 this_command_key_count = 0;
63020c46 10010 this_command_key_count_reset = 0;
6321824f
RS
10011 this_single_command_key_start = 0;
10012 }
c0a58692 10013
d148e14d 10014#ifdef HAVE_WINDOW_SYSTEM
526a058f
GM
10015 if (display_hourglass_p)
10016 cancel_hourglass ();
d0c48478
GM
10017#endif
10018
309b0fc8 10019 i = read_key_sequence (keybuf, (sizeof keybuf/sizeof (keybuf[0])),
ce98e608 10020 prompt, ! NILP (dont_downcase_last),
f571ae0d 10021 ! NILP (can_return_switch_frame), 0);
284f4730 10022
ae18aa3b 10023#if 0 /* The following is fine for code reading a key sequence and
f95c4fe5 10024 then proceeding with a lenghty computation, but it's not good
ae18aa3b 10025 for code reading keys in a loop, like an input method. */
d148e14d 10026#ifdef HAVE_WINDOW_SYSTEM
526a058f
GM
10027 if (display_hourglass_p)
10028 start_hourglass ();
ae18aa3b 10029#endif
d0c48478
GM
10030#endif
10031
dcc408a0
RS
10032 if (i == -1)
10033 {
10034 Vquit_flag = Qt;
10035 QUIT;
10036 }
284f4730 10037 UNGCPRO;
d5eecefb 10038 return unbind_to (count, make_event_array (i, keybuf));
284f4730 10039}
e39da3d7
RS
10040
10041DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,
d5eecefb 10042 Sread_key_sequence_vector, 1, 5, 0,
4707d2d0 10043 doc: /* Like `read-key-sequence' but always return a vector. */)
5842a27b 10044 (Lisp_Object prompt, Lisp_Object continue_echo, Lisp_Object dont_downcase_last, Lisp_Object can_return_switch_frame, Lisp_Object command_loop)
e39da3d7
RS
10045{
10046 Lisp_Object keybuf[30];
10047 register int i;
03cee6ae 10048 struct gcpro gcpro1;
aed13378 10049 int count = SPECPDL_INDEX ();
e39da3d7
RS
10050
10051 if (!NILP (prompt))
b7826503 10052 CHECK_STRING (prompt);
e39da3d7
RS
10053 QUIT;
10054
d5eecefb
RS
10055 specbind (Qinput_method_exit_on_first_char,
10056 (NILP (command_loop) ? Qt : Qnil));
10057 specbind (Qinput_method_use_echo_area,
10058 (NILP (command_loop) ? Qt : Qnil));
10059
72af86bd 10060 memset (keybuf, 0, sizeof keybuf);
e39da3d7
RS
10061 GCPRO1 (keybuf[0]);
10062 gcpro1.nvars = (sizeof keybuf/sizeof (keybuf[0]));
10063
10064 if (NILP (continue_echo))
10065 {
10066 this_command_key_count = 0;
63020c46 10067 this_command_key_count_reset = 0;
e39da3d7
RS
10068 this_single_command_key_start = 0;
10069 }
10070
d148e14d 10071#ifdef HAVE_WINDOW_SYSTEM
526a058f
GM
10072 if (display_hourglass_p)
10073 cancel_hourglass ();
d0c48478
GM
10074#endif
10075
e39da3d7
RS
10076 i = read_key_sequence (keybuf, (sizeof keybuf/sizeof (keybuf[0])),
10077 prompt, ! NILP (dont_downcase_last),
10078 ! NILP (can_return_switch_frame), 0);
10079
d148e14d 10080#ifdef HAVE_WINDOW_SYSTEM
526a058f
GM
10081 if (display_hourglass_p)
10082 start_hourglass ();
d0c48478
GM
10083#endif
10084
e39da3d7
RS
10085 if (i == -1)
10086 {
10087 Vquit_flag = Qt;
10088 QUIT;
10089 }
10090 UNGCPRO;
d5eecefb 10091 return unbind_to (count, Fvector (i, keybuf));
e39da3d7 10092}
284f4730 10093\f
158f7532 10094DEFUN ("command-execute", Fcommand_execute, Scommand_execute, 1, 4, 0,
4707d2d0
PJ
10095 doc: /* Execute CMD as an editor command.
10096CMD must be a symbol that satisfies the `commandp' predicate.
10097Optional second arg RECORD-FLAG non-nil
10098means unconditionally put this command in `command-history'.
10099Otherwise, that is done only if an arg is read using the minibuffer.
10100The argument KEYS specifies the value to use instead of (this-command-keys)
10101when reading the arguments; if it is nil, (this-command-keys) is used.
10102The argument SPECIAL, if non-nil, means that this command is executing
10103a special event, so ignore the prefix argument and don't clear it. */)
5842a27b 10104 (Lisp_Object cmd, Lisp_Object record_flag, Lisp_Object keys, Lisp_Object special)
284f4730
JB
10105{
10106 register Lisp_Object final;
10107 register Lisp_Object tem;
10108 Lisp_Object prefixarg;
284f4730 10109
284f4730
JB
10110 debug_on_next_call = 0;
10111
158f7532
RS
10112 if (NILP (special))
10113 {
10114 prefixarg = current_kboard->Vprefix_arg;
10115 Vcurrent_prefix_arg = prefixarg;
10116 current_kboard->Vprefix_arg = Qnil;
10117 }
10118 else
10119 prefixarg = Qnil;
10120
8c18cbfb 10121 if (SYMBOLP (cmd))
284f4730
JB
10122 {
10123 tem = Fget (cmd, Qdisabled);
88ce066e 10124 if (!NILP (tem) && !NILP (Vrun_hooks))
b78ce8fb 10125 {
971e4c98 10126 tem = Fsymbol_value (Qdisabled_command_function);
b78ce8fb 10127 if (!NILP (tem))
971e4c98 10128 return call1 (Vrun_hooks, Qdisabled_command_function);
b78ce8fb 10129 }
284f4730
JB
10130 }
10131
01e26217 10132 while (1)
284f4730 10133 {
a7f96a35 10134 final = Findirect_function (cmd, Qnil);
284f4730
JB
10135
10136 if (CONSP (final) && (tem = Fcar (final), EQ (tem, Qautoload)))
b516a185
RS
10137 {
10138 struct gcpro gcpro1, gcpro2;
10139
10140 GCPRO2 (cmd, prefixarg);
10141 do_autoload (final, cmd);
10142 UNGCPRO;
10143 }
284f4730
JB
10144 else
10145 break;
10146 }
10147
8c18cbfb 10148 if (STRINGP (final) || VECTORP (final))
284f4730
JB
10149 {
10150 /* If requested, place the macro in the command history. For
10151 other sorts of commands, call-interactively takes care of
10152 this. */
e57d8fd8 10153 if (!NILP (record_flag))
f4385381
RS
10154 {
10155 Vcommand_history
10156 = Fcons (Fcons (Qexecute_kbd_macro,
10157 Fcons (final, Fcons (prefixarg, Qnil))),
10158 Vcommand_history);
10159
10160 /* Don't keep command history around forever. */
10161 if (NUMBERP (Vhistory_length) && XINT (Vhistory_length) > 0)
10162 {
10163 tem = Fnthcdr (Vhistory_length, Vcommand_history);
10164 if (CONSP (tem))
f3fbd155 10165 XSETCDR (tem, Qnil);
f4385381
RS
10166 }
10167 }
284f4730 10168
caa06051 10169 return Fexecute_kbd_macro (final, prefixarg, Qnil);
284f4730 10170 }
f4385381 10171
8c18cbfb 10172 if (CONSP (final) || SUBRP (final) || COMPILEDP (final))
6d0867e5
SM
10173 /* Don't call Fcall_interactively directly because we want to make
10174 sure the backtrace has an entry for `call-interactively'.
10175 For the same reason, pass `cmd' rather than `final'. */
10176 return call3 (Qcall_interactively, cmd, record_flag, keys);
284f4730 10177
284f4730
JB
10178 return Qnil;
10179}
c970a760
GM
10180
10181
284f4730 10182\f
284f4730 10183DEFUN ("execute-extended-command", Fexecute_extended_command, Sexecute_extended_command,
4707d2d0 10184 1, 1, "P",
dfb4bff5
EZ
10185 doc: /* Read function name, then read its arguments and call it.
10186
10187To pass a numeric argument to the command you are invoking with, specify
10188the numeric argument to this command.
10189
10190Noninteractively, the argument PREFIXARG is the prefix argument to
10191give to the command you invoke, if it asks for an argument. */)
5842a27b 10192 (Lisp_Object prefixarg)
284f4730
JB
10193{
10194 Lisp_Object function;
41118bd3 10195 EMACS_INT saved_last_point_position;
2e1a49ad 10196 Lisp_Object saved_keys, saved_last_point_position_buffer;
5434fce6 10197 Lisp_Object bindings, value;
2e1a49ad 10198 struct gcpro gcpro1, gcpro2, gcpro3;
d148e14d 10199#ifdef HAVE_WINDOW_SYSTEM
7133b7ee 10200 /* The call to Fcompleting_read will start and cancel the hourglass,
a25e44b2
JD
10201 but if the hourglass was already scheduled, this means that no
10202 hourglass will be shown for the actual M-x command itself.
10203 So we restart it if it is already scheduled. Note that checking
10204 hourglass_shown_p is not enough, normally the hourglass is not shown,
10205 just scheduled to be shown. */
10206 int hstarted = hourglass_started ();
10207#endif
284f4730 10208
b0f2a7bf
KH
10209 saved_keys = Fvector (this_command_key_count,
10210 XVECTOR (this_command_keys)->contents);
2e1a49ad
SM
10211 saved_last_point_position_buffer = last_point_position_buffer;
10212 saved_last_point_position = last_point_position;
2e1a49ad 10213 GCPRO3 (saved_keys, prefixarg, saved_last_point_position_buffer);
284f4730 10214
7133b7ee 10215 function = call0 (intern ("read-extended-command"));
284f4730 10216
d148e14d 10217#ifdef HAVE_WINDOW_SYSTEM
a25e44b2
JD
10218 if (hstarted) start_hourglass ();
10219#endif
10220
d5db4077 10221 if (STRINGP (function) && SCHARS (function) == 0)
1f5b1641
RS
10222 error ("No command name given");
10223
1113d9db
JB
10224 /* Set this_command_keys to the concatenation of saved_keys and
10225 function, followed by a RET. */
284f4730 10226 {
b0f2a7bf 10227 Lisp_Object *keys;
284f4730 10228 int i;
284f4730 10229
1113d9db 10230 this_command_key_count = 0;
63020c46 10231 this_command_key_count_reset = 0;
6321824f 10232 this_single_command_key_start = 0;
1113d9db 10233
b0f2a7bf
KH
10234 keys = XVECTOR (saved_keys)->contents;
10235 for (i = 0; i < XVECTOR (saved_keys)->size; i++)
10236 add_command_key (keys[i]);
1113d9db 10237
1b049b51 10238 for (i = 0; i < SCHARS (function); i++)
301738ed 10239 add_command_key (Faref (function, make_number (i)));
1113d9db 10240
301738ed 10241 add_command_key (make_number ('\015'));
284f4730
JB
10242 }
10243
2e1a49ad
SM
10244 last_point_position = saved_last_point_position;
10245 last_point_position_buffer = saved_last_point_position_buffer;
10246
284f4730
JB
10247 UNGCPRO;
10248
0a7f1fc0 10249 function = Fintern (function, Qnil);
d8bcf58e 10250 current_kboard->Vprefix_arg = prefixarg;
d5eecefb
RS
10251 Vthis_command = function;
10252 real_this_command = function;
284f4730 10253
6526ab49
RS
10254 /* If enabled, show which key runs this command. */
10255 if (!NILP (Vsuggest_key_bindings)
ce0d2858 10256 && NILP (Vexecuting_kbd_macro)
6526ab49 10257 && SYMBOLP (function))
5434fce6 10258 bindings = Fwhere_is_internal (function, Voverriding_local_map,
8b9940e6 10259 Qt, Qnil, Qnil);
5434fce6
RS
10260 else
10261 bindings = Qnil;
6526ab49 10262
5434fce6 10263 value = Qnil;
6d0867e5 10264 GCPRO3 (bindings, value, function);
5434fce6 10265 value = Fcommand_execute (function, Qt, Qnil, Qnil);
6526ab49 10266
5434fce6 10267 /* If the command has a key binding, print it now. */
3ababa60 10268 if (!NILP (bindings)
ee112567
KH
10269 && ! (VECTORP (bindings) && EQ (Faref (bindings, make_number (0)),
10270 Qmouse_movement)))
5434fce6
RS
10271 {
10272 /* But first wait, and skip the message if there is input. */
7ba07a1a
CY
10273 Lisp_Object waited;
10274
666dc232
KS
10275 /* If this command displayed something in the echo area;
10276 wait a few seconds, then display our suggestion message. */
10277 if (NILP (echo_area_buffer[0]))
10278 waited = sit_for (make_number (0), 0, 2);
10279 else if (NUMBERP (Vsuggest_key_bindings))
2bcac766 10280 waited = sit_for (Vsuggest_key_bindings, 0, 2);
426939cc 10281 else
666dc232 10282 waited = sit_for (make_number (2), 0, 2);
426939cc 10283
7ba07a1a 10284 if (!NILP (waited) && ! CONSP (Vunread_command_events))
6526ab49 10285 {
5434fce6
RS
10286 Lisp_Object binding;
10287 char *newmessage;
985f9f66 10288 int message_p = push_message ();
331379bf 10289 int count = SPECPDL_INDEX ();
5434fce6 10290
65efd7da 10291 record_unwind_protect (pop_message_unwind, Qnil);
a1bfe073 10292 binding = Fkey_description (bindings, Qnil);
5434fce6
RS
10293
10294 newmessage
d5db4077
KR
10295 = (char *) alloca (SCHARS (SYMBOL_NAME (function))
10296 + SBYTES (binding)
5434fce6 10297 + 100);
3ababa60 10298 sprintf (newmessage, "You can run the command `%s' with %s",
d5db4077
KR
10299 SDATA (SYMBOL_NAME (function)),
10300 SDATA (binding));
301738ed
RS
10301 message2_nolog (newmessage,
10302 strlen (newmessage),
10303 STRING_MULTIBYTE (binding));
7ba07a1a 10304 if (NUMBERP (Vsuggest_key_bindings))
666dc232 10305 waited = sit_for (Vsuggest_key_bindings, 0, 2);
7ba07a1a 10306 else
666dc232 10307 waited = sit_for (make_number (2), 0, 2);
7ba07a1a
CY
10308
10309 if (!NILP (waited) && message_p)
985f9f66
GM
10310 restore_message ();
10311
c970a760 10312 unbind_to (count, Qnil);
6526ab49
RS
10313 }
10314 }
10315
5434fce6 10316 RETURN_UNGCPRO (value);
284f4730 10317}
6526ab49 10318
284f4730 10319\f
d9d4c147 10320/* Return nonzero if input events are pending. */
284f4730 10321
dfcf069d 10322int
d3da34e0 10323detect_input_pending (void)
284f4730
JB
10324{
10325 if (!input_pending)
d9d4c147
KH
10326 get_input_pending (&input_pending, 0);
10327
10328 return input_pending;
10329}
10330
a2d5fca0
JD
10331/* Return nonzero if input events other than mouse movements are
10332 pending. */
10333
10334int
d3da34e0 10335detect_input_pending_ignore_squeezables (void)
a2d5fca0
JD
10336{
10337 if (!input_pending)
10338 get_input_pending (&input_pending, READABLE_EVENTS_IGNORE_SQUEEZABLES);
10339
10340 return input_pending;
10341}
10342
b1878f45 10343/* Return nonzero if input events are pending, and run any pending timers. */
d9d4c147 10344
dfcf069d 10345int
d3da34e0 10346detect_input_pending_run_timers (int do_display)
d9d4c147 10347{
87dd9b9b
RS
10348 int old_timers_run = timers_run;
10349
d9d4c147 10350 if (!input_pending)
a2d5fca0 10351 get_input_pending (&input_pending, READABLE_EVENTS_DO_TIMERS_NOW);
284f4730 10352
87dd9b9b 10353 if (old_timers_run != timers_run && do_display)
7ee32cda 10354 {
3007ebfb 10355 redisplay_preserve_echo_area (8);
7ee32cda
GM
10356 /* The following fixes a bug when using lazy-lock with
10357 lazy-lock-defer-on-the-fly set to t, i.e. when fontifying
10358 from an idle timer function. The symptom of the bug is that
10359 the cursor sometimes doesn't become visible until the next X
10360 event is processed. --gerd. */
fa971ac3
KL
10361 {
10362 Lisp_Object tail, frame;
10363 FOR_EACH_FRAME (tail, frame)
10364 if (FRAME_RIF (XFRAME (frame)))
10365 FRAME_RIF (XFRAME (frame))->flush_display (XFRAME (frame));
10366 }
7ee32cda 10367 }
87dd9b9b 10368
284f4730
JB
10369 return input_pending;
10370}
10371
ffd56f97
JB
10372/* This is called in some cases before a possible quit.
10373 It cases the next call to detect_input_pending to recompute input_pending.
10374 So calling this function unnecessarily can't do any harm. */
07a59269
KH
10375
10376void
d3da34e0 10377clear_input_pending (void)
ffd56f97
JB
10378{
10379 input_pending = 0;
10380}
10381
b1878f45 10382/* Return nonzero if there are pending requeued events.
d64b707c 10383 This isn't used yet. The hope is to make wait_reading_process_output
27fd22dc 10384 call it, and return if it runs Lisp code that unreads something.
b1878f45
RS
10385 The problem is, kbd_buffer_get_event needs to be fixed to know what
10386 to do in that case. It isn't trivial. */
10387
dfcf069d 10388int
d3da34e0 10389requeued_events_pending_p (void)
b1878f45
RS
10390{
10391 return (!NILP (Vunread_command_events) || unread_command_char != -1);
10392}
10393
10394
284f4730 10395DEFUN ("input-pending-p", Finput_pending_p, Sinput_pending_p, 0, 0, 0,
a064684d
RS
10396 doc: /* Return t if command input is currently available with no wait.
10397Actually, the value is nil only if we can be sure that no input is available;
10398if there is a doubt, the value is t. */)
5842a27b 10399 (void)
284f4730 10400{
182f67de
KS
10401 if (!NILP (Vunread_command_events) || unread_command_char != -1
10402 || !NILP (Vunread_post_input_method_events)
10403 || !NILP (Vunread_input_method_events))
284f4730
JB
10404 return (Qt);
10405
a2d5fca0
JD
10406 get_input_pending (&input_pending,
10407 READABLE_EVENTS_DO_TIMERS_NOW
10408 | READABLE_EVENTS_FILTER_EVENTS);
d9d4c147 10409 return input_pending > 0 ? Qt : Qnil;
284f4730
JB
10410}
10411
10412DEFUN ("recent-keys", Frecent_keys, Srecent_keys, 0, 0, 0,
0721f230 10413 doc: /* Return vector of last 300 events, not counting those from keyboard macros. */)
5842a27b 10414 (void)
284f4730 10415{
5160df46 10416 Lisp_Object *keys = XVECTOR (recent_keys)->contents;
284f4730
JB
10417 Lisp_Object val;
10418
10419 if (total_keys < NUM_RECENT_KEYS)
5160df46 10420 return Fvector (total_keys, keys);
284f4730
JB
10421 else
10422 {
5160df46 10423 val = Fvector (NUM_RECENT_KEYS, keys);
72af86bd
AS
10424 memcpy (XVECTOR (val)->contents, keys + recent_keys_index,
10425 (NUM_RECENT_KEYS - recent_keys_index) * sizeof (Lisp_Object));
10426 memcpy (XVECTOR (val)->contents + NUM_RECENT_KEYS - recent_keys_index,
10427 keys, recent_keys_index * sizeof (Lisp_Object));
284f4730
JB
10428 return val;
10429 }
10430}
10431
10432DEFUN ("this-command-keys", Fthis_command_keys, Sthis_command_keys, 0, 0, 0,
4707d2d0 10433 doc: /* Return the key sequence that invoked this command.
92501652 10434However, if the command has called `read-key-sequence', it returns
4052e7bb 10435the last key sequence that has been read.
65849ada
EZ
10436The value is a string or a vector.
10437
10438See also `this-command-keys-vector'. */)
5842a27b 10439 (void)
284f4730 10440{
86e5706b
RS
10441 return make_event_array (this_command_key_count,
10442 XVECTOR (this_command_keys)->contents);
284f4730
JB
10443}
10444
e39da3d7 10445DEFUN ("this-command-keys-vector", Fthis_command_keys_vector, Sthis_command_keys_vector, 0, 0, 0,
92501652
RS
10446 doc: /* Return the key sequence that invoked this command, as a vector.
10447However, if the command has called `read-key-sequence', it returns
65849ada
EZ
10448the last key sequence that has been read.
10449
10450See also `this-command-keys'. */)
5842a27b 10451 (void)
e39da3d7
RS
10452{
10453 return Fvector (this_command_key_count,
10454 XVECTOR (this_command_keys)->contents);
10455}
10456
6321824f
RS
10457DEFUN ("this-single-command-keys", Fthis_single_command_keys,
10458 Sthis_single_command_keys, 0, 0, 0,
4707d2d0 10459 doc: /* Return the key sequence that invoked this command.
92501652
RS
10460More generally, it returns the last key sequence read, either by
10461the command loop or by `read-key-sequence'.
4707d2d0
PJ
10462Unlike `this-command-keys', this function's value
10463does not include prefix arguments.
10464The value is always a vector. */)
5842a27b 10465 (void)
6321824f 10466{
e39da3d7
RS
10467 return Fvector (this_command_key_count
10468 - this_single_command_key_start,
10469 (XVECTOR (this_command_keys)->contents
10470 + this_single_command_key_start));
6321824f
RS
10471}
10472
7d18f9ae
RS
10473DEFUN ("this-single-command-raw-keys", Fthis_single_command_raw_keys,
10474 Sthis_single_command_raw_keys, 0, 0, 0,
4707d2d0 10475 doc: /* Return the raw events that were read for this command.
92501652
RS
10476More generally, it returns the last key sequence read, either by
10477the command loop or by `read-key-sequence'.
4707d2d0
PJ
10478Unlike `this-single-command-keys', this function's value
10479shows the events before all translations (except for input methods).
10480The value is always a vector. */)
5842a27b 10481 (void)
7d18f9ae
RS
10482{
10483 return Fvector (raw_keybuf_count,
10484 (XVECTOR (raw_keybuf)->contents));
10485}
10486
71918b75 10487DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,
4707d2d0 10488 Sreset_this_command_lengths, 0, 0, 0,
63020c46
RS
10489 doc: /* Make the unread events replace the last command and echo.
10490Used in `universal-argument-other-key'.
4707d2d0
PJ
10491
10492`universal-argument-other-key' rereads the event just typed.
10493It then gets translated through `function-key-map'.
63020c46
RS
10494The translated event has to replace the real events,
10495both in the value of (this-command-keys) and in echoing.
10496To achieve this, `universal-argument-other-key' calls
10497`reset-this-command-lengths', which discards the record of reading
10498these events the first time. */)
5842a27b 10499 (void)
71918b75 10500{
22b94eeb
RS
10501 this_command_key_count = before_command_key_count;
10502 if (this_command_key_count < this_single_command_key_start)
10503 this_single_command_key_start = this_command_key_count;
63020c46 10504
22b94eeb
RS
10505 echo_truncate (before_command_echo_length);
10506
63020c46
RS
10507 /* Cause whatever we put into unread-command-events
10508 to echo as if it were being freshly read from the keyboard. */
10509 this_command_key_count_reset = 1;
10510
6e5742a0 10511 return Qnil;
71918b75
RS
10512}
10513
82e6e5af 10514DEFUN ("clear-this-command-keys", Fclear_this_command_keys,
ab1959fc 10515 Sclear_this_command_keys, 0, 1, 0,
4707d2d0 10516 doc: /* Clear out the vector that `this-command-keys' returns.
ab1959fc
KS
10517Also clear the record of the last 100 events, unless optional arg
10518KEEP-RECORD is non-nil. */)
5842a27b 10519 (Lisp_Object keep_record)
82e6e5af 10520{
fb0dde6c 10521 int i;
c60ee5e7 10522
82e6e5af 10523 this_command_key_count = 0;
63020c46 10524 this_command_key_count_reset = 0;
fb0dde6c 10525
ab1959fc
KS
10526 if (NILP (keep_record))
10527 {
10528 for (i = 0; i < XVECTOR (recent_keys)->size; ++i)
10529 XVECTOR (recent_keys)->contents[i] = Qnil;
10530 total_keys = 0;
10531 recent_keys_index = 0;
10532 }
82e6e5af
RS
10533 return Qnil;
10534}
10535
284f4730 10536DEFUN ("recursion-depth", Frecursion_depth, Srecursion_depth, 0, 0, 0,
4707d2d0 10537 doc: /* Return the current depth in recursive edits. */)
5842a27b 10538 (void)
284f4730
JB
10539{
10540 Lisp_Object temp;
bb9e9bed 10541 XSETFASTINT (temp, command_loop_level + minibuf_level);
284f4730
JB
10542 return temp;
10543}
10544
10545DEFUN ("open-dribble-file", Fopen_dribble_file, Sopen_dribble_file, 1, 1,
4707d2d0
PJ
10546 "FOpen dribble file: ",
10547 doc: /* Start writing all keyboard characters to a dribble file called FILE.
10548If FILE is nil, close any open dribble file. */)
5842a27b 10549 (Lisp_Object file)
284f4730 10550{
6cb52def 10551 if (dribble)
284f4730 10552 {
34f5c10f 10553 BLOCK_INPUT;
6cb52def 10554 fclose (dribble);
34f5c10f 10555 UNBLOCK_INPUT;
6cb52def 10556 dribble = 0;
284f4730 10557 }
6cb52def 10558 if (!NILP (file))
284f4730
JB
10559 {
10560 file = Fexpand_file_name (file, Qnil);
d5db4077 10561 dribble = fopen (SDATA (file), "w");
ab6ca1de
KH
10562 if (dribble == 0)
10563 report_file_error ("Opening dribble", Fcons (file, Qnil));
284f4730
JB
10564 }
10565 return Qnil;
10566}
10567
10568DEFUN ("discard-input", Fdiscard_input, Sdiscard_input, 0, 0, 0,
4707d2d0 10569 doc: /* Discard the contents of the terminal input buffer.
2b17d5ed 10570Also end any kbd macro being defined. */)
5842a27b 10571 (void)
284f4730 10572{
2b17d5ed
KS
10573 if (!NILP (current_kboard->defining_kbd_macro))
10574 {
10575 /* Discard the last command from the macro. */
10576 Fcancel_kbd_macro_events ();
10577 end_kbd_macro ();
10578 }
10579
284f4730
JB
10580 update_mode_lines++;
10581
24597608 10582 Vunread_command_events = Qnil;
86e5706b 10583 unread_command_char = -1;
284f4730
JB
10584
10585 discard_tty_input ();
10586
7ee32cda 10587 kbd_fetch_ptr = kbd_store_ptr;
284f4730
JB
10588 input_pending = 0;
10589
10590 return Qnil;
10591}
10592\f
10593DEFUN ("suspend-emacs", Fsuspend_emacs, Ssuspend_emacs, 0, 1, "",
4707d2d0
PJ
10594 doc: /* Stop Emacs and return to superior process. You can resume later.
10595If `cannot-suspend' is non-nil, or if the system doesn't support job
10596control, run a subshell instead.
10597
10598If optional arg STUFFSTRING is non-nil, its characters are stuffed
10599to be read as terminal input by Emacs's parent, after suspension.
10600
10601Before suspending, run the normal hook `suspend-hook'.
10602After resumption run the normal hook `suspend-resume-hook'.
10603
10604Some operating systems cannot stop the Emacs process and resume it later.
10605On such systems, Emacs starts a subshell instead of suspending. */)
5842a27b 10606 (Lisp_Object stuffstring)
284f4730 10607{
aed13378 10608 int count = SPECPDL_INDEX ();
284f4730
JB
10609 int old_height, old_width;
10610 int width, height;
03cee6ae 10611 struct gcpro gcpro1;
284f4730 10612
9628b887 10613 if (tty_list && tty_list->next)
4a933ef8 10614 error ("There are other tty frames open; close them before suspending Emacs");
3b7fbceb 10615
284f4730 10616 if (!NILP (stuffstring))
b7826503 10617 CHECK_STRING (stuffstring);
284f4730 10618
1e95ed28
JB
10619 /* Run the functions in suspend-hook. */
10620 if (!NILP (Vrun_hooks))
10621 call1 (Vrun_hooks, intern ("suspend-hook"));
284f4730 10622
b7d2ebbf 10623 GCPRO1 (stuffstring);
0b0d3e0b 10624 get_tty_size (fileno (CURTTY ()->input), &old_width, &old_height);
28d440ab 10625 reset_all_sys_modes ();
284f4730
JB
10626 /* sys_suspend can get an error if it tries to fork a subshell
10627 and the system resources aren't available for that. */
f57e2426 10628 record_unwind_protect ((Lisp_Object (*) (Lisp_Object)) init_all_sys_modes,
d52a7a92 10629 Qnil);
284f4730 10630 stuff_buffered_input (stuffstring);
8026024c
KH
10631 if (cannot_suspend)
10632 sys_subshell ();
10633 else
10634 sys_suspend ();
284f4730
JB
10635 unbind_to (count, Qnil);
10636
10637 /* Check if terminal/window size has changed.
10638 Note that this is not useful when we are running directly
10639 with a window system; but suspend should be disabled in that case. */
0b0d3e0b 10640 get_tty_size (fileno (CURTTY ()->input), &width, &height);
284f4730 10641 if (width != old_width || height != old_height)
788f89eb 10642 change_frame_size (SELECTED_FRAME (), height, width, 0, 0, 0);
284f4730 10643
1e95ed28 10644 /* Run suspend-resume-hook. */
284f4730
JB
10645 if (!NILP (Vrun_hooks))
10646 call1 (Vrun_hooks, intern ("suspend-resume-hook"));
df0f2ba1 10647
284f4730
JB
10648 UNGCPRO;
10649 return Qnil;
10650}
10651
10652/* If STUFFSTRING is a string, stuff its contents as pending terminal input.
eb8c3be9 10653 Then in any case stuff anything Emacs has read ahead and not used. */
284f4730 10654
07a59269 10655void
d3da34e0 10656stuff_buffered_input (Lisp_Object stuffstring)
284f4730 10657{
0c1c1b93 10658#ifdef SIGTSTP /* stuff_char is defined if SIGTSTP. */
612b78ef 10659 register unsigned char *p;
612b78ef 10660
8c18cbfb 10661 if (STRINGP (stuffstring))
284f4730 10662 {
41118bd3 10663 register EMACS_INT count;
284f4730 10664
d5db4077
KR
10665 p = SDATA (stuffstring);
10666 count = SBYTES (stuffstring);
284f4730
JB
10667 while (count-- > 0)
10668 stuff_char (*p++);
10669 stuff_char ('\n');
10670 }
c60ee5e7 10671
284f4730 10672 /* Anything we have read ahead, put back for the shell to read. */
beecf6a1 10673 /* ?? What should this do when we have multiple keyboards??
0c1c1b93 10674 Should we ignore anything that was typed in at the "wrong" kboard?
26503ad2 10675
0c1c1b93
RS
10676 rms: we should stuff everything back into the kboard
10677 it came from. */
beecf6a1 10678 for (; kbd_fetch_ptr != kbd_store_ptr; kbd_fetch_ptr++)
284f4730 10679 {
c60ee5e7 10680
beecf6a1
KH
10681 if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
10682 kbd_fetch_ptr = kbd_buffer;
3b8f9651 10683 if (kbd_fetch_ptr->kind == ASCII_KEYSTROKE_EVENT)
beecf6a1 10684 stuff_char (kbd_fetch_ptr->code);
c60ee5e7 10685
6b61353c 10686 clear_event (kbd_fetch_ptr);
284f4730 10687 }
c60ee5e7 10688
284f4730 10689 input_pending = 0;
0c1c1b93 10690#endif /* SIGTSTP */
284f4730
JB
10691}
10692\f
dfcf069d 10693void
d3da34e0 10694set_waiting_for_input (struct timeval *time_to_clear)
284f4730 10695{
ffd56f97 10696 input_available_clear_time = time_to_clear;
284f4730 10697
114a8b8c 10698 /* Tell handle_interrupt to throw back to read_char, */
284f4730
JB
10699 waiting_for_input = 1;
10700
114a8b8c 10701 /* If handle_interrupt was called before and buffered a C-g,
284f4730
JB
10702 make it run again now, to avoid timing error. */
10703 if (!NILP (Vquit_flag))
10704 quit_throw_to_read_char ();
284f4730
JB
10705}
10706
07a59269 10707void
d3da34e0 10708clear_waiting_for_input (void)
284f4730 10709{
114a8b8c 10710 /* Tell handle_interrupt not to throw back to read_char, */
284f4730 10711 waiting_for_input = 0;
ffd56f97 10712 input_available_clear_time = 0;
284f4730
JB
10713}
10714
da8e1115 10715/* The SIGINT handler.
284f4730 10716
e72cf5ee
KL
10717 If we have a frame on the controlling tty, we assume that the
10718 SIGINT was generated by C-g, so we call handle_interrupt.
10719 Otherwise, the handler kills Emacs. */
284f4730 10720
14e40288 10721static SIGTYPE
d3da34e0
JB
10722interrupt_signal (int signalnum) /* If we don't have an argument, some */
10723 /* compilers complain in signal calls. */
284f4730 10724{
284f4730
JB
10725 /* Must preserve main program's value of errno. */
10726 int old_errno = errno;
6ed8eeff 10727 struct terminal *terminal;
284f4730 10728
333f1b6f 10729 SIGNAL_THREAD_CHECK (signalnum);
e72cf5ee 10730
6ed8eeff 10731 /* See if we have an active terminal on our controlling tty. */
fdf5ebde 10732 terminal = get_named_tty ("/dev/tty");
6ed8eeff 10733 if (!terminal)
3224dac1 10734 {
4ca927b4
KL
10735 /* If there are no frames there, let's pretend that we are a
10736 well-behaving UN*X program and quit. */
b3e6f69c 10737 Fkill_emacs (Qnil);
3224dac1 10738 }
4ca927b4
KL
10739 else
10740 {
10741 /* Otherwise, the SIGINT was probably generated by C-g. */
3b7fbceb 10742
4ca927b4
KL
10743 /* Set internal_last_event_frame to the top frame of the
10744 controlling tty, if we have a frame there. We disable the
10745 interrupt key on secondary ttys, so the SIGINT must have come
10746 from the controlling tty. */
6ed8eeff 10747 internal_last_event_frame = terminal->display_info.tty->top_frame;
4ca927b4
KL
10748
10749 handle_interrupt ();
4ca927b4 10750 }
114a8b8c
KL
10751
10752 errno = old_errno;
10753}
10754
da8e1115 10755/* This routine is called at interrupt level in response to C-g.
3b7fbceb 10756
da8e1115
KL
10757 It is called from the SIGINT handler or kbd_buffer_store_event.
10758
10759 If `waiting_for_input' is non zero, then unless `echoing' is
10760 nonzero, immediately throw back to read_char.
10761
10762 Otherwise it sets the Lisp variable quit-flag not-nil. This causes
10763 eval to throw, when it gets a chance. If quit-flag is already
10764 non-nil, it stops the job right away. */
114a8b8c 10765
114a8b8c 10766static void
d3da34e0 10767handle_interrupt (void)
114a8b8c 10768{
3b7fbceb 10769 char c;
114a8b8c 10770
284f4730
JB
10771 cancel_echoing ();
10772
3224dac1 10773 /* XXX This code needs to be revised for multi-tty support. */
d44004c0 10774 if (!NILP (Vquit_flag) && get_named_tty ("/dev/tty"))
284f4730 10775 {
31e4e97b
EZ
10776 /* If SIGINT isn't blocked, don't let us be interrupted by
10777 another SIGINT, it might be harmful due to non-reentrancy
10778 in I/O functions. */
10779 sigblock (sigmask (SIGINT));
10780
284f4730 10781 fflush (stdout);
28d440ab 10782 reset_all_sys_modes ();
31e4e97b 10783
284f4730
JB
10784#ifdef SIGTSTP /* Support possible in later USG versions */
10785/*
10786 * On systems which can suspend the current process and return to the original
10787 * shell, this command causes the user to end up back at the shell.
10788 * The "Auto-save" and "Abort" questions are not asked until
10789 * the user elects to return to emacs, at which point he can save the current
10790 * job and either dump core or continue.
10791 */
10792 sys_suspend ();
10793#else
284f4730
JB
10794 /* Perhaps should really fork an inferior shell?
10795 But that would not provide any way to get back
10796 to the original shell, ever. */
10797 printf ("No support for stopping a process on this operating system;\n");
10798 printf ("you can continue or abort.\n");
284f4730 10799#endif /* not SIGTSTP */
80e4aa30
RS
10800#ifdef MSDOS
10801 /* We must remain inside the screen area when the internal terminal
10802 is used. Note that [Enter] is not echoed by dos. */
cb22456d 10803 cursor_to (SELECTED_FRAME (), 0, 0);
80e4aa30 10804#endif
118d6ca9
RS
10805 /* It doesn't work to autosave while GC is in progress;
10806 the code used for auto-saving doesn't cope with the mark bit. */
10807 if (!gc_in_progress)
9fd7d808 10808 {
118d6ca9
RS
10809 printf ("Auto-save? (y or n) ");
10810 fflush (stdout);
10811 if (((c = getchar ()) & ~040) == 'Y')
10812 {
10813 Fdo_auto_save (Qt, Qnil);
80e4aa30 10814#ifdef MSDOS
118d6ca9 10815 printf ("\r\nAuto-save done");
80e4aa30 10816#else /* not MSDOS */
118d6ca9 10817 printf ("Auto-save done\n");
80e4aa30 10818#endif /* not MSDOS */
118d6ca9
RS
10819 }
10820 while (c != '\n') c = getchar ();
9fd7d808 10821 }
c60ee5e7 10822 else
118d6ca9
RS
10823 {
10824 /* During GC, it must be safe to reenable quitting again. */
10825 Vinhibit_quit = Qnil;
10826#ifdef MSDOS
10827 printf ("\r\n");
10828#endif /* not MSDOS */
10829 printf ("Garbage collection in progress; cannot auto-save now\r\n");
10830 printf ("but will instead do a real quit after garbage collection ends\r\n");
10831 fflush (stdout);
10832 }
10833
80e4aa30
RS
10834#ifdef MSDOS
10835 printf ("\r\nAbort? (y or n) ");
10836#else /* not MSDOS */
284f4730 10837 printf ("Abort (and dump core)? (y or n) ");
80e4aa30 10838#endif /* not MSDOS */
284f4730
JB
10839 fflush (stdout);
10840 if (((c = getchar ()) & ~040) == 'Y')
10841 abort ();
10842 while (c != '\n') c = getchar ();
80e4aa30
RS
10843#ifdef MSDOS
10844 printf ("\r\nContinuing...\r\n");
10845#else /* not MSDOS */
284f4730 10846 printf ("Continuing...\n");
80e4aa30 10847#endif /* not MSDOS */
284f4730 10848 fflush (stdout);
28d440ab 10849 init_all_sys_modes ();
31e4e97b 10850 sigfree ();
284f4730
JB
10851 }
10852 else
10853 {
10854 /* If executing a function that wants to be interrupted out of
10855 and the user has not deferred quitting by binding `inhibit-quit'
10856 then quit right away. */
10857 if (immediate_quit && NILP (Vinhibit_quit))
10858 {
e39da3d7
RS
10859 struct gl_state_s saved;
10860 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
10861
284f4730
JB
10862 immediate_quit = 0;
10863 sigfree ();
e39da3d7
RS
10864 saved = gl_state;
10865 GCPRO4 (saved.object, saved.global_code,
10866 saved.current_syntax_table, saved.old_prop);
284f4730 10867 Fsignal (Qquit, Qnil);
d48cd3f4 10868 /* FIXME: AFAIK, `quit' can never return, so this code is dead! */
e39da3d7
RS
10869 gl_state = saved;
10870 UNGCPRO;
284f4730
JB
10871 }
10872 else
10873 /* Else request quit when it's safe */
10874 Vquit_flag = Qt;
10875 }
10876
8ad093db
AR
10877/* TODO: The longjmp in this call throws the NS event loop integration off,
10878 and it seems to do fine without this. Probably some attention
10879 needs to be paid to the setting of waiting_for_input in
10880 wait_reading_process_output() under HAVE_NS because of the call
10881 to ns_select there (needed because otherwise events aren't picked up
10882 outside of polling since we don't get SIGIO like X and we don't have a
10883 separate event loop thread like W32. */
10884#ifndef HAVE_NS
284f4730 10885 if (waiting_for_input && !echoing)
4ca927b4 10886 quit_throw_to_read_char ();
8ad093db 10887#endif
284f4730
JB
10888}
10889
10890/* Handle a C-g by making read_char return C-g. */
10891
07a59269 10892void
d3da34e0 10893quit_throw_to_read_char (void)
284f4730 10894{
284f4730
JB
10895 sigfree ();
10896 /* Prevent another signal from doing this before we finish. */
f76475ad 10897 clear_waiting_for_input ();
284f4730
JB
10898 input_pending = 0;
10899
24597608 10900 Vunread_command_events = Qnil;
86e5706b 10901 unread_command_char = -1;
284f4730 10902
087feab3
RS
10903#if 0 /* Currently, sit_for is called from read_char without turning
10904 off polling. And that can call set_waiting_for_input.
10905 It seems to be harmless. */
e6b01c14
JB
10906#ifdef POLL_FOR_INPUT
10907 /* May be > 1 if in recursive minibuffer. */
10908 if (poll_suppress_count == 0)
10909 abort ();
10910#endif
087feab3 10911#endif
4c52b668 10912 if (FRAMEP (internal_last_event_frame)
788f89eb 10913 && !EQ (internal_last_event_frame, selected_frame))
719191cf 10914 do_switch_frame (make_lispy_switch_frame (internal_last_event_frame),
e630dfc6 10915 0, 0, Qnil);
e6b01c14 10916
284f4730
JB
10917 _longjmp (getcjmp, 1);
10918}
10919\f
a712a8c3
KL
10920DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode, Sset_input_interrupt_mode, 1, 1, 0,
10921 doc: /* Set interrupt mode of reading keyboard input.
10922If INTERRUPT is non-nil, Emacs will use input interrupts;
10923otherwise Emacs uses CBREAK mode.
10924
4707d2d0 10925See also `current-input-mode'. */)
5842a27b 10926 (Lisp_Object interrupt)
284f4730 10927{
a712a8c3 10928 int new_interrupt_input;
284f4730
JB
10929#ifdef SIGIO
10930/* Note SIGIO has been undef'd if FIONREAD is missing. */
4beb2d71 10931#ifdef HAVE_X_WINDOWS
6bbba5a6 10932 if (x_display_list != NULL)
9a0f60bb
KH
10933 {
10934 /* When using X, don't give the user a real choice,
10935 because we haven't implemented the mechanisms to support it. */
a712a8c3 10936 new_interrupt_input = 1;
9a0f60bb
KH
10937 }
10938 else
8ad093db 10939#endif /* HAVE_X_WINDOWS */
a712a8c3 10940 new_interrupt_input = !NILP (interrupt);
284f4730 10941#else /* not SIGIO */
a712a8c3 10942 new_interrupt_input = 0;
284f4730 10943#endif /* not SIGIO */
9a0f60bb 10944
033b73e2 10945 if (new_interrupt_input != interrupt_input)
a712a8c3
KL
10946 {
10947#ifdef POLL_FOR_INPUT
10948 stop_polling ();
10949#endif
10950#ifndef DOS_NT
10951 /* this causes startup screen to be restored and messes with the mouse */
10952 reset_all_sys_modes ();
a712a8c3 10953 interrupt_input = new_interrupt_input;
a712a8c3 10954 init_all_sys_modes ();
c2f0866a
DN
10955#else
10956 interrupt_input = new_interrupt_input;
284f4730 10957#endif
9a0f60bb 10958
a712a8c3
KL
10959#ifdef POLL_FOR_INPUT
10960 poll_suppress_count = 1;
10961 start_polling ();
10962#endif
10963 }
10964 return Qnil;
10965}
6bbba5a6 10966
a712a8c3
KL
10967DEFUN ("set-output-flow-control", Fset_output_flow_control, Sset_output_flow_control, 1, 2, 0,
10968 doc: /* Enable or disable ^S/^Q flow control for output to TERMINAL.
10969If FLOW is non-nil, flow control is enabled and you cannot use C-s or
10970C-q in key sequences.
10971
6ed8eeff 10972This setting only has an effect on tty terminals and only when
a712a8c3
KL
10973Emacs reads input in CBREAK mode; see `set-input-interrupt-mode'.
10974
10975See also `current-input-mode'. */)
5842a27b 10976 (Lisp_Object flow, Lisp_Object terminal)
a712a8c3 10977{
6ed8eeff 10978 struct terminal *t = get_terminal (terminal, 1);
a712a8c3 10979 struct tty_display_info *tty;
d44004c0 10980 if (t == NULL || (t->type != output_termcap && t->type != output_msdos_raw))
a712a8c3 10981 return Qnil;
6ed8eeff 10982 tty = t->display_info.tty;
a712a8c3
KL
10983
10984 if (tty->flow_control != !NILP (flow))
daf01701 10985 {
a712a8c3
KL
10986#ifndef DOS_NT
10987 /* this causes startup screen to be restored and messes with the mouse */
10988 reset_sys_modes (tty);
10989#endif
10990
daf01701 10991 tty->flow_control = !NILP (flow);
a712a8c3
KL
10992
10993#ifndef DOS_NT
10994 init_sys_modes (tty);
10995#endif
daf01701 10996 }
ed8dad6b 10997 return Qnil;
a712a8c3
KL
10998}
10999
11000DEFUN ("set-input-meta-mode", Fset_input_meta_mode, Sset_input_meta_mode, 1, 2, 0,
11001 doc: /* Enable or disable 8-bit input on TERMINAL.
11002If META is t, Emacs will accept 8-bit input, and interpret the 8th
11003bit as the Meta modifier.
11004
11005If META is nil, Emacs will ignore the top bit, on the assumption it is
11006parity.
11007
11008Otherwise, Emacs will accept and pass through 8-bit input without
11009specially interpreting the top bit.
11010
6ed8eeff 11011This setting only has an effect on tty terminal devices.
3b7fbceb 11012
6ed8eeff 11013Optional parameter TERMINAL specifies the tty terminal device to use.
708e05dc
CY
11014It may be a terminal object, a frame, or nil for the terminal used by
11015the currently selected frame.
a712a8c3
KL
11016
11017See also `current-input-mode'. */)
5842a27b 11018 (Lisp_Object meta, Lisp_Object terminal)
a712a8c3 11019{
6ed8eeff 11020 struct terminal *t = get_terminal (terminal, 1);
a712a8c3
KL
11021 struct tty_display_info *tty;
11022 int new_meta;
033b73e2 11023
d44004c0 11024 if (t == NULL || (t->type != output_termcap && t->type != output_msdos_raw))
a712a8c3 11025 return Qnil;
6ed8eeff 11026 tty = t->display_info.tty;
a712a8c3 11027
b04904fb 11028 if (NILP (meta))
a712a8c3 11029 new_meta = 0;
b04904fb 11030 else if (EQ (meta, Qt))
a712a8c3 11031 new_meta = 1;
b04904fb 11032 else
a712a8c3 11033 new_meta = 2;
284f4730 11034
033b73e2 11035 if (tty->meta_key != new_meta)
a712a8c3 11036 {
07de30b9 11037#ifndef DOS_NT
a712a8c3
KL
11038 /* this causes startup screen to be restored and messes with the mouse */
11039 reset_sys_modes (tty);
2ee250ec 11040#endif
34f04431 11041
a712a8c3 11042 tty->meta_key = new_meta;
033b73e2 11043
a712a8c3
KL
11044#ifndef DOS_NT
11045 init_sys_modes (tty);
34f04431 11046#endif
a712a8c3
KL
11047 }
11048 return Qnil;
11049}
11050
11051DEFUN ("set-quit-char", Fset_quit_char, Sset_quit_char, 1, 1, 0,
11052 doc: /* Specify character used for quitting.
11053QUIT must be an ASCII character.
11054
fdf5ebde
KL
11055This function only has an effect on the controlling tty of the Emacs
11056process.
a712a8c3
KL
11057
11058See also `current-input-mode'. */)
5842a27b 11059 (Lisp_Object quit)
a712a8c3 11060{
fdf5ebde 11061 struct terminal *t = get_named_tty ("/dev/tty");
a712a8c3 11062 struct tty_display_info *tty;
d44004c0 11063 if (t == NULL || (t->type != output_termcap && t->type != output_msdos_raw))
a712a8c3 11064 return Qnil;
6ed8eeff 11065 tty = t->display_info.tty;
a712a8c3 11066
6213d5b3
KL
11067 if (NILP (quit) || !INTEGERP (quit) || XINT (quit) < 0 || XINT (quit) > 0400)
11068 error ("QUIT must be an ASCII character");
11069
a712a8c3
KL
11070#ifndef DOS_NT
11071 /* this causes startup screen to be restored and messes with the mouse */
11072 reset_sys_modes (tty);
11073#endif
033b73e2 11074
a712a8c3
KL
11075 /* Don't let this value be out of range. */
11076 quit_char = XINT (quit) & (tty->meta_key == 0 ? 0177 : 0377);
11077
11078#ifndef DOS_NT
11079 init_sys_modes (tty);
34f04431 11080#endif
a712a8c3
KL
11081
11082 return Qnil;
11083}
033b73e2 11084
a712a8c3
KL
11085DEFUN ("set-input-mode", Fset_input_mode, Sset_input_mode, 3, 4, 0,
11086 doc: /* Set mode of reading keyboard input.
11087First arg INTERRUPT non-nil means use input interrupts;
11088 nil means use CBREAK mode.
11089Second arg FLOW non-nil means use ^S/^Q flow control for output to terminal
11090 (no effect except in CBREAK mode).
11091Third arg META t means accept 8-bit input (for a Meta key).
11092 META nil means ignore the top bit, on the assumption it is parity.
11093 Otherwise, accept 8-bit input and don't use the top bit for Meta.
11094Optional fourth arg QUIT if non-nil specifies character to use for quitting.
11095See also `current-input-mode'. */)
5842a27b 11096 (Lisp_Object interrupt, Lisp_Object flow, Lisp_Object meta, Lisp_Object quit)
a712a8c3
KL
11097{
11098 Fset_input_interrupt_mode (interrupt);
11099 Fset_output_flow_control (flow, Qnil);
11100 Fset_input_meta_mode (meta, Qnil);
0a42be6d
RF
11101 if (!NILP (quit))
11102 Fset_quit_char (quit);
284f4730
JB
11103 return Qnil;
11104}
80645119
JB
11105
11106DEFUN ("current-input-mode", Fcurrent_input_mode, Scurrent_input_mode, 0, 0, 0,
4707d2d0
PJ
11107 doc: /* Return information about the way Emacs currently reads keyboard input.
11108The value is a list of the form (INTERRUPT FLOW META QUIT), where
11109 INTERRUPT is non-nil if Emacs is using interrupt-driven input; if
11110 nil, Emacs is using CBREAK mode.
11111 FLOW is non-nil if Emacs uses ^S/^Q flow control for output to the
11112 terminal; this does not apply if Emacs uses interrupt-driven input.
11113 META is t if accepting 8-bit input with 8th bit as Meta flag.
11114 META nil means ignoring the top bit, on the assumption it is parity.
11115 META is neither t nor nil if accepting 8-bit input and using
11116 all 8 bits as the character code.
11117 QUIT is the character Emacs currently uses to quit.
11118The elements of this list correspond to the arguments of
11119`set-input-mode'. */)
5842a27b 11120 (void)
80645119
JB
11121{
11122 Lisp_Object val[4];
daf01701 11123 struct frame *sf = XFRAME (selected_frame);
80645119
JB
11124
11125 val[0] = interrupt_input ? Qt : Qnil;
d44004c0 11126 if (FRAME_TERMCAP_P (sf) || FRAME_MSDOS_P (sf))
daf01701
KL
11127 {
11128 val[1] = FRAME_TTY (sf)->flow_control ? Qt : Qnil;
c3b4957f
KL
11129 val[2] = (FRAME_TTY (sf)->meta_key == 2
11130 ? make_number (0)
11131 : (CURTTY ()->meta_key == 1 ? Qt : Qnil));
daf01701
KL
11132 }
11133 else
11134 {
11135 val[1] = Qnil;
11136 val[2] = Qt;
11137 }
bb9e9bed 11138 XSETFASTINT (val[3], quit_char);
80645119 11139
bf673a7a 11140 return Flist (sizeof (val) / sizeof (val[0]), val);
80645119
JB
11141}
11142
a25f766a 11143DEFUN ("posn-at-x-y", Fposn_at_x_y, Sposn_at_x_y, 2, 4, 0,
ec026e7a
KS
11144 doc: /* Return position information for pixel coordinates X and Y.
11145By default, X and Y are relative to text area of the selected window.
6e604a9b 11146Optional third arg FRAME-OR-WINDOW non-nil specifies frame or window.
a25f766a
KS
11147If optional fourth arg WHOLE is non-nil, X is relative to the left
11148edge of the window.
ec026e7a
KS
11149
11150The return value is similar to a mouse click position:
11151 (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
11152 IMAGE (DX . DY) (WIDTH . HEIGHT))
11153The `posn-' functions access elements of such lists. */)
5842a27b 11154 (Lisp_Object x, Lisp_Object y, Lisp_Object frame_or_window, Lisp_Object whole)
ec026e7a 11155{
f4a5a485
SM
11156 CHECK_NATNUM (x);
11157 CHECK_NATNUM (y);
11158
ec026e7a
KS
11159 if (NILP (frame_or_window))
11160 frame_or_window = selected_window;
11161
11162 if (WINDOWP (frame_or_window))
11163 {
11164 struct window *w;
11165
11166 CHECK_LIVE_WINDOW (frame_or_window);
11167
11168 w = XWINDOW (frame_or_window);
6507c4c7
KS
11169 XSETINT (x, (XINT (x)
11170 + WINDOW_LEFT_EDGE_X (w)
a25f766a
KS
11171 + (NILP (whole)
11172 ? window_box_left_offset (w, TEXT_AREA)
6507c4c7 11173 : 0)));
ec026e7a
KS
11174 XSETINT (y, WINDOW_TO_FRAME_PIXEL_Y (w, XINT (y)));
11175 frame_or_window = w->frame;
11176 }
11177
11178 CHECK_LIVE_FRAME (frame_or_window);
11179
9173a8fb 11180 return make_lispy_position (XFRAME (frame_or_window), x, y, 0);
ec026e7a
KS
11181}
11182
11183DEFUN ("posn-at-point", Fposn_at_point, Sposn_at_point, 0, 2, 0,
11184 doc: /* Return position information for buffer POS in WINDOW.
11185POS defaults to point in WINDOW; WINDOW defaults to the selected window.
11186
11187Return nil if position is not visible in window. Otherwise,
883d272e 11188the return value is similar to that returned by `event-start' for
ec026e7a
KS
11189a mouse click at the upper left corner of the glyph corresponding
11190to the given buffer position:
11191 (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
11192 IMAGE (DX . DY) (WIDTH . HEIGHT))
8f1657f0 11193The `posn-' functions access elements of such lists. */)
5842a27b 11194 (Lisp_Object pos, Lisp_Object window)
ec026e7a
KS
11195{
11196 Lisp_Object tem;
11197
6507c4c7
KS
11198 if (NILP (window))
11199 window = selected_window;
11200
ec026e7a
KS
11201 tem = Fpos_visible_in_window_p (pos, window, Qt);
11202 if (!NILP (tem))
6507c4c7
KS
11203 {
11204 Lisp_Object x = XCAR (tem);
11205 Lisp_Object y = XCAR (XCDR (tem));
11206
11207 /* Point invisible due to hscrolling? */
11208 if (XINT (x) < 0)
11209 return Qnil;
11210 tem = Fposn_at_x_y (x, y, window, Qnil);
11211 }
11212
ec026e7a
KS
11213 return tem;
11214}
11215
284f4730 11216\f
6c6083a9 11217/*
c5fdd383 11218 * Set up a new kboard object with reasonable initial values.
6c6083a9
KH
11219 */
11220void
d3da34e0 11221init_kboard (KBOARD *kb)
6c6083a9 11222{
217258d5 11223 kb->Voverriding_terminal_local_map = Qnil;
6c7178b9 11224 kb->Vlast_command = Qnil;
75045dcb 11225 kb->Vreal_last_command = Qnil;
2e478293 11226 kb->Vkeyboard_translate_table = Qnil;
d0d3a311 11227 kb->Vlast_repeatable_command = Qnil;
d8bcf58e 11228 kb->Vprefix_arg = Qnil;
75045dcb 11229 kb->Vlast_prefix_arg = Qnil;
c5fdd383
KH
11230 kb->kbd_queue = Qnil;
11231 kb->kbd_queue_has_data = 0;
11232 kb->immediate_echo = 0;
678e9d18 11233 kb->echo_string = Qnil;
c5fdd383
KH
11234 kb->echo_after_prompt = -1;
11235 kb->kbd_macro_buffer = 0;
11236 kb->kbd_macro_bufsize = 0;
11237 kb->defining_kbd_macro = Qnil;
11238 kb->Vlast_kbd_macro = Qnil;
11239 kb->reference_count = 0;
7c97ffdc 11240 kb->Vsystem_key_alist = Qnil;
142e6c73 11241 kb->system_key_syms = Qnil;
70b8d0a4 11242 kb->Vwindow_system = Qt; /* Unset. */
4f4a84ec 11243 kb->Vinput_decode_map = Fmake_sparse_keymap (Qnil);
ac09dc1e
KL
11244 kb->Vlocal_function_key_map = Fmake_sparse_keymap (Qnil);
11245 Fset_keymap_parent (kb->Vlocal_function_key_map, Vfunction_key_map);
9ba47203 11246 kb->Vdefault_minibuffer_frame = Qnil;
6c6083a9
KH
11247}
11248
11249/*
c5fdd383 11250 * Destroy the contents of a kboard object, but not the object itself.
8e6208c5 11251 * We use this just before deleting it, or if we're going to initialize
6c6083a9
KH
11252 * it a second time.
11253 */
e50b8090 11254static void
d3da34e0 11255wipe_kboard (KBOARD *kb)
6c6083a9 11256{
70fdbb46 11257 xfree (kb->kbd_macro_buffer);
6c6083a9
KH
11258}
11259
a122a38e
GM
11260/* Free KB and memory referenced from it. */
11261
e50b8090 11262void
d3da34e0 11263delete_kboard (KBOARD *kb)
e50b8090
KH
11264{
11265 KBOARD **kbp;
c60ee5e7 11266
e50b8090
KH
11267 for (kbp = &all_kboards; *kbp != kb; kbp = &(*kbp)->next_kboard)
11268 if (*kbp == NULL)
11269 abort ();
11270 *kbp = kb->next_kboard;
a122a38e
GM
11271
11272 /* Prevent a dangling reference to KB. */
18f534df
GM
11273 if (kb == current_kboard
11274 && FRAMEP (selected_frame)
11275 && FRAME_LIVE_P (XFRAME (selected_frame)))
a122a38e 11276 {
b3e6f69c
KL
11277 current_kboard = FRAME_KBOARD (XFRAME (selected_frame));
11278 single_kboard = 0;
a122a38e
GM
11279 if (current_kboard == kb)
11280 abort ();
11281 }
c60ee5e7 11282
e50b8090
KH
11283 wipe_kboard (kb);
11284 xfree (kb);
11285}
a122a38e 11286
dfcf069d 11287void
d3da34e0 11288init_keyboard (void)
284f4730 11289{
284f4730
JB
11290 /* This is correct before outermost invocation of the editor loop */
11291 command_loop_level = -1;
11292 immediate_quit = 0;
11293 quit_char = Ctl ('g');
24597608 11294 Vunread_command_events = Qnil;
86e5706b 11295 unread_command_char = -1;
87dd9b9b 11296 EMACS_SET_SECS_USECS (timer_idleness_start_time, -1, -1);
284f4730 11297 total_keys = 0;
9deb415a 11298 recent_keys_index = 0;
beecf6a1
KH
11299 kbd_fetch_ptr = kbd_buffer;
11300 kbd_store_ptr = kbd_buffer;
ae372f41 11301#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
a9d77f1f 11302 do_mouse_tracking = Qnil;
2eb6bfbe 11303#endif
284f4730 11304 input_pending = 0;
4c180390
JD
11305 interrupt_input_blocked = 0;
11306 interrupt_input_pending = 0;
07a1e794 11307#ifdef SYNC_INPUT
ceb18827 11308 pending_signals = 0;
07a1e794 11309#endif
284f4730 11310
4c52b668
KH
11311 /* This means that command_loop_1 won't try to select anything the first
11312 time through. */
11313 internal_last_event_frame = Qnil;
11314 Vlast_event_frame = internal_last_event_frame;
4c52b668 11315
aaca43a1 11316 current_kboard = initial_kboard;
1bc973c2 11317 /* Re-initialize the keyboard again. */
aaca43a1 11318 wipe_kboard (current_kboard);
c5fdd383 11319 init_kboard (current_kboard);
1bc973c2
SM
11320 /* A value of nil for Vwindow_system normally means a tty, but we also use
11321 it for the initial terminal since there is no window system there. */
11322 current_kboard->Vwindow_system = Qnil;
07d2b8de 11323
7b00d185 11324 if (!noninteractive)
284f4730 11325 {
3224dac1
KL
11326 /* Before multi-tty support, these handlers used to be installed
11327 only if the current session was a tty session. Now an Emacs
11328 session may have multiple display types, so we always handle
11329 SIGINT. There is special code in interrupt_signal to exit
4ca927b4
KL
11330 Emacs on SIGINT when there are no termcap frames on the
11331 controlling terminal. */
284f4730 11332 signal (SIGINT, interrupt_signal);
a7ebc409 11333#ifndef DOS_NT
284f4730
JB
11334 /* For systems with SysV TERMIO, C-g is set up for both SIGINT and
11335 SIGQUIT and we can't tell which one it will give us. */
11336 signal (SIGQUIT, interrupt_signal);
a7ebc409 11337#endif /* not DOS_NT */
7a80a6f6 11338 }
284f4730
JB
11339/* Note SIGIO has been undef'd if FIONREAD is missing. */
11340#ifdef SIGIO
7a80a6f6
RS
11341 if (!noninteractive)
11342 signal (SIGIO, input_available_signal);
8ea0a720 11343#endif /* SIGIO */
284f4730
JB
11344
11345/* Use interrupt input by default, if it works and noninterrupt input
11346 has deficiencies. */
11347
11348#ifdef INTERRUPT_INPUT
11349 interrupt_input = 1;
11350#else
11351 interrupt_input = 0;
11352#endif
11353
284f4730
JB
11354 sigfree ();
11355 dribble = 0;
11356
11357 if (keyboard_init_hook)
11358 (*keyboard_init_hook) ();
11359
11360#ifdef POLL_FOR_INPUT
c3c963a0 11361 poll_timer = NULL;
284f4730
JB
11362 poll_suppress_count = 1;
11363 start_polling ();
11364#endif
11365}
11366
df0f2ba1 11367/* This type's only use is in syms_of_keyboard, to initialize the
284f4730
JB
11368 event header symbols and put properties on them. */
11369struct event_head {
11370 Lisp_Object *var;
8ea90aa3 11371 const char *name;
284f4730
JB
11372 Lisp_Object *kind;
11373};
11374
6f704c76 11375static const struct event_head head_table[] = {
7406e988
PJ
11376 {&Qmouse_movement, "mouse-movement", &Qmouse_movement},
11377 {&Qscroll_bar_movement, "scroll-bar-movement", &Qmouse_movement},
11378 {&Qswitch_frame, "switch-frame", &Qswitch_frame},
11379 {&Qdelete_frame, "delete-frame", &Qdelete_frame},
11380 {&Qiconify_frame, "iconify-frame", &Qiconify_frame},
a697f886 11381 {&Qmake_frame_visible, "make-frame-visible", &Qmake_frame_visible},
6901b111
SM
11382 /* `select-window' should be handled just like `switch-frame'
11383 in read_key_sequence. */
11384 {&Qselect_window, "select-window", &Qswitch_frame}
284f4730
JB
11385};
11386
dfcf069d 11387void
d3da34e0 11388syms_of_keyboard (void)
284f4730 11389{
58555d81 11390 pending_funcalls = Qnil;
864660a2 11391 staticpro (&pending_funcalls);
58555d81 11392
a4ada374 11393 Vlispy_mouse_stem = make_pure_c_string ("mouse");
8e1e4240 11394 staticpro (&Vlispy_mouse_stem);
f0c1cc56 11395
9ea173e8 11396 /* Tool-bars. */
d67b4f80 11397 QCimage = intern_c_string (":image");
7ee32cda
GM
11398 staticpro (&QCimage);
11399
11400 staticpro (&Qhelp_echo);
d67b4f80 11401 Qhelp_echo = intern_c_string ("help-echo");
7ee32cda 11402
cf0590c4 11403 staticpro (&Qrtl);
d67b4f80 11404 Qrtl = intern_c_string (":rtl");
cf0590c4 11405
e8886a1d
RS
11406 staticpro (&item_properties);
11407 item_properties = Qnil;
11408
9ea173e8
GM
11409 staticpro (&tool_bar_item_properties);
11410 tool_bar_item_properties = Qnil;
11411 staticpro (&tool_bar_items_vector);
11412 tool_bar_items_vector = Qnil;
7ee32cda 11413
d5eecefb
RS
11414 staticpro (&real_this_command);
11415 real_this_command = Qnil;
11416
d67b4f80 11417 Qtimer_event_handler = intern_c_string ("timer-event-handler");
d925fb39
RS
11418 staticpro (&Qtimer_event_handler);
11419
d67b4f80 11420 Qdisabled_command_function = intern_c_string ("disabled-command-function");
971e4c98 11421 staticpro (&Qdisabled_command_function);
2e894dab 11422
d67b4f80 11423 Qself_insert_command = intern_c_string ("self-insert-command");
284f4730
JB
11424 staticpro (&Qself_insert_command);
11425
d67b4f80 11426 Qforward_char = intern_c_string ("forward-char");
284f4730
JB
11427 staticpro (&Qforward_char);
11428
d67b4f80 11429 Qbackward_char = intern_c_string ("backward-char");
284f4730
JB
11430 staticpro (&Qbackward_char);
11431
d67b4f80 11432 Qdisabled = intern_c_string ("disabled");
284f4730
JB
11433 staticpro (&Qdisabled);
11434
d67b4f80 11435 Qundefined = intern_c_string ("undefined");
e58aa385
RS
11436 staticpro (&Qundefined);
11437
d67b4f80 11438 Qpre_command_hook = intern_c_string ("pre-command-hook");
86e5706b
RS
11439 staticpro (&Qpre_command_hook);
11440
d67b4f80 11441 Qpost_command_hook = intern_c_string ("post-command-hook");
86e5706b
RS
11442 staticpro (&Qpost_command_hook);
11443
d67b4f80 11444 Qdeferred_action_function = intern_c_string ("deferred-action-function");
3ef14e46
RS
11445 staticpro (&Qdeferred_action_function);
11446
d67b4f80 11447 Qcommand_hook_internal = intern_c_string ("command-hook-internal");
40932d1a
RS
11448 staticpro (&Qcommand_hook_internal);
11449
d67b4f80 11450 Qfunction_key = intern_c_string ("function-key");
284f4730 11451 staticpro (&Qfunction_key);
d67b4f80 11452 Qmouse_click = intern_c_string ("mouse-click");
284f4730 11453 staticpro (&Qmouse_click);
9e2a2647 11454#if defined (WINDOWSNT)
d67b4f80 11455 Qlanguage_change = intern_c_string ("language-change");
1161d367 11456 staticpro (&Qlanguage_change);
07de30b9 11457#endif
d67b4f80 11458 Qdrag_n_drop = intern_c_string ("drag-n-drop");
a24dc617 11459 staticpro (&Qdrag_n_drop);
284f4730 11460
d67b4f80 11461 Qsave_session = intern_c_string ("save-session");
6e604a9b 11462 staticpro (&Qsave_session);
c60ee5e7 11463
033b73e2 11464#ifdef HAVE_DBUS
d67b4f80 11465 Qdbus_event = intern_c_string ("dbus-event");
033b73e2
MA
11466 staticpro (&Qdbus_event);
11467#endif
11468
637fa988
JD
11469 Qconfig_changed_event = intern_c_string ("config-changed-event");
11470 staticpro (&Qconfig_changed_event);
11471
d67b4f80 11472 Qmenu_enable = intern_c_string ("menu-enable");
598a9fa7 11473 staticpro (&Qmenu_enable);
d67b4f80 11474 QCenable = intern_c_string (":enable");
e8886a1d 11475 staticpro (&QCenable);
d67b4f80 11476 QCvisible = intern_c_string (":visible");
e8886a1d 11477 staticpro (&QCvisible);
d67b4f80 11478 QChelp = intern_c_string (":help");
7ee32cda 11479 staticpro (&QChelp);
d67b4f80 11480 QCfilter = intern_c_string (":filter");
e8886a1d 11481 staticpro (&QCfilter);
d67b4f80 11482 QCbutton = intern_c_string (":button");
e8886a1d 11483 staticpro (&QCbutton);
d67b4f80 11484 QCkeys = intern_c_string (":keys");
74c1de23 11485 staticpro (&QCkeys);
d67b4f80 11486 QCkey_sequence = intern_c_string (":key-sequence");
74c1de23 11487 staticpro (&QCkey_sequence);
d67b4f80 11488 QCtoggle = intern_c_string (":toggle");
e8886a1d 11489 staticpro (&QCtoggle);
d67b4f80 11490 QCradio = intern_c_string (":radio");
e8886a1d 11491 staticpro (&QCradio);
f904c0f9
JD
11492 QClabel = intern_c_string (":label");
11493 staticpro (&QClabel);
d2bd5189
JD
11494 QCvert_only = intern_c_string (":vert-only");
11495 staticpro (&QCvert_only);
598a9fa7 11496
d67b4f80 11497 Qmode_line = intern_c_string ("mode-line");
284f4730 11498 staticpro (&Qmode_line);
d67b4f80 11499 Qvertical_line = intern_c_string ("vertical-line");
e5d77022 11500 staticpro (&Qvertical_line);
d67b4f80 11501 Qvertical_scroll_bar = intern_c_string ("vertical-scroll-bar");
3c370943 11502 staticpro (&Qvertical_scroll_bar);
d67b4f80 11503 Qmenu_bar = intern_c_string ("menu-bar");
5ec75a55 11504 staticpro (&Qmenu_bar);
4bb994d1 11505
ae372f41 11506#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
d67b4f80 11507 Qmouse_fixup_help_message = intern_c_string ("mouse-fixup-help-message");
c22237f7
KS
11508 staticpro (&Qmouse_fixup_help_message);
11509#endif
11510
d67b4f80 11511 Qabove_handle = intern_c_string ("above-handle");
4bb994d1 11512 staticpro (&Qabove_handle);
d67b4f80 11513 Qhandle = intern_c_string ("handle");
4bb994d1 11514 staticpro (&Qhandle);
d67b4f80 11515 Qbelow_handle = intern_c_string ("below-handle");
4bb994d1 11516 staticpro (&Qbelow_handle);
d67b4f80 11517 Qup = intern_c_string ("up");
db08707d 11518 staticpro (&Qup);
d67b4f80 11519 Qdown = intern_c_string ("down");
db08707d 11520 staticpro (&Qdown);
d67b4f80 11521 Qtop = intern_c_string ("top");
7ee32cda 11522 staticpro (&Qtop);
d67b4f80 11523 Qbottom = intern_c_string ("bottom");
7ee32cda 11524 staticpro (&Qbottom);
d67b4f80 11525 Qend_scroll = intern_c_string ("end-scroll");
7ee32cda 11526 staticpro (&Qend_scroll);
d67b4f80 11527 Qratio = intern_c_string ("ratio");
eef28553 11528 staticpro (&Qratio);
284f4730 11529
d67b4f80 11530 Qevent_kind = intern_c_string ("event-kind");
284f4730 11531 staticpro (&Qevent_kind);
d67b4f80 11532 Qevent_symbol_elements = intern_c_string ("event-symbol-elements");
88cb0656 11533 staticpro (&Qevent_symbol_elements);
d67b4f80 11534 Qevent_symbol_element_mask = intern_c_string ("event-symbol-element-mask");
0a7f1fc0 11535 staticpro (&Qevent_symbol_element_mask);
d67b4f80 11536 Qmodifier_cache = intern_c_string ("modifier-cache");
0a7f1fc0 11537 staticpro (&Qmodifier_cache);
284f4730 11538
d67b4f80 11539 Qrecompute_lucid_menubar = intern_c_string ("recompute-lucid-menubar");
48e416d4 11540 staticpro (&Qrecompute_lucid_menubar);
d67b4f80 11541 Qactivate_menubar_hook = intern_c_string ("activate-menubar-hook");
48e416d4
RS
11542 staticpro (&Qactivate_menubar_hook);
11543
d67b4f80 11544 Qpolling_period = intern_c_string ("polling-period");
f4eef8b4
RS
11545 staticpro (&Qpolling_period);
11546
d67b4f80 11547 Qinput_method_function = intern_c_string ("input-method-function");
7d18f9ae
RS
11548 staticpro (&Qinput_method_function);
11549
9852377f
CY
11550 Qx_set_selection = intern_c_string ("x-set-selection");
11551 staticpro (&Qx_set_selection);
11552 QPRIMARY = intern_c_string ("PRIMARY");
11553 staticpro (&QPRIMARY);
1c409d0b
CY
11554 Qhandle_switch_frame = intern_c_string ("handle-switch-frame");
11555 staticpro (&Qhandle_switch_frame);
9852377f 11556
d67b4f80 11557 Qinput_method_exit_on_first_char = intern_c_string ("input-method-exit-on-first-char");
d5eecefb 11558 staticpro (&Qinput_method_exit_on_first_char);
d67b4f80 11559 Qinput_method_use_echo_area = intern_c_string ("input-method-use-echo-area");
d5eecefb
RS
11560 staticpro (&Qinput_method_use_echo_area);
11561
11562 Fset (Qinput_method_exit_on_first_char, Qnil);
11563 Fset (Qinput_method_use_echo_area, Qnil);
11564
e18dfbf4 11565 last_point_position_buffer = Qnil;
bb0e1d19 11566 last_point_position_window = Qnil;
e18dfbf4 11567
284f4730 11568 {
6f704c76 11569 const struct event_head *p;
284f4730
JB
11570
11571 for (p = head_table;
11572 p < head_table + (sizeof (head_table) / sizeof (head_table[0]));
11573 p++)
11574 {
d67b4f80 11575 *p->var = intern_c_string (p->name);
284f4730
JB
11576 staticpro (p->var);
11577 Fput (*p->var, Qevent_kind, *p->kind);
88cb0656 11578 Fput (*p->var, Qevent_symbol_elements, Fcons (*p->var, Qnil));
284f4730
JB
11579 }
11580 }
11581
1373f3be 11582 button_down_location = Fmake_vector (make_number (5), Qnil);
7b4aedb9 11583 staticpro (&button_down_location);
1373f3be 11584 mouse_syms = Fmake_vector (make_number (5), Qnil);
8e1e4240 11585 staticpro (&mouse_syms);
3208cb35
YM
11586 wheel_syms = Fmake_vector (make_number (sizeof (lispy_wheel_names)
11587 / sizeof (lispy_wheel_names[0])),
11588 Qnil);
8006e4bb 11589 staticpro (&wheel_syms);
88cb0656
JB
11590
11591 {
11592 int i;
11593 int len = sizeof (modifier_names) / sizeof (modifier_names[0]);
11594
11595 modifier_symbols = Fmake_vector (make_number (len), Qnil);
11596 for (i = 0; i < len; i++)
86e5706b 11597 if (modifier_names[i])
d67b4f80 11598 XVECTOR (modifier_symbols)->contents[i] = intern_c_string (modifier_names[i]);
88cb0656
JB
11599 staticpro (&modifier_symbols);
11600 }
11601
9deb415a
JB
11602 recent_keys = Fmake_vector (make_number (NUM_RECENT_KEYS), Qnil);
11603 staticpro (&recent_keys);
11604
6569cc8d 11605 this_command_keys = Fmake_vector (make_number (40), Qnil);
715d9345 11606 staticpro (&this_command_keys);
6569cc8d 11607
7d18f9ae
RS
11608 raw_keybuf = Fmake_vector (make_number (30), Qnil);
11609 staticpro (&raw_keybuf);
11610
d67b4f80 11611 Qextended_command_history = intern_c_string ("extended-command-history");
03b4122a
BF
11612 Fset (Qextended_command_history, Qnil);
11613 staticpro (&Qextended_command_history);
11614
24597608
RS
11615 accent_key_syms = Qnil;
11616 staticpro (&accent_key_syms);
11617
284f4730
JB
11618 func_key_syms = Qnil;
11619 staticpro (&func_key_syms);
11620
a24dc617
RS
11621 drag_n_drop_syms = Qnil;
11622 staticpro (&drag_n_drop_syms);
07de30b9 11623
cd21b839
JB
11624 unread_switch_frame = Qnil;
11625 staticpro (&unread_switch_frame);
11626
fe412364
EN
11627 internal_last_event_frame = Qnil;
11628 staticpro (&internal_last_event_frame);
11629
11630 read_key_sequence_cmd = Qnil;
11631 staticpro (&read_key_sequence_cmd);
11632
759860a6
RS
11633 menu_bar_one_keymap_changed_items = Qnil;
11634 staticpro (&menu_bar_one_keymap_changed_items);
11635
7320c7de
KS
11636 menu_bar_items_vector = Qnil;
11637 staticpro (&menu_bar_items_vector);
11638
638d3da0
CY
11639 help_form_saved_window_configs = Qnil;
11640 staticpro (&help_form_saved_window_configs);
11641
ff458d81 11642 defsubr (&Scurrent_idle_time);
58da34c7 11643 defsubr (&Sevent_symbol_parse_modifiers);
a1706c30 11644 defsubr (&Sevent_convert_list);
284f4730 11645 defsubr (&Sread_key_sequence);
e39da3d7 11646 defsubr (&Sread_key_sequence_vector);
284f4730 11647 defsubr (&Srecursive_edit);
ae372f41 11648#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
284f4730 11649 defsubr (&Strack_mouse);
2eb6bfbe 11650#endif
284f4730
JB
11651 defsubr (&Sinput_pending_p);
11652 defsubr (&Scommand_execute);
11653 defsubr (&Srecent_keys);
11654 defsubr (&Sthis_command_keys);
e39da3d7 11655 defsubr (&Sthis_command_keys_vector);
6321824f 11656 defsubr (&Sthis_single_command_keys);
7d18f9ae 11657 defsubr (&Sthis_single_command_raw_keys);
71918b75 11658 defsubr (&Sreset_this_command_lengths);
82e6e5af 11659 defsubr (&Sclear_this_command_keys);
284f4730
JB
11660 defsubr (&Ssuspend_emacs);
11661 defsubr (&Sabort_recursive_edit);
11662 defsubr (&Sexit_recursive_edit);
11663 defsubr (&Srecursion_depth);
11664 defsubr (&Stop_level);
11665 defsubr (&Sdiscard_input);
11666 defsubr (&Sopen_dribble_file);
a712a8c3
KL
11667 defsubr (&Sset_input_interrupt_mode);
11668 defsubr (&Sset_output_flow_control);
11669 defsubr (&Sset_input_meta_mode);
11670 defsubr (&Sset_quit_char);
284f4730 11671 defsubr (&Sset_input_mode);
80645119 11672 defsubr (&Scurrent_input_mode);
284f4730 11673 defsubr (&Sexecute_extended_command);
ec026e7a
KS
11674 defsubr (&Sposn_at_point);
11675 defsubr (&Sposn_at_x_y);
284f4730 11676
29208e82 11677 DEFVAR_LISP ("last-command-event", last_command_event,
4707d2d0 11678 doc: /* Last input event that was part of a command. */);
284f4730 11679
29208e82 11680 DEFVAR_LISP ("last-nonmenu-event", last_nonmenu_event,
4707d2d0
PJ
11681 doc: /* Last input event in a command, except for mouse menu events.
11682Mouse menus give back keys that don't look like mouse events;
11683this variable holds the actual mouse event that led to the menu,
11684so that you can determine whether the command was run by mouse or not. */);
7d6de002 11685
29208e82 11686 DEFVAR_LISP ("last-input-event", last_input_event,
fa1361cb 11687 doc: /* Last input event. */);
86e5706b 11688
29208e82 11689 DEFVAR_LISP ("unread-command-events", Vunread_command_events,
4707d2d0 11690 doc: /* List of events to be read as the command input.
96f4f7ec
KS
11691These events are processed first, before actual keyboard input.
11692Events read from this list are not normally added to `this-command-keys',
11693as they will already have been added once as they were read for the first time.
11694An element of the form (t . EVENT) forces EVENT to be added to that list. */);
7d18f9ae 11695 Vunread_command_events = Qnil;
284f4730 11696
29208e82 11697 DEFVAR_INT ("unread-command-char", unread_command_char,
4707d2d0 11698 doc: /* If not -1, an object to be read as next command input event. */);
86e5706b 11699
29208e82 11700 DEFVAR_LISP ("unread-post-input-method-events", Vunread_post_input_method_events,
4707d2d0 11701 doc: /* List of events to be processed as input by input methods.
748726f4 11702These events are processed before `unread-command-events'
7d8d0914 11703and actual keyboard input, but are not given to `input-method-function'. */);
7d18f9ae
RS
11704 Vunread_post_input_method_events = Qnil;
11705
29208e82 11706 DEFVAR_LISP ("unread-input-method-events", Vunread_input_method_events,
4707d2d0
PJ
11707 doc: /* List of events to be processed as input by input methods.
11708These events are processed after `unread-command-events', but
748726f4
KH
11709before actual keyboard input.
11710If there's an active input method, the events are given to
11711`input-method-function'. */);
7d18f9ae
RS
11712 Vunread_input_method_events = Qnil;
11713
29208e82 11714 DEFVAR_LISP ("meta-prefix-char", meta_prefix_char,
4707d2d0
PJ
11715 doc: /* Meta-prefix character code.
11716Meta-foo as command input turns into this character followed by foo. */);
18cd2eeb 11717 XSETINT (meta_prefix_char, 033);
284f4730 11718
6c7178b9 11719 DEFVAR_KBOARD ("last-command", Vlast_command,
4707d2d0
PJ
11720 doc: /* The last command executed.
11721Normally a symbol with a function definition, but can be whatever was found
11722in the keymap, or whatever the variable `this-command' was set to by that
11723command.
11724
11725The value `mode-exit' is special; it means that the previous command
11726read an event that told it to exit, and it did so and unread that event.
11727In other words, the present command is the event that made the previous
11728command exit.
11729
11730The value `kill-region' is special; it means that the previous command
2a42d440
KL
11731was a kill command.
11732
6ed8eeff 11733`last-command' has a separate binding for each terminal device.
31c4aaf6 11734See Info node `(elisp)Multiple Terminals'. */);
284f4730 11735
75045dcb 11736 DEFVAR_KBOARD ("real-last-command", Vreal_last_command,
4707d2d0 11737 doc: /* Same as `last-command', but never altered by Lisp code. */);
75045dcb 11738
d0d3a311
MR
11739 DEFVAR_KBOARD ("last-repeatable-command", Vlast_repeatable_command,
11740 doc: /* Last command that may be repeated.
11741The last command executed that was not bound to an input event.
11742This is the command `repeat' will try to repeat. */);
11743
29208e82 11744 DEFVAR_LISP ("this-command", Vthis_command,
4707d2d0
PJ
11745 doc: /* The command now being executed.
11746The command can set this variable; whatever is put here
11747will be in `last-command' during the following command. */);
d5eecefb 11748 Vthis_command = Qnil;
284f4730 11749
025ae953 11750 DEFVAR_LISP ("this-command-keys-shift-translated",
29208e82 11751 Vthis_command_keys_shift_translated,
025ae953
CY
11752 doc: /* Non-nil if the key sequence activating this command was shift-translated.
11753Shift-translation occurs when there is no binding for the key sequence
11754as entered, but a binding was found by changing an upper-case letter
11755to lower-case, or a shifted function key to an unshifted one. */);
11756 Vthis_command_keys_shift_translated = Qnil;
11757
29208e82 11758 DEFVAR_LISP ("this-original-command", Vthis_original_command,
f5613d1e
KS
11759 doc: /* The command bound to the current key sequence before remapping.
11760It equals `this-command' if the original command was not remapped through
11761any of the active keymaps. Otherwise, the value of `this-command' is the
177c0ea7 11762result of looking up the original command in the active keymaps. */);
8b9940e6
KS
11763 Vthis_original_command = Qnil;
11764
29208e82 11765 DEFVAR_INT ("auto-save-interval", auto_save_interval,
4707d2d0
PJ
11766 doc: /* *Number of input events between auto-saves.
11767Zero means disable autosaving due to number of characters typed. */);
284f4730
JB
11768 auto_save_interval = 300;
11769
29208e82 11770 DEFVAR_LISP ("auto-save-timeout", Vauto_save_timeout,
4707d2d0
PJ
11771 doc: /* *Number of seconds idle time before auto-save.
11772Zero or nil means disable auto-saving due to idleness.
11773After auto-saving due to this many seconds of idle time,
11774Emacs also does a garbage collection if that seems to be warranted. */);
bb9e9bed 11775 XSETFASTINT (Vauto_save_timeout, 30);
284f4730 11776
29208e82 11777 DEFVAR_LISP ("echo-keystrokes", Vecho_keystrokes,
4707d2d0
PJ
11778 doc: /* *Nonzero means echo unfinished commands after this many seconds of pause.
11779The value may be integer or floating point. */);
39aab679 11780 Vecho_keystrokes = make_number (1);
284f4730 11781
29208e82 11782 DEFVAR_INT ("polling-period", polling_period,
4707d2d0
PJ
11783 doc: /* *Interval between polling for input during Lisp execution.
11784The reason for polling is to make C-g work to stop a running program.
11785Polling is needed only when using X windows and SIGIO does not work.
11786Polling is automatically disabled in all other cases. */);
284f4730 11787 polling_period = 2;
df0f2ba1 11788
29208e82 11789 DEFVAR_LISP ("double-click-time", Vdouble_click_time,
4707d2d0 11790 doc: /* *Maximum time between mouse clicks to make a double-click.
05e0ac99
JB
11791Measured in milliseconds. The value nil means disable double-click
11792recognition; t means double-clicks have no time limit and are detected
4707d2d0 11793by position only. */);
aab06933 11794 Vdouble_click_time = make_number (500);
fbcd35bd 11795
29208e82 11796 DEFVAR_INT ("double-click-fuzz", double_click_fuzz,
4707d2d0
PJ
11797 doc: /* *Maximum mouse movement between clicks to make a double-click.
11798On window-system frames, value is the number of pixels the mouse may have
11799moved horizontally or vertically between two clicks to make a double-click.
11800On non window-system frames, value is interpreted in units of 1/8 characters
1ca6a9c4
RS
11801instead of pixels.
11802
11803This variable is also the threshold for motion of the mouse
11804to count as a drag. */);
222d557c 11805 double_click_fuzz = 3;
c60ee5e7 11806
29208e82 11807 DEFVAR_BOOL ("inhibit-local-menu-bar-menus", inhibit_local_menu_bar_menus,
4707d2d0 11808 doc: /* *Non-nil means inhibit local map menu bar menus. */);
03361bcc
RS
11809 inhibit_local_menu_bar_menus = 0;
11810
29208e82 11811 DEFVAR_INT ("num-input-keys", num_input_keys,
4707d2d0
PJ
11812 doc: /* Number of complete key sequences read as input so far.
11813This includes key sequences read from keyboard macros.
11814The number is effectively the number of interactive command invocations. */);
284f4730
JB
11815 num_input_keys = 0;
11816
29208e82 11817 DEFVAR_INT ("num-nonmacro-input-events", num_nonmacro_input_events,
4707d2d0
PJ
11818 doc: /* Number of input events read from the keyboard so far.
11819This does not include events generated by keyboard macros. */);
c43b1734 11820 num_nonmacro_input_events = 0;
fa90970d 11821
29208e82 11822 DEFVAR_LISP ("last-event-frame", Vlast_event_frame,
4707d2d0
PJ
11823 doc: /* The frame in which the most recently read event occurred.
11824If the last event came from a keyboard macro, this is set to `macro'. */);
4c52b668
KH
11825 Vlast_event_frame = Qnil;
11826
fa90970d 11827 /* This variable is set up in sysdep.c. */
29208e82 11828 DEFVAR_LISP ("tty-erase-char", Vtty_erase_char,
4707d2d0 11829 doc: /* The ERASE character as set by the user with stty. */);
fa90970d 11830
29208e82 11831 DEFVAR_LISP ("help-char", Vhelp_char,
4707d2d0
PJ
11832 doc: /* Character to recognize as meaning Help.
11833When it is read, do `(eval help-form)', and display result if it's a string.
11834If the value of `help-form' is nil, this char can be read normally. */);
18cd2eeb 11835 XSETINT (Vhelp_char, Ctl ('H'));
284f4730 11836
29208e82 11837 DEFVAR_LISP ("help-event-list", Vhelp_event_list,
4707d2d0
PJ
11838 doc: /* List of input events to recognize as meaning Help.
11839These work just like the value of `help-char' (see that). */);
ecb7cb34
KH
11840 Vhelp_event_list = Qnil;
11841
29208e82 11842 DEFVAR_LISP ("help-form", Vhelp_form,
4707d2d0
PJ
11843 doc: /* Form to execute when character `help-char' is read.
11844If the form returns a string, that string is displayed.
11845If `help-form' is nil, the help char is not recognized. */);
284f4730
JB
11846 Vhelp_form = Qnil;
11847
29208e82 11848 DEFVAR_LISP ("prefix-help-command", Vprefix_help_command,
4707d2d0
PJ
11849 doc: /* Command to run when `help-char' character follows a prefix key.
11850This command is used only when there is no actual binding
11851for that character after that prefix key. */);
7e85b935
RS
11852 Vprefix_help_command = Qnil;
11853
29208e82 11854 DEFVAR_LISP ("top-level", Vtop_level,
4707d2d0
PJ
11855 doc: /* Form to evaluate when Emacs starts up.
11856Useful to set before you dump a modified Emacs. */);
284f4730
JB
11857 Vtop_level = Qnil;
11858
2e478293
KL
11859 DEFVAR_KBOARD ("keyboard-translate-table", Vkeyboard_translate_table,
11860 doc: /* Translate table for local keyboard input, or nil.
669de2fb
LT
11861If non-nil, the value should be a char-table. Each character read
11862from the keyboard is looked up in this char-table. If the value found
11863there is non-nil, then it is used instead of the actual input character.
11864
11865The value can also be a string or vector, but this is considered obsolete.
11866If it is a string or vector of length N, character codes N and up are left
11867untranslated. In a vector, an element which is nil means "no translation".
a0acc6c7
DL
11868
11869This is applied to the characters supplied to input methods, not their
2e478293
KL
11870output. See also `translation-table-for-input'.
11871
31c4aaf6
KR
11872This variable has a separate binding for each terminal.
11873See Info node `(elisp)Multiple Terminals'. */);
284f4730 11874
29208e82 11875 DEFVAR_BOOL ("cannot-suspend", cannot_suspend,
4707d2d0
PJ
11876 doc: /* Non-nil means to always spawn a subshell instead of suspending.
11877\(Even if the operating system has support for stopping a process.\) */);
8026024c
KH
11878 cannot_suspend = 0;
11879
29208e82 11880 DEFVAR_BOOL ("menu-prompting", menu_prompting,
4707d2d0
PJ
11881 doc: /* Non-nil means prompt with menus when appropriate.
11882This is done when reading from a keymap that has a prompt string,
11883for elements that have prompt strings.
11884The menu is displayed on the screen
11885if X menus were enabled at configuration
11886time and the previous event was a mouse click prefix key.
11887Otherwise, menu prompting uses the echo area. */);
284f4730
JB
11888 menu_prompting = 1;
11889
29208e82 11890 DEFVAR_LISP ("menu-prompt-more-char", menu_prompt_more_char,
4707d2d0
PJ
11891 doc: /* Character to see next line of menu prompt.
11892Type this character while in a menu prompt to rotate around the lines of it. */);
18cd2eeb 11893 XSETINT (menu_prompt_more_char, ' ');
9fa4395d 11894
29208e82 11895 DEFVAR_INT ("extra-keyboard-modifiers", extra_keyboard_modifiers,
4707d2d0
PJ
11896 doc: /* A mask of additional modifier keys to use with every keyboard character.
11897Emacs applies the modifiers of the character stored here to each keyboard
11898character it reads. For example, after evaluating the expression
11899 (setq extra-keyboard-modifiers ?\\C-x)
11900all input characters will have the control modifier applied to them.
11901
11902Note that the character ?\\C-@, equivalent to the integer zero, does
11903not count as a control character; rather, it counts as a character
11904with no modifiers; thus, setting `extra-keyboard-modifiers' to zero
11905cancels any modification. */);
9fa4395d 11906 extra_keyboard_modifiers = 0;
86e5706b 11907
29208e82 11908 DEFVAR_LISP ("deactivate-mark", Vdeactivate_mark,
4707d2d0
PJ
11909 doc: /* If an editing command sets this to t, deactivate the mark afterward.
11910The command loop sets this to nil before each command,
11911and tests the value when the command returns.
11912Buffer modification stores t in this variable. */);
86e5706b 11913 Vdeactivate_mark = Qnil;
d67b4f80 11914 Qdeactivate_mark = intern_c_string ("deactivate-mark");
5c4cc82a 11915 staticpro (&Qdeactivate_mark);
86e5706b 11916
29208e82 11917 DEFVAR_LISP ("command-hook-internal", Vcommand_hook_internal,
f761d6b6 11918 doc: /* Temporary storage of `pre-command-hook' or `post-command-hook'. */);
b0f2a7bf
KH
11919 Vcommand_hook_internal = Qnil;
11920
29208e82 11921 DEFVAR_LISP ("pre-command-hook", Vpre_command_hook,
4707d2d0
PJ
11922 doc: /* Normal hook run before each command is executed.
11923If an unhandled error happens in running this hook,
11924the hook value is set to nil, since otherwise the error
11925might happen repeatedly and make Emacs nonfunctional. */);
86e5706b
RS
11926 Vpre_command_hook = Qnil;
11927
29208e82 11928 DEFVAR_LISP ("post-command-hook", Vpost_command_hook,
4707d2d0
PJ
11929 doc: /* Normal hook run after each command is executed.
11930If an unhandled error happens in running this hook,
11931the hook value is set to nil, since otherwise the error
11932might happen repeatedly and make Emacs nonfunctional. */);
86e5706b 11933 Vpost_command_hook = Qnil;
48e416d4 11934
cf24f894
RS
11935#if 0
11936 DEFVAR_LISP ("echo-area-clear-hook", ...,
4707d2d0 11937 doc: /* Normal hook run when clearing the echo area. */);
cf24f894 11938#endif
d67b4f80 11939 Qecho_area_clear_hook = intern_c_string ("echo-area-clear-hook");
c8e16a02 11940 staticpro (&Qecho_area_clear_hook);
1373f3be 11941 Fset (Qecho_area_clear_hook, Qnil);
cdb9d665 11942
29208e82 11943 DEFVAR_LISP ("lucid-menu-bar-dirty-flag", Vlucid_menu_bar_dirty_flag,
fa1361cb 11944 doc: /* Non-nil means menu bar, specified Lucid style, needs to be recomputed. */);
48e416d4 11945 Vlucid_menu_bar_dirty_flag = Qnil;
a73c5e29 11946
29208e82 11947 DEFVAR_LISP ("menu-bar-final-items", Vmenu_bar_final_items,
4707d2d0
PJ
11948 doc: /* List of menu bar items to move to the end of the menu bar.
11949The elements of the list are event types that may have menu bar bindings. */);
9f9c0e27 11950 Vmenu_bar_final_items = Qnil;
e9bf89a0 11951
29208e82 11952 DEFVAR_LISP ("tool-bar-separator-image-expression", Vtool_bar_separator_image_expression,
94975270
CY
11953 doc: /* Expression evaluating to the image spec for a tool-bar separator.
11954This is used internally by graphical displays that do not render
11955tool-bar separators natively. Otherwise it is unused (e.g. on GTK). */);
11956 Vtool_bar_separator_image_expression = Qnil;
11957
217258d5
KH
11958 DEFVAR_KBOARD ("overriding-terminal-local-map",
11959 Voverriding_terminal_local_map,
4707d2d0
PJ
11960 doc: /* Per-terminal keymap that overrides all other local keymaps.
11961If this variable is non-nil, it is used as a keymap instead of the
11962buffer's local map, and the minor mode keymaps and text property keymaps.
5a45dd33
RS
11963It also replaces `overriding-local-map'.
11964
4707d2d0 11965This variable is intended to let commands such as `universal-argument'
2a42d440
KL
11966set up a different keymap for reading the next command.
11967
6ed8eeff
KL
11968`overriding-terminal-local-map' has a separate binding for each
11969terminal device.
31c4aaf6 11970See Info node `(elisp)Multiple Terminals'. */);
217258d5 11971
29208e82 11972 DEFVAR_LISP ("overriding-local-map", Voverriding_local_map,
4707d2d0 11973 doc: /* Keymap that overrides all other local keymaps.
5a45dd33
RS
11974If this variable is non-nil, it is used as a keymap--replacing the
11975buffer's local map, the minor mode keymaps, and char property keymaps. */);
9dd3131c
RS
11976 Voverriding_local_map = Qnil;
11977
29208e82 11978 DEFVAR_LISP ("overriding-local-map-menu-flag", Voverriding_local_map_menu_flag,
4707d2d0
PJ
11979 doc: /* Non-nil means `overriding-local-map' applies to the menu bar.
11980Otherwise, the menu bar continues to reflect the buffer's local map
11981and the minor mode maps regardless of `overriding-local-map'. */);
d0a49716
RS
11982 Voverriding_local_map_menu_flag = Qnil;
11983
29208e82 11984 DEFVAR_LISP ("special-event-map", Vspecial_event_map,
4707d2d0 11985 doc: /* Keymap defining bindings for special events to execute at low level. */);
d67b4f80 11986 Vspecial_event_map = Fcons (intern_c_string ("keymap"), Qnil);
7f07d5ca 11987
29208e82 11988 DEFVAR_LISP ("track-mouse", do_mouse_tracking,
4707d2d0 11989 doc: /* *Non-nil means generate motion events for mouse motion. */);
80e4aa30 11990
7c97ffdc 11991 DEFVAR_KBOARD ("system-key-alist", Vsystem_key_alist,
4707d2d0
PJ
11992 doc: /* Alist of system-specific X windows key symbols.
11993Each element should have the form (N . SYMBOL) where N is the
11994numeric keysym code (sans the \"system-specific\" bit 1<<28)
2a42d440
KL
11995and SYMBOL is its name.
11996
6ed8eeff 11997`system-key-alist' has a separate binding for each terminal device.
31c4aaf6 11998See Info node `(elisp)Multiple Terminals'. */);
8a792f3a 11999
ac09dc1e 12000 DEFVAR_KBOARD ("local-function-key-map", Vlocal_function_key_map,
e93b2956 12001 doc: /* Keymap that translates key sequences to key sequences during input.
4f4a84ec
SM
12002This is used mainly for mapping key sequences into some preferred
12003key events (symbols).
f01b6d17
KL
12004
12005The `read-key-sequence' function replaces any subsequence bound by
7a81ec10
KL
12006`local-function-key-map' with its binding. More precisely, when the
12007active keymaps have no binding for the current key sequence but
12008`local-function-key-map' binds a suffix of the sequence to a vector or
12009string, `read-key-sequence' replaces the matching suffix with its
12010binding, and continues with the new sequence.
f01b6d17 12011
feba0cd6
KL
12012If the binding is a function, it is called with one argument (the prompt)
12013and its return value (a key sequence) is used.
12014
7a81ec10
KL
12015The events that come from bindings in `local-function-key-map' are not
12016themselves looked up in `local-function-key-map'.
f01b6d17 12017
7a81ec10 12018For example, suppose `local-function-key-map' binds `ESC O P' to [f1].
f01b6d17 12019Typing `ESC O P' to `read-key-sequence' would return [f1]. Typing
7a81ec10
KL
12020`C-x ESC O P' would return [?\\C-x f1]. If [f1] were a prefix key,
12021typing `ESC O P x' would return [f1 x].
f01b6d17 12022
6ed8eeff 12023`local-function-key-map' has a separate binding for each terminal
31c4aaf6 12024device. See Info node `(elisp)Multiple Terminals'. If you need to
6ed8eeff 12025define a binding on all terminals, change `function-key-map'
7a81ec10 12026instead. Initially, `local-function-key-map' is an empty keymap that
6ed8eeff 12027has `function-key-map' as its parent on all terminal devices. */);
f01b6d17 12028
4f4a84ec
SM
12029 DEFVAR_KBOARD ("input-decode-map", Vinput_decode_map,
12030 doc: /* Keymap that decodes input escape sequences.
12031This is used mainly for mapping ASCII function key sequences into
12032real Emacs function key events (symbols).
12033
12034The `read-key-sequence' function replaces any subsequence bound by
9d0644c4 12035`input-decode-map' with its binding. Contrary to `function-key-map',
4f4a84ec
SM
12036this map applies its rebinding regardless of the presence of an ordinary
12037binding. So it is more like `key-translation-map' except that it applies
12038before `function-key-map' rather than after.
12039
12040If the binding is a function, it is called with one argument (the prompt)
12041and its return value (a key sequence) is used.
12042
12043The events that come from bindings in `input-decode-map' are not
12044themselves looked up in `input-decode-map'.
12045
12046This variable is keyboard-local. */);
12047
29208e82 12048 DEFVAR_LISP ("function-key-map", Vfunction_key_map,
ac09dc1e 12049 doc: /* The parent keymap of all `local-function-key-map' instances.
6ed8eeff 12050Function key definitions that apply to all terminal devices should go
7a81ec10
KL
12051here. If a mapping is defined in both the current
12052`local-function-key-map' binding and this variable, then the local
12053definition will take precendence. */);
ac09dc1e 12054 Vfunction_key_map = Fmake_sparse_keymap (Qnil);
033b73e2 12055
29208e82 12056 DEFVAR_LISP ("key-translation-map", Vkey_translation_map,
4f4a84ec 12057 doc: /* Keymap of key translations that can override keymaps.
4ea81208
KL
12058This keymap works like `function-key-map', but comes after that,
12059and its non-prefix bindings override ordinary bindings.
4f4a84ec 12060Another difference is that it is global rather than keyboard-local. */);
ac09dc1e 12061 Vkey_translation_map = Fmake_sparse_keymap (Qnil);
8a792f3a 12062
29208e82 12063 DEFVAR_LISP ("deferred-action-list", Vdeferred_action_list,
4707d2d0
PJ
12064 doc: /* List of deferred actions to be performed at a later time.
12065The precise format isn't relevant here; we just check whether it is nil. */);
8a792f3a
RS
12066 Vdeferred_action_list = Qnil;
12067
29208e82 12068 DEFVAR_LISP ("deferred-action-function", Vdeferred_action_function,
4707d2d0
PJ
12069 doc: /* Function to call to handle deferred actions, after each command.
12070This function is called with no arguments after each command
12071whenever `deferred-action-list' is non-nil. */);
8a792f3a 12072 Vdeferred_action_function = Qnil;
6526ab49 12073
29208e82 12074 DEFVAR_LISP ("suggest-key-bindings", Vsuggest_key_bindings,
4707d2d0
PJ
12075 doc: /* *Non-nil means show the equivalent key-binding when M-x command has one.
12076The value can be a length of time to show the message for.
12077If the value is non-nil and not a number, we wait 2 seconds. */);
6526ab49 12078 Vsuggest_key_bindings = Qt;
8bb1c042 12079
29208e82 12080 DEFVAR_LISP ("timer-list", Vtimer_list,
4707d2d0 12081 doc: /* List of active absolute time timers in order of increasing time. */);
c04cbc3b 12082 Vtimer_list = Qnil;
d9d4c147 12083
29208e82 12084 DEFVAR_LISP ("timer-idle-list", Vtimer_idle_list,
4707d2d0 12085 doc: /* List of active idle-time timers in order of increasing time. */);
d9d4c147 12086 Vtimer_idle_list = Qnil;
7d18f9ae 12087
29208e82 12088 DEFVAR_LISP ("input-method-function", Vinput_method_function,
4707d2d0
PJ
12089 doc: /* If non-nil, the function that implements the current input method.
12090It's called with one argument, a printing character that was just read.
12091\(That means a character with code 040...0176.)
12092Typically this function uses `read-event' to read additional events.
12093When it does so, it should first bind `input-method-function' to nil
12094so it will not be called recursively.
12095
12096The function should return a list of zero or more events
12097to be used as input. If it wants to put back some events
12098to be reconsidered, separately, by the input method,
12099it can add them to the beginning of `unread-command-events'.
12100
f761d6b6 12101The input method function can find in `input-method-previous-message'
4707d2d0
PJ
12102the previous echo area message.
12103
12104The input method function should refer to the variables
12105`input-method-use-echo-area' and `input-method-exit-on-first-char'
12106for guidance on what to do. */);
7d18f9ae 12107 Vinput_method_function = Qnil;
d5eecefb
RS
12108
12109 DEFVAR_LISP ("input-method-previous-message",
29208e82 12110 Vinput_method_previous_message,
4707d2d0
PJ
12111 doc: /* When `input-method-function' is called, hold the previous echo area message.
12112This variable exists because `read-event' clears the echo area
12113before running the input method. It is nil if there was no message. */);
d5eecefb 12114 Vinput_method_previous_message = Qnil;
7ee32cda 12115
29208e82 12116 DEFVAR_LISP ("show-help-function", Vshow_help_function,
4707d2d0
PJ
12117 doc: /* If non-nil, the function that implements the display of help.
12118It's called with one argument, the help string to display. */);
7ee32cda 12119 Vshow_help_function = Qnil;
adf5cb9c 12120
29208e82 12121 DEFVAR_LISP ("disable-point-adjustment", Vdisable_point_adjustment,
4707d2d0
PJ
12122 doc: /* If non-nil, suppress point adjustment after executing a command.
12123
12124After a command is executed, if point is moved into a region that has
12125special properties (e.g. composition, display), we adjust point to
5fee9a2f
LT
12126the boundary of the region. But, when a command sets this variable to
12127non-nil, we suppress the point adjustment.
4707d2d0
PJ
12128
12129This variable is set to nil before reading a command, and is checked
12130just after executing the command. */);
adf5cb9c
KH
12131 Vdisable_point_adjustment = Qnil;
12132
12133 DEFVAR_LISP ("global-disable-point-adjustment",
29208e82 12134 Vglobal_disable_point_adjustment,
4707d2d0
PJ
12135 doc: /* *If non-nil, always suppress point adjustment.
12136
12137The default value is nil, in which case, point adjustment are
12138suppressed only after special commands that set
12139`disable-point-adjustment' (which see) to non-nil. */);
adf5cb9c 12140 Vglobal_disable_point_adjustment = Qnil;
3626fb1a 12141
29208e82 12142 DEFVAR_LISP ("minibuffer-message-timeout", Vminibuffer_message_timeout,
4707d2d0
PJ
12143 doc: /* *How long to display an echo-area message when the minibuffer is active.
12144If the value is not a number, such messages don't time out. */);
00392ce6 12145 Vminibuffer_message_timeout = make_number (2);
2a84c6da 12146
29208e82 12147 DEFVAR_LISP ("throw-on-input", Vthrow_on_input,
2a84c6da
KS
12148 doc: /* If non-nil, any keyboard input throws to this symbol.
12149The value of that variable is passed to `quit-flag' and later causes a
12150peculiar kind of quitting. */);
12151 Vthrow_on_input = Qnil;
9d56e0da 12152
29208e82 12153 DEFVAR_LISP ("command-error-function", Vcommand_error_function,
04d8c47d
RS
12154 doc: /* If non-nil, function to output error messages.
12155The arguments are the error data, a list of the form
12156 (SIGNALED-CONDITIONS . SIGNAL-DATA)
12157such as just as `condition-case' would bind its variable to,
12158the context (a string which normally goes at the start of the message),
12159and the Lisp function within which the error was signaled. */);
12160 Vcommand_error_function = Qnil;
12161
9d56e0da 12162 DEFVAR_LISP ("enable-disabled-menus-and-buttons",
29208e82 12163 Venable_disabled_menus_and_buttons,
9d56e0da
EZ
12164 doc: /* If non-nil, don't ignore events produced by disabled menu items and tool-bar.
12165
12166Help functions bind this to allow help on disabled menu items
12167and tool-bar buttons. */);
12168 Venable_disabled_menus_and_buttons = Qnil;
1bc973c2 12169
9852377f 12170 DEFVAR_LISP ("select-active-regions",
29208e82 12171 Vselect_active_regions,
7c420169 12172 doc: /* If non-nil, an active region automatically sets the primary selection.
7c23dd44
CY
12173If the value is `only', only temporarily active regions (usually made
12174by mouse-dragging or shift-selection) set the window selection.
9852377f 12175
7c23dd44
CY
12176This takes effect only when Transient Mark mode is enabled. */);
12177 Vselect_active_regions = Qt;
9852377f
CY
12178
12179 DEFVAR_LISP ("saved-region-selection",
29208e82 12180 Vsaved_region_selection,
9852377f
CY
12181 doc: /* Contents of active region prior to buffer modification.
12182If `select-active-regions' is non-nil, Emacs sets this to the
12183text in the region before modifying the buffer. The next
12184`deactivate-mark' call uses this to set the window selection. */);
12185 Vsaved_region_selection = Qnil;
12186
1bc973c2
SM
12187 /* Create the initial keyboard. */
12188 initial_kboard = (KBOARD *) xmalloc (sizeof (KBOARD));
12189 init_kboard (initial_kboard);
12190 /* Vwindow_system is left at t for now. */
12191 initial_kboard->next_kboard = all_kboards;
12192 all_kboards = initial_kboard;
284f4730
JB
12193}
12194
dfcf069d 12195void
d3da34e0 12196keys_of_keyboard (void)
284f4730
JB
12197{
12198 initial_define_key (global_map, Ctl ('Z'), "suspend-emacs");
12199 initial_define_key (control_x_map, Ctl ('Z'), "suspend-emacs");
12200 initial_define_key (meta_map, Ctl ('C'), "exit-recursive-edit");
12201 initial_define_key (global_map, Ctl (']'), "abort-recursive-edit");
12202 initial_define_key (meta_map, 'x', "execute-extended-command");
7f07d5ca
RS
12203
12204 initial_define_lispy_key (Vspecial_event_map, "delete-frame",
12205 "handle-delete-frame");
8612b71a
AR
12206 initial_define_lispy_key (Vspecial_event_map, "ns-put-working-text",
12207 "ns-put-working-text");
12208 initial_define_lispy_key (Vspecial_event_map, "ns-unput-working-text",
12209 "ns-unput-working-text");
a18bf897
SM
12210 /* Here we used to use `ignore-event' which would simple set prefix-arg to
12211 current-prefix-arg, as is done in `handle-switch-frame'.
12212 But `handle-switch-frame is not run from the special-map.
12213 Commands from that map are run in a special way that automatically
12214 preserves the prefix-arg. Restoring the prefix arg here is not just
12215 redundant but harmful:
12216 - C-u C-x v =
12217 - current-prefix-arg is set to non-nil, prefix-arg is set to nil.
12218 - after the first prompt, the exit-minibuffer-hook is run which may
12219 iconify a frame and thus push a `iconify-frame' event.
12220 - after running exit-minibuffer-hook, current-prefix-arg is
12221 restored to the non-nil value it had before the prompt.
12222 - we enter the second prompt.
12223 current-prefix-arg is non-nil, prefix-arg is nil.
12224 - before running the first real event, we run the special iconify-frame
12225 event, but we pass the `special' arg to execute-command so
12226 current-prefix-arg and prefix-arg are left untouched.
12227 - here we foolishly copy the non-nil current-prefix-arg to prefix-arg.
12228 - the next key event will have a spuriously non-nil current-prefix-arg. */
7f07d5ca 12229 initial_define_lispy_key (Vspecial_event_map, "iconify-frame",
a18bf897 12230 "ignore");
7f07d5ca 12231 initial_define_lispy_key (Vspecial_event_map, "make-frame-visible",
a18bf897 12232 "ignore");
a4e19f6e
SM
12233 /* Handling it at such a low-level causes read_key_sequence to get
12234 * confused because it doesn't realize that the current_buffer was
12235 * changed by read_char.
6b61353c 12236 *
a4e19f6e
SM
12237 * initial_define_lispy_key (Vspecial_event_map, "select-window",
12238 * "handle-select-window"); */
4ebc27a5
JD
12239 initial_define_lispy_key (Vspecial_event_map, "save-session",
12240 "handle-save-session");
033b73e2
MA
12241
12242#ifdef HAVE_DBUS
12243 /* Define a special event which is raised for dbus callback
12244 functions. */
12245 initial_define_lispy_key (Vspecial_event_map, "dbus-event",
12246 "dbus-handle-event");
12247#endif
637fa988
JD
12248
12249 initial_define_lispy_key (Vspecial_event_map, "config-changed-event",
12250 "ignore");
284f4730 12251}
1269a761
SM
12252
12253/* Mark the pointers in the kboard objects.
12254 Called by the Fgarbage_collector. */
12255void
d3da34e0 12256mark_kboards (void)
1269a761
SM
12257{
12258 KBOARD *kb;
12259 Lisp_Object *p;
12260 for (kb = all_kboards; kb; kb = kb->next_kboard)
12261 {
12262 if (kb->kbd_macro_buffer)
12263 for (p = kb->kbd_macro_buffer; p < kb->kbd_macro_ptr; p++)
3ebb8729
SM
12264 mark_object (*p);
12265 mark_object (kb->Voverriding_terminal_local_map);
12266 mark_object (kb->Vlast_command);
12267 mark_object (kb->Vreal_last_command);
1d33157f 12268 mark_object (kb->Vkeyboard_translate_table);
d0d3a311 12269 mark_object (kb->Vlast_repeatable_command);
3ebb8729
SM
12270 mark_object (kb->Vprefix_arg);
12271 mark_object (kb->Vlast_prefix_arg);
12272 mark_object (kb->kbd_queue);
12273 mark_object (kb->defining_kbd_macro);
12274 mark_object (kb->Vlast_kbd_macro);
12275 mark_object (kb->Vsystem_key_alist);
12276 mark_object (kb->system_key_syms);
70b8d0a4 12277 mark_object (kb->Vwindow_system);
4f4a84ec 12278 mark_object (kb->Vinput_decode_map);
ac09dc1e 12279 mark_object (kb->Vlocal_function_key_map);
3ebb8729
SM
12280 mark_object (kb->Vdefault_minibuffer_frame);
12281 mark_object (kb->echo_string);
1269a761
SM
12282 }
12283 {
12284 struct input_event *event;
12285 for (event = kbd_fetch_ptr; event != kbd_store_ptr; event++)
12286 {
12287 if (event == kbd_buffer + KBD_BUFFER_SIZE)
12288 event = kbd_buffer;
e3f6e7c7
KS
12289 if (event->kind != SELECTION_REQUEST_EVENT
12290 && event->kind != SELECTION_CLEAR_EVENT)
0161caf9
KS
12291 {
12292 mark_object (event->x);
12293 mark_object (event->y);
12294 }
3ebb8729
SM
12295 mark_object (event->frame_or_window);
12296 mark_object (event->arg);
1269a761
SM
12297 }
12298 }
12299}