(kbd_buffer_get_event): Return Qnil when current time is exactly equal to
[bpt/emacs.git] / src / keyboard.c
CommitLineData
284f4730 1/* Keyboard and mouse input; editor command loop.
0b5538bd
TTN
2 Copyright (C) 1985, 1986, 1987, 1988, 1989, 1993, 1994, 1995,
3 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004,
aaef169d 4 2005, 2006 Free Software Foundation, Inc.
284f4730
JB
5
6This file is part of GNU Emacs.
7
8GNU Emacs is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
7b4aedb9 10the Free Software Foundation; either version 2, or (at your option)
284f4730
JB
11any later version.
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GNU Emacs; see the file COPYING. If not, write to
4fc5845f
LK
20the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21Boston, MA 02110-1301, USA. */
284f4730 22
18160b98 23#include <config.h>
68c45bf0 24#include <signal.h>
284f4730 25#include <stdio.h>
284f4730
JB
26#include "termchar.h"
27#include "termopts.h"
28#include "lisp.h"
29#include "termhooks.h"
30#include "macros.h"
02639609 31#include "keyboard.h"
ff11dfa1 32#include "frame.h"
284f4730
JB
33#include "window.h"
34#include "commands.h"
35#include "buffer.h"
37cd9f30 36#include "charset.h"
284f4730 37#include "disptab.h"
f4255cd1 38#include "dispextern.h"
e39da3d7 39#include "syntax.h"
497ba7a1 40#include "intervals.h"
bdb7aa47 41#include "keymap.h"
9ac0d9e0 42#include "blockinput.h"
e8886a1d 43#include "puresize.h"
8a9f5d3c
GM
44#include "systime.h"
45#include "atimer.h"
284f4730
JB
46#include <setjmp.h>
47#include <errno.h>
48
aa477689
JD
49#ifdef HAVE_GTK_AND_PTHREAD
50#include <pthread.h>
51#endif
80e4aa30
RS
52#ifdef MSDOS
53#include "msdos.h"
54#include <time.h>
55#else /* not MSDOS */
284f4730
JB
56#ifndef VMS
57#include <sys/ioctl.h>
284f4730 58#endif
80e4aa30 59#endif /* not MSDOS */
284f4730 60
52baf19e 61#include "syssignal.h"
6ef5b54f 62#include "systty.h"
52baf19e 63
03cee6ae
GM
64#include <sys/types.h>
65#ifdef HAVE_UNISTD_H
66#include <unistd.h>
67#endif
68
e31d908f
DN
69#ifdef HAVE_FCNTL_H
70#include <fcntl.h>
71#endif
72
c5e3b6c5
RS
73/* This is to get the definitions of the XK_ symbols. */
74#ifdef HAVE_X_WINDOWS
75#include "xterm.h"
76#endif
77
e98a93eb
GV
78#ifdef HAVE_NTGUI
79#include "w32term.h"
80#endif /* HAVE_NTGUI */
81
e0f712ba 82#ifdef MAC_OS
1a578e9b
AC
83#include "macterm.h"
84#endif
85
02639609 86#ifndef USE_CRT_DLL
52baf19e 87extern int errno;
02639609 88#endif
52baf19e 89
9ac0d9e0
JB
90/* Variables for blockinput.h: */
91
92/* Non-zero if interrupt input is blocked right now. */
63927c41 93int interrupt_input_blocked;
9ac0d9e0
JB
94
95/* Nonzero means an input interrupt has arrived
96 during the current critical section. */
63927c41 97int interrupt_input_pending;
9ac0d9e0
JB
98
99
437f6112
RS
100/* File descriptor to use for input. */
101extern int input_fd;
284f4730 102
e98a93eb 103#ifdef HAVE_WINDOW_SYSTEM
284f4730 104/* Make all keyboard buffers much bigger when using X windows. */
e0f712ba
AC
105#ifdef MAC_OS8
106/* But not too big (local data > 32K error) if on Mac OS Classic. */
f019cded
RS
107#define KBD_BUFFER_SIZE 512
108#else
284f4730 109#define KBD_BUFFER_SIZE 4096
f019cded 110#endif
284f4730 111#else /* No X-windows, character input */
de11c1ea 112#define KBD_BUFFER_SIZE 4096
284f4730
JB
113#endif /* No X-windows */
114
222d557c
GM
115#define abs(x) ((x) >= 0 ? (x) : -(x))
116
284f4730
JB
117/* Following definition copied from eval.c */
118
119struct backtrace
120 {
121 struct backtrace *next;
122 Lisp_Object *function;
123 Lisp_Object *args; /* Points to vector of args. */
124 int nargs; /* length of vector. If nargs is UNEVALLED,
125 args points to slot holding list of
126 unevalled args */
127 char evalargs;
080e18b1
KS
128 /* Nonzero means call value of debugger when done with this operation. */
129 char debug_on_exit;
284f4730
JB
130 };
131
c5fdd383
KH
132#ifdef MULTI_KBOARD
133KBOARD *initial_kboard;
134KBOARD *current_kboard;
135KBOARD *all_kboards;
1e8bd3da 136int single_kboard;
6c6083a9 137#else
c5fdd383 138KBOARD the_only_kboard;
6c6083a9 139#endif
612b78ef 140
284f4730 141/* Non-nil disable property on a command means
971e4c98
LT
142 do not execute it; call disabled-command-function's value instead. */
143Lisp_Object Qdisabled, Qdisabled_command_function;
284f4730
JB
144
145#define NUM_RECENT_KEYS (100)
146int recent_keys_index; /* Index for storing next element into recent_keys */
147int total_keys; /* Total number of elements stored into recent_keys */
5160df46 148Lisp_Object recent_keys; /* A vector, holding the last 100 keystrokes */
284f4730 149
6569cc8d
JB
150/* Vector holding the key sequence that invoked the current command.
151 It is reused for each command, and it may be longer than the current
152 sequence; this_command_key_count indicates how many elements
153 actually mean something.
154 It's easier to staticpro a single Lisp_Object than an array. */
155Lisp_Object this_command_keys;
156int this_command_key_count;
284f4730 157
63020c46
RS
158/* 1 after calling Freset_this_command_lengths.
159 Usually it is 0. */
160int this_command_key_count_reset;
161
7d18f9ae
RS
162/* This vector is used as a buffer to record the events that were actually read
163 by read_key_sequence. */
164Lisp_Object raw_keybuf;
165int raw_keybuf_count;
166
167#define GROW_RAW_KEYBUF \
7189cad8 168 if (raw_keybuf_count == XVECTOR (raw_keybuf)->size) \
7d18f9ae
RS
169 { \
170 int newsize = 2 * XVECTOR (raw_keybuf)->size; \
171 Lisp_Object new; \
172 new = Fmake_vector (make_number (newsize), Qnil); \
173 bcopy (XVECTOR (raw_keybuf)->contents, XVECTOR (new)->contents, \
174 raw_keybuf_count * sizeof (Lisp_Object)); \
175 raw_keybuf = new; \
176 }
177
6321824f
RS
178/* Number of elements of this_command_keys
179 that precede this key sequence. */
180int this_single_command_key_start;
181
71918b75
RS
182/* Record values of this_command_key_count and echo_length ()
183 before this command was read. */
184static int before_command_key_count;
185static int before_command_echo_length;
71918b75 186
284f4730
JB
187extern int minbuf_level;
188
a59b172a
RS
189extern int message_enable_multibyte;
190
284f4730
JB
191extern struct backtrace *backtrace_list;
192
7ee32cda
GM
193/* If non-nil, the function that implements the display of help.
194 It's called with one argument, the help string to display. */
195
196Lisp_Object Vshow_help_function;
197
f0c1cc56
GM
198/* If a string, the message displayed before displaying a help-echo
199 in the echo area. */
200
201Lisp_Object Vpre_help_message;
202
284f4730 203/* Nonzero means do menu prompting. */
f0c1cc56 204
284f4730
JB
205static int menu_prompting;
206
207/* Character to see next line of menu prompt. */
f0c1cc56 208
284f4730
JB
209static Lisp_Object menu_prompt_more_char;
210
211/* For longjmp to where kbd input is being done. */
f0c1cc56 212
284f4730
JB
213static jmp_buf getcjmp;
214
215/* True while doing kbd input. */
216int waiting_for_input;
217
218/* True while displaying for echoing. Delays C-g throwing. */
985f9f66 219
c843d6c6 220int echoing;
284f4730 221
985f9f66
GM
222/* Non-null means we can start echoing at the next input pause even
223 though there is something in the echo area. */
224
225static struct kboard *ok_to_echo_at_next_pause;
226
59a84f8e
GM
227/* The kboard last echoing, or null for none. Reset to 0 in
228 cancel_echoing. If non-null, and a current echo area message
229 exists, and echo_message_buffer is eq to the current message
230 buffer, we know that the message comes from echo_kboard. */
985f9f66 231
f49aedfd 232struct kboard *echo_kboard;
1fc93d49 233
59a84f8e
GM
234/* The buffer used for echoing. Set in echo_now, reset in
235 cancel_echoing. */
236
c843d6c6 237Lisp_Object echo_message_buffer;
59a84f8e 238
03361bcc
RS
239/* Nonzero means disregard local maps for the menu bar. */
240static int inhibit_local_menu_bar_menus;
241
80e4aa30 242/* Nonzero means C-g should cause immediate error-signal. */
284f4730
JB
243int immediate_quit;
244
04d8c47d
RS
245/* The user's hook function for outputting an error message. */
246Lisp_Object Vcommand_error_function;
247
fa90970d
RS
248/* The user's ERASE setting. */
249Lisp_Object Vtty_erase_char;
250
284f4730 251/* Character to recognize as the help char. */
7e85b935 252Lisp_Object Vhelp_char;
284f4730 253
ecb7cb34
KH
254/* List of other event types to recognize as meaning "help". */
255Lisp_Object Vhelp_event_list;
256
284f4730
JB
257/* Form to execute when help char is typed. */
258Lisp_Object Vhelp_form;
259
7e85b935
RS
260/* Command to run when the help character follows a prefix key. */
261Lisp_Object Vprefix_help_command;
262
9f9c0e27
RS
263/* List of items that should move to the end of the menu bar. */
264Lisp_Object Vmenu_bar_final_items;
a73c5e29 265
6526ab49
RS
266/* Non-nil means show the equivalent key-binding for
267 any M-x command that has one.
268 The value can be a length of time to show the message for.
269 If the value is non-nil and not a number, we wait 2 seconds. */
270Lisp_Object Vsuggest_key_bindings;
271
00392ce6
MB
272/* How long to display an echo-area message when the minibuffer is active.
273 If the value is not a number, such messages don't time out. */
274Lisp_Object Vminibuffer_message_timeout;
275
284f4730
JB
276/* Character that causes a quit. Normally C-g.
277
278 If we are running on an ordinary terminal, this must be an ordinary
279 ASCII char, since we want to make it our interrupt character.
280
281 If we are not running on an ordinary terminal, it still needs to be
282 an ordinary ASCII char. This character needs to be recognized in
283 the input interrupt handler. At this point, the keystroke is
284 represented as a struct input_event, while the desired quit
285 character is specified as a lispy event. The mapping from struct
286 input_events to lispy events cannot run in an interrupt handler,
287 and the reverse mapping is difficult for anything but ASCII
288 keystrokes.
289
290 FOR THESE ELABORATE AND UNSATISFYING REASONS, quit_char must be an
291 ASCII character. */
292int quit_char;
293
294extern Lisp_Object current_global_map;
295extern int minibuf_level;
296
9dd3131c
RS
297/* If non-nil, this is a map that overrides all other local maps. */
298Lisp_Object Voverriding_local_map;
299
d0a49716
RS
300/* If non-nil, Voverriding_local_map applies to the menu bar. */
301Lisp_Object Voverriding_local_map_menu_flag;
302
7f07d5ca
RS
303/* Keymap that defines special misc events that should
304 be processed immediately at a low level. */
305Lisp_Object Vspecial_event_map;
306
284f4730
JB
307/* Current depth in recursive edits. */
308int command_loop_level;
309
310/* Total number of times command_loop has read a key sequence. */
31ade731 311EMACS_INT num_input_keys;
284f4730
JB
312
313/* Last input character read as a command. */
314Lisp_Object last_command_char;
315
7d6de002
RS
316/* Last input character read as a command, not counting menus
317 reached by the mouse. */
318Lisp_Object last_nonmenu_event;
319
284f4730
JB
320/* Last input character read for any purpose. */
321Lisp_Object last_input_char;
322
dbc4e1c1 323/* If not Qnil, a list of objects to be read as subsequent command input. */
24597608 324Lisp_Object Vunread_command_events;
284f4730 325
7d18f9ae
RS
326/* If not Qnil, a list of objects to be read as subsequent command input
327 including input method processing. */
328Lisp_Object Vunread_input_method_events;
329
330/* If not Qnil, a list of objects to be read as subsequent command input
331 but NOT including input method processing. */
332Lisp_Object Vunread_post_input_method_events;
333
86e5706b 334/* If not -1, an event to be read as subsequent command input. */
31ade731 335EMACS_INT unread_command_char;
86e5706b 336
cd21b839
JB
337/* If not Qnil, this is a switch-frame event which we decided to put
338 off until the end of a key sequence. This should be read as the
dbc4e1c1 339 next command input, after any unread_command_events.
8f805655
JB
340
341 read_key_sequence uses this to delay switch-frame events until the
342 end of the key sequence; Fread_char uses it to put off switch-frame
343 events until a non-ASCII event is acceptable as input. */
344Lisp_Object unread_switch_frame;
cd21b839 345
9fa4395d 346/* A mask of extra modifier bits to put into every keyboard char. */
31ade731 347EMACS_INT extra_keyboard_modifiers;
9fa4395d 348
284f4730
JB
349/* Char to use as prefix when a meta character is typed in.
350 This is bound on entry to minibuffer in case ESC is changed there. */
351
352Lisp_Object meta_prefix_char;
353
354/* Last size recorded for a current buffer which is not a minibuffer. */
355static int last_non_minibuf_size;
356
06ef7355 357/* Number of idle seconds before an auto-save and garbage collection. */
284f4730
JB
358static Lisp_Object Vauto_save_timeout;
359
360/* Total number of times read_char has returned. */
4abfba1f 361int num_input_events;
284f4730 362
51172b6d 363/* Total number of times read_char has returned, outside of macros. */
31ade731 364EMACS_INT num_nonmacro_input_events;
51172b6d 365
284f4730
JB
366/* Auto-save automatically when this many characters have been typed
367 since the last time. */
368
31ade731 369static EMACS_INT auto_save_interval;
284f4730 370
c43b1734 371/* Value of num_nonmacro_input_events as of last auto save. */
284f4730
JB
372
373int last_auto_save;
374
284f4730 375/* The command being executed by the command loop.
6c7178b9
KH
376 Commands may set this, and the value set will be copied into
377 current_kboard->Vlast_command instead of the actual command. */
d5eecefb
RS
378Lisp_Object Vthis_command;
379
380/* This is like Vthis_command, except that commands never set it. */
381Lisp_Object real_this_command;
284f4730 382
8b9940e6
KS
383/* If the lookup of the command returns a binding, the original
384 command is stored in this-original-command. It is nil otherwise. */
385Lisp_Object Vthis_original_command;
386
bb0e1d19 387/* The value of point when the last command was started. */
b453f72e
KH
388int last_point_position;
389
047688cb
RS
390/* The buffer that was current when the last command was started. */
391Lisp_Object last_point_position_buffer;
392
bb0e1d19
RS
393/* The window that was selected when the last command was started. */
394Lisp_Object last_point_position_window;
395
4c52b668
KH
396/* The frame in which the last input event occurred, or Qmacro if the
397 last event came from a macro. We use this to determine when to
398 generate switch-frame events. This may be cleared by functions
399 like Fselect_frame, to make sure that a switch-frame event is
400 generated by the next character. */
401Lisp_Object internal_last_event_frame;
4c52b668
KH
402
403/* A user-visible version of the above, intended to allow users to
404 figure out where the last event came from, if the event doesn't
405 carry that information itself (i.e. if it was a character). */
406Lisp_Object Vlast_event_frame;
407
1113d9db
JB
408/* The timestamp of the last input event we received from the X server.
409 X Windows wants this for selection ownership. */
284f4730
JB
410unsigned long last_event_timestamp;
411
412Lisp_Object Qself_insert_command;
413Lisp_Object Qforward_char;
414Lisp_Object Qbackward_char;
e58aa385 415Lisp_Object Qundefined;
d925fb39 416Lisp_Object Qtimer_event_handler;
284f4730
JB
417
418/* read_key_sequence stores here the command definition of the
419 key sequence that it reads. */
420Lisp_Object read_key_sequence_cmd;
421
39aab679
DL
422/* Echo unfinished commands after this many seconds of pause. */
423Lisp_Object Vecho_keystrokes;
424
284f4730
JB
425/* Form to evaluate (if non-nil) when Emacs is started. */
426Lisp_Object Vtop_level;
427
a0acc6c7 428/* User-supplied table to translate input characters. */
284f4730
JB
429Lisp_Object Vkeyboard_translate_table;
430
431/* Keymap mapping ASCII function key sequences onto their preferred forms. */
432extern Lisp_Object Vfunction_key_map;
433
e0301c07
RS
434/* Another keymap that maps key sequences into key sequences.
435 This one takes precedence over ordinary definitions. */
436extern Lisp_Object Vkey_translation_map;
a612e298 437
7d18f9ae
RS
438/* If non-nil, this implements the current input method. */
439Lisp_Object Vinput_method_function;
440Lisp_Object Qinput_method_function;
441
d5eecefb
RS
442/* When we call Vinput_method_function,
443 this holds the echo area message that was just erased. */
444Lisp_Object Vinput_method_previous_message;
445
86e5706b
RS
446/* Non-nil means deactivate the mark at end of this command. */
447Lisp_Object Vdeactivate_mark;
448
48e416d4
RS
449/* Menu bar specified in Lucid Emacs fashion. */
450
451Lisp_Object Vlucid_menu_bar_dirty_flag;
452Lisp_Object Qrecompute_lucid_menubar, Qactivate_menubar_hook;
453
cf24f894 454Lisp_Object Qecho_area_clear_hook;
cdb9d665 455
86e5706b 456/* Hooks to run before and after each command. */
59aadc81
RS
457Lisp_Object Qpre_command_hook, Vpre_command_hook;
458Lisp_Object Qpost_command_hook, Vpost_command_hook;
40932d1a 459Lisp_Object Qcommand_hook_internal, Vcommand_hook_internal;
86e5706b 460
8a792f3a
RS
461/* List of deferred actions to be performed at a later time.
462 The precise format isn't relevant here; we just check whether it is nil. */
463Lisp_Object Vdeferred_action_list;
464
465/* Function to call to handle deferred actions, when there are any. */
466Lisp_Object Vdeferred_action_function;
3ef14e46 467Lisp_Object Qdeferred_action_function;
8a792f3a 468
d5eecefb
RS
469Lisp_Object Qinput_method_exit_on_first_char;
470Lisp_Object Qinput_method_use_echo_area;
471
284f4730
JB
472/* File in which we write all commands we read. */
473FILE *dribble;
474
475/* Nonzero if input is available. */
476int input_pending;
477
b04904fb
RS
478/* 1 if should obey 0200 bit in input chars as "Meta", 2 if should
479 keep 0200 bit in input chars. 0 to ignore the 0200 bit. */
480
284f4730
JB
481int meta_key;
482
483extern char *pending_malloc_warning;
484
beecf6a1 485/* Circular buffer for pre-read keyboard input. */
da8f7368 486
beecf6a1
KH
487static struct input_event kbd_buffer[KBD_BUFFER_SIZE];
488
beecf6a1
KH
489/* Pointer to next available character in kbd_buffer.
490 If kbd_fetch_ptr == kbd_store_ptr, the buffer is empty.
5cb6905d 491 This may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the
beecf6a1
KH
492 next available char is in kbd_buffer[0]. */
493static struct input_event *kbd_fetch_ptr;
494
495/* Pointer to next place to store character in kbd_buffer. This
496 may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the next
497 character should go in kbd_buffer[0]. */
7ee32cda 498static struct input_event * volatile kbd_store_ptr;
beecf6a1
KH
499
500/* The above pair of variables forms a "queue empty" flag. When we
501 enqueue a non-hook event, we increment kbd_store_ptr. When we
502 dequeue a non-hook event, we increment kbd_fetch_ptr. We say that
503 there is input available iff the two pointers are not equal.
504
505 Why not just have a flag set and cleared by the enqueuing and
506 dequeuing functions? Such a flag could be screwed up by interrupts
507 at inopportune times. */
508
f3253854 509/* If this flag is non-nil, we check mouse_moved to see when the
a9d77f1f
RS
510 mouse moves, and motion events will appear in the input stream.
511 Otherwise, mouse motion is ignored. */
e10da507 512Lisp_Object do_mouse_tracking;
284f4730 513
284f4730
JB
514/* Symbols to head events. */
515Lisp_Object Qmouse_movement;
3c370943 516Lisp_Object Qscroll_bar_movement;
cd21b839 517Lisp_Object Qswitch_frame;
bbdc2092 518Lisp_Object Qdelete_frame;
af17bd2b
KH
519Lisp_Object Qiconify_frame;
520Lisp_Object Qmake_frame_visible;
a697f886 521Lisp_Object Qselect_window;
7ee32cda 522Lisp_Object Qhelp_echo;
cd21b839 523
c22237f7
KS
524#ifdef HAVE_MOUSE
525Lisp_Object Qmouse_fixup_help_message;
526#endif
527
284f4730
JB
528/* Symbols to denote kinds of events. */
529Lisp_Object Qfunction_key;
530Lisp_Object Qmouse_click;
c16dab62 531#if defined (WINDOWSNT) || defined (MAC_OS)
1161d367 532Lisp_Object Qlanguage_change;
07de30b9 533#endif
a24dc617 534Lisp_Object Qdrag_n_drop;
4ebc27a5 535Lisp_Object Qsave_session;
f66c49cc
YM
536#ifdef MAC_OS
537Lisp_Object Qmac_apple_event;
538#endif
4ebc27a5 539
284f4730 540/* Lisp_Object Qmouse_movement; - also an event header */
284f4730
JB
541
542/* Properties of event headers. */
543Lisp_Object Qevent_kind;
88cb0656 544Lisp_Object Qevent_symbol_elements;
284f4730 545
e8886a1d
RS
546/* menu item parts */
547Lisp_Object Qmenu_alias;
598a9fa7 548Lisp_Object Qmenu_enable;
74c1de23
RS
549Lisp_Object QCenable, QCvisible, QChelp, QCfilter, QCkeys, QCkey_sequence;
550Lisp_Object QCbutton, QCtoggle, QCradio;
e8886a1d
RS
551extern Lisp_Object Vdefine_key_rebound_commands;
552extern Lisp_Object Qmenu_item;
598a9fa7 553
0a7f1fc0
JB
554/* An event header symbol HEAD may have a property named
555 Qevent_symbol_element_mask, which is of the form (BASE MODIFIERS);
556 BASE is the base, unmodified version of HEAD, and MODIFIERS is the
557 mask of modifiers applied to it. If present, this is used to help
558 speed up parse_modifiers. */
559Lisp_Object Qevent_symbol_element_mask;
560
561/* An unmodified event header BASE may have a property named
562 Qmodifier_cache, which is an alist mapping modifier masks onto
563 modified versions of BASE. If present, this helps speed up
564 apply_modifiers. */
565Lisp_Object Qmodifier_cache;
566
5ec75a55 567/* Symbols to use for parts of windows. */
284f4730 568Lisp_Object Qmode_line;
e5d77022 569Lisp_Object Qvertical_line;
3c370943 570Lisp_Object Qvertical_scroll_bar;
5ec75a55 571Lisp_Object Qmenu_bar;
7d60ad8a 572extern Lisp_Object Qleft_margin, Qright_margin;
3d566707 573extern Lisp_Object Qleft_fringe, Qright_fringe;
2e3f0f61 574extern Lisp_Object QCmap;
5ec75a55 575
f4255cd1
JB
576Lisp_Object recursive_edit_unwind (), command_loop ();
577Lisp_Object Fthis_command_keys ();
03b4122a 578Lisp_Object Qextended_command_history;
c04cbc3b 579EMACS_TIME timer_check ();
284f4730 580
a0acc6c7 581extern Lisp_Object Vhistory_length, Vtranslation_table_for_input;
f4385381 582
2c834fb3
KH
583extern char *x_get_keysym_name ();
584
8eb4d8ef 585static void record_menu_key ();
22b94eeb 586static int echo_length ();
8eb4d8ef 587
f4eef8b4
RS
588Lisp_Object Qpolling_period;
589
d9d4c147 590/* List of absolute timers. Appears in order of next scheduled event. */
c04cbc3b
RS
591Lisp_Object Vtimer_list;
592
d9d4c147
KH
593/* List of idle time timers. Appears in order of next scheduled event. */
594Lisp_Object Vtimer_idle_list;
595
87dd9b9b
RS
596/* Incremented whenever a timer is run. */
597int timers_run;
598
a9f16aa9
KH
599extern Lisp_Object Vprint_level, Vprint_length;
600
ffd56f97
JB
601/* Address (if not 0) of EMACS_TIME to zero out if a SIGIO interrupt
602 happens. */
603EMACS_TIME *input_available_clear_time;
284f4730
JB
604
605/* Nonzero means use SIGIO interrupts; zero means use CBREAK mode.
606 Default is 1 if INTERRUPT_INPUT is defined. */
607int interrupt_input;
608
609/* Nonzero while interrupts are temporarily deferred during redisplay. */
610int interrupts_deferred;
611
87dd9b9b 612/* Nonzero means use ^S/^Q for flow control. */
284f4730
JB
613int flow_control;
614
284f4730
JB
615/* Allow m- file to inhibit use of FIONREAD. */
616#ifdef BROKEN_FIONREAD
617#undef FIONREAD
618#endif
619
620/* We are unable to use interrupts if FIONREAD is not available,
621 so flush SIGIO so we won't try. */
fc7a70cc 622#if !defined (FIONREAD)
284f4730
JB
623#ifdef SIGIO
624#undef SIGIO
625#endif
626#endif
627
e98a93eb 628/* If we support a window system, turn on the code to poll periodically
34f04431 629 to detect C-g. It isn't actually used when doing interrupt input. */
742fbed7 630#if defined(HAVE_WINDOW_SYSTEM) && !defined(USE_ASYNC_EVENTS)
284f4730
JB
631#define POLL_FOR_INPUT
632#endif
adf5cb9c
KH
633
634/* After a command is executed, if point is moved into a region that
635 has specific properties (e.g. composition, display), we adjust
636 point to the boundary of the region. But, if a command sets this
27fd22dc 637 variable to non-nil, we suppress this point adjustment. This
adf5cb9c 638 variable is set to nil before reading a command. */
da8f7368 639
adf5cb9c
KH
640Lisp_Object Vdisable_point_adjustment;
641
642/* If non-nil, always disable point adjustment. */
da8f7368 643
adf5cb9c
KH
644Lisp_Object Vglobal_disable_point_adjustment;
645
fdbb67fe
GM
646/* The time when Emacs started being idle. */
647
648static EMACS_TIME timer_idleness_start_time;
649
3021d3a9
RS
650/* After Emacs stops being idle, this saves the last value
651 of timer_idleness_start_time from when it was idle. */
652
653static EMACS_TIME timer_last_idleness_start_time;
654
9d56e0da
EZ
655/* If non-nil, events produced by disabled menu items and tool-bar
656 buttons are not ignored. Help functions bind this to allow help on
657 those items and buttons. */
658Lisp_Object Venable_disabled_menus_and_buttons;
659
284f4730
JB
660\f
661/* Global variable declarations. */
662
a2d5fca0
JD
663/* Flags for readable_events. */
664#define READABLE_EVENTS_DO_TIMERS_NOW (1 << 0)
665#define READABLE_EVENTS_FILTER_EVENTS (1 << 1)
666#define READABLE_EVENTS_IGNORE_SQUEEZABLES (1 << 2)
667
284f4730
JB
668/* Function for init_keyboard to call with no args (if nonzero). */
669void (*keyboard_init_hook) ();
670
0bbfdc25
GM
671static int read_avail_input P_ ((int));
672static void get_input_pending P_ ((int *, int));
673static int readable_events P_ ((int));
674static Lisp_Object read_char_x_menu_prompt P_ ((int, Lisp_Object *,
675 Lisp_Object, int *));
8150596a 676static Lisp_Object read_char_x_menu_prompt ();
0bbfdc25
GM
677static Lisp_Object read_char_minibuf_menu_prompt P_ ((int, int,
678 Lisp_Object *));
679static Lisp_Object make_lispy_event P_ ((struct input_event *));
514354e9 680#ifdef HAVE_MOUSE
0bbfdc25
GM
681static Lisp_Object make_lispy_movement P_ ((struct frame *, Lisp_Object,
682 enum scroll_bar_part,
683 Lisp_Object, Lisp_Object,
684 unsigned long));
514354e9 685#endif
0bbfdc25
GM
686static Lisp_Object modify_event_symbol P_ ((int, unsigned, Lisp_Object,
687 Lisp_Object, char **,
688 Lisp_Object *, unsigned));
689static Lisp_Object make_lispy_switch_frame P_ ((Lisp_Object));
690static int parse_solitary_modifier P_ ((Lisp_Object));
3d31316f 691static int parse_solitary_modifier ();
0bbfdc25 692static void save_getcjmp P_ ((jmp_buf));
dfcf069d 693static void save_getcjmp ();
0bbfdc25 694static void restore_getcjmp P_ ((jmp_buf));
7ee32cda 695static Lisp_Object apply_modifiers P_ ((int, Lisp_Object));
0bbfdc25 696static void clear_event P_ ((struct input_event *));
9ce50b1e 697static void any_kboard_state P_ ((void));
5598c32e 698static SIGTYPE interrupt_signal P_ ((int signalnum));
5c12e63f
KS
699static void timer_start_idle P_ ((void));
700static void timer_stop_idle P_ ((void));
701static void timer_resume_idle P_ ((void));
284f4730 702
8026024c
KH
703/* Nonzero means don't try to suspend even if the operating system seems
704 to support it. */
705static int cannot_suspend;
706
29204e13
RS
707extern Lisp_Object Qidentity, Qonly;
708\f
284f4730
JB
709/* Install the string STR as the beginning of the string of echoing,
710 so that it serves as a prompt for the next character.
711 Also start echoing. */
712
dfcf069d 713void
284f4730 714echo_prompt (str)
a4ef85ee 715 Lisp_Object str;
284f4730 716{
678e9d18 717 current_kboard->echo_string = str;
0d121f7c 718 current_kboard->echo_after_prompt = SCHARS (str);
3dbd9ee4 719 echo_now ();
284f4730
JB
720}
721
df0f2ba1 722/* Add C to the echo string, if echoing is going on.
284f4730
JB
723 C can be a character, which is printed prettily ("M-C-x" and all that
724 jazz), or a symbol, whose name is printed. */
725
dfcf069d 726void
284f4730
JB
727echo_char (c)
728 Lisp_Object c;
729{
c5fdd383 730 if (current_kboard->immediate_echo)
284f4730 731 {
678e9d18
GM
732 int size = KEY_DESCRIPTION_SIZE + 100;
733 char *buffer = (char *) alloca (size);
734 char *ptr = buffer;
735 Lisp_Object echo_string;
284f4730 736
0d121f7c 737 echo_string = current_kboard->echo_string;
c60ee5e7 738
284f4730 739 /* If someone has passed us a composite event, use its head symbol. */
88cb0656 740 c = EVENT_HEAD (c);
284f4730 741
8c18cbfb 742 if (INTEGERP (c))
284f4730 743 {
678e9d18 744 ptr = push_key_description (XINT (c), ptr, 1);
284f4730 745 }
8c18cbfb 746 else if (SYMBOLP (c))
284f4730 747 {
1b049b51
KR
748 Lisp_Object name = SYMBOL_NAME (c);
749 int nbytes = SBYTES (name);
c60ee5e7 750
0d121f7c 751 if (size - (ptr - buffer) < nbytes)
678e9d18
GM
752 {
753 int offset = ptr - buffer;
0d121f7c 754 size = max (2 * size, size + nbytes);
678e9d18
GM
755 buffer = (char *) alloca (size);
756 ptr = buffer + offset;
757 }
758
1b049b51
KR
759 ptr += copy_text (SDATA (name), ptr, nbytes,
760 STRING_MULTIBYTE (name), 1);
284f4730
JB
761 }
762
0d121f7c 763 if ((NILP (echo_string) || SCHARS (echo_string) == 0)
ecb7cb34 764 && help_char_p (c))
284f4730 765 {
678e9d18
GM
766 const char *text = " (Type ? for further options)";
767 int len = strlen (text);
c60ee5e7 768
678e9d18
GM
769 if (size - (ptr - buffer) < len)
770 {
771 int offset = ptr - buffer;
772 size += len;
773 buffer = (char *) alloca (size);
774 ptr = buffer + offset;
775 }
776
777 bcopy (text, ptr, len);
778 ptr += len;
284f4730
JB
779 }
780
0d121f7c
GM
781 /* Replace a dash from echo_dash with a space, otherwise
782 add a space at the end as a separator between keys. */
678e9d18 783 if (STRINGP (echo_string)
2ff4d3d9 784 && SCHARS (echo_string) > 1)
0d121f7c 785 {
2ff4d3d9
RS
786 Lisp_Object last_char, prev_char, idx;
787
788 idx = make_number (SCHARS (echo_string) - 2);
789 prev_char = Faref (echo_string, idx);
0d121f7c
GM
790
791 idx = make_number (SCHARS (echo_string) - 1);
792 last_char = Faref (echo_string, idx);
793
2ff4d3d9
RS
794 /* We test PREV_CHAR to make sure this isn't the echoing
795 of a minus-sign. */
796 if (XINT (last_char) == '-' && XINT (prev_char) != ' ')
0d121f7c
GM
797 Faset (echo_string, idx, make_number (' '));
798 else
799 echo_string = concat2 (echo_string, build_string (" "));
800 }
c3be81c7
RS
801 else if (STRINGP (echo_string))
802 echo_string = concat2 (echo_string, build_string (" "));
678e9d18
GM
803
804 current_kboard->echo_string
805 = concat2 (echo_string, make_string (buffer, ptr - buffer));
284f4730 806
3dbd9ee4 807 echo_now ();
284f4730
JB
808 }
809}
810
811/* Temporarily add a dash to the end of the echo string if it's not
812 empty, so that it serves as a mini-prompt for the very next character. */
813
dfcf069d 814void
284f4730
JB
815echo_dash ()
816{
678e9d18
GM
817 /* Do nothing if not echoing at all. */
818 if (NILP (current_kboard->echo_string))
819 return;
820
c5fdd383 821 if (!current_kboard->immediate_echo
0d121f7c 822 && SCHARS (current_kboard->echo_string) == 0)
284f4730 823 return;
c60ee5e7 824
7a80a6f6 825 /* Do nothing if we just printed a prompt. */
c5fdd383 826 if (current_kboard->echo_after_prompt
0d121f7c 827 == SCHARS (current_kboard->echo_string))
4bafa972 828 return;
c60ee5e7 829
366511da
MB
830 /* Do nothing if we have already put a dash at the end. */
831 if (SCHARS (current_kboard->echo_string) > 1)
832 {
c3be81c7 833 Lisp_Object last_char, prev_char, idx;
366511da 834
c3be81c7
RS
835 idx = make_number (SCHARS (current_kboard->echo_string) - 2);
836 prev_char = Faref (current_kboard->echo_string, idx);
366511da 837
c3be81c7
RS
838 idx = make_number (SCHARS (current_kboard->echo_string) - 1);
839 last_char = Faref (current_kboard->echo_string, idx);
366511da 840
c3be81c7
RS
841 if (XINT (last_char) == '-' && XINT (prev_char) != ' ')
842 return;
366511da
MB
843 }
844
284f4730
JB
845 /* Put a dash at the end of the buffer temporarily,
846 but make it go away when the next character is added. */
678e9d18
GM
847 current_kboard->echo_string = concat2 (current_kboard->echo_string,
848 build_string ("-"));
3dbd9ee4 849 echo_now ();
284f4730
JB
850}
851
852/* Display the current echo string, and begin echoing if not already
853 doing so. */
854
07a59269 855void
3dbd9ee4 856echo_now ()
284f4730 857{
c5fdd383 858 if (!current_kboard->immediate_echo)
284f4730
JB
859 {
860 int i;
c5fdd383 861 current_kboard->immediate_echo = 1;
284f4730
JB
862
863 for (i = 0; i < this_command_key_count; i++)
d0a57728
RS
864 {
865 Lisp_Object c;
22b94eeb
RS
866
867 /* Set before_command_echo_length to the value that would
868 have been saved before the start of this subcommand in
869 command_loop_1, if we had already been echoing then. */
870 if (i == this_single_command_key_start)
871 before_command_echo_length = echo_length ();
872
d0a57728
RS
873 c = XVECTOR (this_command_keys)->contents[i];
874 if (! (EVENT_HAS_PARAMETERS (c)
875 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_movement)))
876 echo_char (c);
877 }
22b94eeb
RS
878
879 /* Set before_command_echo_length to the value that would
880 have been saved before the start of this subcommand in
881 command_loop_1, if we had already been echoing then. */
882 if (this_command_key_count == this_single_command_key_start)
883 before_command_echo_length = echo_length ();
884
885 /* Put a dash at the end to invite the user to type more. */
284f4730
JB
886 echo_dash ();
887 }
888
889 echoing = 1;
678e9d18 890 message3_nolog (current_kboard->echo_string,
0d121f7c 891 SBYTES (current_kboard->echo_string),
d5db4077 892 STRING_MULTIBYTE (current_kboard->echo_string));
284f4730
JB
893 echoing = 0;
894
59a84f8e
GM
895 /* Record in what buffer we echoed, and from which kboard. */
896 echo_message_buffer = echo_area_buffer[0];
897 echo_kboard = current_kboard;
898
284f4730
JB
899 if (waiting_for_input && !NILP (Vquit_flag))
900 quit_throw_to_read_char ();
901}
902
903/* Turn off echoing, for the start of a new command. */
904
dfcf069d 905void
284f4730
JB
906cancel_echoing ()
907{
c5fdd383 908 current_kboard->immediate_echo = 0;
c5fdd383 909 current_kboard->echo_after_prompt = -1;
678e9d18 910 current_kboard->echo_string = Qnil;
59a84f8e
GM
911 ok_to_echo_at_next_pause = NULL;
912 echo_kboard = NULL;
913 echo_message_buffer = Qnil;
284f4730
JB
914}
915
916/* Return the length of the current echo string. */
917
918static int
919echo_length ()
920{
678e9d18 921 return (STRINGP (current_kboard->echo_string)
0d121f7c 922 ? SCHARS (current_kboard->echo_string)
678e9d18 923 : 0);
284f4730
JB
924}
925
926/* Truncate the current echo message to its first LEN chars.
927 This and echo_char get used by read_key_sequence when the user
ff11dfa1 928 switches frames while entering a key sequence. */
284f4730
JB
929
930static void
678e9d18
GM
931echo_truncate (nchars)
932 int nchars;
933{
934 if (STRINGP (current_kboard->echo_string))
935 current_kboard->echo_string
936 = Fsubstring (current_kboard->echo_string,
937 make_number (0), make_number (nchars));
938 truncate_echo_area (nchars);
284f4730
JB
939}
940
941\f
942/* Functions for manipulating this_command_keys. */
943static void
944add_command_key (key)
945 Lisp_Object key;
946{
22b94eeb
RS
947#if 0 /* Not needed after we made Freset_this_command_lengths
948 do the job immediately. */
71918b75
RS
949 /* If reset-this-command-length was called recently, obey it now.
950 See the doc string of that function for an explanation of why. */
951 if (before_command_restore_flag)
952 {
953 this_command_key_count = before_command_key_count_1;
6321824f
RS
954 if (this_command_key_count < this_single_command_key_start)
955 this_single_command_key_start = this_command_key_count;
71918b75
RS
956 echo_truncate (before_command_echo_length_1);
957 before_command_restore_flag = 0;
958 }
22b94eeb 959#endif
71918b75 960
f4e05d97
GM
961 if (this_command_key_count >= ASIZE (this_command_keys))
962 this_command_keys = larger_vector (this_command_keys,
963 2 * ASIZE (this_command_keys),
964 Qnil);
6569cc8d 965
f4e05d97
GM
966 AREF (this_command_keys, this_command_key_count) = key;
967 ++this_command_key_count;
284f4730 968}
f4e05d97 969
284f4730
JB
970\f
971Lisp_Object
972recursive_edit_1 ()
973{
aed13378 974 int count = SPECPDL_INDEX ();
284f4730
JB
975 Lisp_Object val;
976
977 if (command_loop_level > 0)
978 {
979 specbind (Qstandard_output, Qt);
980 specbind (Qstandard_input, Qt);
981 }
982
84265027 983#ifdef HAVE_X_WINDOWS
526a058f 984 /* The command loop has started an hourglass timer, so we have to
84265027 985 cancel it here, otherwise it will fire because the recursive edit
d8e2d5ba
PJ
986 can take some time. Do not check for display_hourglass_p here,
987 because it could already be nil. */
526a058f 988 cancel_hourglass ();
84265027
GM
989#endif
990
980a2d69
GM
991 /* This function may have been called from a debugger called from
992 within redisplay, for instance by Edebugging a function called
993 from fontification-functions. We want to allow redisplay in
994 the debugging session.
995
996 The recursive edit is left with a `(throw exit ...)'. The `exit'
997 tag is not caught anywhere in redisplay, i.e. when we leave the
998 recursive edit, the original redisplay leading to the recursive
999 edit will be unwound. The outcome should therefore be safe. */
1000 specbind (Qinhibit_redisplay, Qnil);
1001 redisplaying_p = 0;
1002
284f4730
JB
1003 val = command_loop ();
1004 if (EQ (val, Qt))
1005 Fsignal (Qquit, Qnil);
cb252880
RS
1006 /* Handle throw from read_minibuf when using minibuffer
1007 while it's active but we're in another window. */
1008 if (STRINGP (val))
43cae48c 1009 xsignal1 (Qerror, val);
284f4730 1010
cb5df6ae 1011 return unbind_to (count, Qnil);
284f4730
JB
1012}
1013
1014/* When an auto-save happens, record the "time", and don't do again soon. */
5846638c 1015
07a59269 1016void
284f4730
JB
1017record_auto_save ()
1018{
c43b1734 1019 last_auto_save = num_nonmacro_input_events;
284f4730 1020}
5846638c
RS
1021
1022/* Make an auto save happen as soon as possible at command level. */
1023
dfcf069d 1024void
5846638c
RS
1025force_auto_save_soon ()
1026{
1027 last_auto_save = - auto_save_interval - 1;
241ceaf7
RS
1028
1029 record_asynch_buffer_change ();
5846638c 1030}
284f4730 1031\f
284f4730 1032DEFUN ("recursive-edit", Frecursive_edit, Srecursive_edit, 0, 0, "",
4707d2d0
PJ
1033 doc: /* Invoke the editor command loop recursively.
1034To get out of the recursive edit, a command can do `(throw 'exit nil)';
1035that tells this function to return.
6e604a9b 1036Alternatively, `(throw 'exit t)' makes this function signal an error.
4707d2d0
PJ
1037This function is called by the editor initialization to begin editing. */)
1038 ()
284f4730 1039{
aed13378 1040 int count = SPECPDL_INDEX ();
9ce50b1e 1041 Lisp_Object buffer;
284f4730 1042
96edd5d4
KS
1043 /* If we enter while input is blocked, don't lock up here.
1044 This may happen through the debugger during redisplay. */
1045 if (INPUT_BLOCKED_P)
1046 return Qnil;
1047
284f4730
JB
1048 command_loop_level++;
1049 update_mode_lines = 1;
1050
9ce50b1e
GM
1051 if (command_loop_level
1052 && current_buffer != XBUFFER (XWINDOW (selected_window)->buffer))
1053 buffer = Fcurrent_buffer ();
1054 else
1055 buffer = Qnil;
1056
1057 /* If we leave recursive_edit_1 below with a `throw' for instance,
1058 like it is done in the splash screen display, we have to
1059 make sure that we restore single_kboard as command_loop_1
1060 would have done if it were left normally. */
284f4730 1061 record_unwind_protect (recursive_edit_unwind,
9ce50b1e
GM
1062 Fcons (buffer, single_kboard ? Qt : Qnil));
1063
284f4730
JB
1064 recursive_edit_1 ();
1065 return unbind_to (count, Qnil);
1066}
1067
1068Lisp_Object
9ce50b1e
GM
1069recursive_edit_unwind (info)
1070 Lisp_Object info;
284f4730 1071{
9ce50b1e
GM
1072 if (BUFFERP (XCAR (info)))
1073 Fset_buffer (XCAR (info));
c60ee5e7 1074
9ce50b1e
GM
1075 if (NILP (XCDR (info)))
1076 any_kboard_state ();
1077 else
1078 single_kboard_state ();
c60ee5e7 1079
284f4730
JB
1080 command_loop_level--;
1081 update_mode_lines = 1;
1082 return Qnil;
1083}
9ce50b1e 1084
284f4730 1085\f
604ccd1d 1086static void
1e8bd3da 1087any_kboard_state ()
604ccd1d 1088{
1e8bd3da
RS
1089#ifdef MULTI_KBOARD
1090#if 0 /* Theory: if there's anything in Vunread_command_events,
1091 it will right away be read by read_key_sequence,
1092 and then if we do switch KBOARDS, it will go into the side
1093 queue then. So we don't need to do anything special here -- rms. */
604ccd1d 1094 if (CONSP (Vunread_command_events))
4524b161 1095 {
c5fdd383
KH
1096 current_kboard->kbd_queue
1097 = nconc2 (Vunread_command_events, current_kboard->kbd_queue);
1098 current_kboard->kbd_queue_has_data = 1;
4524b161 1099 }
604ccd1d 1100 Vunread_command_events = Qnil;
1e8bd3da
RS
1101#endif
1102 single_kboard = 0;
1103#endif
604ccd1d 1104}
1e8bd3da
RS
1105
1106/* Switch to the single-kboard state, making current_kboard
1107 the only KBOARD from which further input is accepted. */
1108
1109void
1110single_kboard_state ()
1111{
1112#ifdef MULTI_KBOARD
1113 single_kboard = 1;
604ccd1d 1114#endif
1e8bd3da
RS
1115}
1116
0c1c1b93
RS
1117/* If we're in single_kboard state for kboard KBOARD,
1118 get out of it. */
1119
1120void
1121not_single_kboard_state (kboard)
1122 KBOARD *kboard;
1123{
26503ad2 1124#ifdef MULTI_KBOARD
0c1c1b93
RS
1125 if (kboard == current_kboard)
1126 single_kboard = 0;
26503ad2 1127#endif
0c1c1b93
RS
1128}
1129
1e8bd3da
RS
1130/* Maintain a stack of kboards, so other parts of Emacs
1131 can switch temporarily to the kboard of a given frame
1132 and then revert to the previous status. */
1133
1134struct kboard_stack
1135{
1136 KBOARD *kboard;
1137 struct kboard_stack *next;
1138};
1139
1140static struct kboard_stack *kboard_stack;
1141
1142void
1143push_frame_kboard (f)
1144 FRAME_PTR f;
1145{
ab48365b 1146#ifdef MULTI_KBOARD
1e8bd3da
RS
1147 struct kboard_stack *p
1148 = (struct kboard_stack *) xmalloc (sizeof (struct kboard_stack));
1149
1150 p->next = kboard_stack;
1151 p->kboard = current_kboard;
1152 kboard_stack = p;
1153
1154 current_kboard = FRAME_KBOARD (f);
ab48365b 1155#endif
1e8bd3da
RS
1156}
1157
1158void
1159pop_frame_kboard ()
1160{
ab48365b 1161#ifdef MULTI_KBOARD
1e8bd3da
RS
1162 struct kboard_stack *p = kboard_stack;
1163 current_kboard = p->kboard;
1164 kboard_stack = p->next;
1165 xfree (p);
ab48365b 1166#endif
1e8bd3da
RS
1167}
1168\f
1169/* Handle errors that are not handled at inner levels
1170 by printing an error message and returning to the editor command loop. */
604ccd1d 1171
284f4730
JB
1172Lisp_Object
1173cmd_error (data)
1174 Lisp_Object data;
a1341f75 1175{
a9f16aa9 1176 Lisp_Object old_level, old_length;
e881d8b2
RS
1177 char macroerror[50];
1178
160552c5
RS
1179#ifdef HAVE_X_WINDOWS
1180 if (display_hourglass_p)
1181 cancel_hourglass ();
1182#endif
1183
649d952d 1184 if (!NILP (executing_kbd_macro))
e881d8b2 1185 {
649d952d 1186 if (executing_kbd_macro_iterations == 1)
e881d8b2
RS
1187 sprintf (macroerror, "After 1 kbd macro iteration: ");
1188 else
1189 sprintf (macroerror, "After %d kbd macro iterations: ",
649d952d 1190 executing_kbd_macro_iterations);
e881d8b2
RS
1191 }
1192 else
1193 *macroerror = 0;
a9f16aa9 1194
a1341f75
RS
1195 Vstandard_output = Qt;
1196 Vstandard_input = Qt;
ce0d2858 1197 Vexecuting_kbd_macro = Qnil;
649d952d 1198 executing_kbd_macro = Qnil;
d8bcf58e 1199 current_kboard->Vprefix_arg = Qnil;
75045dcb 1200 current_kboard->Vlast_prefix_arg = Qnil;
df0f2ba1 1201 cancel_echoing ();
a9f16aa9
KH
1202
1203 /* Avoid unquittable loop if data contains a circular list. */
1204 old_level = Vprint_level;
1205 old_length = Vprint_length;
0c04a67e
RS
1206 XSETFASTINT (Vprint_level, 10);
1207 XSETFASTINT (Vprint_length, 10);
e881d8b2 1208 cmd_error_internal (data, macroerror);
a9f16aa9
KH
1209 Vprint_level = old_level;
1210 Vprint_length = old_length;
a1341f75
RS
1211
1212 Vquit_flag = Qnil;
1213
1214 Vinhibit_quit = Qnil;
c5fdd383 1215#ifdef MULTI_KBOARD
e3ee34f0
RS
1216 if (command_loop_level == 0 && minibuf_level == 0)
1217 any_kboard_state ();
ff4b06d3 1218#endif
a1341f75
RS
1219
1220 return make_number (0);
1221}
1222
301738ed
RS
1223/* Take actions on handling an error. DATA is the data that describes
1224 the error.
1225
1226 CONTEXT is a C-string containing ASCII characters only which
1227 describes the context in which the error happened. If we need to
1228 generalize CONTEXT to allow multibyte characters, make it a Lisp
1229 string. */
1230
07a59269 1231void
a1341f75
RS
1232cmd_error_internal (data, context)
1233 Lisp_Object data;
1234 char *context;
284f4730 1235{
788f89eb 1236 struct frame *sf = SELECTED_FRAME ();
284f4730 1237
04d8c47d
RS
1238 /* The immediate context is not interesting for Quits,
1239 since they are asyncronous. */
1240 if (EQ (XCAR (data), Qquit))
1241 Vsignaling_function = Qnil;
1242
284f4730
JB
1243 Vquit_flag = Qnil;
1244 Vinhibit_quit = Qt;
284f4730 1245
04d8c47d
RS
1246 /* Use user's specified output function if any. */
1247 if (!NILP (Vcommand_error_function))
1248 call3 (Vcommand_error_function, data,
1249 build_string (context ? context : ""),
1250 Vsignaling_function);
ff11dfa1 1251 /* If the window system or terminal frame hasn't been initialized
04d8c47d
RS
1252 yet, or we're not interactive, write the message to stderr and exit. */
1253 else if (!sf->glyphs_initialized_p
1254 /* This is the case of the frame dumped with Emacs, when we're
1255 running under a window system. */
1256 || (!NILP (Vwindow_system)
1257 && !inhibit_window_system
1258 && FRAME_TERMCAP_P (sf))
1259 || noninteractive)
1260 {
1261 print_error_message (data, Qexternal_debugging_output,
1262 context, Vsignaling_function);
1263 Fterpri (Qexternal_debugging_output);
1264 Fkill_emacs (make_number (-1));
7ee32cda 1265 }
284f4730
JB
1266 else
1267 {
04d8c47d 1268 clear_message (1, 0);
284f4730 1269 Fdiscard_input ();
dc4854ce 1270 message_log_maybe_newline ();
284f4730 1271 bitch_at_user ();
c60ee5e7 1272
04d8c47d
RS
1273 print_error_message (data, Qt, context, Vsignaling_function);
1274 }
a1341f75 1275
dc4854ce 1276 Vsignaling_function = Qnil;
284f4730
JB
1277}
1278\f
1279Lisp_Object command_loop_1 ();
1280Lisp_Object command_loop_2 ();
1281Lisp_Object top_level_1 ();
1282
1283/* Entry to editor-command-loop.
1284 This level has the catches for exiting/returning to editor command loop.
1285 It returns nil to exit recursive edit, t to abort it. */
1286
1287Lisp_Object
1288command_loop ()
1289{
1290 if (command_loop_level > 0 || minibuf_level > 0)
1291 {
07ba902e
RS
1292 Lisp_Object val;
1293 val = internal_catch (Qexit, command_loop_2, Qnil);
649d952d 1294 executing_kbd_macro = Qnil;
68c46464 1295 return val;
284f4730
JB
1296 }
1297 else
1298 while (1)
1299 {
1300 internal_catch (Qtop_level, top_level_1, Qnil);
e3ee34f0
RS
1301 /* Reset single_kboard in case top-level set it while
1302 evaluating an -f option, or we are stuck there for some
1303 other reason. */
1304 any_kboard_state ();
284f4730 1305 internal_catch (Qtop_level, command_loop_2, Qnil);
649d952d 1306 executing_kbd_macro = Qnil;
df0f2ba1 1307
284f4730
JB
1308 /* End of file in -batch run causes exit here. */
1309 if (noninteractive)
1310 Fkill_emacs (Qt);
1311 }
1312}
1313
1314/* Here we catch errors in execution of commands within the
1315 editing loop, and reenter the editing loop.
1316 When there is an error, cmd_error runs and returns a non-nil
27fd22dc 1317 value to us. A value of nil means that command_loop_1 itself
284f4730
JB
1318 returned due to end of file (or end of kbd macro). */
1319
1320Lisp_Object
1321command_loop_2 ()
1322{
1323 register Lisp_Object val;
1324
1325 do
1326 val = internal_condition_case (command_loop_1, Qerror, cmd_error);
1327 while (!NILP (val));
1328
1329 return Qnil;
1330}
1331
1332Lisp_Object
1333top_level_2 ()
1334{
1335 return Feval (Vtop_level);
1336}
1337
1338Lisp_Object
1339top_level_1 ()
1340{
1341 /* On entry to the outer level, run the startup file */
1342 if (!NILP (Vtop_level))
1343 internal_condition_case (top_level_2, Qerror, cmd_error);
1344 else if (!NILP (Vpurify_flag))
1345 message ("Bare impure Emacs (standard Lisp code not loaded)");
1346 else
1347 message ("Bare Emacs (standard Lisp code not loaded)");
1348 return Qnil;
1349}
1350
1351DEFUN ("top-level", Ftop_level, Stop_level, 0, 0, "",
4707d2d0
PJ
1352 doc: /* Exit all recursive editing levels. */)
1353 ()
284f4730 1354{
2c9cf2c8 1355#ifdef HAVE_X_WINDOWS
526a058f
GM
1356 if (display_hourglass_p)
1357 cancel_hourglass ();
2c9cf2c8 1358#endif
96edd5d4 1359
a25e44b2
JD
1360 /* Unblock input if we enter with input blocked. This may happen if
1361 redisplay traps e.g. during tool-bar update with input blocked. */
1362 while (INPUT_BLOCKED_P)
1363 UNBLOCK_INPUT;
1364
8c907a56 1365 return Fthrow (Qtop_level, Qnil);
284f4730
JB
1366}
1367
1368DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, "",
4707d2d0
PJ
1369 doc: /* Exit from the innermost recursive edit or minibuffer. */)
1370 ()
284f4730
JB
1371{
1372 if (command_loop_level > 0 || minibuf_level > 0)
1373 Fthrow (Qexit, Qnil);
1374
1375 error ("No recursive edit is in progress");
8c907a56 1376 return Qnil;
284f4730
JB
1377}
1378
1379DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 0, 0, "",
4707d2d0
PJ
1380 doc: /* Abort the command that requested this recursive edit or minibuffer input. */)
1381 ()
284f4730
JB
1382{
1383 if (command_loop_level > 0 || minibuf_level > 0)
1384 Fthrow (Qexit, Qt);
1385
1386 error ("No recursive edit is in progress");
8c907a56 1387 return Qnil;
284f4730
JB
1388}
1389\f
1390/* This is the actual command reading loop,
1391 sans error-handling encapsulation. */
1392
a7b772c1
GM
1393static int read_key_sequence P_ ((Lisp_Object *, int, Lisp_Object,
1394 int, int, int));
1395void safe_run_hooks P_ ((Lisp_Object));
2a026b04 1396static void adjust_point_for_property P_ ((int, int));
284f4730 1397
0af912f0
JD
1398/* Cancel hourglass from protect_unwind.
1399 ARG is not used. */
bb8db7e1 1400#ifdef HAVE_X_WINDOWS
0af912f0
JD
1401static Lisp_Object
1402cancel_hourglass_unwind (arg)
1403 Lisp_Object arg;
1404{
1405 cancel_hourglass ();
cea5d0d4 1406 return Qnil;
0af912f0 1407}
bb8db7e1 1408#endif
0af912f0 1409
284f4730
JB
1410Lisp_Object
1411command_loop_1 ()
1412{
03cee6ae
GM
1413 Lisp_Object cmd;
1414 int lose;
284f4730
JB
1415 int nonundocount;
1416 Lisp_Object keybuf[30];
1417 int i;
284f4730 1418 int no_direct;
a53fe666 1419 int prev_modiff = 0;
8c907a56 1420 struct buffer *prev_buffer = NULL;
c5fdd383 1421#ifdef MULTI_KBOARD
1e8bd3da 1422 int was_locked = single_kboard;
bded54dd 1423#endif
2764bebd 1424 int already_adjusted;
284f4730 1425
d9b641bb 1426 current_kboard->Vprefix_arg = Qnil;
75045dcb 1427 current_kboard->Vlast_prefix_arg = Qnil;
86e5706b 1428 Vdeactivate_mark = Qnil;
284f4730 1429 waiting_for_input = 0;
df0f2ba1 1430 cancel_echoing ();
284f4730 1431
284f4730 1432 nonundocount = 0;
284f4730 1433 this_command_key_count = 0;
63020c46 1434 this_command_key_count_reset = 0;
6321824f 1435 this_single_command_key_start = 0;
284f4730 1436
325309f5 1437 if (NILP (Vmemory_full))
59aadc81 1438 {
10ffcb64
RS
1439 /* Make sure this hook runs after commands that get errors and
1440 throw to top level. */
1441 /* Note that the value cell will never directly contain nil
1442 if the symbol is a local variable. */
1443 if (!NILP (Vpost_command_hook) && !NILP (Vrun_hooks))
1444 safe_run_hooks (Qpost_command_hook);
1445
1446 /* If displaying a message, resize the echo area window to fit
1447 that message's size exactly. */
1448 if (!NILP (echo_area_buffer[0]))
1449 resize_echo_area_exactly ();
1450
1451 if (!NILP (Vdeferred_action_list))
0b5d283f 1452 safe_run_hooks (Qdeferred_action_function);
59aadc81
RS
1453 }
1454
51d5a2c9 1455 /* Do this after running Vpost_command_hook, for consistency. */
d5eecefb
RS
1456 current_kboard->Vlast_command = Vthis_command;
1457 current_kboard->Vreal_last_command = real_this_command;
51d5a2c9 1458
284f4730
JB
1459 while (1)
1460 {
788f89eb 1461 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
a94a4335
KH
1462 Fkill_emacs (Qnil);
1463
284f4730
JB
1464 /* Make sure the current window's buffer is selected. */
1465 if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
1466 set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer));
1467
1468 /* Display any malloc warning that just came out. Use while because
1469 displaying one warning can cause another. */
1470
1471 while (pending_malloc_warning)
1472 display_malloc_warning ();
1473
1474 no_direct = 0;
1475
86e5706b
RS
1476 Vdeactivate_mark = Qnil;
1477
284f4730 1478 /* If minibuffer on and echo area in use,
00392ce6 1479 wait a short time and redraw minibuffer. */
284f4730 1480
7ee32cda 1481 if (minibuf_level
985f9f66 1482 && !NILP (echo_area_buffer[0])
00392ce6
MB
1483 && EQ (minibuf_window, echo_area_window)
1484 && NUMBERP (Vminibuffer_message_timeout))
284f4730 1485 {
f1bed6d8
RS
1486 /* Bind inhibit-quit to t so that C-g gets read in
1487 rather than quitting back to the minibuffer. */
aed13378 1488 int count = SPECPDL_INDEX ();
f1bed6d8 1489 specbind (Qinhibit_quit, Qt);
f1bed6d8 1490
666dc232
KS
1491 sit_for (Vminibuffer_message_timeout, 0, 2);
1492
e6aa7813 1493 /* Clear the echo area. */
301738ed 1494 message2 (0, 0, 0);
cdb9d665 1495 safe_run_hooks (Qecho_area_clear_hook);
e6aa7813 1496
db08707d
RS
1497 unbind_to (count, Qnil);
1498
e6aa7813 1499 /* If a C-g came in before, treat it as input now. */
284f4730
JB
1500 if (!NILP (Vquit_flag))
1501 {
1502 Vquit_flag = Qnil;
24597608 1503 Vunread_command_events = Fcons (make_number (quit_char), Qnil);
284f4730
JB
1504 }
1505 }
1506
1507#ifdef C_ALLOCA
ff4b06d3 1508 alloca (0); /* Cause a garbage collection now */
284f4730
JB
1509 /* Since we can free the most stuff here. */
1510#endif /* C_ALLOCA */
1511
8f805655 1512#if 0
8f805655
JB
1513 /* Select the frame that the last event came from. Usually,
1514 switch-frame events will take care of this, but if some lisp
1515 code swallows a switch-frame event, we'll fix things up here.
1516 Is this a good idea? */
8c18cbfb 1517 if (FRAMEP (internal_last_event_frame)
788f89eb 1518 && !EQ (internal_last_event_frame, selected_frame))
f840fb39 1519 Fselect_frame (internal_last_event_frame);
284f4730 1520#endif
48e416d4
RS
1521 /* If it has changed current-menubar from previous value,
1522 really recompute the menubar from the value. */
a646e520
RS
1523 if (! NILP (Vlucid_menu_bar_dirty_flag)
1524 && !NILP (Ffboundp (Qrecompute_lucid_menubar)))
48e416d4
RS
1525 call0 (Qrecompute_lucid_menubar);
1526
71918b75
RS
1527 before_command_key_count = this_command_key_count;
1528 before_command_echo_length = echo_length ();
1529
d5eecefb
RS
1530 Vthis_command = Qnil;
1531 real_this_command = Qnil;
9d138659 1532 Vthis_original_command = Qnil;
d7437ef6 1533
8f805655 1534 /* Read next key sequence; i gets its length. */
ce98e608 1535 i = read_key_sequence (keybuf, sizeof keybuf / sizeof keybuf[0],
f571ae0d 1536 Qnil, 0, 1, 1);
8f805655 1537
6fac1409 1538 /* A filter may have run while we were reading the input. */
788f89eb 1539 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
a94a4335 1540 Fkill_emacs (Qnil);
6fac1409
RS
1541 if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
1542 set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer));
1543
8f805655
JB
1544 ++num_input_keys;
1545
284f4730
JB
1546 /* Now we have read a key sequence of length I,
1547 or else I is 0 and we found end of file. */
1548
1549 if (i == 0) /* End of file -- happens only in */
1550 return Qnil; /* a kbd macro, at the end. */
dcc408a0
RS
1551 /* -1 means read_key_sequence got a menu that was rejected.
1552 Just loop around and read another command. */
1553 if (i == -1)
1554 {
1555 cancel_echoing ();
1556 this_command_key_count = 0;
63020c46 1557 this_command_key_count_reset = 0;
6321824f 1558 this_single_command_key_start = 0;
ff4b06d3 1559 goto finalize;
dcc408a0 1560 }
284f4730 1561
284f4730
JB
1562 last_command_char = keybuf[i - 1];
1563
75c0b143
RS
1564 /* If the previous command tried to force a specific window-start,
1565 forget about that, in case this command moves point far away
c422836d
KH
1566 from that position. But also throw away beg_unchanged and
1567 end_unchanged information in that case, so that redisplay will
1568 update the whole window properly. */
1569 if (!NILP (XWINDOW (selected_window)->force_start))
1570 {
9351ebd0 1571 struct buffer *b;
c422836d 1572 XWINDOW (selected_window)->force_start = Qnil;
9351ebd0
GM
1573 b = XBUFFER (XWINDOW (selected_window)->buffer);
1574 BUF_BEG_UNCHANGED (b) = BUF_END_UNCHANGED (b) = 0;
c422836d 1575 }
75c0b143 1576
284f4730 1577 cmd = read_key_sequence_cmd;
ce0d2858 1578 if (!NILP (Vexecuting_kbd_macro))
284f4730
JB
1579 {
1580 if (!NILP (Vquit_flag))
1581 {
ce0d2858 1582 Vexecuting_kbd_macro = Qt;
284f4730
JB
1583 QUIT; /* Make some noise. */
1584 /* Will return since macro now empty. */
1585 }
1586 }
1587
1588 /* Do redisplay processing after this command except in special
e35b6123 1589 cases identified below. */
86e5706b
RS
1590 prev_buffer = current_buffer;
1591 prev_modiff = MODIFF;
8746da95 1592 last_point_position = PT;
bb0e1d19 1593 last_point_position_window = selected_window;
18cd2eeb 1594 XSETBUFFER (last_point_position_buffer, prev_buffer);
86e5706b 1595
adf5cb9c
KH
1596 /* By default, we adjust point to a boundary of a region that
1597 has such a property that should be treated intangible
1598 (e.g. composition, display). But, some commands will set
1599 this variable differently. */
1600 Vdisable_point_adjustment = Qnil;
a7b772c1 1601
be2488ca
GM
1602 /* Process filters and timers may have messed with deactivate-mark.
1603 reset it before we execute the command. */
1604 Vdeactivate_mark = Qnil;
1605
8b9940e6
KS
1606 /* Remap command through active keymaps */
1607 Vthis_original_command = cmd;
a34cb674 1608 if (SYMBOLP (cmd))
8b9940e6
KS
1609 {
1610 Lisp_Object cmd1;
023b93f6 1611 if (cmd1 = Fcommand_remapping (cmd), !NILP (cmd1))
8b9940e6
KS
1612 cmd = cmd1;
1613 }
1614
284f4730
JB
1615 /* Execute the command. */
1616
d5eecefb
RS
1617 Vthis_command = cmd;
1618 real_this_command = cmd;
a98ea3f9
RS
1619 /* Note that the value cell will never directly contain nil
1620 if the symbol is a local variable. */
e98a93eb 1621 if (!NILP (Vpre_command_hook) && !NILP (Vrun_hooks))
a98ea3f9 1622 safe_run_hooks (Qpre_command_hook);
c60ee5e7 1623
2764bebd
RS
1624 already_adjusted = 0;
1625
d5eecefb 1626 if (NILP (Vthis_command))
284f4730
JB
1627 {
1628 /* nil means key is undefined. */
1bf0e604
SM
1629 Lisp_Object keys = Fvector (i, keybuf);
1630 keys = Fkey_description (keys, Qnil);
284f4730 1631 bitch_at_user ();
1bf0e604 1632 message_with_string ("%s is undefined", keys, 0);
c5fdd383 1633 current_kboard->defining_kbd_macro = Qnil;
284f4730 1634 update_mode_lines = 1;
d8bcf58e 1635 current_kboard->Vprefix_arg = Qnil;
284f4730
JB
1636 }
1637 else
1638 {
d8bcf58e 1639 if (NILP (current_kboard->Vprefix_arg) && ! no_direct)
284f4730 1640 {
75045dcb
RS
1641 /* In case we jump to directly_done. */
1642 Vcurrent_prefix_arg = current_kboard->Vprefix_arg;
1643
284f4730
JB
1644 /* Recognize some common commands in common situations and
1645 do them directly. */
d5eecefb 1646 if (EQ (Vthis_command, Qforward_char) && PT < ZV)
284f4730 1647 {
51ad8a68 1648 struct Lisp_Char_Table *dp
284f4730 1649 = window_display_table (XWINDOW (selected_window));
aaf35234 1650 lose = FETCH_CHAR (PT_BYTE);
8458ede6 1651 SET_PT (PT + 1);
d86ba5c5
RS
1652 if (! NILP (Vpost_command_hook))
1653 /* Put this before calling adjust_point_for_property
1654 so it will only get called once in any case. */
1655 goto directly_done;
22b94eeb
RS
1656 if (current_buffer == prev_buffer
1657 && last_point_position != PT
1658 && NILP (Vdisable_point_adjustment)
1659 && NILP (Vglobal_disable_point_adjustment))
1660 adjust_point_for_property (last_point_position, 0);
2764bebd
RS
1661 already_adjusted = 1;
1662 if (PT == last_point_position + 1
1663 && (dp
1664 ? (VECTORP (DISP_CHAR_VECTOR (dp, lose))
1665 ? XVECTOR (DISP_CHAR_VECTOR (dp, lose))->size == 1
1666 : (NILP (DISP_CHAR_VECTOR (dp, lose))
1667 && (lose >= 0x20 && lose < 0x7f)))
1668 : (lose >= 0x20 && lose < 0x7f))
37cd9f30
KH
1669 /* To extract the case of continuation on
1670 wide-column characters. */
8458ede6 1671 && (WIDTH_BY_CHAR_HEAD (FETCH_BYTE (PT_BYTE)) == 1)
284f4730
JB
1672 && (XFASTINT (XWINDOW (selected_window)->last_modified)
1673 >= MODIFF)
598ba4c7
RS
1674 && (XFASTINT (XWINDOW (selected_window)->last_overlay_modified)
1675 >= OVERLAY_MODIFF)
284f4730 1676 && (XFASTINT (XWINDOW (selected_window)->last_point)
8001d352 1677 == PT - 1)
284f4730
JB
1678 && !windows_or_buffers_changed
1679 && EQ (current_buffer->selective_display, Qnil)
1680 && !detect_input_pending ()
962ae636 1681 && NILP (XWINDOW (selected_window)->column_number_displayed)
ce0d2858 1682 && NILP (Vexecuting_kbd_macro))
e35b6123 1683 direct_output_forward_char (1);
284f4730
JB
1684 goto directly_done;
1685 }
d5eecefb 1686 else if (EQ (Vthis_command, Qbackward_char) && PT > BEGV)
284f4730 1687 {
51ad8a68 1688 struct Lisp_Char_Table *dp
284f4730 1689 = window_display_table (XWINDOW (selected_window));
8458ede6 1690 SET_PT (PT - 1);
aaf35234 1691 lose = FETCH_CHAR (PT_BYTE);
d86ba5c5
RS
1692 if (! NILP (Vpost_command_hook))
1693 goto directly_done;
22b94eeb
RS
1694 if (current_buffer == prev_buffer
1695 && last_point_position != PT
1696 && NILP (Vdisable_point_adjustment)
1697 && NILP (Vglobal_disable_point_adjustment))
1698 adjust_point_for_property (last_point_position, 0);
2764bebd
RS
1699 already_adjusted = 1;
1700 if (PT == last_point_position - 1
1701 && (dp
1702 ? (VECTORP (DISP_CHAR_VECTOR (dp, lose))
1703 ? XVECTOR (DISP_CHAR_VECTOR (dp, lose))->size == 1
1704 : (NILP (DISP_CHAR_VECTOR (dp, lose))
1705 && (lose >= 0x20 && lose < 0x7f)))
1706 : (lose >= 0x20 && lose < 0x7f))
284f4730
JB
1707 && (XFASTINT (XWINDOW (selected_window)->last_modified)
1708 >= MODIFF)
598ba4c7
RS
1709 && (XFASTINT (XWINDOW (selected_window)->last_overlay_modified)
1710 >= OVERLAY_MODIFF)
284f4730 1711 && (XFASTINT (XWINDOW (selected_window)->last_point)
8001d352 1712 == PT + 1)
284f4730
JB
1713 && !windows_or_buffers_changed
1714 && EQ (current_buffer->selective_display, Qnil)
1715 && !detect_input_pending ()
962ae636 1716 && NILP (XWINDOW (selected_window)->column_number_displayed)
ce0d2858 1717 && NILP (Vexecuting_kbd_macro))
e35b6123 1718 direct_output_forward_char (-1);
284f4730
JB
1719 goto directly_done;
1720 }
d5eecefb 1721 else if (EQ (Vthis_command, Qself_insert_command)
14e40288
SM
1722 /* Try this optimization only on char keystrokes. */
1723 && NATNUMP (last_command_char)
1724 && CHAR_VALID_P (XFASTINT (last_command_char), 0))
284f4730 1725 {
d86ba5c5
RS
1726 unsigned int c
1727 = translate_char (Vtranslation_table_for_input,
1728 XFASTINT (last_command_char), 0, 0, 0);
fc9cce4e 1729 int value;
ce0d2858 1730 if (NILP (Vexecuting_kbd_macro)
fc9cce4e 1731 && !EQ (minibuf_window, selected_window))
284f4730
JB
1732 {
1733 if (!nonundocount || nonundocount >= 20)
1734 {
1735 Fundo_boundary ();
1736 nonundocount = 0;
1737 }
1738 nonundocount++;
1739 }
c60ee5e7 1740
fc9cce4e
RS
1741 lose = ((XFASTINT (XWINDOW (selected_window)->last_modified)
1742 < MODIFF)
598ba4c7
RS
1743 || (XFASTINT (XWINDOW (selected_window)->last_overlay_modified)
1744 < OVERLAY_MODIFF)
fc9cce4e
RS
1745 || (XFASTINT (XWINDOW (selected_window)->last_point)
1746 != PT)
4c61f38e 1747 || MODIFF <= SAVE_MODIFF
fc9cce4e
RS
1748 || windows_or_buffers_changed
1749 || !EQ (current_buffer->selective_display, Qnil)
1750 || detect_input_pending ()
962ae636 1751 || !NILP (XWINDOW (selected_window)->column_number_displayed)
ce0d2858 1752 || !NILP (Vexecuting_kbd_macro));
c60ee5e7 1753
fc9cce4e 1754 value = internal_self_insert (c, 0);
7ee32cda 1755
fc9cce4e
RS
1756 if (value == 2)
1757 nonundocount = 0;
1758
294d643a
RS
1759 if (! NILP (Vpost_command_hook))
1760 /* Put this before calling adjust_point_for_property
1761 so it will only get called once in any case. */
1762 goto directly_done;
1763
7ee32cda
GM
1764 /* VALUE == 1 when AFTER-CHANGE functions are
1765 installed which is the case most of the time
1766 because FONT-LOCK installs one. */
1767 if (!lose && !value)
e35b6123 1768 direct_output_for_insert (c);
284f4730
JB
1769 goto directly_done;
1770 }
1771 }
1772
1773 /* Here for a command that isn't executed directly */
1774
0af912f0 1775 {
7ee32cda 1776#ifdef HAVE_X_WINDOWS
0af912f0
JD
1777 int scount = SPECPDL_INDEX ();
1778
1779 if (display_hourglass_p
ce0d2858 1780 && NILP (Vexecuting_kbd_macro))
0af912f0
JD
1781 {
1782 record_unwind_protect (cancel_hourglass_unwind, Qnil);
1783 start_hourglass ();
1784 }
7ee32cda
GM
1785#endif
1786
0af912f0
JD
1787 nonundocount = 0;
1788 if (NILP (current_kboard->Vprefix_arg))
1789 Fundo_boundary ();
1790 Fcommand_execute (Vthis_command, Qnil, Qnil, Qnil);
d0c48478
GM
1791
1792#ifdef HAVE_X_WINDOWS
4fbcc9b1
PJ
1793 /* Do not check display_hourglass_p here, because
1794 Fcommand_execute could change it, but we should cancel
e1204d39
RS
1795 hourglass cursor anyway.
1796 But don't cancel the hourglass within a macro
1797 just because a command in the macro finishes. */
ce0d2858 1798 if (NILP (Vexecuting_kbd_macro))
0af912f0 1799 unbind_to (scount, Qnil);
d0c48478 1800#endif
0af912f0 1801 }
284f4730 1802 }
a764a753 1803 directly_done: ;
75045dcb 1804 current_kboard->Vlast_prefix_arg = Vcurrent_prefix_arg;
284f4730 1805
84ee6048
RS
1806 /* Note that the value cell will never directly contain nil
1807 if the symbol is a local variable. */
1808 if (!NILP (Vpost_command_hook) && !NILP (Vrun_hooks))
1809 safe_run_hooks (Qpost_command_hook);
1810
8f12e41d
GM
1811 /* If displaying a message, resize the echo area window to fit
1812 that message's size exactly. */
1813 if (!NILP (echo_area_buffer[0]))
f09c15ed 1814 resize_echo_area_exactly ();
8f12e41d 1815
84ee6048
RS
1816 if (!NILP (Vdeferred_action_list))
1817 safe_run_hooks (Qdeferred_action_function);
1818
284f4730 1819 /* If there is a prefix argument,
6c7178b9
KH
1820 1) We don't want Vlast_command to be ``universal-argument''
1821 (that would be dumb), so don't set Vlast_command,
284f4730
JB
1822 2) we want to leave echoing on so that the prefix will be
1823 echoed as part of this key sequence, so don't call
1824 cancel_echoing, and
1825 3) we want to leave this_command_key_count non-zero, so that
1826 read_char will realize that it is re-reading a character, and
217258d5
KH
1827 not echo it a second time.
1828
1829 If the command didn't actually create a prefix arg,
1830 but is merely a frame event that is transparent to prefix args,
1831 then the above doesn't apply. */
1832 if (NILP (current_kboard->Vprefix_arg) || CONSP (last_command_char))
284f4730 1833 {
d5eecefb
RS
1834 current_kboard->Vlast_command = Vthis_command;
1835 current_kboard->Vreal_last_command = real_this_command;
284f4730
JB
1836 cancel_echoing ();
1837 this_command_key_count = 0;
63020c46 1838 this_command_key_count_reset = 0;
6321824f 1839 this_single_command_key_start = 0;
284f4730 1840 }
86e5706b 1841
88ce066e 1842 if (!NILP (current_buffer->mark_active) && !NILP (Vrun_hooks))
86e5706b 1843 {
f28c1bd9
RS
1844 /* Setting transient-mark-mode to `only' is a way of
1845 turning it on for just one command. */
1846
1847 if (EQ (Vtransient_mark_mode, Qidentity))
1848 Vtransient_mark_mode = Qnil;
1849 if (EQ (Vtransient_mark_mode, Qonly))
1850 Vtransient_mark_mode = Qidentity;
1851
86e5706b
RS
1852 if (!NILP (Vdeactivate_mark) && !NILP (Vtransient_mark_mode))
1853 {
2e1a49ad
SM
1854 /* We could also call `deactivate'mark'. */
1855 if (EQ (Vtransient_mark_mode, Qlambda))
1856 Vtransient_mark_mode = Qnil;
1857 else
1858 {
1859 current_buffer->mark_active = Qnil;
1860 call1 (Vrun_hooks, intern ("deactivate-mark-hook"));
1861 }
86e5706b
RS
1862 }
1863 else if (current_buffer != prev_buffer || MODIFF != prev_modiff)
1864 call1 (Vrun_hooks, intern ("activate-mark-hook"));
1865 }
ff4b06d3
KH
1866
1867 finalize:
adf5cb9c
KH
1868
1869 if (current_buffer == prev_buffer
1870 && last_point_position != PT
1871 && NILP (Vdisable_point_adjustment)
2764bebd
RS
1872 && NILP (Vglobal_disable_point_adjustment)
1873 && !already_adjusted)
2a026b04 1874 adjust_point_for_property (last_point_position, MODIFF != prev_modiff);
adf5cb9c 1875
ff4b06d3
KH
1876 /* Install chars successfully executed in kbd macro. */
1877
d8bcf58e
KH
1878 if (!NILP (current_kboard->defining_kbd_macro)
1879 && NILP (current_kboard->Vprefix_arg))
ff4b06d3
KH
1880 finalize_kbd_macro_chars ();
1881
c5fdd383 1882#ifdef MULTI_KBOARD
604ccd1d 1883 if (!was_locked)
1e8bd3da 1884 any_kboard_state ();
ff4b06d3 1885#endif
284f4730
JB
1886 }
1887}
1c9784c9 1888
adf5cb9c
KH
1889extern Lisp_Object Qcomposition, Qdisplay;
1890
1891/* Adjust point to a boundary of a region that has such a property
1892 that should be treated intangible. For the moment, we check
7e16ef60
SM
1893 `composition', `display' and `invisible' properties.
1894 LAST_PT is the last position of point. */
adf5cb9c 1895
14e40288
SM
1896extern Lisp_Object Qafter_string, Qbefore_string;
1897extern Lisp_Object get_pos_property P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
1898
adf5cb9c 1899static void
2a026b04 1900adjust_point_for_property (last_pt, modified)
adf5cb9c 1901 int last_pt;
2a026b04 1902 int modified;
adf5cb9c 1903{
7e16ef60
SM
1904 int beg, end;
1905 Lisp_Object val, overlay, tmp;
1906 int check_composition = 1, check_display = 1, check_invisible = 1;
0bbdffbd 1907 int orig_pt = PT;
adf5cb9c 1908
0bbdffbd
SM
1909 /* FIXME: cycling is probably not necessary because these properties
1910 can't be usefully combined anyway. */
7e16ef60 1911 while (check_composition || check_display || check_invisible)
adf5cb9c
KH
1912 {
1913 if (check_composition
1914 && PT > BEGV && PT < ZV
7e16ef60
SM
1915 && get_property_and_range (PT, Qcomposition, &val, &beg, &end, Qnil)
1916 && COMPOSITION_VALID_P (beg, end, val)
1917 && beg < PT /* && end > PT <- It's always the case. */
1918 && (last_pt <= beg || last_pt >= end))
adf5cb9c 1919 {
14e40288 1920 xassert (end > PT);
7e16ef60 1921 SET_PT (PT < last_pt ? beg : end);
14e40288 1922 check_display = check_invisible = 1;
adf5cb9c
KH
1923 }
1924 check_composition = 0;
1925 if (check_display
1926 && PT > BEGV && PT < ZV
7e16ef60
SM
1927 && !NILP (val = get_char_property_and_overlay
1928 (make_number (PT), Qdisplay, Qnil, &overlay))
3e9ac4b7 1929 && display_prop_intangible_p (val)
7e16ef60
SM
1930 && (!OVERLAYP (overlay)
1931 ? get_property_and_range (PT, Qdisplay, &val, &beg, &end, Qnil)
1932 : (beg = OVERLAY_POSITION (OVERLAY_START (overlay)),
1933 end = OVERLAY_POSITION (OVERLAY_END (overlay))))
4ca39724
KS
1934 && (beg < PT /* && end > PT <- It's always the case. */
1935 || (beg <= PT && STRINGP (val) && SCHARS (val) == 0)))
adf5cb9c 1936 {
14e40288 1937 xassert (end > PT);
4ca39724
KS
1938 SET_PT (PT < last_pt
1939 ? (STRINGP (val) && SCHARS (val) == 0 ? beg - 1 : beg)
1940 : end);
14e40288 1941 check_composition = check_invisible = 1;
adf5cb9c
KH
1942 }
1943 check_display = 0;
14e40288 1944 if (check_invisible && PT > BEGV && PT < ZV)
7e16ef60 1945 {
14e40288
SM
1946 int inv, ellipsis = 0;
1947 beg = end = PT;
1948
1949 /* Find boundaries `beg' and `end' of the invisible area, if any. */
1950 while (end < ZV
1951 && !NILP (val = get_char_property_and_overlay
1952 (make_number (end), Qinvisible, Qnil, &overlay))
1953 && (inv = TEXT_PROP_MEANS_INVISIBLE (val)))
1954 {
1955 ellipsis = ellipsis || inv > 1
1956 || (OVERLAYP (overlay)
1957 && (!NILP (Foverlay_get (overlay, Qafter_string))
1958 || !NILP (Foverlay_get (overlay, Qbefore_string))));
1959 tmp = Fnext_single_char_property_change
1960 (make_number (end), Qinvisible, Qnil, Qnil);
1961 end = NATNUMP (tmp) ? XFASTINT (tmp) : ZV;
1962 }
1963 while (beg > BEGV
1964 && !NILP (val = get_char_property_and_overlay
1965 (make_number (beg - 1), Qinvisible, Qnil, &overlay))
1966 && (inv = TEXT_PROP_MEANS_INVISIBLE (val)))
1967 {
1968 ellipsis = ellipsis || inv > 1
1969 || (OVERLAYP (overlay)
1970 && (!NILP (Foverlay_get (overlay, Qafter_string))
1971 || !NILP (Foverlay_get (overlay, Qbefore_string))));
1972 tmp = Fprevious_single_char_property_change
1973 (make_number (beg), Qinvisible, Qnil, Qnil);
1974 beg = NATNUMP (tmp) ? XFASTINT (tmp) : BEGV;
1975 }
c60ee5e7 1976
14e40288
SM
1977 /* Move away from the inside area. */
1978 if (beg < PT && end > PT)
1979 {
0bbdffbd
SM
1980 SET_PT ((orig_pt == PT && (last_pt < beg || last_pt > end))
1981 /* We haven't moved yet (so we don't need to fear
1982 infinite-looping) and we were outside the range
1983 before (so either end of the range still corresponds
1984 to a move in the right direction): pretend we moved
1985 less than we actually did, so that we still have
1986 more freedom below in choosing which end of the range
1987 to go to. */
9465a86c 1988 ? (orig_pt = -1, PT < last_pt ? end : beg)
0bbdffbd
SM
1989 /* We either have moved already or the last point
1990 was already in the range: we don't get to choose
1991 which end of the range we have to go to. */
1992 : (PT < last_pt ? beg : end));
14e40288
SM
1993 check_composition = check_display = 1;
1994 }
a874691c
MB
1995#if 0 /* This assertion isn't correct, because SET_PT may end up setting
1996 the point to something other than its argument, due to
1997 point-motion hooks, intangibility, etc. */
14e40288 1998 xassert (PT == beg || PT == end);
a874691c
MB
1999#endif
2000
2a026b04
KH
2001 /* Pretend the area doesn't exist if the buffer is not
2002 modified. */
2003 if (!modified && !ellipsis && beg < end)
14e40288
SM
2004 {
2005 if (last_pt == beg && PT == end && end < ZV)
2006 (check_composition = check_display = 1, SET_PT (end + 1));
2007 else if (last_pt == end && PT == beg && beg > BEGV)
2008 (check_composition = check_display = 1, SET_PT (beg - 1));
2009 else if (PT == ((PT < last_pt) ? beg : end))
2010 /* We've already moved as far as we can. Trying to go
2011 to the other end would mean moving backwards and thus
2012 could lead to an infinite loop. */
2013 ;
2014 else if (val = get_pos_property (make_number (PT),
2015 Qinvisible, Qnil),
2016 TEXT_PROP_MEANS_INVISIBLE (val)
2017 && (val = get_pos_property
2018 (make_number (PT == beg ? end : beg),
2019 Qinvisible, Qnil),
2020 !TEXT_PROP_MEANS_INVISIBLE (val)))
2021 (check_composition = check_display = 1,
2022 SET_PT (PT == beg ? end : beg));
2023 }
7e16ef60
SM
2024 }
2025 check_invisible = 0;
adf5cb9c
KH
2026 }
2027}
2028
0bc3db2b
RS
2029/* Subroutine for safe_run_hooks: run the hook HOOK. */
2030
2031static Lisp_Object
2032safe_run_hooks_1 (hook)
2033 Lisp_Object hook;
2034{
5e093f44
RS
2035 if (NILP (Vrun_hooks))
2036 return Qnil;
0bc3db2b
RS
2037 return call1 (Vrun_hooks, Vinhibit_quit);
2038}
2039
2040/* Subroutine for safe_run_hooks: handle an error by clearing out the hook. */
2041
2042static Lisp_Object
2043safe_run_hooks_error (data)
2044 Lisp_Object data;
2045{
adec392e
SM
2046 Lisp_Object args[3];
2047 args[0] = build_string ("Error in %s: %s");
2048 args[1] = Vinhibit_quit;
2049 args[2] = data;
2050 Fmessage (3, args);
30690496 2051 return Fset (Vinhibit_quit, Qnil);
0bc3db2b
RS
2052}
2053
1c9784c9
KH
2054/* If we get an error while running the hook, cause the hook variable
2055 to be nil. Also inhibit quits, so that C-g won't cause the hook
2056 to mysteriously evaporate. */
0bc3db2b 2057
68f297c5 2058void
1c9784c9 2059safe_run_hooks (hook)
a98ea3f9 2060 Lisp_Object hook;
1c9784c9 2061{
aed13378 2062 int count = SPECPDL_INDEX ();
0bc3db2b
RS
2063 specbind (Qinhibit_quit, hook);
2064
e702932d 2065 internal_condition_case (safe_run_hooks_1, Qt, safe_run_hooks_error);
1c9784c9
KH
2066
2067 unbind_to (count, Qnil);
2068}
8a9f5d3c 2069
284f4730 2070\f
8a9f5d3c
GM
2071/* Number of seconds between polling for input. This is a Lisp
2072 variable that can be bound. */
2073
31ade731 2074EMACS_INT polling_period;
284f4730 2075
eb8c3be9 2076/* Nonzero means polling for input is temporarily suppressed. */
8a9f5d3c 2077
284f4730
JB
2078int poll_suppress_count;
2079
8a9f5d3c
GM
2080/* Asynchronous timer for polling. */
2081
2082struct atimer *poll_timer;
2083
284f4730 2084
36922b18
RS
2085#ifdef POLL_FOR_INPUT
2086
8a9f5d3c
GM
2087/* Poll for input, so what we catch a C-g if it comes in. This
2088 function is called from x_make_frame_visible, see comment
2089 there. */
284f4730 2090
8a9f5d3c
GM
2091void
2092poll_for_input_1 ()
284f4730 2093{
9ac0d9e0
JB
2094 if (interrupt_input_blocked == 0
2095 && !waiting_for_input)
2096 read_avail_input (0);
284f4730
JB
2097}
2098
8a9f5d3c
GM
2099/* Timer callback function for poll_timer. TIMER is equal to
2100 poll_timer. */
2101
2102void
2103poll_for_input (timer)
2104 struct atimer *timer;
2105{
2106 if (poll_suppress_count == 0)
a42bf890
YM
2107#ifdef SYNC_INPUT
2108 interrupt_input_pending = 1;
2109#else
8a9f5d3c 2110 poll_for_input_1 ();
a42bf890 2111#endif
8a9f5d3c
GM
2112}
2113
2114#endif /* POLL_FOR_INPUT */
284f4730
JB
2115
2116/* Begin signals to poll for input, if they are appropriate.
2117 This function is called unconditionally from various places. */
2118
07a59269 2119void
284f4730
JB
2120start_polling ()
2121{
2122#ifdef POLL_FOR_INPUT
34f04431 2123 if (read_socket_hook && !interrupt_input)
284f4730 2124 {
8a9f5d3c
GM
2125 /* Turn alarm handling on unconditionally. It might have
2126 been turned off in process.c. */
2127 turn_on_atimers (1);
c60ee5e7 2128
8a9f5d3c
GM
2129 /* If poll timer doesn't exist, are we need one with
2130 a different interval, start a new one. */
2131 if (poll_timer == NULL
2132 || EMACS_SECS (poll_timer->interval) != polling_period)
284f4730 2133 {
8a9f5d3c
GM
2134 EMACS_TIME interval;
2135
2136 if (poll_timer)
2137 cancel_atimer (poll_timer);
c60ee5e7 2138
8a9f5d3c
GM
2139 EMACS_SET_SECS_USECS (interval, polling_period, 0);
2140 poll_timer = start_atimer (ATIMER_CONTINUOUS, interval,
2141 poll_for_input, NULL);
284f4730 2142 }
8a9f5d3c
GM
2143
2144 /* Let the timer's callback function poll for input
2145 if this becomes zero. */
2146 --poll_suppress_count;
284f4730
JB
2147 }
2148#endif
2149}
2150
1d3195db
RS
2151/* Nonzero if we are using polling to handle input asynchronously. */
2152
2153int
2154input_polling_used ()
2155{
2156#ifdef POLL_FOR_INPUT
2157 return read_socket_hook && !interrupt_input;
2158#else
2159 return 0;
2160#endif
2161}
2162
284f4730
JB
2163/* Turn off polling. */
2164
07a59269 2165void
284f4730
JB
2166stop_polling ()
2167{
2168#ifdef POLL_FOR_INPUT
34f04431 2169 if (read_socket_hook && !interrupt_input)
8a9f5d3c 2170 ++poll_suppress_count;
284f4730
JB
2171#endif
2172}
fe8aeef3
RS
2173
2174/* Set the value of poll_suppress_count to COUNT
2175 and start or stop polling accordingly. */
2176
2177void
2178set_poll_suppress_count (count)
2179 int count;
2180{
2181#ifdef POLL_FOR_INPUT
2182 if (count == 0 && poll_suppress_count != 0)
2183 {
2184 poll_suppress_count = 1;
2185 start_polling ();
2186 }
2187 else if (count != 0 && poll_suppress_count == 0)
2188 {
2189 stop_polling ();
2190 }
2191 poll_suppress_count = count;
2192#endif
2193}
f4eef8b4 2194
d0a57728
RS
2195/* Bind polling_period to a value at least N.
2196 But don't decrease it. */
2197
07a59269 2198void
f4eef8b4
RS
2199bind_polling_period (n)
2200 int n;
2201{
2202#ifdef POLL_FOR_INPUT
d0a57728
RS
2203 int new = polling_period;
2204
2205 if (n > new)
2206 new = n;
2207
6fe007f7 2208 stop_other_atimers (poll_timer);
f4eef8b4 2209 stop_polling ();
d0a57728
RS
2210 specbind (Qpolling_period, make_number (new));
2211 /* Start a new alarm with the new period. */
f4eef8b4
RS
2212 start_polling ();
2213#endif
2214}
284f4730 2215\f
6da3dd3a
RS
2216/* Apply the control modifier to CHARACTER. */
2217
faf5e407
JB
2218int
2219make_ctrl_char (c)
2220 int c;
2221{
d205953b
JB
2222 /* Save the upper bits here. */
2223 int upper = c & ~0177;
2224
2225 c &= 0177;
2226
2227 /* Everything in the columns containing the upper-case letters
2228 denotes a control character. */
2229 if (c >= 0100 && c < 0140)
2230 {
2231 int oc = c;
2232 c &= ~0140;
2233 /* Set the shift modifier for a control char
2234 made from a shifted letter. But only for letters! */
2235 if (oc >= 'A' && oc <= 'Z')
2236 c |= shift_modifier;
2237 }
2238
2239 /* The lower-case letters denote control characters too. */
2240 else if (c >= 'a' && c <= 'z')
2241 c &= ~0140;
2242
2243 /* Include the bits for control and shift
2244 only if the basic ASCII code can't indicate them. */
2245 else if (c >= ' ')
2246 c |= ctrl_modifier;
2247
2248 /* Replace the high bits. */
2249 c |= (upper & ~ctrl_modifier);
faf5e407
JB
2250
2251 return c;
2252}
2253
bb8c4865
RS
2254/* Display the help-echo property of the character after the mouse pointer.
2255 Either show it in the echo area, or call show-help-function to display
2256 it by other means (maybe in a tooltip).
d4e68eea 2257
bb8c4865
RS
2258 If HELP is nil, that means clear the previous help echo.
2259
2260 If HELP is a string, display that string. If HELP is a function,
2261 call it with OBJECT and POS as arguments; the function should
2262 return a help string or nil for none. For all other types of HELP,
2263 evaluate it to obtain a string.
8dfd92c9 2264
2190735a
GM
2265 WINDOW is the window in which the help was generated, if any.
2266 It is nil if not in a window.
2267
5b2ec2d0
GM
2268 If OBJECT is a buffer, POS is the position in the buffer where the
2269 `help-echo' text property was found.
2270
2271 If OBJECT is an overlay, that overlay has a `help-echo' property,
2272 and POS is the position in the overlay's buffer under the mouse.
2273
2274 If OBJECT is a string (an overlay string or a string displayed with
2275 the `display' property). POS is the position in that string under
2276 the mouse.
d4e68eea 2277
27fd22dc 2278 OK_TO_OVERWRITE_KEYSTROKE_ECHO non-zero means it's okay if the help
d4e68eea
GM
2279 echo overwrites a keystroke echo currently displayed in the echo
2280 area.
2281
8dfd92c9
GM
2282 Note: this function may only be called with HELP nil or a string
2283 from X code running asynchronously. */
d4e68eea 2284
31f84d03 2285void
2190735a
GM
2286show_help_echo (help, window, object, pos, ok_to_overwrite_keystroke_echo)
2287 Lisp_Object help, window, object, pos;
adc84f48 2288 int ok_to_overwrite_keystroke_echo;
31f84d03 2289{
8dfd92c9 2290 if (!NILP (help) && !STRINGP (help))
d4e68eea 2291 {
8dfd92c9
GM
2292 if (FUNCTIONP (help))
2293 {
2190735a 2294 Lisp_Object args[4];
8dfd92c9 2295 args[0] = help;
2190735a
GM
2296 args[1] = window;
2297 args[2] = object;
2298 args[3] = pos;
1db0076e 2299 help = safe_call (4, args);
8dfd92c9
GM
2300 }
2301 else
1db0076e 2302 help = safe_eval (help);
c60ee5e7 2303
8dfd92c9 2304 if (!STRINGP (help))
d4e68eea 2305 return;
31f84d03
SM
2306 }
2307
c22237f7
KS
2308#ifdef HAVE_MOUSE
2309 if (!noninteractive && STRINGP (help))
2310 help = call1 (Qmouse_fixup_help_message, help);
2311#endif
2312
8dfd92c9 2313 if (STRINGP (help) || NILP (help))
d4e68eea
GM
2314 {
2315 if (!NILP (Vshow_help_function))
8dfd92c9 2316 call1 (Vshow_help_function, help);
d4e68eea
GM
2317 else if (/* Don't overwrite minibuffer contents. */
2318 !MINI_WINDOW_P (XWINDOW (selected_window))
2319 /* Don't overwrite a keystroke echo. */
8dfd92c9
GM
2320 && (NILP (echo_message_buffer)
2321 || ok_to_overwrite_keystroke_echo)
d4e68eea
GM
2322 /* Don't overwrite a prompt. */
2323 && !cursor_in_echo_area)
2324 {
8dfd92c9 2325 if (STRINGP (help))
d4e68eea 2326 {
331379bf 2327 int count = SPECPDL_INDEX ();
f0c1cc56
GM
2328
2329 if (!help_echo_showing_p)
2330 Vpre_help_message = current_message ();
c60ee5e7 2331
d4e68eea 2332 specbind (Qmessage_truncate_lines, Qt);
d5db4077 2333 message3_nolog (help, SBYTES (help),
8dfd92c9 2334 STRING_MULTIBYTE (help));
d4e68eea
GM
2335 unbind_to (count, Qnil);
2336 }
f0c1cc56
GM
2337 else if (STRINGP (Vpre_help_message))
2338 {
2339 message3_nolog (Vpre_help_message,
d5db4077 2340 SBYTES (Vpre_help_message),
f0c1cc56
GM
2341 STRING_MULTIBYTE (Vpre_help_message));
2342 Vpre_help_message = Qnil;
2343 }
d4e68eea 2344 else
f0c1cc56 2345 message (0);
d4e68eea 2346 }
c60ee5e7 2347
5295a500 2348 help_echo_showing_p = STRINGP (help);
d4e68eea 2349 }
31f84d03
SM
2350}
2351
faf5e407
JB
2352
2353\f
284f4730
JB
2354/* Input of single characters from keyboard */
2355
2356Lisp_Object print_help ();
2357static Lisp_Object kbd_buffer_get_event ();
e4fe371d 2358static void record_char ();
284f4730 2359
c5fdd383
KH
2360#ifdef MULTI_KBOARD
2361static jmp_buf wrong_kboard_jmpbuf;
bded54dd 2362#endif
beecf6a1 2363
184c3d81
RS
2364#define STOP_POLLING \
2365do { if (! polling_stopped_here) stop_polling (); \
2366 polling_stopped_here = 1; } while (0)
2367
2368#define RESUME_POLLING \
2369do { if (polling_stopped_here) start_polling (); \
2370 polling_stopped_here = 0; } while (0)
2371
284f4730
JB
2372/* read a character from the keyboard; call the redisplay if needed */
2373/* commandflag 0 means do not do auto-saving, but do do redisplay.
2374 -1 means do not do redisplay, but do do autosaving.
2375 1 means do both. */
2376
7d6de002
RS
2377/* The arguments MAPS and NMAPS are for menu prompting.
2378 MAPS is an array of keymaps; NMAPS is the length of MAPS.
2379
2380 PREV_EVENT is the previous input event, or nil if we are reading
b638f328
RS
2381 the first event of a key sequence (or not reading a key sequence).
2382 If PREV_EVENT is t, that is a "magic" value that says
2383 not to run input methods, but in other respects to act as if
2384 not reading a key sequence.
7d6de002 2385
83d68044 2386 If USED_MOUSE_MENU is non-null, then we set *USED_MOUSE_MENU to 1
6569cc8d 2387 if we used a mouse menu to read the input, or zero otherwise. If
83d68044 2388 USED_MOUSE_MENU is null, we don't dereference it.
dcc408a0 2389
179f689c
CY
2390 If END_TIME is non-null, it is a pointer to an EMACS_TIME
2391 specifying the maximum time to wait until. If no input arrives by
2392 that time, stop waiting and return nil.
2393
dcc408a0 2394 Value is t if we showed a menu and the user rejected it. */
7d6de002 2395
284f4730 2396Lisp_Object
179f689c 2397read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu, end_time)
284f4730 2398 int commandflag;
7d6de002
RS
2399 int nmaps;
2400 Lisp_Object *maps;
2401 Lisp_Object prev_event;
2402 int *used_mouse_menu;
179f689c 2403 EMACS_TIME *end_time;
284f4730 2404{
8c907a56 2405 volatile Lisp_Object c;
092869b9 2406 int count, jmpcount;
410d4de9 2407 jmp_buf local_getcjmp;
284f4730 2408 jmp_buf save_jump;
8c907a56 2409 volatile int key_already_recorded = 0;
017c7cb6 2410 Lisp_Object tem, save;
8c907a56
GM
2411 volatile Lisp_Object previous_echo_area_message;
2412 volatile Lisp_Object also_record;
2413 volatile int reread;
d5eecefb 2414 struct gcpro gcpro1, gcpro2;
184c3d81 2415 int polling_stopped_here = 0;
7c3bc944 2416
e4fe371d 2417 also_record = Qnil;
284f4730 2418
22b94eeb 2419#if 0 /* This was commented out as part of fixing echo for C-u left. */
71918b75
RS
2420 before_command_key_count = this_command_key_count;
2421 before_command_echo_length = echo_length ();
22b94eeb 2422#endif
ef6661f7 2423 c = Qnil;
7ee32cda 2424 previous_echo_area_message = Qnil;
71918b75 2425
7ee32cda 2426 GCPRO2 (c, previous_echo_area_message);
7c3bc944 2427
7f07d5ca
RS
2428 retry:
2429
7d18f9ae
RS
2430 reread = 0;
2431 if (CONSP (Vunread_post_input_method_events))
284f4730 2432 {
7539e11f 2433 c = XCAR (Vunread_post_input_method_events);
7d18f9ae 2434 Vunread_post_input_method_events
7539e11f 2435 = XCDR (Vunread_post_input_method_events);
284f4730 2436
2479e91e
RS
2437 /* Undo what read_char_x_menu_prompt did when it unread
2438 additional keys returned by Fx_popup_menu. */
2439 if (CONSP (c)
7539e11f
KR
2440 && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c)))
2441 && NILP (XCDR (c)))
2442 c = XCAR (c);
2479e91e 2443
7d18f9ae
RS
2444 reread = 1;
2445 goto reread_first;
284f4730
JB
2446 }
2447
86e5706b
RS
2448 if (unread_command_char != -1)
2449 {
18cd2eeb 2450 XSETINT (c, unread_command_char);
86e5706b
RS
2451 unread_command_char = -1;
2452
7d18f9ae
RS
2453 reread = 1;
2454 goto reread_first;
2455 }
2456
2457 if (CONSP (Vunread_command_events))
2458 {
7539e11f
KR
2459 c = XCAR (Vunread_command_events);
2460 Vunread_command_events = XCDR (Vunread_command_events);
7d18f9ae
RS
2461
2462 /* Undo what read_char_x_menu_prompt did when it unread
2463 additional keys returned by Fx_popup_menu. */
2464 if (CONSP (c)
f4e05d97
GM
2465 && EQ (XCDR (c), Qdisabled)
2466 && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c))))
7539e11f 2467 c = XCAR (c);
c60ee5e7 2468
d17e49a8
GM
2469 /* If the queued event is something that used the mouse,
2470 set used_mouse_menu accordingly. */
2471 if (used_mouse_menu
2472 && (EQ (c, Qtool_bar) || EQ (c, Qmenu_bar)))
2473 *used_mouse_menu = 1;
c60ee5e7 2474
7d18f9ae
RS
2475 reread = 1;
2476 goto reread_for_input_method;
2477 }
2478
2479 if (CONSP (Vunread_input_method_events))
2480 {
7539e11f
KR
2481 c = XCAR (Vunread_input_method_events);
2482 Vunread_input_method_events = XCDR (Vunread_input_method_events);
7d18f9ae
RS
2483
2484 /* Undo what read_char_x_menu_prompt did when it unread
2485 additional keys returned by Fx_popup_menu. */
2486 if (CONSP (c)
7539e11f
KR
2487 && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c)))
2488 && NILP (XCDR (c)))
2489 c = XCAR (c);
7d18f9ae
RS
2490 reread = 1;
2491 goto reread_for_input_method;
86e5706b
RS
2492 }
2493
63020c46
RS
2494 this_command_key_count_reset = 0;
2495
ce0d2858 2496 if (!NILP (Vexecuting_kbd_macro))
284f4730 2497 {
fce33686
JB
2498 /* We set this to Qmacro; since that's not a frame, nobody will
2499 try to switch frames on us, and the selected window will
2500 remain unchanged.
2501
2502 Since this event came from a macro, it would be misleading to
eb8c3be9 2503 leave internal_last_event_frame set to wherever the last
3c370943
JB
2504 real event came from. Normally, a switch-frame event selects
2505 internal_last_event_frame after each command is read, but
2506 events read from a macro should never cause a new frame to be
2507 selected. */
4c52b668 2508 Vlast_event_frame = internal_last_event_frame = Qmacro;
fce33686 2509
663258f2
JB
2510 /* Exit the macro if we are at the end.
2511 Also, some things replace the macro with t
2512 to force an early exit. */
ce0d2858 2513 if (EQ (Vexecuting_kbd_macro, Qt)
649d952d 2514 || executing_kbd_macro_index >= XFASTINT (Flength (Vexecuting_kbd_macro)))
284f4730 2515 {
18cd2eeb 2516 XSETINT (c, -1);
184c3d81 2517 goto exit;
284f4730 2518 }
df0f2ba1 2519
649d952d 2520 c = Faref (Vexecuting_kbd_macro, make_number (executing_kbd_macro_index));
ce0d2858 2521 if (STRINGP (Vexecuting_kbd_macro)
d5161e8c 2522 && (XINT (c) & 0x80) && (XUINT (c) <= 0xff))
bb9e9bed 2523 XSETFASTINT (c, CHAR_META | (XINT (c) & ~0x80));
86e5706b 2524
649d952d 2525 executing_kbd_macro_index++;
284f4730
JB
2526
2527 goto from_macro;
2528 }
2529
cd21b839
JB
2530 if (!NILP (unread_switch_frame))
2531 {
2532 c = unread_switch_frame;
2533 unread_switch_frame = Qnil;
2534
2535 /* This event should make it into this_command_keys, and get echoed
7d18f9ae 2536 again, so we do not set `reread'. */
f4255cd1 2537 goto reread_first;
cd21b839
JB
2538 }
2539
adc1d5c8 2540 /* if redisplay was requested */
6e4e64a8
RS
2541 if (commandflag >= 0)
2542 {
adc1d5c8
RS
2543 /* If there is pending input, process any events which are not
2544 user-visible, such as X selection_request events. */
6e4e64a8
RS
2545 if (input_pending
2546 || detect_input_pending_run_timers (0))
adc1d5c8 2547 swallow_events (0); /* may clear input_pending */
6e4e64a8 2548
adc1d5c8
RS
2549 /* Redisplay if no pending input. */
2550 while (!input_pending)
2551 {
5295a500 2552 if (help_echo_showing_p && !EQ (selected_window, minibuf_window))
3007ebfb 2553 redisplay_preserve_echo_area (5);
5295a500
GM
2554 else
2555 redisplay ();
adc1d5c8
RS
2556
2557 if (!input_pending)
2558 /* Normal case: no input arrived during redisplay. */
2559 break;
2560
2561 /* Input arrived and pre-empted redisplay.
2562 Process any events which are not user-visible. */
2563 swallow_events (0);
2564 /* If that cleared input_pending, try again to redisplay. */
2565 }
6e4e64a8 2566 }
e9bf89a0 2567
59a84f8e 2568 /* Message turns off echoing unless more keystrokes turn it on again.
c60ee5e7 2569
59a84f8e
GM
2570 The code in 20.x for the condition was
2571
2572 1. echo_area_glyphs && *echo_area_glyphs
2573 2. && echo_area_glyphs != current_kboard->echobuf
2574 3. && ok_to_echo_at_next_pause != echo_area_glyphs
2575
2576 (1) means there's a current message displayed
c60ee5e7 2577
59a84f8e
GM
2578 (2) means it's not the message from echoing from the current
2579 kboard.
c60ee5e7 2580
59a84f8e
GM
2581 (3) There's only one place in 20.x where ok_to_echo_at_next_pause
2582 is set to a non-null value. This is done in read_char and it is
2583 set to echo_area_glyphs after a call to echo_char. That means
2584 ok_to_echo_at_next_pause is either null or
2585 current_kboard->echobuf with the appropriate current_kboard at
2586 that time.
2587
2588 So, condition (3) means in clear text ok_to_echo_at_next_pause
2589 must be either null, or the current message isn't from echoing at
2590 all, or it's from echoing from a different kboard than the
2591 current one. */
c60ee5e7 2592
27fd22dc 2593 if (/* There currently is something in the echo area. */
985f9f66 2594 !NILP (echo_area_buffer[0])
59a84f8e
GM
2595 && (/* And it's either not from echoing. */
2596 !EQ (echo_area_buffer[0], echo_message_buffer)
2597 /* Or it's an echo from a different kboard. */
2598 || echo_kboard != current_kboard
2599 /* Or we explicitly allow overwriting whatever there is. */
2600 || ok_to_echo_at_next_pause == NULL))
7ee32cda 2601 cancel_echoing ();
410d4de9 2602 else
410d4de9 2603 echo_dash ();
c60ee5e7 2604
410d4de9
RS
2605 /* Try reading a character via menu prompting in the minibuf.
2606 Try this before the sit-for, because the sit-for
2607 would do the wrong thing if we are supposed to do
2608 menu prompting. If EVENT_HAS_PARAMETERS then we are reading
2609 after a mouse event so don't try a minibuf menu. */
2610 c = Qnil;
2611 if (nmaps > 0 && INTERACTIVE
2612 && !NILP (prev_event) && ! EVENT_HAS_PARAMETERS (prev_event)
2613 /* Don't bring up a menu if we already have another event. */
2614 && NILP (Vunread_command_events)
2615 && unread_command_char < 0
4ec4ed6a 2616 && !detect_input_pending_run_timers (0))
410d4de9
RS
2617 {
2618 c = read_char_minibuf_menu_prompt (commandflag, nmaps, maps);
2619 if (! NILP (c))
2620 {
2621 key_already_recorded = 1;
2622 goto non_reread_1;
2623 }
2624 }
284f4730 2625
410d4de9
RS
2626 /* Make a longjmp point for quits to use, but don't alter getcjmp just yet.
2627 We will do that below, temporarily for short sections of code,
2628 when appropriate. local_getcjmp must be in effect
2629 around any call to sit_for or kbd_buffer_get_event;
2630 it *must not* be in effect when we call redisplay. */
284f4730 2631
092869b9 2632 jmpcount = SPECPDL_INDEX ();
410d4de9 2633 if (_setjmp (local_getcjmp))
284f4730 2634 {
dfbfad25
RS
2635 /* We must have saved the outer value of getcjmp here,
2636 so restore it now. */
2637 restore_getcjmp (save_jump);
092869b9 2638 unbind_to (jmpcount, Qnil);
18cd2eeb 2639 XSETINT (c, quit_char);
788f89eb 2640 internal_last_event_frame = selected_frame;
4c52b668 2641 Vlast_event_frame = internal_last_event_frame;
04904c29
RS
2642 /* If we report the quit char as an event,
2643 don't do so more than once. */
2644 if (!NILP (Vinhibit_quit))
2645 Vquit_flag = Qnil;
284f4730 2646
c5fdd383 2647#ifdef MULTI_KBOARD
df0f2ba1 2648 {
788f89eb 2649 KBOARD *kb = FRAME_KBOARD (XFRAME (selected_frame));
c5fdd383 2650 if (kb != current_kboard)
df0f2ba1 2651 {
f3fbd155 2652 Lisp_Object link = kb->kbd_queue;
1e8bd3da
RS
2653 /* We shouldn't get here if we were in single-kboard mode! */
2654 if (single_kboard)
df0f2ba1 2655 abort ();
f3fbd155
KR
2656 if (CONSP (link))
2657 {
2658 while (CONSP (XCDR (link)))
2659 link = XCDR (link);
2660 if (!NILP (XCDR (link)))
2661 abort ();
2662 }
2663 if (!CONSP (link))
2664 kb->kbd_queue = Fcons (c, Qnil);
2665 else
2666 XSETCDR (link, Fcons (c, Qnil));
c5fdd383
KH
2667 kb->kbd_queue_has_data = 1;
2668 current_kboard = kb;
ef6661f7
RS
2669 /* This is going to exit from read_char
2670 so we had better get rid of this frame's stuff. */
2671 UNGCPRO;
c5fdd383 2672 longjmp (wrong_kboard_jmpbuf, 1);
df0f2ba1
KH
2673 }
2674 }
2675#endif
284f4730
JB
2676 goto non_reread;
2677 }
2678
d9d4c147
KH
2679 timer_start_idle ();
2680
284f4730
JB
2681 /* If in middle of key sequence and minibuffer not active,
2682 start echoing if enough time elapses. */
410d4de9 2683
c60ee5e7 2684 if (minibuf_level == 0
179f689c 2685 && !end_time
7ee32cda 2686 && !current_kboard->immediate_echo
6c6083a9 2687 && this_command_key_count > 0
27203ead 2688 && ! noninteractive
f2647d04
DL
2689 && (FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
2690 && NILP (Fzerop (Vecho_keystrokes))
985f9f66
GM
2691 && (/* No message. */
2692 NILP (echo_area_buffer[0])
2693 /* Or empty message. */
2694 || (BUF_BEG (XBUFFER (echo_area_buffer[0]))
2695 == BUF_Z (XBUFFER (echo_area_buffer[0])))
2696 /* Or already echoing from same kboard. */
2697 || (echo_kboard && ok_to_echo_at_next_pause == echo_kboard)
2698 /* Or not echoing before and echoing allowed. */
2699 || (!echo_kboard && ok_to_echo_at_next_pause)))
284f4730 2700 {
7d6de002
RS
2701 /* After a mouse event, start echoing right away.
2702 This is because we are probably about to display a menu,
2703 and we don't want to delay before doing so. */
dbc4e1c1 2704 if (EVENT_HAS_PARAMETERS (prev_event))
3dbd9ee4 2705 echo_now ();
7d6de002
RS
2706 else
2707 {
666dc232
KS
2708 Lisp_Object tem0;
2709
410d4de9
RS
2710 save_getcjmp (save_jump);
2711 restore_getcjmp (local_getcjmp);
666dc232 2712 tem0 = sit_for (Vecho_keystrokes, 1, 1);
410d4de9 2713 restore_getcjmp (save_jump);
303b5b3f
RS
2714 if (EQ (tem0, Qt)
2715 && ! CONSP (Vunread_command_events))
3dbd9ee4 2716 echo_now ();
7d6de002 2717 }
284f4730
JB
2718 }
2719
410d4de9 2720 /* Maybe auto save due to number of keystrokes. */
284f4730
JB
2721
2722 if (commandflag != 0
2723 && auto_save_interval > 0
c43b1734 2724 && num_nonmacro_input_events - last_auto_save > max (auto_save_interval, 20)
4ec4ed6a 2725 && !detect_input_pending_run_timers (0))
284f4730 2726 {
284f4730 2727 Fdo_auto_save (Qnil, Qnil);
ef8fd672
RS
2728 /* Hooks can actually change some buffers in auto save. */
2729 redisplay ();
284f4730
JB
2730 }
2731
8150596a 2732 /* Try reading using an X menu.
24597608
RS
2733 This is never confused with reading using the minibuf
2734 because the recursive call of read_char in read_char_minibuf_menu_prompt
2735 does not pass on any keymaps. */
410d4de9 2736
24597608 2737 if (nmaps > 0 && INTERACTIVE
5a8d99e0
KH
2738 && !NILP (prev_event)
2739 && EVENT_HAS_PARAMETERS (prev_event)
7539e11f
KR
2740 && !EQ (XCAR (prev_event), Qmenu_bar)
2741 && !EQ (XCAR (prev_event), Qtool_bar)
24597608
RS
2742 /* Don't bring up a menu if we already have another event. */
2743 && NILP (Vunread_command_events)
b8556aee 2744 && unread_command_char < 0)
8eb4d8ef
RS
2745 {
2746 c = read_char_x_menu_prompt (nmaps, maps, prev_event, used_mouse_menu);
2747
2748 /* Now that we have read an event, Emacs is not idle. */
2749 timer_stop_idle ();
2750
184c3d81 2751 goto exit;
8eb4d8ef 2752 }
7d6de002 2753
410d4de9
RS
2754 /* Maybe autosave and/or garbage collect due to idleness. */
2755
26c1639e 2756 if (INTERACTIVE && NILP (c))
7d6de002
RS
2757 {
2758 int delay_level, buffer_size;
2759
410d4de9
RS
2760 /* Slow down auto saves logarithmically in size of current buffer,
2761 and garbage collect while we're at it. */
7d6de002
RS
2762 if (! MINI_WINDOW_P (XWINDOW (selected_window)))
2763 last_non_minibuf_size = Z - BEG;
2764 buffer_size = (last_non_minibuf_size >> 8) + 1;
2765 delay_level = 0;
2766 while (buffer_size > 64)
2767 delay_level++, buffer_size -= buffer_size >> 2;
2768 if (delay_level < 4) delay_level = 4;
2769 /* delay_level is 4 for files under around 50k, 7 at 100k,
2770 9 at 200k, 11 at 300k, and 12 at 500k. It is 15 at 1 meg. */
2771
2772 /* Auto save if enough time goes by without input. */
2773 if (commandflag != 0
c43b1734 2774 && num_nonmacro_input_events > last_auto_save
8c18cbfb 2775 && INTEGERP (Vauto_save_timeout)
7d6de002
RS
2776 && XINT (Vauto_save_timeout) > 0)
2777 {
2778 Lisp_Object tem0;
666dc232 2779 int timeout = delay_level * XFASTINT (Vauto_save_timeout) / 4;
410d4de9
RS
2780
2781 save_getcjmp (save_jump);
2782 restore_getcjmp (local_getcjmp);
666dc232 2783 tem0 = sit_for (make_number (timeout), 1, 1);
410d4de9
RS
2784 restore_getcjmp (save_jump);
2785
303b5b3f
RS
2786 if (EQ (tem0, Qt)
2787 && ! CONSP (Vunread_command_events))
7d6de002 2788 {
7d6de002 2789 Fdo_auto_save (Qnil, Qnil);
7d6de002
RS
2790
2791 /* If we have auto-saved and there is still no input
2792 available, garbage collect if there has been enough
2793 consing going on to make it worthwhile. */
4ec4ed6a 2794 if (!detect_input_pending_run_timers (0)
c8e16a02 2795 && consing_since_gc > gc_cons_threshold / 2)
ef8fd672 2796 Fgarbage_collect ();
410d4de9 2797
ef8fd672 2798 redisplay ();
7d6de002
RS
2799 }
2800 }
2801 }
284f4730 2802
303b5b3f
RS
2803 /* If this has become non-nil here, it has been set by a timer
2804 or sentinel or filter. */
2805 if (CONSP (Vunread_command_events))
2806 {
7539e11f
KR
2807 c = XCAR (Vunread_command_events);
2808 Vunread_command_events = XCDR (Vunread_command_events);
303b5b3f
RS
2809 }
2810
410d4de9
RS
2811 /* Read something from current KBOARD's side queue, if possible. */
2812
beecf6a1 2813 if (NILP (c))
1e12dd87 2814 {
c5fdd383 2815 if (current_kboard->kbd_queue_has_data)
beecf6a1 2816 {
c5fdd383 2817 if (!CONSP (current_kboard->kbd_queue))
4524b161 2818 abort ();
7539e11f 2819 c = XCAR (current_kboard->kbd_queue);
c5fdd383 2820 current_kboard->kbd_queue
7539e11f 2821 = XCDR (current_kboard->kbd_queue);
c5fdd383
KH
2822 if (NILP (current_kboard->kbd_queue))
2823 current_kboard->kbd_queue_has_data = 0;
d9d4c147 2824 input_pending = readable_events (0);
4c52b668
KH
2825 if (EVENT_HAS_PARAMETERS (c)
2826 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qswitch_frame))
7539e11f 2827 internal_last_event_frame = XCAR (XCDR (c));
4c52b668 2828 Vlast_event_frame = internal_last_event_frame;
beecf6a1 2829 }
1e8bd3da
RS
2830 }
2831
c5fdd383 2832#ifdef MULTI_KBOARD
1e8bd3da
RS
2833 /* If current_kboard's side queue is empty check the other kboards.
2834 If one of them has data that we have not yet seen here,
2835 switch to it and process the data waiting for it.
2836
2837 Note: if the events queued up for another kboard
2838 have already been seen here, and therefore are not a complete command,
2839 the kbd_queue_has_data field is 0, so we skip that kboard here.
2840 That's to avoid an infinite loop switching between kboards here. */
2841 if (NILP (c) && !single_kboard)
2842 {
2843 KBOARD *kb;
2844 for (kb = all_kboards; kb; kb = kb->next_kboard)
2845 if (kb->kbd_queue_has_data)
2846 {
2847 current_kboard = kb;
ef6661f7
RS
2848 /* This is going to exit from read_char
2849 so we had better get rid of this frame's stuff. */
2850 UNGCPRO;
1e8bd3da
RS
2851 longjmp (wrong_kboard_jmpbuf, 1);
2852 }
2853 }
df0f2ba1
KH
2854#endif
2855
410d4de9
RS
2856 wrong_kboard:
2857
184c3d81 2858 STOP_POLLING;
410d4de9 2859
1e8bd3da
RS
2860 /* Finally, we read from the main queue,
2861 and if that gives us something we can't use yet, we put it on the
2862 appropriate side queue and try again. */
410d4de9 2863
1e8bd3da
RS
2864 if (NILP (c))
2865 {
2866 KBOARD *kb;
2867
179f689c
CY
2868 if (end_time)
2869 {
2870 EMACS_TIME now;
2871 EMACS_GET_TIME (now);
2872 if (EMACS_TIME_GE (now, *end_time))
2873 goto exit;
2874 }
2875
1e8bd3da 2876 /* Actually read a character, waiting if necessary. */
410d4de9
RS
2877 save_getcjmp (save_jump);
2878 restore_getcjmp (local_getcjmp);
5b7bc0da 2879 timer_start_idle ();
179f689c 2880 c = kbd_buffer_get_event (&kb, used_mouse_menu, end_time);
410d4de9
RS
2881 restore_getcjmp (save_jump);
2882
c5fdd383 2883#ifdef MULTI_KBOARD
410d4de9 2884 if (! NILP (c) && (kb != current_kboard))
1e8bd3da 2885 {
f3fbd155
KR
2886 Lisp_Object link = kb->kbd_queue;
2887 if (CONSP (link))
2888 {
2889 while (CONSP (XCDR (link)))
2890 link = XCDR (link);
2891 if (!NILP (XCDR (link)))
2892 abort ();
2893 }
2894 if (!CONSP (link))
2895 kb->kbd_queue = Fcons (c, Qnil);
2896 else
2897 XSETCDR (link, Fcons (c, Qnil));
1e8bd3da 2898 kb->kbd_queue_has_data = 1;
46b84797 2899 c = Qnil;
1e8bd3da
RS
2900 if (single_kboard)
2901 goto wrong_kboard;
2902 current_kboard = kb;
ef6661f7
RS
2903 /* This is going to exit from read_char
2904 so we had better get rid of this frame's stuff. */
2905 UNGCPRO;
1e8bd3da 2906 longjmp (wrong_kboard_jmpbuf, 1);
df0f2ba1 2907 }
1e8bd3da 2908#endif
beecf6a1 2909 }
1e8bd3da 2910
284f4730 2911 /* Terminate Emacs in batch mode if at eof. */
8c18cbfb 2912 if (noninteractive && INTEGERP (c) && XINT (c) < 0)
284f4730
JB
2913 Fkill_emacs (make_number (1));
2914
8c18cbfb 2915 if (INTEGERP (c))
80645119
JB
2916 {
2917 /* Add in any extra modifiers, where appropriate. */
2918 if ((extra_keyboard_modifiers & CHAR_CTL)
2919 || ((extra_keyboard_modifiers & 0177) < ' '
2920 && (extra_keyboard_modifiers & 0177) != 0))
faf5e407 2921 XSETINT (c, make_ctrl_char (XINT (c)));
80645119
JB
2922
2923 /* Transfer any other modifier bits directly from
2924 extra_keyboard_modifiers to c. Ignore the actual character code
2925 in the low 16 bits of extra_keyboard_modifiers. */
b8d9050d 2926 XSETINT (c, XINT (c) | (extra_keyboard_modifiers & ~0xff7f & ~CHAR_CTL));
80645119 2927 }
9fa4395d 2928
284f4730
JB
2929 non_reread:
2930
2fb9049e 2931 timer_stop_idle ();
184c3d81 2932 RESUME_POLLING;
284f4730 2933
410d4de9
RS
2934 if (NILP (c))
2935 {
2936 if (commandflag >= 0
4ec4ed6a 2937 && !input_pending && !detect_input_pending_run_timers (0))
410d4de9
RS
2938 redisplay ();
2939
2940 goto wrong_kboard;
2941 }
2942
2943 non_reread_1:
2944
dfd11da7 2945 /* Buffer switch events are only for internal wakeups
7c3bc944
RS
2946 so don't show them to the user.
2947 Also, don't record a key if we already did. */
2948 if (BUFFERP (c) || key_already_recorded)
184c3d81 2949 goto exit;
a1341f75 2950
7f07d5ca
RS
2951 /* Process special events within read_char
2952 and loop around to read another event. */
017c7cb6
RS
2953 save = Vquit_flag;
2954 Vquit_flag = Qnil;
02067692 2955 tem = access_keymap (get_keymap (Vspecial_event_map, 0, 1), c, 0, 0, 1);
017c7cb6 2956 Vquit_flag = save;
7f07d5ca
RS
2957
2958 if (!NILP (tem))
2959 {
ba8dfba8
RS
2960 int was_locked = single_kboard;
2961
7f07d5ca 2962 last_input_char = c;
158f7532 2963 Fcommand_execute (tem, Qnil, Fvector (1, &last_input_char), Qt);
ba8dfba8 2964
5d12f14d
EZ
2965 if (CONSP (c) && EQ (XCAR (c), Qselect_window))
2966 /* We stopped being idle for this event; undo that. This
2967 prevents automatic window selection (under
0b9a1d3d 2968 mouse_autoselect_window from acting as a real input event, for
5d12f14d 2969 example banishing the mouse under mouse-avoidance-mode. */
5c12e63f 2970 timer_resume_idle ();
5d12f14d 2971
ba8dfba8
RS
2972 /* Resume allowing input from any kboard, if that was true before. */
2973 if (!was_locked)
2974 any_kboard_state ();
2975
7f07d5ca
RS
2976 goto retry;
2977 }
2978
284f4730 2979 /* Handle things that only apply to characters. */
8c18cbfb 2980 if (INTEGERP (c))
284f4730
JB
2981 {
2982 /* If kbd_buffer_get_event gave us an EOF, return that. */
86e5706b 2983 if (XINT (c) == -1)
184c3d81 2984 goto exit;
284f4730 2985
301738ed 2986 if ((STRINGP (Vkeyboard_translate_table)
d5db4077 2987 && SCHARS (Vkeyboard_translate_table) > (unsigned) XFASTINT (c))
301738ed
RS
2988 || (VECTORP (Vkeyboard_translate_table)
2989 && XVECTOR (Vkeyboard_translate_table)->size > (unsigned) XFASTINT (c))
2990 || (CHAR_TABLE_P (Vkeyboard_translate_table)
5e3cb80d 2991 && CHAR_VALID_P (XINT (c), 0)))
f9414d62
RS
2992 {
2993 Lisp_Object d;
2994 d = Faref (Vkeyboard_translate_table, c);
2995 /* nil in keyboard-translate-table means no translation. */
2996 if (!NILP (d))
2997 c = d;
2998 }
284f4730
JB
2999 }
3000
e4fe371d
RS
3001 /* If this event is a mouse click in the menu bar,
3002 return just menu-bar for now. Modify the mouse click event
3003 so we won't do this twice, then queue it up. */
3004 if (EVENT_HAS_PARAMETERS (c)
7539e11f 3005 && CONSP (XCDR (c))
e4fe371d 3006 && CONSP (EVENT_START (c))
7539e11f 3007 && CONSP (XCDR (EVENT_START (c))))
284f4730 3008 {
e4fe371d 3009 Lisp_Object posn;
284f4730 3010
eee5863b 3011 posn = POSN_POSN (EVENT_START (c));
e4fe371d
RS
3012 /* Handle menu-bar events:
3013 insert the dummy prefix event `menu-bar'. */
9ea173e8 3014 if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
e4fe371d
RS
3015 {
3016 /* Change menu-bar to (menu-bar) as the event "position". */
eee5863b 3017 POSN_SET_POSN (EVENT_START (c), Fcons (posn, Qnil));
284f4730 3018
e4fe371d
RS
3019 also_record = c;
3020 Vunread_command_events = Fcons (c, Vunread_command_events);
3021 c = posn;
284f4730 3022 }
284f4730
JB
3023 }
3024
7d18f9ae
RS
3025 /* Store these characters into recent_keys, the dribble file if any,
3026 and the keyboard macro being defined, if any. */
e4fe371d
RS
3027 record_char (c);
3028 if (! NILP (also_record))
3029 record_char (also_record);
51172b6d 3030
d5eecefb
RS
3031 /* Wipe the echo area.
3032 But first, if we are about to use an input method,
3033 save the echo area contents for it to refer to. */
3034 if (INTEGERP (c)
3035 && ! NILP (Vinput_method_function)
3036 && (unsigned) XINT (c) >= ' '
8d769115
KH
3037 && (unsigned) XINT (c) != 127
3038 && (unsigned) XINT (c) < 256)
7ee32cda
GM
3039 {
3040 previous_echo_area_message = Fcurrent_message ();
3041 Vinput_method_previous_message = previous_echo_area_message;
3042 }
d5eecefb 3043
1172eb8d
GM
3044 /* Now wipe the echo area, except for help events which do their
3045 own stuff with the echo area. */
4d2e9f95
GM
3046 if (!CONSP (c)
3047 || (!(EQ (Qhelp_echo, XCAR (c)))
3048 && !(EQ (Qswitch_frame, XCAR (c)))))
1172eb8d
GM
3049 {
3050 if (!NILP (echo_area_buffer[0]))
3051 safe_run_hooks (Qecho_area_clear_hook);
3052 clear_message (1, 0);
3053 }
d5eecefb 3054
7d18f9ae 3055 reread_for_input_method:
284f4730 3056 from_macro:
7d18f9ae 3057 /* Pass this to the input method, if appropriate. */
d5eecefb
RS
3058 if (INTEGERP (c)
3059 && ! NILP (Vinput_method_function)
b638f328
RS
3060 /* Don't run the input method within a key sequence,
3061 after the first event of the key sequence. */
3062 && NILP (prev_event)
d5eecefb 3063 && (unsigned) XINT (c) >= ' '
8d769115
KH
3064 && (unsigned) XINT (c) != 127
3065 && (unsigned) XINT (c) < 256)
d5eecefb 3066 {
c60ee5e7 3067 Lisp_Object keys;
63020c46 3068 int key_count, key_count_reset;
d5eecefb 3069 struct gcpro gcpro1;
aed13378 3070 int count = SPECPDL_INDEX ();
d5eecefb 3071
6e5742a0
RS
3072 /* Save the echo status. */
3073 int saved_immediate_echo = current_kboard->immediate_echo;
985f9f66 3074 struct kboard *saved_ok_to_echo = ok_to_echo_at_next_pause;
dc29116a 3075 Lisp_Object saved_echo_string = current_kboard->echo_string;
6e5742a0
RS
3076 int saved_echo_after_prompt = current_kboard->echo_after_prompt;
3077
22b94eeb 3078#if 0
6e5742a0
RS
3079 if (before_command_restore_flag)
3080 {
3081 this_command_key_count = before_command_key_count_1;
3082 if (this_command_key_count < this_single_command_key_start)
3083 this_single_command_key_start = this_command_key_count;
3084 echo_truncate (before_command_echo_length_1);
3085 before_command_restore_flag = 0;
3086 }
22b94eeb 3087#endif
6e5742a0
RS
3088
3089 /* Save the this_command_keys status. */
3090 key_count = this_command_key_count;
63020c46 3091 key_count_reset = this_command_key_count_reset;
6e5742a0
RS
3092
3093 if (key_count > 0)
3094 keys = Fcopy_sequence (this_command_keys);
3095 else
3096 keys = Qnil;
d5eecefb 3097 GCPRO1 (keys);
6e5742a0
RS
3098
3099 /* Clear out this_command_keys. */
3100 this_command_key_count = 0;
63020c46 3101 this_command_key_count_reset = 0;
6e5742a0
RS
3102
3103 /* Now wipe the echo area. */
985f9f66 3104 if (!NILP (echo_area_buffer[0]))
6e5742a0 3105 safe_run_hooks (Qecho_area_clear_hook);
985f9f66 3106 clear_message (1, 0);
6e5742a0
RS
3107 echo_truncate (0);
3108
b638f328
RS
3109 /* If we are not reading a key sequence,
3110 never use the echo area. */
3111 if (maps == 0)
3112 {
b638f328
RS
3113 specbind (Qinput_method_use_echo_area, Qt);
3114 }
3115
6e5742a0 3116 /* Call the input method. */
d5eecefb 3117 tem = call1 (Vinput_method_function, c);
b638f328
RS
3118
3119 tem = unbind_to (count, tem);
3120
6e5742a0
RS
3121 /* Restore the saved echoing state
3122 and this_command_keys state. */
3123 this_command_key_count = key_count;
63020c46 3124 this_command_key_count_reset = key_count_reset;
6e5742a0
RS
3125 if (key_count > 0)
3126 this_command_keys = keys;
3127
3128 cancel_echoing ();
3129 ok_to_echo_at_next_pause = saved_ok_to_echo;
dc29116a 3130 current_kboard->echo_string = saved_echo_string;
6e5742a0
RS
3131 current_kboard->echo_after_prompt = saved_echo_after_prompt;
3132 if (saved_immediate_echo)
3133 echo_now ();
3134
d5eecefb 3135 UNGCPRO;
6e5742a0 3136
d5eecefb
RS
3137 /* The input method can return no events. */
3138 if (! CONSP (tem))
7d18f9ae 3139 {
d5eecefb 3140 /* Bring back the previous message, if any. */
7ee32cda
GM
3141 if (! NILP (previous_echo_area_message))
3142 message_with_string ("%s", previous_echo_area_message, 0);
d5eecefb 3143 goto retry;
7d18f9ae 3144 }
d5eecefb 3145 /* It returned one event or more. */
7539e11f 3146 c = XCAR (tem);
d5eecefb 3147 Vunread_post_input_method_events
7539e11f 3148 = nconc2 (XCDR (tem), Vunread_post_input_method_events);
7d18f9ae 3149 }
7c3bc944 3150
7d18f9ae 3151 reread_first:
284f4730 3152
7ee32cda 3153 /* Display help if not echoing. */
1172eb8d 3154 if (CONSP (c) && EQ (XCAR (c), Qhelp_echo))
7ee32cda 3155 {
2190735a 3156 /* (help-echo FRAME HELP WINDOW OBJECT POS). */
d31053f9
RS
3157 Lisp_Object help, object, position, window, tem;
3158
3159 tem = Fcdr (XCDR (c));
3160 help = Fcar (tem);
3161 tem = Fcdr (tem);
3162 window = Fcar (tem);
3163 tem = Fcdr (tem);
3164 object = Fcar (tem);
3165 tem = Fcdr (tem);
3166 position = Fcar (tem);
3167
2190735a 3168 show_help_echo (help, window, object, position, 0);
fdbb67fe
GM
3169
3170 /* We stopped being idle for this event; undo that. */
5c12e63f 3171 timer_resume_idle ();
7ee32cda
GM
3172 goto retry;
3173 }
c60ee5e7 3174
63020c46
RS
3175 if (! reread || this_command_key_count == 0
3176 || this_command_key_count_reset)
e4fe371d 3177 {
7d18f9ae
RS
3178
3179 /* Don't echo mouse motion events. */
f2647d04
DL
3180 if ((FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
3181 && NILP (Fzerop (Vecho_keystrokes))
7d18f9ae
RS
3182 && ! (EVENT_HAS_PARAMETERS (c)
3183 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_movement)))
3184 {
3185 echo_char (c);
3186 if (! NILP (also_record))
3187 echo_char (also_record);
3188 /* Once we reread a character, echoing can happen
3189 the next time we pause to read a new one. */
985f9f66 3190 ok_to_echo_at_next_pause = current_kboard;
7d18f9ae
RS
3191 }
3192
3193 /* Record this character as part of the current key. */
3194 add_command_key (c);
e4fe371d 3195 if (! NILP (also_record))
7d18f9ae 3196 add_command_key (also_record);
e4fe371d 3197 }
b8556aee 3198
284f4730 3199 last_input_char = c;
c43b1734 3200 num_input_events++;
284f4730
JB
3201
3202 /* Process the help character specially if enabled */
ecb7cb34 3203 if (!NILP (Vhelp_form) && help_char_p (c))
284f4730
JB
3204 {
3205 Lisp_Object tem0;
aed13378 3206 count = SPECPDL_INDEX ();
284f4730
JB
3207
3208 record_unwind_protect (Fset_window_configuration,
3209 Fcurrent_window_configuration (Qnil));
3210
3211 tem0 = Feval (Vhelp_form);
8c18cbfb 3212 if (STRINGP (tem0))
284f4730
JB
3213 internal_with_output_to_temp_buffer ("*Help*", print_help, tem0);
3214
3215 cancel_echoing ();
3cb81011 3216 do
179f689c 3217 c = read_char (0, 0, 0, Qnil, 0, NULL);
8c18cbfb 3218 while (BUFFERP (c));
ff11dfa1 3219 /* Remove the help from the frame */
284f4730 3220 unbind_to (count, Qnil);
410d4de9 3221
284f4730
JB
3222 redisplay ();
3223 if (EQ (c, make_number (040)))
3224 {
3225 cancel_echoing ();
3cb81011 3226 do
179f689c 3227 c = read_char (0, 0, 0, Qnil, 0, NULL);
8c18cbfb 3228 while (BUFFERP (c));
284f4730
JB
3229 }
3230 }
3231
184c3d81
RS
3232 exit:
3233 RESUME_POLLING;
7c3bc944 3234 RETURN_UNGCPRO (c);
284f4730
JB
3235}
3236
8eb4d8ef
RS
3237/* Record a key that came from a mouse menu.
3238 Record it for echoing, for this-command-keys, and so on. */
3239
3240static void
3241record_menu_key (c)
3242 Lisp_Object c;
3243{
3244 /* Wipe the echo area. */
985f9f66 3245 clear_message (1, 0);
8eb4d8ef
RS
3246
3247 record_char (c);
3248
22b94eeb 3249#if 0
8eb4d8ef
RS
3250 before_command_key_count = this_command_key_count;
3251 before_command_echo_length = echo_length ();
22b94eeb 3252#endif
8eb4d8ef
RS
3253
3254 /* Don't echo mouse motion events. */
f2647d04
DL
3255 if ((FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
3256 && NILP (Fzerop (Vecho_keystrokes)))
8eb4d8ef
RS
3257 {
3258 echo_char (c);
3259
3260 /* Once we reread a character, echoing can happen
3261 the next time we pause to read a new one. */
3262 ok_to_echo_at_next_pause = 0;
3263 }
3264
3265 /* Record this character as part of the current key. */
3266 add_command_key (c);
3267
3268 /* Re-reading in the middle of a command */
3269 last_input_char = c;
c43b1734 3270 num_input_events++;
8eb4d8ef
RS
3271}
3272
ecb7cb34
KH
3273/* Return 1 if should recognize C as "the help character". */
3274
3275int
3276help_char_p (c)
3277 Lisp_Object c;
3278{
3279 Lisp_Object tail;
3280
3281 if (EQ (c, Vhelp_char))
3282 return 1;
7539e11f
KR
3283 for (tail = Vhelp_event_list; CONSP (tail); tail = XCDR (tail))
3284 if (EQ (c, XCAR (tail)))
ecb7cb34
KH
3285 return 1;
3286 return 0;
3287}
3288
e4fe371d
RS
3289/* Record the input event C in various ways. */
3290
3291static void
3292record_char (c)
3293 Lisp_Object c;
3294{
090c68b9 3295 int recorded = 0;
52be17cc 3296
090c68b9
KS
3297 if (CONSP (c) && (EQ (XCAR (c), Qhelp_echo) || EQ (XCAR (c), Qmouse_movement)))
3298 {
3299 /* To avoid filling recent_keys with help-echo and mouse-movement
3300 events, we filter out repeated help-echo events, only store the
3301 first and last in a series of mouse-movement events, and don't
3302 store repeated help-echo events which are only separated by
3303 mouse-movement events. */
3304
3305 Lisp_Object ev1, ev2, ev3;
3306 int ix1, ix2, ix3;
c60ee5e7 3307
090c68b9
KS
3308 if ((ix1 = recent_keys_index - 1) < 0)
3309 ix1 = NUM_RECENT_KEYS - 1;
3310 ev1 = AREF (recent_keys, ix1);
c60ee5e7 3311
090c68b9
KS
3312 if ((ix2 = ix1 - 1) < 0)
3313 ix2 = NUM_RECENT_KEYS - 1;
3314 ev2 = AREF (recent_keys, ix2);
c60ee5e7 3315
090c68b9
KS
3316 if ((ix3 = ix2 - 1) < 0)
3317 ix3 = NUM_RECENT_KEYS - 1;
3318 ev3 = AREF (recent_keys, ix3);
c60ee5e7 3319
090c68b9
KS
3320 if (EQ (XCAR (c), Qhelp_echo))
3321 {
3322 /* Don't record `help-echo' in recent_keys unless it shows some help
a978004d 3323 message, and a different help than the previously recorded
090c68b9
KS
3324 event. */
3325 Lisp_Object help, last_help;
3326
3327 help = Fcar_safe (Fcdr_safe (XCDR (c)));
3328 if (!STRINGP (help))
3329 recorded = 1;
3330 else if (CONSP (ev1) && EQ (XCAR (ev1), Qhelp_echo)
3331 && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev1))), EQ (last_help, help)))
3332 recorded = 1;
3333 else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
3334 && CONSP (ev2) && EQ (XCAR (ev2), Qhelp_echo)
3335 && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev2))), EQ (last_help, help)))
3336 recorded = -1;
3337 else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
3338 && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
3339 && CONSP (ev3) && EQ (XCAR (ev3), Qhelp_echo)
3340 && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev3))), EQ (last_help, help)))
3341 recorded = -2;
3342 }
3343 else if (EQ (XCAR (c), Qmouse_movement))
52be17cc 3344 {
090c68b9
KS
3345 /* Only record one pair of `mouse-movement' on a window in recent_keys.
3346 So additional mouse movement events replace the last element. */
3347 Lisp_Object last_window, window;
3348
3349 window = Fcar_safe (Fcar_safe (XCDR (c)));
3350 if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
3351 && (last_window = Fcar_safe (Fcar_safe (XCDR (ev1))), EQ (last_window, window))
3352 && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
3353 && (last_window = Fcar_safe (Fcar_safe (XCDR (ev2))), EQ (last_window, window)))
52be17cc 3354 {
090c68b9
KS
3355 ASET (recent_keys, ix1, c);
3356 recorded = 1;
52be17cc
GM
3357 }
3358 }
3359 }
3360 else
090c68b9
KS
3361 store_kbd_macro_char (c);
3362
3363 if (!recorded)
e8a50785
GM
3364 {
3365 total_keys++;
3366 ASET (recent_keys, recent_keys_index, c);
3367 if (++recent_keys_index >= NUM_RECENT_KEYS)
3368 recent_keys_index = 0;
3369 }
090c68b9
KS
3370 else if (recorded < 0)
3371 {
3372 /* We need to remove one or two events from recent_keys.
3373 To do this, we simply put nil at those events and move the
3374 recent_keys_index backwards over those events. Usually,
3375 users will never see those nil events, as they will be
3376 overwritten by the command keys entered to see recent_keys
3377 (e.g. C-h l). */
3378
3379 while (recorded++ < 0 && total_keys > 0)
3380 {
3381 if (total_keys < NUM_RECENT_KEYS)
3382 total_keys--;
3383 if (--recent_keys_index < 0)
3384 recent_keys_index = NUM_RECENT_KEYS - 1;
3385 ASET (recent_keys, recent_keys_index, Qnil);
3386 }
3387 }
3388
3389 num_nonmacro_input_events++;
c60ee5e7 3390
e4fe371d
RS
3391 /* Write c to the dribble file. If c is a lispy event, write
3392 the event's symbol to the dribble file, in <brackets>. Bleaugh.
3393 If you, dear reader, have a better idea, you've got the source. :-) */
3394 if (dribble)
3395 {
3396 if (INTEGERP (c))
3397 {
3398 if (XUINT (c) < 0x100)
3399 putc (XINT (c), dribble);
3400 else
6de34814 3401 fprintf (dribble, " 0x%x", (int) XUINT (c));
e4fe371d
RS
3402 }
3403 else
3404 {
3405 Lisp_Object dribblee;
3406
3407 /* If it's a structured event, take the event header. */
3408 dribblee = EVENT_HEAD (c);
3409
3410 if (SYMBOLP (dribblee))
3411 {
3412 putc ('<', dribble);
d5db4077
KR
3413 fwrite (SDATA (SYMBOL_NAME (dribblee)), sizeof (char),
3414 SBYTES (SYMBOL_NAME (dribblee)),
e4fe371d
RS
3415 dribble);
3416 putc ('>', dribble);
3417 }
3418 }
3419
3420 fflush (dribble);
3421 }
e4fe371d
RS
3422}
3423
284f4730
JB
3424Lisp_Object
3425print_help (object)
3426 Lisp_Object object;
3427{
622de3e9 3428 struct buffer *old = current_buffer;
284f4730 3429 Fprinc (object, Qnil);
622de3e9
KH
3430 set_buffer_internal (XBUFFER (Vstandard_output));
3431 call0 (intern ("help-mode"));
3432 set_buffer_internal (old);
284f4730
JB
3433 return Qnil;
3434}
3435
3436/* Copy out or in the info on where C-g should throw to.
3437 This is used when running Lisp code from within get_char,
3438 in case get_char is called recursively.
3439 See read_process_output. */
3440
dfcf069d 3441static void
284f4730
JB
3442save_getcjmp (temp)
3443 jmp_buf temp;
3444{
3445 bcopy (getcjmp, temp, sizeof getcjmp);
3446}
3447
dfcf069d 3448static void
284f4730
JB
3449restore_getcjmp (temp)
3450 jmp_buf temp;
3451{
3452 bcopy (temp, getcjmp, sizeof getcjmp);
3453}
284f4730 3454\f
2eb6bfbe
RM
3455#ifdef HAVE_MOUSE
3456
284f4730
JB
3457/* Restore mouse tracking enablement. See Ftrack_mouse for the only use
3458 of this function. */
a9d77f1f 3459
284f4730
JB
3460static Lisp_Object
3461tracking_off (old_value)
3462 Lisp_Object old_value;
3463{
71edead1
RS
3464 do_mouse_tracking = old_value;
3465 if (NILP (old_value))
284f4730 3466 {
284f4730
JB
3467 /* Redisplay may have been preempted because there was input
3468 available, and it assumes it will be called again after the
3469 input has been processed. If the only input available was
3470 the sort that we have just disabled, then we need to call
3471 redisplay. */
a2d5fca0 3472 if (!readable_events (READABLE_EVENTS_DO_TIMERS_NOW))
284f4730 3473 {
3007ebfb 3474 redisplay_preserve_echo_area (6);
a2d5fca0
JD
3475 get_input_pending (&input_pending,
3476 READABLE_EVENTS_DO_TIMERS_NOW);
284f4730
JB
3477 }
3478 }
30690496 3479 return Qnil;
284f4730
JB
3480}
3481
3482DEFUN ("track-mouse", Ftrack_mouse, Strack_mouse, 0, UNEVALLED, 0,
4707d2d0
PJ
3483 doc: /* Evaluate BODY with mouse movement events enabled.
3484Within a `track-mouse' form, mouse motion generates input events that
3485you can read with `read-event'.
3486Normally, mouse motion is ignored.
3487usage: (track-mouse BODY ...) */)
3488 (args)
284f4730
JB
3489 Lisp_Object args;
3490{
aed13378 3491 int count = SPECPDL_INDEX ();
284f4730
JB
3492 Lisp_Object val;
3493
a9d77f1f 3494 record_unwind_protect (tracking_off, do_mouse_tracking);
284f4730 3495
f3253854 3496 do_mouse_tracking = Qt;
df0f2ba1 3497
284f4730
JB
3498 val = Fprogn (args);
3499 return unbind_to (count, val);
3500}
2eb6bfbe 3501
f3253854
KH
3502/* If mouse has moved on some frame, return one of those frames.
3503 Return 0 otherwise. */
3504
3505static FRAME_PTR
3506some_mouse_moved ()
3507{
3508 Lisp_Object tail, frame;
3509
3510 FOR_EACH_FRAME (tail, frame)
3511 {
3512 if (XFRAME (frame)->mouse_moved)
3513 return XFRAME (frame);
3514 }
3515
3516 return 0;
3517}
3518
2eb6bfbe 3519#endif /* HAVE_MOUSE */
a612e298
RS
3520\f
3521/* Low level keyboard/mouse input.
3522 kbd_buffer_store_event places events in kbd_buffer, and
0646c0dd 3523 kbd_buffer_get_event retrieves them. */
a612e298
RS
3524
3525/* Return true iff there are any events in the queue that read-char
3526 would return. If this returns false, a read-char would block. */
3527static int
a2d5fca0
JD
3528readable_events (flags)
3529 int flags;
a612e298 3530{
a2d5fca0
JD
3531 if (flags & READABLE_EVENTS_DO_TIMERS_NOW)
3532 timer_check (1);
4ec4ed6a 3533
a2d5fca0
JD
3534 /* If the buffer contains only FOCUS_IN_EVENT events, and
3535 READABLE_EVENTS_FILTER_EVENTS is set, report it as empty. */
beecf6a1 3536 if (kbd_fetch_ptr != kbd_store_ptr)
a0ba8995 3537 {
354344a2
YM
3538 if (flags & (READABLE_EVENTS_FILTER_EVENTS
3539#ifdef USE_TOOLKIT_SCROLL_BARS
3540 | READABLE_EVENTS_IGNORE_SQUEEZABLES
3541#endif
3542 ))
20057d52
JD
3543 {
3544 struct input_event *event;
3545
3546 event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
3547 ? kbd_fetch_ptr
3548 : kbd_buffer);
3549
354344a2
YM
3550 do
3551 {
3552 if (!(
3553#ifdef USE_TOOLKIT_SCROLL_BARS
3554 (flags & READABLE_EVENTS_FILTER_EVENTS) &&
3555#endif
3556 event->kind == FOCUS_IN_EVENT)
3557#ifdef USE_TOOLKIT_SCROLL_BARS
3558 && !((flags & READABLE_EVENTS_IGNORE_SQUEEZABLES)
3559 && event->kind == SCROLL_BAR_CLICK_EVENT
3560 && event->part == scroll_bar_handle
3561 && event->modifiers == 0)
3562#endif
3563 )
3564 return 1;
3565 event++;
20057d52
JD
3566 if (event == kbd_buffer + KBD_BUFFER_SIZE)
3567 event = kbd_buffer;
354344a2
YM
3568 }
3569 while (event != kbd_store_ptr);
20057d52 3570 }
354344a2
YM
3571 else
3572 return 1;
a0ba8995
RS
3573 }
3574
beecf6a1 3575#ifdef HAVE_MOUSE
a2d5fca0
JD
3576 if (!(flags & READABLE_EVENTS_IGNORE_SQUEEZABLES)
3577 && !NILP (do_mouse_tracking) && some_mouse_moved ())
beecf6a1
KH
3578 return 1;
3579#endif
1e8bd3da 3580 if (single_kboard)
4c52b668 3581 {
c5fdd383 3582 if (current_kboard->kbd_queue_has_data)
4c52b668
KH
3583 return 1;
3584 }
3585 else
3586 {
c5fdd383
KH
3587 KBOARD *kb;
3588 for (kb = all_kboards; kb; kb = kb->next_kboard)
3589 if (kb->kbd_queue_has_data)
4c52b668
KH
3590 return 1;
3591 }
beecf6a1 3592 return 0;
a612e298
RS
3593}
3594
3595/* Set this for debugging, to have a way to get out */
3596int stop_character;
284f4730 3597
c5fdd383
KH
3598#ifdef MULTI_KBOARD
3599static KBOARD *
3600event_to_kboard (event)
5798cf15
KH
3601 struct input_event *event;
3602{
3603 Lisp_Object frame;
3604 frame = event->frame_or_window;
3605 if (CONSP (frame))
7539e11f 3606 frame = XCAR (frame);
5798cf15
KH
3607 else if (WINDOWP (frame))
3608 frame = WINDOW_FRAME (XWINDOW (frame));
3609
3610 /* There are still some events that don't set this field.
f5b56972
KH
3611 For now, just ignore the problem.
3612 Also ignore dead frames here. */
3613 if (!FRAMEP (frame) || !FRAME_LIVE_P (XFRAME (frame)))
5798cf15
KH
3614 return 0;
3615 else
c5fdd383 3616 return FRAME_KBOARD (XFRAME (frame));
5798cf15
KH
3617}
3618#endif
3619
2a84c6da
KS
3620
3621Lisp_Object Vthrow_on_input;
3622
284f4730
JB
3623/* Store an event obtained at interrupt level into kbd_buffer, fifo */
3624
3625void
3626kbd_buffer_store_event (event)
3627 register struct input_event *event;
0fc0bac9
KS
3628{
3629 kbd_buffer_store_event_hold (event, 0);
3630}
3631
3632/* Store EVENT obtained at interrupt level into kbd_buffer, fifo.
3633
3634 If HOLD_QUIT is 0, just stuff EVENT into the fifo.
3635 Else, if HOLD_QUIT.kind != NO_EVENT, discard EVENT.
3636 Else, if EVENT is a quit event, store the quit event
3637 in HOLD_QUIT, and return (thus ignoring further events).
3638
3639 This is used in read_avail_input to postpone the processing
3640 of the quit event until all subsequent input events have been
3641 parsed (and discarded).
3642 */
3643
3644void
3645kbd_buffer_store_event_hold (event, hold_quit)
3646 register struct input_event *event;
3647 struct input_event *hold_quit;
284f4730 3648{
3b8f9651 3649 if (event->kind == NO_EVENT)
284f4730
JB
3650 abort ();
3651
0fc0bac9
KS
3652 if (hold_quit && hold_quit->kind != NO_EVENT)
3653 return;
3654
3b8f9651 3655 if (event->kind == ASCII_KEYSTROKE_EVENT)
284f4730 3656 {
e9bf89a0 3657 register int c = event->code & 0377;
284f4730 3658
faf5e407
JB
3659 if (event->modifiers & ctrl_modifier)
3660 c = make_ctrl_char (c);
3661
9fd7d808
RS
3662 c |= (event->modifiers
3663 & (meta_modifier | alt_modifier
3664 | hyper_modifier | super_modifier));
3665
86e5706b 3666 if (c == quit_char)
284f4730 3667 {
c5fdd383
KH
3668#ifdef MULTI_KBOARD
3669 KBOARD *kb;
5798cf15
KH
3670 struct input_event *sp;
3671
1e8bd3da 3672 if (single_kboard
c5fdd383
KH
3673 && (kb = FRAME_KBOARD (XFRAME (event->frame_or_window)),
3674 kb != current_kboard))
5798cf15 3675 {
c5fdd383 3676 kb->kbd_queue
5798cf15
KH
3677 = Fcons (make_lispy_switch_frame (event->frame_or_window),
3678 Fcons (make_number (c), Qnil));
c5fdd383 3679 kb->kbd_queue_has_data = 1;
5798cf15
KH
3680 for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++)
3681 {
3682 if (sp == kbd_buffer + KBD_BUFFER_SIZE)
3683 sp = kbd_buffer;
3684
c5fdd383 3685 if (event_to_kboard (sp) == kb)
5798cf15 3686 {
3b8f9651 3687 sp->kind = NO_EVENT;
5798cf15 3688 sp->frame_or_window = Qnil;
da8f7368 3689 sp->arg = Qnil;
5798cf15
KH
3690 }
3691 }
3692 return;
3693 }
3694#endif
3e51c7b7 3695
0fc0bac9
KS
3696 if (hold_quit)
3697 {
3698 bcopy (event, (char *) hold_quit, sizeof (*event));
3699 return;
3700 }
3701
284f4730 3702 /* If this results in a quit_char being returned to Emacs as
3c370943 3703 input, set Vlast_event_frame properly. If this doesn't
284f4730 3704 get returned to Emacs as an event, the next event read
ff11dfa1 3705 will set Vlast_event_frame again, so this is safe to do. */
4bb994d1 3706 {
9b8eb840 3707 Lisp_Object focus;
4bb994d1 3708
9b8eb840 3709 focus = FRAME_FOCUS_FRAME (XFRAME (event->frame_or_window));
4bb994d1 3710 if (NILP (focus))
beecf6a1 3711 focus = event->frame_or_window;
4c52b668
KH
3712 internal_last_event_frame = focus;
3713 Vlast_event_frame = focus;
4bb994d1 3714 }
3e51c7b7 3715
ffd56f97 3716 last_event_timestamp = event->timestamp;
7189cad8 3717 interrupt_signal (0 /* dummy */);
284f4730
JB
3718 return;
3719 }
3720
3721 if (c && c == stop_character)
3722 {
3723 sys_suspend ();
3724 return;
3725 }
284f4730 3726 }
3b8f9651 3727 /* Don't insert two BUFFER_SWITCH_EVENT's in a row.
3fe8e9a2 3728 Just ignore the second one. */
3b8f9651 3729 else if (event->kind == BUFFER_SWITCH_EVENT
3fe8e9a2 3730 && kbd_fetch_ptr != kbd_store_ptr
0fc0bac9
KS
3731 && ((kbd_store_ptr == kbd_buffer
3732 ? kbd_buffer + KBD_BUFFER_SIZE - 1
3733 : kbd_store_ptr - 1)->kind) == BUFFER_SWITCH_EVENT)
3fe8e9a2 3734 return;
284f4730 3735
beecf6a1
KH
3736 if (kbd_store_ptr - kbd_buffer == KBD_BUFFER_SIZE)
3737 kbd_store_ptr = kbd_buffer;
284f4730
JB
3738
3739 /* Don't let the very last slot in the buffer become full,
3740 since that would make the two pointers equal,
3741 and that is indistinguishable from an empty buffer.
3742 Discard the event if it would fill the last slot. */
beecf6a1 3743 if (kbd_fetch_ptr - 1 != kbd_store_ptr)
284f4730 3744 {
e3f6e7c7
KS
3745 *kbd_store_ptr = *event;
3746 ++kbd_store_ptr;
3747 }
2a84c6da 3748
85e7f477
RS
3749 /* If we're inside while-no-input, and this event qualifies
3750 as input, set quit-flag to cause an interrupt. */
2a84c6da
KS
3751 if (!NILP (Vthrow_on_input)
3752 && event->kind != FOCUS_IN_EVENT
3753 && event->kind != HELP_EVENT
3754 && event->kind != DEICONIFY_EVENT)
85e7f477
RS
3755 {
3756 Vquit_flag = Vthrow_on_input;
3757 /* If we're inside a function that wants immediate quits,
3758 do it now. */
3759 if (immediate_quit && NILP (Vinhibit_quit))
3760 {
3761 immediate_quit = 0;
3762 sigfree ();
3763 QUIT;
3764 }
3765 }
e3f6e7c7 3766}
c60ee5e7 3767
da8f7368 3768
e3f6e7c7 3769/* Put an input event back in the head of the event queue. */
284f4730 3770
e3f6e7c7
KS
3771void
3772kbd_buffer_unget_event (event)
3773 register struct input_event *event;
3774{
3775 if (kbd_fetch_ptr == kbd_buffer)
3776 kbd_fetch_ptr = kbd_buffer + KBD_BUFFER_SIZE;
3777
3778 /* Don't let the very last slot in the buffer become full, */
3779 if (kbd_fetch_ptr - 1 != kbd_store_ptr)
3780 {
3781 --kbd_fetch_ptr;
3782 *kbd_fetch_ptr = *event;
284f4730
JB
3783 }
3784}
8dfd92c9
GM
3785
3786
f139e559 3787/* Generate HELP_EVENT input_events in BUFP which has room for
0bbfdc25
GM
3788 SIZE events. If there's not enough room in BUFP, ignore this
3789 event.
8dfd92c9
GM
3790
3791 HELP is the help form.
3792
3793 FRAME is the frame on which the help is generated. OBJECT is the
5b2ec2d0
GM
3794 Lisp object where the help was found (a buffer, a string, an
3795 overlay, or nil if neither from a string nor from a buffer. POS is
3796 the position within OBJECT where the help was found.
8dfd92c9
GM
3797
3798 Value is the number of input_events generated. */
3799
0fc0bac9
KS
3800void
3801gen_help_event (help, frame, window, object, pos)
2190735a 3802 Lisp_Object help, frame, object, window;
8dfd92c9
GM
3803 int pos;
3804{
0fc0bac9
KS
3805 struct input_event event;
3806
3807 EVENT_INIT (event);
3808
3809 event.kind = HELP_EVENT;
3810 event.frame_or_window = frame;
3811 event.arg = object;
3812 event.x = WINDOWP (window) ? window : frame;
3813 event.y = help;
3814 event.code = pos;
3815 kbd_buffer_store_event (&event);
8dfd92c9
GM
3816}
3817
3818
3819/* Store HELP_EVENTs for HELP on FRAME in the input queue. */
3820
3821void
3822kbd_buffer_store_help_event (frame, help)
3823 Lisp_Object frame, help;
3824{
3825 struct input_event event;
3826
3827 event.kind = HELP_EVENT;
3828 event.frame_or_window = frame;
3829 event.arg = Qnil;
2e1a49ad
SM
3830 event.x = Qnil;
3831 event.y = help;
8dfd92c9
GM
3832 event.code = 0;
3833 kbd_buffer_store_event (&event);
8dfd92c9
GM
3834}
3835
a612e298 3836\f
07de30b9 3837/* Discard any mouse events in the event buffer by setting them to
3b8f9651 3838 NO_EVENT. */
07de30b9
GV
3839void
3840discard_mouse_events ()
3841{
3842 struct input_event *sp;
3843 for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++)
3844 {
3845 if (sp == kbd_buffer + KBD_BUFFER_SIZE)
3846 sp = kbd_buffer;
3847
3b8f9651 3848 if (sp->kind == MOUSE_CLICK_EVENT
8006e4bb 3849 || sp->kind == WHEEL_EVENT
07de30b9 3850#ifdef WINDOWSNT
3b8f9651 3851 || sp->kind == W32_SCROLL_BAR_CLICK_EVENT
07de30b9 3852#endif
3b8f9651 3853 || sp->kind == SCROLL_BAR_CLICK_EVENT)
07de30b9 3854 {
3b8f9651 3855 sp->kind = NO_EVENT;
07de30b9
GV
3856 }
3857 }
3858}
eeabfe76 3859
0bbfdc25
GM
3860
3861/* Return non-zero if there are any real events waiting in the event
3b8f9651 3862 buffer, not counting `NO_EVENT's.
0bbfdc25 3863
3b8f9651 3864 If DISCARD is non-zero, discard NO_EVENT events at the front of
0bbfdc25
GM
3865 the input queue, possibly leaving the input queue empty if there
3866 are no real input events. */
3867
eeabfe76
EZ
3868int
3869kbd_buffer_events_waiting (discard)
3870 int discard;
3871{
3872 struct input_event *sp;
c60ee5e7 3873
0bbfdc25 3874 for (sp = kbd_fetch_ptr;
3b8f9651 3875 sp != kbd_store_ptr && sp->kind == NO_EVENT;
0bbfdc25 3876 ++sp)
eeabfe76
EZ
3877 {
3878 if (sp == kbd_buffer + KBD_BUFFER_SIZE)
3879 sp = kbd_buffer;
eeabfe76 3880 }
0bbfdc25 3881
eeabfe76
EZ
3882 if (discard)
3883 kbd_fetch_ptr = sp;
0bbfdc25 3884
3b8f9651 3885 return sp != kbd_store_ptr && sp->kind != NO_EVENT;
eeabfe76 3886}
0bbfdc25 3887
07de30b9 3888\f
0bbfdc25
GM
3889/* Clear input event EVENT. */
3890
3891static INLINE void
3892clear_event (event)
3893 struct input_event *event;
3894{
3b8f9651 3895 event->kind = NO_EVENT;
0bbfdc25
GM
3896}
3897
3898
a612e298
RS
3899/* Read one event from the event buffer, waiting if necessary.
3900 The value is a Lisp object representing the event.
3901 The value is nil for an event that should be ignored,
3902 or that was handled here.
3903 We always read and discard one event. */
284f4730
JB
3904
3905static Lisp_Object
179f689c 3906kbd_buffer_get_event (kbp, used_mouse_menu, end_time)
410d4de9 3907 KBOARD **kbp;
83d68044 3908 int *used_mouse_menu;
179f689c 3909 EMACS_TIME *end_time;
284f4730
JB
3910{
3911 register int c;
3912 Lisp_Object obj;
3913
3914 if (noninteractive)
3915 {
3916 c = getchar ();
18cd2eeb 3917 XSETINT (obj, c);
f5b56972 3918 *kbp = current_kboard;
284f4730
JB
3919 return obj;
3920 }
3921
3922 /* Wait until there is input available. */
3923 for (;;)
3924 {
beecf6a1
KH
3925 if (kbd_fetch_ptr != kbd_store_ptr)
3926 break;
3927#ifdef HAVE_MOUSE
f3253854 3928 if (!NILP (do_mouse_tracking) && some_mouse_moved ())
284f4730 3929 break;
beecf6a1 3930#endif
284f4730
JB
3931
3932 /* If the quit flag is set, then read_char will return
3933 quit_char, so that counts as "available input." */
3934 if (!NILP (Vquit_flag))
3935 quit_throw_to_read_char ();
3936
3937 /* One way or another, wait until input is available; then, if
3938 interrupt handlers have not read it, read it now. */
3939
3940#ifdef OLDVMS
3941 wait_for_kbd_input ();
3942#else
3943/* Note SIGIO has been undef'd if FIONREAD is missing. */
3944#ifdef SIGIO
3945 gobble_input (0);
3946#endif /* SIGIO */
beecf6a1
KH
3947 if (kbd_fetch_ptr != kbd_store_ptr)
3948 break;
3949#ifdef HAVE_MOUSE
f3253854 3950 if (!NILP (do_mouse_tracking) && some_mouse_moved ())
beecf6a1
KH
3951 break;
3952#endif
179f689c
CY
3953 if (end_time)
3954 {
3955 EMACS_TIME duration;
3956 EMACS_GET_TIME (duration);
6b657e42
EZ
3957 if (EMACS_TIME_GE (duration, *end_time))
3958 return Qnil; /* finished waiting */
179f689c 3959 else
6b657e42
EZ
3960 {
3961 EMACS_SUB_TIME (duration, *end_time, duration);
3962 wait_reading_process_output (EMACS_SECS (duration),
3963 EMACS_USECS (duration),
3964 -1, 1, Qnil, NULL, 0);
3965 }
179f689c
CY
3966 }
3967 else
d64b707c 3968 wait_reading_process_output (0, 0, -1, 1, Qnil, NULL, 0);
284f4730 3969
179f689c
CY
3970 if (!interrupt_input && kbd_fetch_ptr == kbd_store_ptr)
3971 /* Pass 1 for EXPECT since we just waited to have input. */
3972 read_avail_input (1);
284f4730
JB
3973#endif /* not VMS */
3974 }
3975
303b5b3f
RS
3976 if (CONSP (Vunread_command_events))
3977 {
3978 Lisp_Object first;
7539e11f
KR
3979 first = XCAR (Vunread_command_events);
3980 Vunread_command_events = XCDR (Vunread_command_events);
303b5b3f
RS
3981 *kbp = current_kboard;
3982 return first;
3983 }
3984
284f4730
JB
3985 /* At this point, we know that there is a readable event available
3986 somewhere. If the event queue is empty, then there must be a
3987 mouse movement enabled and available. */
beecf6a1 3988 if (kbd_fetch_ptr != kbd_store_ptr)
284f4730 3989 {
cd21b839 3990 struct input_event *event;
3e51c7b7 3991
beecf6a1
KH
3992 event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
3993 ? kbd_fetch_ptr
3994 : kbd_buffer);
3e51c7b7 3995
cd21b839 3996 last_event_timestamp = event->timestamp;
cd21b839 3997
c5fdd383
KH
3998#ifdef MULTI_KBOARD
3999 *kbp = event_to_kboard (event);
4000 if (*kbp == 0)
4001 *kbp = current_kboard; /* Better than returning null ptr? */
5798cf15 4002#else
c5fdd383 4003 *kbp = &the_only_kboard;
5798cf15 4004#endif
beecf6a1 4005
4bb994d1
JB
4006 obj = Qnil;
4007
48e416d4 4008 /* These two kinds of events get special handling
a612e298
RS
4009 and don't actually appear to the command loop.
4010 We return nil for them. */
e3f6e7c7
KS
4011 if (event->kind == SELECTION_REQUEST_EVENT
4012 || event->kind == SELECTION_CLEAR_EVENT)
48e416d4 4013 {
598a9fa7 4014#ifdef HAVE_X11
1e8bd3da
RS
4015 struct input_event copy;
4016
4581e928
RS
4017 /* Remove it from the buffer before processing it,
4018 since otherwise swallow_events will see it
4019 and process it again. */
1e8bd3da 4020 copy = *event;
beecf6a1 4021 kbd_fetch_ptr = event + 1;
d9d4c147 4022 input_pending = readable_events (0);
e3f6e7c7 4023 x_handle_selection_event (&copy);
598a9fa7
JB
4024#else
4025 /* We're getting selection request events, but we don't have
4026 a window system. */
4027 abort ();
4028#endif
48e416d4
RS
4029 }
4030
e0f712ba 4031#if defined (HAVE_X11) || defined (HAVE_NTGUI) || defined (MAC_OS)
3b8f9651 4032 else if (event->kind == DELETE_WINDOW_EVENT)
990acea3 4033 {
bbdc2092
RS
4034 /* Make an event (delete-frame (FRAME)). */
4035 obj = Fcons (event->frame_or_window, Qnil);
af17bd2b 4036 obj = Fcons (Qdelete_frame, Fcons (obj, Qnil));
beecf6a1 4037 kbd_fetch_ptr = event + 1;
af17bd2b 4038 }
1a578e9b 4039#endif
fca32d15 4040#if defined (HAVE_X11) || defined (HAVE_NTGUI) || defined (MAC_OS)
3b8f9651 4041 else if (event->kind == ICONIFY_EVENT)
af17bd2b
KH
4042 {
4043 /* Make an event (iconify-frame (FRAME)). */
4044 obj = Fcons (event->frame_or_window, Qnil);
4045 obj = Fcons (Qiconify_frame, Fcons (obj, Qnil));
beecf6a1 4046 kbd_fetch_ptr = event + 1;
af17bd2b 4047 }
3b8f9651 4048 else if (event->kind == DEICONIFY_EVENT)
af17bd2b
KH
4049 {
4050 /* Make an event (make-frame-visible (FRAME)). */
4051 obj = Fcons (event->frame_or_window, Qnil);
4052 obj = Fcons (Qmake_frame_visible, Fcons (obj, Qnil));
beecf6a1 4053 kbd_fetch_ptr = event + 1;
990acea3
RS
4054 }
4055#endif
3b8f9651 4056 else if (event->kind == BUFFER_SWITCH_EVENT)
a8015ab5
KH
4057 {
4058 /* The value doesn't matter here; only the type is tested. */
18cd2eeb 4059 XSETBUFFER (obj, current_buffer);
beecf6a1 4060 kbd_fetch_ptr = event + 1;
a8015ab5 4061 }
488dd4c4
JD
4062#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) || defined (MAC_OS) \
4063 || defined (USE_GTK)
3b8f9651 4064 else if (event->kind == MENU_BAR_ACTIVATE_EVENT)
099787c1
RS
4065 {
4066 kbd_fetch_ptr = event + 1;
d9d4c147 4067 input_pending = readable_events (0);
e649d076
RS
4068 if (FRAME_LIVE_P (XFRAME (event->frame_or_window)))
4069 x_activate_menubar (XFRAME (event->frame_or_window));
099787c1 4070 }
1161d367 4071#endif
c16dab62 4072#if defined (WINDOWSNT) || defined (MAC_OS)
3b8f9651 4073 else if (event->kind == LANGUAGE_CHANGE_EVENT)
1161d367 4074 {
c16dab62
YM
4075#ifdef MAC_OS
4076 /* Make an event (language-change (KEY_SCRIPT)). */
4077 obj = Fcons (make_number (event->code), Qnil);
4078#else
1161d367 4079 /* Make an event (language-change (FRAME CHARSET LCID)). */
d352abdf 4080 obj = Fcons (event->frame_or_window, Qnil);
c16dab62 4081#endif
1161d367
GV
4082 obj = Fcons (Qlanguage_change, Fcons (obj, Qnil));
4083 kbd_fetch_ptr = event + 1;
4084 }
099787c1 4085#endif
3b8f9651 4086 else if (event->kind == SAVE_SESSION_EVENT)
4ebc27a5
JD
4087 {
4088 obj = Fcons (Qsave_session, Qnil);
4089 kbd_fetch_ptr = event + 1;
4090 }
a612e298 4091 /* Just discard these, by returning nil.
c5fdd383 4092 With MULTI_KBOARD, these events are used as placeholders
5798cf15
KH
4093 when we need to randomly delete events from the queue.
4094 (They shouldn't otherwise be found in the buffer,
4095 but on some machines it appears they do show up
c5fdd383 4096 even without MULTI_KBOARD.) */
3b8f9651 4097 /* On Windows NT/9X, NO_EVENT is used to delete extraneous
07de30b9 4098 mouse events during a popup-menu call. */
3b8f9651 4099 else if (event->kind == NO_EVENT)
beecf6a1 4100 kbd_fetch_ptr = event + 1;
7ee32cda
GM
4101 else if (event->kind == HELP_EVENT)
4102 {
2190735a 4103 Lisp_Object object, position, help, frame, window;
e4457b09 4104
8dfd92c9
GM
4105 frame = event->frame_or_window;
4106 object = event->arg;
2e1a49ad
SM
4107 position = make_number (event->code);
4108 window = event->x;
4109 help = event->y;
0bbfdc25 4110 clear_event (event);
e4457b09
GM
4111
4112 kbd_fetch_ptr = event + 1;
2190735a
GM
4113 if (!WINDOWP (window))
4114 window = Qnil;
4115 obj = Fcons (Qhelp_echo,
4116 list5 (frame, help, window, object, position));
7ee32cda 4117 }
c51c7093
GM
4118 else if (event->kind == FOCUS_IN_EVENT)
4119 {
4120 /* Notification of a FocusIn event. The frame receiving the
4121 focus is in event->frame_or_window. Generate a
4122 switch-frame event if necessary. */
4123 Lisp_Object frame, focus;
4124
4125 frame = event->frame_or_window;
4126 focus = FRAME_FOCUS_FRAME (XFRAME (frame));
4127 if (FRAMEP (focus))
4128 frame = focus;
4129
4130 if (!EQ (frame, internal_last_event_frame)
4131 && !EQ (frame, selected_frame))
4132 obj = make_lispy_switch_frame (frame);
4133 internal_last_event_frame = frame;
4134 kbd_fetch_ptr = event + 1;
4135 }
1e12dd87
RS
4136 else
4137 {
c51c7093
GM
4138 /* If this event is on a different frame, return a switch-frame this
4139 time, and leave the event in the queue for next time. */
9b8eb840 4140 Lisp_Object frame;
1e12dd87 4141 Lisp_Object focus;
7b4aedb9 4142
9b8eb840 4143 frame = event->frame_or_window;
2470a66f 4144 if (CONSP (frame))
7539e11f 4145 frame = XCAR (frame);
2470a66f 4146 else if (WINDOWP (frame))
1e12dd87 4147 frame = WINDOW_FRAME (XWINDOW (frame));
4bb994d1 4148
1e12dd87
RS
4149 focus = FRAME_FOCUS_FRAME (XFRAME (frame));
4150 if (! NILP (focus))
4151 frame = focus;
07d2b8de 4152
4c52b668 4153 if (! EQ (frame, internal_last_event_frame)
788f89eb 4154 && !EQ (frame, selected_frame))
1e12dd87 4155 obj = make_lispy_switch_frame (frame);
4c52b668 4156 internal_last_event_frame = frame;
4bb994d1 4157
1e12dd87
RS
4158 /* If we didn't decide to make a switch-frame event, go ahead
4159 and build a real event from the queue entry. */
cd21b839 4160
1e12dd87
RS
4161 if (NILP (obj))
4162 {
4163 obj = make_lispy_event (event);
c60ee5e7 4164
488dd4c4
JD
4165#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) || defined(MAC_OS) \
4166 || defined (USE_GTK)
83d68044
KH
4167 /* If this was a menu selection, then set the flag to inhibit
4168 writing to last_nonmenu_event. Don't do this if the event
4169 we're returning is (menu-bar), though; that indicates the
4170 beginning of the menu sequence, and we might as well leave
4171 that as the `event with parameters' for this selection. */
da8f7368
GM
4172 if (used_mouse_menu
4173 && !EQ (event->frame_or_window, event->arg)
4174 && (event->kind == MENU_BAR_EVENT
4175 || event->kind == TOOL_BAR_EVENT))
83d68044
KH
4176 *used_mouse_menu = 1;
4177#endif
1e12dd87
RS
4178
4179 /* Wipe out this event, to catch bugs. */
0bbfdc25 4180 clear_event (event);
beecf6a1 4181 kbd_fetch_ptr = event + 1;
1e12dd87 4182 }
4bb994d1 4183 }
284f4730 4184 }
2eb6bfbe 4185#ifdef HAVE_MOUSE
a612e298 4186 /* Try generating a mouse motion event. */
f3253854 4187 else if (!NILP (do_mouse_tracking) && some_mouse_moved ())
284f4730 4188 {
f3253854 4189 FRAME_PTR f = some_mouse_moved ();
7b4aedb9 4190 Lisp_Object bar_window;
3c370943 4191 enum scroll_bar_part part;
e5d77022
JB
4192 Lisp_Object x, y;
4193 unsigned long time;
284f4730 4194
c5fdd383 4195 *kbp = current_kboard;
e177ac3a
RS
4196 /* Note that this uses F to determine which display to look at.
4197 If there is no valid info, it does not store anything
4198 so x remains nil. */
4199 x = Qnil;
dd26ab75 4200 (*mouse_position_hook) (&f, 0, &bar_window, &part, &x, &y, &time);
4bb994d1
JB
4201
4202 obj = Qnil;
284f4730 4203
4bb994d1
JB
4204 /* Decide if we should generate a switch-frame event. Don't
4205 generate switch-frame events for motion outside of all Emacs
4206 frames. */
e177ac3a 4207 if (!NILP (x) && f)
cd21b839 4208 {
9b8eb840 4209 Lisp_Object frame;
4bb994d1 4210
9b8eb840 4211 frame = FRAME_FOCUS_FRAME (f);
4bb994d1 4212 if (NILP (frame))
18cd2eeb 4213 XSETFRAME (frame, f);
4bb994d1 4214
4c52b668 4215 if (! EQ (frame, internal_last_event_frame)
788f89eb 4216 && !EQ (frame, selected_frame))
764cb3f9 4217 obj = make_lispy_switch_frame (frame);
4c52b668 4218 internal_last_event_frame = frame;
cd21b839 4219 }
4bb994d1 4220
df0f2ba1 4221 /* If we didn't decide to make a switch-frame event, go ahead and
4bb994d1 4222 return a mouse-motion event. */
e177ac3a 4223 if (!NILP (x) && NILP (obj))
7b4aedb9 4224 obj = make_lispy_movement (f, bar_window, part, x, y, time);
6cbff1cb 4225 }
2eb6bfbe 4226#endif /* HAVE_MOUSE */
284f4730
JB
4227 else
4228 /* We were promised by the above while loop that there was
4229 something for us to read! */
4230 abort ();
4231
d9d4c147 4232 input_pending = readable_events (0);
284f4730 4233
4c52b668 4234 Vlast_event_frame = internal_last_event_frame;
3c370943 4235
284f4730
JB
4236 return (obj);
4237}
a612e298
RS
4238\f
4239/* Process any events that are not user-visible,
4240 then return, without reading any user-visible events. */
3a3b9632
RS
4241
4242void
d9d4c147
KH
4243swallow_events (do_display)
4244 int do_display;
3a3b9632 4245{
87dd9b9b
RS
4246 int old_timers_run;
4247
beecf6a1 4248 while (kbd_fetch_ptr != kbd_store_ptr)
3a3b9632
RS
4249 {
4250 struct input_event *event;
4251
beecf6a1
KH
4252 event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
4253 ? kbd_fetch_ptr
4254 : kbd_buffer);
3a3b9632
RS
4255
4256 last_event_timestamp = event->timestamp;
4257
4258 /* These two kinds of events get special handling
4259 and don't actually appear to the command loop. */
e3f6e7c7
KS
4260 if (event->kind == SELECTION_REQUEST_EVENT
4261 || event->kind == SELECTION_CLEAR_EVENT)
3a3b9632
RS
4262 {
4263#ifdef HAVE_X11
4581e928 4264 struct input_event copy;
e0301c07
RS
4265
4266 /* Remove it from the buffer before processing it,
4267 since otherwise swallow_events called recursively could see it
4268 and process it again. */
4581e928 4269 copy = *event;
beecf6a1 4270 kbd_fetch_ptr = event + 1;
d9d4c147 4271 input_pending = readable_events (0);
e3f6e7c7 4272 x_handle_selection_event (&copy);
3a3b9632
RS
4273#else
4274 /* We're getting selection request events, but we don't have
4275 a window system. */
4276 abort ();
4277#endif
4278 }
4279 else
4280 break;
4281 }
4282
87dd9b9b 4283 old_timers_run = timers_run;
a2d5fca0 4284 get_input_pending (&input_pending, READABLE_EVENTS_DO_TIMERS_NOW);
87dd9b9b
RS
4285
4286 if (timers_run != old_timers_run && do_display)
3007ebfb 4287 redisplay_preserve_echo_area (7);
3a3b9632 4288}
a612e298 4289\f
d9d4c147
KH
4290/* Record the start of when Emacs is idle,
4291 for the sake of running idle-time timers. */
4292
5c12e63f 4293static void
d9d4c147
KH
4294timer_start_idle ()
4295{
4296 Lisp_Object timers;
4297
4298 /* If we are already in the idle state, do nothing. */
4299 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4300 return;
4301
4302 EMACS_GET_TIME (timer_idleness_start_time);
4303
3021d3a9
RS
4304 timer_last_idleness_start_time = timer_idleness_start_time;
4305
d9d4c147 4306 /* Mark all idle-time timers as once again candidates for running. */
7539e11f 4307 for (timers = Vtimer_idle_list; CONSP (timers); timers = XCDR (timers))
d9d4c147
KH
4308 {
4309 Lisp_Object timer;
4310
7539e11f 4311 timer = XCAR (timers);
d9d4c147
KH
4312
4313 if (!VECTORP (timer) || XVECTOR (timer)->size != 8)
4314 continue;
4315 XVECTOR (timer)->contents[0] = Qnil;
4316 }
4317}
4318
4319/* Record that Emacs is no longer idle, so stop running idle-time timers. */
4320
5c12e63f 4321static void
d9d4c147
KH
4322timer_stop_idle ()
4323{
4324 EMACS_SET_SECS_USECS (timer_idleness_start_time, -1, -1);
4325}
4326
5c12e63f
KS
4327/* Resume idle timer from last idle start time. */
4328
4329static void
4330timer_resume_idle ()
4331{
4332 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4333 return;
4334
4335 timer_idleness_start_time = timer_last_idleness_start_time;
4336}
4337
e044e87c
RS
4338/* This is only for debugging. */
4339struct input_event last_timer_event;
4340
c04cbc3b
RS
4341/* Check whether a timer has fired. To prevent larger problems we simply
4342 disregard elements that are not proper timers. Do not make a circular
4343 timer list for the time being.
4344
4345 Returns the number of seconds to wait until the next timer fires. If a
4346 timer is triggering now, return zero seconds.
4347 If no timer is active, return -1 seconds.
4348
4ec4ed6a
RS
4349 If a timer is ripe, we run it, with quitting turned off.
4350
4351 DO_IT_NOW is now ignored. It used to mean that we should
4352 run the timer directly instead of queueing a timer-event.
4353 Now we always run timers directly. */
c04cbc3b
RS
4354
4355EMACS_TIME
4356timer_check (do_it_now)
4357 int do_it_now;
4358{
4359 EMACS_TIME nexttime;
9291c072
RS
4360 EMACS_TIME now, idleness_now;
4361 Lisp_Object timers, idle_timers, chosen_timer;
9291c072 4362 struct gcpro gcpro1, gcpro2, gcpro3;
c04cbc3b 4363
c04cbc3b
RS
4364 EMACS_SET_SECS (nexttime, -1);
4365 EMACS_SET_USECS (nexttime, -1);
4366
9291c072 4367 /* Always consider the ordinary timers. */
7ea13e12 4368 timers = Vtimer_list;
9291c072
RS
4369 /* Consider the idle timers only if Emacs is idle. */
4370 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4371 idle_timers = Vtimer_idle_list;
4372 else
4373 idle_timers = Qnil;
4374 chosen_timer = Qnil;
4375 GCPRO3 (timers, idle_timers, chosen_timer);
7ea13e12 4376
9291c072 4377 if (CONSP (timers) || CONSP (idle_timers))
c04cbc3b 4378 {
9291c072
RS
4379 EMACS_GET_TIME (now);
4380 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4381 EMACS_SUB_TIME (idleness_now, now, timer_idleness_start_time);
4382 }
c04cbc3b 4383
9291c072
RS
4384 while (CONSP (timers) || CONSP (idle_timers))
4385 {
9291c072 4386 Lisp_Object *vector;
8c907a56 4387 Lisp_Object timer = Qnil, idle_timer = Qnil;
9291c072
RS
4388 EMACS_TIME timer_time, idle_timer_time;
4389 EMACS_TIME difference, timer_difference, idle_timer_difference;
4390
4391 /* Skip past invalid timers and timers already handled. */
4392 if (!NILP (timers))
c04cbc3b 4393 {
7539e11f 4394 timer = XCAR (timers);
9291c072
RS
4395 if (!VECTORP (timer) || XVECTOR (timer)->size != 8)
4396 {
7539e11f 4397 timers = XCDR (timers);
9291c072
RS
4398 continue;
4399 }
4400 vector = XVECTOR (timer)->contents;
d9d4c147 4401
9291c072
RS
4402 if (!INTEGERP (vector[1]) || !INTEGERP (vector[2])
4403 || !INTEGERP (vector[3])
4404 || ! NILP (vector[0]))
4405 {
7539e11f 4406 timers = XCDR (timers);
9291c072
RS
4407 continue;
4408 }
4409 }
4410 if (!NILP (idle_timers))
4411 {
7539e11f 4412 timer = XCAR (idle_timers);
d9d4c147 4413 if (!VECTORP (timer) || XVECTOR (timer)->size != 8)
9291c072 4414 {
7539e11f 4415 idle_timers = XCDR (idle_timers);
9291c072
RS
4416 continue;
4417 }
d9d4c147
KH
4418 vector = XVECTOR (timer)->contents;
4419
4420 if (!INTEGERP (vector[1]) || !INTEGERP (vector[2])
9291c072
RS
4421 || !INTEGERP (vector[3])
4422 || ! NILP (vector[0]))
4423 {
7539e11f 4424 idle_timers = XCDR (idle_timers);
9291c072
RS
4425 continue;
4426 }
4427 }
d9d4c147 4428
9291c072
RS
4429 /* Set TIMER, TIMER_TIME and TIMER_DIFFERENCE
4430 based on the next ordinary timer.
4431 TIMER_DIFFERENCE is the distance in time from NOW to when
4432 this timer becomes ripe (negative if it's already ripe). */
4433 if (!NILP (timers))
4434 {
7539e11f 4435 timer = XCAR (timers);
9291c072 4436 vector = XVECTOR (timer)->contents;
d9d4c147
KH
4437 EMACS_SET_SECS (timer_time,
4438 (XINT (vector[1]) << 16) | (XINT (vector[2])));
4439 EMACS_SET_USECS (timer_time, XINT (vector[3]));
9291c072
RS
4440 EMACS_SUB_TIME (timer_difference, timer_time, now);
4441 }
ba8dfba8 4442
9291c072
RS
4443 /* Set IDLE_TIMER, IDLE_TIMER_TIME and IDLE_TIMER_DIFFERENCE
4444 based on the next idle timer. */
4445 if (!NILP (idle_timers))
4446 {
7539e11f 4447 idle_timer = XCAR (idle_timers);
9291c072
RS
4448 vector = XVECTOR (idle_timer)->contents;
4449 EMACS_SET_SECS (idle_timer_time,
4450 (XINT (vector[1]) << 16) | (XINT (vector[2])));
4451 EMACS_SET_USECS (idle_timer_time, XINT (vector[3]));
4452 EMACS_SUB_TIME (idle_timer_difference, idle_timer_time, idleness_now);
4453 }
ba8dfba8 4454
9291c072
RS
4455 /* Decide which timer is the next timer,
4456 and set CHOSEN_TIMER, VECTOR and DIFFERENCE accordingly.
4457 Also step down the list where we found that timer. */
d9d4c147 4458
9291c072
RS
4459 if (! NILP (timers) && ! NILP (idle_timers))
4460 {
4461 EMACS_TIME temp;
4462 EMACS_SUB_TIME (temp, timer_difference, idle_timer_difference);
4463 if (EMACS_TIME_NEG_P (temp))
4464 {
4465 chosen_timer = timer;
7539e11f 4466 timers = XCDR (timers);
9291c072 4467 difference = timer_difference;
c04cbc3b 4468 }
d9d4c147 4469 else
d9d4c147 4470 {
9291c072 4471 chosen_timer = idle_timer;
7539e11f 4472 idle_timers = XCDR (idle_timers);
9291c072 4473 difference = idle_timer_difference;
d9d4c147 4474 }
7ea13e12 4475 }
9291c072
RS
4476 else if (! NILP (timers))
4477 {
4478 chosen_timer = timer;
7539e11f 4479 timers = XCDR (timers);
9291c072
RS
4480 difference = timer_difference;
4481 }
4482 else
4483 {
4484 chosen_timer = idle_timer;
7539e11f 4485 idle_timers = XCDR (idle_timers);
9291c072
RS
4486 difference = idle_timer_difference;
4487 }
4488 vector = XVECTOR (chosen_timer)->contents;
c60ee5e7 4489
bd55b860 4490 /* If timer is ripe, run it if it hasn't been run. */
9291c072
RS
4491 if (EMACS_TIME_NEG_P (difference)
4492 || (EMACS_SECS (difference) == 0
4493 && EMACS_USECS (difference) == 0))
4494 {
4495 if (NILP (vector[0]))
4496 {
d925fb39 4497 int was_locked = single_kboard;
331379bf 4498 int count = SPECPDL_INDEX ();
d0bbfc99 4499 Lisp_Object old_deactivate_mark = Vdeactivate_mark;
d925fb39 4500
9291c072
RS
4501 /* Mark the timer as triggered to prevent problems if the lisp
4502 code fails to reschedule it right. */
4503 vector[0] = Qt;
4504
d925fb39 4505 specbind (Qinhibit_quit, Qt);
c60ee5e7 4506
d925fb39 4507 call1 (Qtimer_event_handler, chosen_timer);
d0bbfc99 4508 Vdeactivate_mark = old_deactivate_mark;
d925fb39 4509 timers_run++;
d925fb39 4510 unbind_to (count, Qnil);
4ec4ed6a 4511
d925fb39
RS
4512 /* Resume allowing input from any kboard, if that was true before. */
4513 if (!was_locked)
4514 any_kboard_state ();
9291c072 4515
d925fb39
RS
4516 /* Since we have handled the event,
4517 we don't need to tell the caller to wake up and do it. */
9291c072
RS
4518 }
4519 }
4520 else
4521 /* When we encounter a timer that is still waiting,
4522 return the amount of time to wait before it is ripe. */
4523 {
4524 UNGCPRO;
9291c072
RS
4525 return difference;
4526 }
c04cbc3b 4527 }
9291c072 4528
7ea13e12
RS
4529 /* No timers are pending in the future. */
4530 /* Return 0 if we generated an event, and -1 if not. */
4531 UNGCPRO;
c04cbc3b
RS
4532 return nexttime;
4533}
4534\f
284f4730 4535/* Caches for modify_event_symbol. */
e9bf89a0 4536static Lisp_Object accent_key_syms;
284f4730
JB
4537static Lisp_Object func_key_syms;
4538static Lisp_Object mouse_syms;
8006e4bb 4539static Lisp_Object wheel_syms;
a24dc617 4540static Lisp_Object drag_n_drop_syms;
284f4730 4541
e9bf89a0
RS
4542/* This is a list of keysym codes for special "accent" characters.
4543 It parallels lispy_accent_keys. */
4544
4545static int lispy_accent_codes[] =
4546{
79a7046c 4547#ifdef XK_dead_circumflex
e9bf89a0 4548 XK_dead_circumflex,
79a7046c
RS
4549#else
4550 0,
4551#endif
4552#ifdef XK_dead_grave
e9bf89a0 4553 XK_dead_grave,
79a7046c
RS
4554#else
4555 0,
4556#endif
4557#ifdef XK_dead_tilde
e9bf89a0 4558 XK_dead_tilde,
79a7046c
RS
4559#else
4560 0,
4561#endif
4562#ifdef XK_dead_diaeresis
e9bf89a0 4563 XK_dead_diaeresis,
79a7046c
RS
4564#else
4565 0,
4566#endif
4567#ifdef XK_dead_macron
e9bf89a0 4568 XK_dead_macron,
79a7046c
RS
4569#else
4570 0,
4571#endif
4572#ifdef XK_dead_degree
e9bf89a0 4573 XK_dead_degree,
79a7046c
RS
4574#else
4575 0,
4576#endif
4577#ifdef XK_dead_acute
e9bf89a0 4578 XK_dead_acute,
79a7046c
RS
4579#else
4580 0,
4581#endif
4582#ifdef XK_dead_cedilla
e9bf89a0 4583 XK_dead_cedilla,
79a7046c
RS
4584#else
4585 0,
4586#endif
4587#ifdef XK_dead_breve
e9bf89a0 4588 XK_dead_breve,
79a7046c
RS
4589#else
4590 0,
4591#endif
4592#ifdef XK_dead_ogonek
e9bf89a0 4593 XK_dead_ogonek,
79a7046c
RS
4594#else
4595 0,
4596#endif
4597#ifdef XK_dead_caron
e9bf89a0 4598 XK_dead_caron,
79a7046c
RS
4599#else
4600 0,
4601#endif
4602#ifdef XK_dead_doubleacute
e9bf89a0 4603 XK_dead_doubleacute,
79a7046c
RS
4604#else
4605 0,
4606#endif
4607#ifdef XK_dead_abovedot
e9bf89a0 4608 XK_dead_abovedot,
79a7046c
RS
4609#else
4610 0,
4611#endif
ed3230db
DL
4612#ifdef XK_dead_abovering
4613 XK_dead_abovering,
4614#else
4615 0,
4616#endif
4617#ifdef XK_dead_iota
4618 XK_dead_iota,
4619#else
4620 0,
4621#endif
4622#ifdef XK_dead_belowdot
4623 XK_dead_belowdot,
4624#else
4625 0,
4626#endif
4627#ifdef XK_dead_voiced_sound
4628 XK_dead_voiced_sound,
4629#else
4630 0,
4631#endif
4632#ifdef XK_dead_semivoiced_sound
4633 XK_dead_semivoiced_sound,
4634#else
4635 0,
4636#endif
4637#ifdef XK_dead_hook
4638 XK_dead_hook,
4639#else
4640 0,
4641#endif
4642#ifdef XK_dead_horn
4643 XK_dead_horn,
4644#else
4645 0,
4646#endif
e9bf89a0
RS
4647};
4648
4649/* This is a list of Lisp names for special "accent" characters.
4650 It parallels lispy_accent_codes. */
4651
4652static char *lispy_accent_keys[] =
4653{
4654 "dead-circumflex",
4655 "dead-grave",
4656 "dead-tilde",
4657 "dead-diaeresis",
4658 "dead-macron",
4659 "dead-degree",
4660 "dead-acute",
4661 "dead-cedilla",
4662 "dead-breve",
4663 "dead-ogonek",
4664 "dead-caron",
4665 "dead-doubleacute",
4666 "dead-abovedot",
ed3230db
DL
4667 "dead-abovering",
4668 "dead-iota",
4669 "dead-belowdot",
4670 "dead-voiced-sound",
4671 "dead-semivoiced-sound",
4672 "dead-hook",
4673 "dead-horn",
e9bf89a0
RS
4674};
4675
e98a93eb
GV
4676#ifdef HAVE_NTGUI
4677#define FUNCTION_KEY_OFFSET 0x0
4678
4679char *lispy_function_keys[] =
4680 {
4681 0, /* 0 */
c60ee5e7 4682
e98a93eb
GV
4683 0, /* VK_LBUTTON 0x01 */
4684 0, /* VK_RBUTTON 0x02 */
4685 "cancel", /* VK_CANCEL 0x03 */
4686 0, /* VK_MBUTTON 0x04 */
c60ee5e7 4687
e98a93eb 4688 0, 0, 0, /* 0x05 .. 0x07 */
c60ee5e7 4689
e98a93eb
GV
4690 "backspace", /* VK_BACK 0x08 */
4691 "tab", /* VK_TAB 0x09 */
c60ee5e7 4692
e98a93eb 4693 0, 0, /* 0x0A .. 0x0B */
c60ee5e7 4694
e98a93eb
GV
4695 "clear", /* VK_CLEAR 0x0C */
4696 "return", /* VK_RETURN 0x0D */
c60ee5e7 4697
e98a93eb 4698 0, 0, /* 0x0E .. 0x0F */
c60ee5e7 4699
1161d367
GV
4700 0, /* VK_SHIFT 0x10 */
4701 0, /* VK_CONTROL 0x11 */
4702 0, /* VK_MENU 0x12 */
e98a93eb 4703 "pause", /* VK_PAUSE 0x13 */
1161d367 4704 "capslock", /* VK_CAPITAL 0x14 */
c60ee5e7 4705
e98a93eb 4706 0, 0, 0, 0, 0, 0, /* 0x15 .. 0x1A */
c60ee5e7 4707
1161d367 4708 "escape", /* VK_ESCAPE 0x1B */
c60ee5e7 4709
e98a93eb 4710 0, 0, 0, 0, /* 0x1C .. 0x1F */
c60ee5e7 4711
e98a93eb
GV
4712 0, /* VK_SPACE 0x20 */
4713 "prior", /* VK_PRIOR 0x21 */
4714 "next", /* VK_NEXT 0x22 */
4715 "end", /* VK_END 0x23 */
4716 "home", /* VK_HOME 0x24 */
4717 "left", /* VK_LEFT 0x25 */
4718 "up", /* VK_UP 0x26 */
4719 "right", /* VK_RIGHT 0x27 */
4720 "down", /* VK_DOWN 0x28 */
4721 "select", /* VK_SELECT 0x29 */
4722 "print", /* VK_PRINT 0x2A */
4723 "execute", /* VK_EXECUTE 0x2B */
4724 "snapshot", /* VK_SNAPSHOT 0x2C */
4725 "insert", /* VK_INSERT 0x2D */
4726 "delete", /* VK_DELETE 0x2E */
4727 "help", /* VK_HELP 0x2F */
c60ee5e7 4728
e98a93eb 4729 /* VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
c60ee5e7 4730
e98a93eb 4731 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
c60ee5e7 4732
e98a93eb 4733 0, 0, 0, 0, 0, 0, 0, /* 0x3A .. 0x40 */
c60ee5e7 4734
e98a93eb 4735 /* VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
c60ee5e7
JB
4736
4737 0, 0, 0, 0, 0, 0, 0, 0, 0,
4738 0, 0, 0, 0, 0, 0, 0, 0, 0,
e98a93eb 4739 0, 0, 0, 0, 0, 0, 0, 0,
c60ee5e7 4740
e376f90d
RS
4741 "lwindow", /* VK_LWIN 0x5B */
4742 "rwindow", /* VK_RWIN 0x5C */
4743 "apps", /* VK_APPS 0x5D */
c60ee5e7 4744
e98a93eb 4745 0, 0, /* 0x5E .. 0x5F */
c60ee5e7 4746
e98a93eb
GV
4747 "kp-0", /* VK_NUMPAD0 0x60 */
4748 "kp-1", /* VK_NUMPAD1 0x61 */
4749 "kp-2", /* VK_NUMPAD2 0x62 */
4750 "kp-3", /* VK_NUMPAD3 0x63 */
4751 "kp-4", /* VK_NUMPAD4 0x64 */
4752 "kp-5", /* VK_NUMPAD5 0x65 */
4753 "kp-6", /* VK_NUMPAD6 0x66 */
4754 "kp-7", /* VK_NUMPAD7 0x67 */
4755 "kp-8", /* VK_NUMPAD8 0x68 */
4756 "kp-9", /* VK_NUMPAD9 0x69 */
4757 "kp-multiply", /* VK_MULTIPLY 0x6A */
4758 "kp-add", /* VK_ADD 0x6B */
4759 "kp-separator", /* VK_SEPARATOR 0x6C */
4760 "kp-subtract", /* VK_SUBTRACT 0x6D */
4761 "kp-decimal", /* VK_DECIMAL 0x6E */
4762 "kp-divide", /* VK_DIVIDE 0x6F */
4763 "f1", /* VK_F1 0x70 */
4764 "f2", /* VK_F2 0x71 */
4765 "f3", /* VK_F3 0x72 */
4766 "f4", /* VK_F4 0x73 */
4767 "f5", /* VK_F5 0x74 */
4768 "f6", /* VK_F6 0x75 */
4769 "f7", /* VK_F7 0x76 */
4770 "f8", /* VK_F8 0x77 */
4771 "f9", /* VK_F9 0x78 */
4772 "f10", /* VK_F10 0x79 */
4773 "f11", /* VK_F11 0x7A */
4774 "f12", /* VK_F12 0x7B */
4775 "f13", /* VK_F13 0x7C */
4776 "f14", /* VK_F14 0x7D */
4777 "f15", /* VK_F15 0x7E */
4778 "f16", /* VK_F16 0x7F */
4779 "f17", /* VK_F17 0x80 */
4780 "f18", /* VK_F18 0x81 */
4781 "f19", /* VK_F19 0x82 */
4782 "f20", /* VK_F20 0x83 */
4783 "f21", /* VK_F21 0x84 */
4784 "f22", /* VK_F22 0x85 */
4785 "f23", /* VK_F23 0x86 */
4786 "f24", /* VK_F24 0x87 */
c60ee5e7 4787
e98a93eb
GV
4788 0, 0, 0, 0, /* 0x88 .. 0x8B */
4789 0, 0, 0, 0, /* 0x8C .. 0x8F */
c60ee5e7 4790
e98a93eb
GV
4791 "kp-numlock", /* VK_NUMLOCK 0x90 */
4792 "scroll", /* VK_SCROLL 0x91 */
c60ee5e7 4793
e376f90d
RS
4794 "kp-space", /* VK_NUMPAD_CLEAR 0x92 */
4795 "kp-enter", /* VK_NUMPAD_ENTER 0x93 */
4796 "kp-prior", /* VK_NUMPAD_PRIOR 0x94 */
4797 "kp-next", /* VK_NUMPAD_NEXT 0x95 */
4798 "kp-end", /* VK_NUMPAD_END 0x96 */
4799 "kp-home", /* VK_NUMPAD_HOME 0x97 */
4800 "kp-left", /* VK_NUMPAD_LEFT 0x98 */
4801 "kp-up", /* VK_NUMPAD_UP 0x99 */
4802 "kp-right", /* VK_NUMPAD_RIGHT 0x9A */
4803 "kp-down", /* VK_NUMPAD_DOWN 0x9B */
4804 "kp-insert", /* VK_NUMPAD_INSERT 0x9C */
4805 "kp-delete", /* VK_NUMPAD_DELETE 0x9D */
4806
4807 0, 0, /* 0x9E .. 0x9F */
4808
e98a93eb
GV
4809 /*
4810 * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
e8886a1d 4811 * Used only as parameters to GetAsyncKeyState and GetKeyState.
e98a93eb
GV
4812 * No other API or message will distinguish left and right keys this way.
4813 */
4814 /* 0xA0 .. 0xEF */
c60ee5e7 4815
e98a93eb
GV
4816 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4817 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4818 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4819 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4820 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
c60ee5e7 4821
e98a93eb 4822 /* 0xF0 .. 0xF5 */
c60ee5e7 4823
e98a93eb 4824 0, 0, 0, 0, 0, 0,
c60ee5e7 4825
e98a93eb
GV
4826 "attn", /* VK_ATTN 0xF6 */
4827 "crsel", /* VK_CRSEL 0xF7 */
4828 "exsel", /* VK_EXSEL 0xF8 */
4829 "ereof", /* VK_EREOF 0xF9 */
4830 "play", /* VK_PLAY 0xFA */
4831 "zoom", /* VK_ZOOM 0xFB */
4832 "noname", /* VK_NONAME 0xFC */
4833 "pa1", /* VK_PA1 0xFD */
4834 "oem_clear", /* VK_OEM_CLEAR 0xFE */
1161d367 4835 0 /* 0xFF */
e98a93eb
GV
4836 };
4837
04f215f0 4838#else /* not HAVE_NTGUI */
e98a93eb 4839
ed3230db
DL
4840/* This should be dealt with in XTread_socket now, and that doesn't
4841 depend on the client system having the Kana syms defined. See also
4842 the XK_kana_A case below. */
4843#if 0
37cd9f30
KH
4844#ifdef XK_kana_A
4845static char *lispy_kana_keys[] =
4846 {
4847 /* X Keysym value */
4848 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x400 .. 0x40f */
4849 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x410 .. 0x41f */
4850 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x420 .. 0x42f */
4851 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x430 .. 0x43f */
4852 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x440 .. 0x44f */
4853 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x450 .. 0x45f */
4854 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x460 .. 0x46f */
4855 0,0,0,0,0,0,0,0,0,0,0,0,0,0,"overline",0,
4856 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x480 .. 0x48f */
4857 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x490 .. 0x49f */
c60ee5e7 4858 0, "kana-fullstop", "kana-openingbracket", "kana-closingbracket",
37cd9f30
KH
4859 "kana-comma", "kana-conjunctive", "kana-WO", "kana-a",
4860 "kana-i", "kana-u", "kana-e", "kana-o",
4861 "kana-ya", "kana-yu", "kana-yo", "kana-tsu",
4862 "prolongedsound", "kana-A", "kana-I", "kana-U",
4863 "kana-E", "kana-O", "kana-KA", "kana-KI",
4864 "kana-KU", "kana-KE", "kana-KO", "kana-SA",
4865 "kana-SHI", "kana-SU", "kana-SE", "kana-SO",
4866 "kana-TA", "kana-CHI", "kana-TSU", "kana-TE",
4867 "kana-TO", "kana-NA", "kana-NI", "kana-NU",
4868 "kana-NE", "kana-NO", "kana-HA", "kana-HI",
4869 "kana-FU", "kana-HE", "kana-HO", "kana-MA",
4870 "kana-MI", "kana-MU", "kana-ME", "kana-MO",
4871 "kana-YA", "kana-YU", "kana-YO", "kana-RA",
4872 "kana-RI", "kana-RU", "kana-RE", "kana-RO",
4873 "kana-WA", "kana-N", "voicedsound", "semivoicedsound",
4874 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x4e0 .. 0x4ef */
4875 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x4f0 .. 0x4ff */
4876 };
4877#endif /* XK_kana_A */
ed3230db 4878#endif /* 0 */
37cd9f30 4879
04f215f0
RS
4880#define FUNCTION_KEY_OFFSET 0xff00
4881
284f4730
JB
4882/* You'll notice that this table is arranged to be conveniently
4883 indexed by X Windows keysym values. */
4884static char *lispy_function_keys[] =
4885 {
4886 /* X Keysym value */
4887
75045dcb
RS
4888 0, 0, 0, 0, 0, 0, 0, 0, /* 0xff00...0f */
4889 "backspace", "tab", "linefeed", "clear",
4890 0, "return", 0, 0,
4891 0, 0, 0, "pause", /* 0xff10...1f */
4892 0, 0, 0, 0, 0, 0, 0, "escape",
86e5706b 4893 0, 0, 0, 0,
75045dcb
RS
4894 0, "kanji", "muhenkan", "henkan", /* 0xff20...2f */
4895 "romaji", "hiragana", "katakana", "hiragana-katakana",
4896 "zenkaku", "hankaku", "zenkaku-hankaku", "touroku",
4897 "massyo", "kana-lock", "kana-shift", "eisu-shift",
4898 "eisu-toggle", /* 0xff30...3f */
4899 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86e5706b
RS
4900 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xff40...4f */
4901
75045dcb
RS
4902 "home", "left", "up", "right", /* 0xff50 */ /* IsCursorKey */
4903 "down", "prior", "next", "end",
4904 "begin", 0, 0, 0, 0, 0, 0, 0,
284f4730
JB
4905 "select", /* 0xff60 */ /* IsMiscFunctionKey */
4906 "print",
4907 "execute",
4908 "insert",
4909 0, /* 0xff64 */
4910 "undo",
4911 "redo",
4912 "menu",
4913 "find",
4914 "cancel",
4915 "help",
4916 "break", /* 0xff6b */
4917
75045dcb
RS
4918 0, 0, 0, 0,
4919 0, 0, 0, 0, "backtab", 0, 0, 0, /* 0xff70... */
4920 0, 0, 0, 0, 0, 0, 0, "kp-numlock", /* 0xff78... */
284f4730
JB
4921 "kp-space", /* 0xff80 */ /* IsKeypadKey */
4922 0, 0, 0, 0, 0, 0, 0, 0,
4923 "kp-tab", /* 0xff89 */
4924 0, 0, 0,
4925 "kp-enter", /* 0xff8d */
4926 0, 0, 0,
4927 "kp-f1", /* 0xff91 */
4928 "kp-f2",
4929 "kp-f3",
4930 "kp-f4",
872157e7
RS
4931 "kp-home", /* 0xff95 */
4932 "kp-left",
4933 "kp-up",
4934 "kp-right",
4935 "kp-down",
4936 "kp-prior", /* kp-page-up */
4937 "kp-next", /* kp-page-down */
4938 "kp-end",
4939 "kp-begin",
4940 "kp-insert",
4941 "kp-delete",
4942 0, /* 0xffa0 */
4943 0, 0, 0, 0, 0, 0, 0, 0, 0,
284f4730
JB
4944 "kp-multiply", /* 0xffaa */
4945 "kp-add",
4946 "kp-separator",
4947 "kp-subtract",
4948 "kp-decimal",
4949 "kp-divide", /* 0xffaf */
4950 "kp-0", /* 0xffb0 */
4951 "kp-1", "kp-2", "kp-3", "kp-4", "kp-5", "kp-6", "kp-7", "kp-8", "kp-9",
4952 0, /* 0xffba */
4953 0, 0,
4954 "kp-equal", /* 0xffbd */
4955 "f1", /* 0xffbe */ /* IsFunctionKey */
86e5706b
RS
4956 "f2",
4957 "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", /* 0xffc0 */
4958 "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18",
4959 "f19", "f20", "f21", "f22", "f23", "f24", "f25", "f26", /* 0xffd0 */
4960 "f27", "f28", "f29", "f30", "f31", "f32", "f33", "f34",
4961 "f35", 0, 0, 0, 0, 0, 0, 0, /* 0xffe0 */
4962 0, 0, 0, 0, 0, 0, 0, 0,
4963 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfff0 */
4964 0, 0, 0, 0, 0, 0, 0, "delete"
04f215f0 4965 };
284f4730 4966
04f215f0
RS
4967/* ISO 9995 Function and Modifier Keys; the first byte is 0xFE. */
4968#define ISO_FUNCTION_KEY_OFFSET 0xfe00
4969
4970static char *iso_lispy_function_keys[] =
4971 {
4972 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe00 */
4973 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe08 */
4974 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe10 */
4975 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe18 */
4976 "iso-lefttab", /* 0xfe20 */
c60ee5e7
JB
4977 "iso-move-line-up", "iso-move-line-down",
4978 "iso-partial-line-up", "iso-partial-line-down",
4979 "iso-partial-space-left", "iso-partial-space-right",
04f215f0
RS
4980 "iso-set-margin-left", "iso-set-margin-right", /* 0xffe27, 28 */
4981 "iso-release-margin-left", "iso-release-margin-right",
4982 "iso-release-both-margins",
4983 "iso-fast-cursor-left", "iso-fast-cursor-right",
4984 "iso-fast-cursor-up", "iso-fast-cursor-down",
4985 "iso-continuous-underline", "iso-discontinuous-underline", /* 0xfe30, 31 */
4986 "iso-emphasize", "iso-center-object", "iso-enter", /* ... 0xfe34 */
4987 };
4988
4989#endif /* not HAVE_NTGUI */
e98a93eb 4990
8e1e4240 4991Lisp_Object Vlispy_mouse_stem;
284f4730 4992
8006e4bb
JR
4993static char *lispy_wheel_names[] =
4994{
4995 "wheel-up", "wheel-down"
4996};
4997
a24dc617
RS
4998/* drag-n-drop events are generated when a set of selected files are
4999 dragged from another application and dropped onto an Emacs window. */
5000static char *lispy_drag_n_drop_names[] =
5001{
5002 "drag-n-drop"
5003};
5004
3c370943 5005/* Scroll bar parts. */
4bb994d1 5006Lisp_Object Qabove_handle, Qhandle, Qbelow_handle;
7ee32cda 5007Lisp_Object Qup, Qdown, Qbottom, Qend_scroll;
eef28553 5008Lisp_Object Qtop, Qratio;
4bb994d1 5009
3c370943
JB
5010/* An array of scroll bar parts, indexed by an enum scroll_bar_part value. */
5011Lisp_Object *scroll_bar_parts[] = {
db08707d 5012 &Qabove_handle, &Qhandle, &Qbelow_handle,
eef28553 5013 &Qup, &Qdown, &Qtop, &Qbottom, &Qend_scroll, &Qratio
4bb994d1
JB
5014};
5015
5bf68f6e
AS
5016/* User signal events. */
5017Lisp_Object Qusr1_signal, Qusr2_signal;
5018
5019Lisp_Object *lispy_user_signals[] =
5020{
5021 &Qusr1_signal, &Qusr2_signal
5022};
5023
4bb994d1 5024
7b4aedb9 5025/* A vector, indexed by button number, giving the down-going location
3c370943 5026 of currently depressed buttons, both scroll bar and non-scroll bar.
7b4aedb9
JB
5027
5028 The elements have the form
5029 (BUTTON-NUMBER MODIFIER-MASK . REST)
5030 where REST is the cdr of a position as it would be reported in the event.
5031
5032 The make_lispy_event function stores positions here to tell the
5033 difference between click and drag events, and to store the starting
5034 location to be included in drag events. */
5035
5036static Lisp_Object button_down_location;
88cb0656 5037
fbcd35bd
JB
5038/* Information about the most recent up-going button event: Which
5039 button, what location, and what time. */
5040
559f9d04
RS
5041static int last_mouse_button;
5042static int last_mouse_x;
5043static int last_mouse_y;
5044static unsigned long button_down_time;
fbcd35bd 5045
222d557c
GM
5046/* The maximum time between clicks to make a double-click, or Qnil to
5047 disable double-click detection, or Qt for no time limit. */
5048
564dc952 5049Lisp_Object Vdouble_click_time;
fbcd35bd 5050
222d557c
GM
5051/* Maximum number of pixels the mouse may be moved between clicks
5052 to make a double-click. */
5053
31ade731 5054EMACS_INT double_click_fuzz;
222d557c 5055
fbcd35bd
JB
5056/* The number of clicks in this multiple-click. */
5057
5058int double_click_count;
5059
3d566707
KS
5060/* Return position of a mouse click or wheel event */
5061
5062static Lisp_Object
5063make_lispy_position (f, x, y, time)
5064 struct frame *f;
5065 Lisp_Object *x, *y;
5066 unsigned long time;
5067{
5068 Lisp_Object window;
5069 enum window_part part;
5070 Lisp_Object posn = Qnil;
5071 Lisp_Object extra_info = Qnil;
5072 int wx, wy;
5073
5074 /* Set `window' to the window under frame pixel coordinates (x,y) */
5075 if (f)
5076 window = window_from_coordinates (f, XINT (*x), XINT (*y),
5077 &part, &wx, &wy, 0);
5078 else
5079 window = Qnil;
5080
5081 if (WINDOWP (window))
5082 {
5083 /* It's a click in window window at frame coordinates (x,y) */
5084 struct window *w = XWINDOW (window);
eee5863b 5085 Lisp_Object string_info = Qnil;
3d566707 5086 int textpos = -1, rx = -1, ry = -1;
45de137a 5087 int dx = -1, dy = -1;
eee5863b
KS
5088 int width = -1, height = -1;
5089 Lisp_Object object = Qnil;
3d566707
KS
5090
5091 /* Set event coordinates to window-relative coordinates
5092 for constructing the Lisp event below. */
5093 XSETINT (*x, wx);
5094 XSETINT (*y, wy);
5095
6507c4c7
KS
5096 if (part == ON_TEXT)
5097 {
5098 wx += WINDOW_LEFT_MARGIN_WIDTH (w);
5099 }
5100 else if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
3d566707
KS
5101 {
5102 /* Mode line or header line. Look for a string under
5103 the mouse that may have a `local-map' property. */
5104 Lisp_Object string;
5105 int charpos;
5106
5107 posn = part == ON_MODE_LINE ? Qmode_line : Qheader_line;
5108 rx = wx, ry = wy;
eee5863b
KS
5109 string = mode_line_string (w, part, &rx, &ry, &charpos,
5110 &object, &dx, &dy, &width, &height);
3d566707 5111 if (STRINGP (string))
eee5863b 5112 string_info = Fcons (string, make_number (charpos));
3d566707
KS
5113 if (w == XWINDOW (selected_window))
5114 textpos = PT;
5115 else
5116 textpos = XMARKER (w->pointm)->charpos;
5117 }
5118 else if (part == ON_VERTICAL_BORDER)
5119 {
5120 posn = Qvertical_line;
5121 wx = -1;
45de137a 5122 dx = 0;
eee5863b 5123 width = 1;
3d566707
KS
5124 }
5125 else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
5126 {
5127 Lisp_Object string;
5128 int charpos;
2320865d 5129
3d566707
KS
5130 posn = (part == ON_LEFT_MARGIN) ? Qleft_margin : Qright_margin;
5131 rx = wx, ry = wy;
eee5863b
KS
5132 string = marginal_area_string (w, part, &rx, &ry, &charpos,
5133 &object, &dx, &dy, &width, &height);
3d566707 5134 if (STRINGP (string))
eee5863b 5135 string_info = Fcons (string, make_number (charpos));
a65fc2c3
KS
5136 if (part == ON_LEFT_MARGIN)
5137 wx = 0;
5138 else
5139 wx = window_box_right_offset (w, TEXT_AREA) - 1;
5140 }
5141 else if (part == ON_LEFT_FRINGE)
5142 {
5143 posn = Qleft_fringe;
5144 rx = 0;
5145 dx = wx;
5146 wx = (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
5147 ? 0
5148 : window_box_width (w, LEFT_MARGIN_AREA));
5149 dx -= wx;
3d566707 5150 }
a65fc2c3 5151 else if (part == ON_RIGHT_FRINGE)
3d566707 5152 {
a65fc2c3 5153 posn = Qright_fringe;
3d566707 5154 rx = 0;
45de137a 5155 dx = wx;
a65fc2c3
KS
5156 wx = (window_box_width (w, LEFT_MARGIN_AREA)
5157 + window_box_width (w, TEXT_AREA)
5158 + (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
5159 ? window_box_width (w, RIGHT_MARGIN_AREA)
5160 : 0));
5161 dx -= wx;
5162 }
5163 else
5164 {
5165 /* Note: We have no special posn for part == ON_SCROLL_BAR. */
5166 wx = max (WINDOW_LEFT_MARGIN_WIDTH (w), wx);
3d566707
KS
5167 }
5168
5169 if (textpos < 0)
5170 {
eee5863b 5171 Lisp_Object string2, object2 = Qnil;
3d566707 5172 struct display_pos p;
45de137a 5173 int dx2, dy2;
eee5863b 5174 int width2, height2;
eee5863b
KS
5175 string2 = buffer_posn_from_coords (w, &wx, &wy, &p,
5176 &object2, &dx2, &dy2,
5177 &width2, &height2);
3d566707 5178 textpos = CHARPOS (p.pos);
45de137a
KS
5179 if (rx < 0) rx = wx;
5180 if (ry < 0) ry = wy;
5181 if (dx < 0) dx = dx2;
5182 if (dy < 0) dy = dy2;
eee5863b
KS
5183 if (width < 0) width = width2;
5184 if (height < 0) height = height2;
3d566707
KS
5185
5186 if (NILP (posn))
5187 {
5188 posn = make_number (textpos);
eee5863b
KS
5189 if (STRINGP (string2))
5190 string_info = Fcons (string2,
5191 make_number (CHARPOS (p.string_pos)));
3d566707 5192 }
eee5863b
KS
5193 if (NILP (object))
5194 object = object2;
3d566707
KS
5195 }
5196
eee5863b
KS
5197#ifdef HAVE_WINDOW_SYSTEM
5198 if (IMAGEP (object))
5199 {
5200 Lisp_Object image_map, hotspot;
5201 if ((image_map = Fplist_get (XCDR (object), QCmap),
5202 !NILP (image_map))
5203 && (hotspot = find_hot_spot (image_map, dx, dy),
5204 CONSP (hotspot))
5205 && (hotspot = XCDR (hotspot), CONSP (hotspot)))
5206 posn = XCAR (hotspot);
5207 }
5208#endif
5209
5210 /* Object info */
3d566707 5211 extra_info = Fcons (object,
eee5863b
KS
5212 Fcons (Fcons (make_number (dx),
5213 make_number (dy)),
5214 Fcons (Fcons (make_number (width),
5215 make_number (height)),
5216 Qnil)));
5217
5218 /* String info */
5219 extra_info = Fcons (string_info,
3d566707
KS
5220 Fcons (make_number (textpos),
5221 Fcons (Fcons (make_number (rx),
5222 make_number (ry)),
eee5863b 5223 extra_info)));
3d566707
KS
5224 }
5225 else if (f != 0)
5226 {
5227 XSETFRAME (window, f);
5228 }
5229 else
5230 {
5231 window = Qnil;
5232 XSETFASTINT (*x, 0);
5233 XSETFASTINT (*y, 0);
5234 }
5235
5236 return Fcons (window,
5237 Fcons (posn,
5238 Fcons (Fcons (*x, *y),
5239 Fcons (make_number (time),
5240 extra_info))));
5241}
5242
284f4730
JB
5243/* Given a struct input_event, build the lisp event which represents
5244 it. If EVENT is 0, build a mouse movement event from the mouse
88cb0656
JB
5245 movement buffer, which should have a movement event in it.
5246
5247 Note that events must be passed to this function in the order they
5248 are received; this function stores the location of button presses
5249 in order to build drag events when the button is released. */
284f4730
JB
5250
5251static Lisp_Object
5252make_lispy_event (event)
5253 struct input_event *event;
5254{
79a7046c
RS
5255 int i;
5256
0220c518 5257 switch (SWITCH_ENUM_CAST (event->kind))
284f4730 5258 {
284f4730 5259 /* A simple keystroke. */
3b8f9651 5260 case ASCII_KEYSTROKE_EVENT:
86e5706b 5261 {
9343ab07 5262 Lisp_Object lispy_c;
e9bf89a0 5263 int c = event->code & 0377;
5a1c6df8
JB
5264 /* Turn ASCII characters into control characters
5265 when proper. */
5266 if (event->modifiers & ctrl_modifier)
d205953b
JB
5267 c = make_ctrl_char (c);
5268
5269 /* Add in the other modifier bits. We took care of ctrl_modifier
5270 just above, and the shift key was taken care of by the X code,
5271 and applied to control characters by make_ctrl_char. */
86e5706b
RS
5272 c |= (event->modifiers
5273 & (meta_modifier | alt_modifier
5274 | hyper_modifier | super_modifier));
32454a9f
RS
5275 /* Distinguish Shift-SPC from SPC. */
5276 if ((event->code & 0377) == 040
5277 && event->modifiers & shift_modifier)
5278 c |= shift_modifier;
559f9d04 5279 button_down_time = 0;
bb9e9bed 5280 XSETFASTINT (lispy_c, c);
9343ab07 5281 return lispy_c;
86e5706b 5282 }
284f4730 5283
3b8f9651 5284 case MULTIBYTE_CHAR_KEYSTROKE_EVENT:
a50e723f
KH
5285 {
5286 Lisp_Object lispy_c;
24d80a06 5287 int c = event->code;
a50e723f 5288
24d80a06
SM
5289 /* Add in the other modifier bits. We took care of ctrl_modifier
5290 just above, and the shift key was taken care of by the X code,
5291 and applied to control characters by make_ctrl_char. */
5292 c |= (event->modifiers
5293 & (meta_modifier | alt_modifier
5294 | hyper_modifier | super_modifier | ctrl_modifier));
5295 /* What about the `shift' modifier ? */
5296 button_down_time = 0;
5297 XSETFASTINT (lispy_c, c);
a50e723f
KH
5298 return lispy_c;
5299 }
5300
284f4730
JB
5301 /* A function key. The symbol may need to have modifier prefixes
5302 tacked onto it. */
3b8f9651 5303 case NON_ASCII_KEYSTROKE_EVENT:
559f9d04 5304 button_down_time = 0;
e9bf89a0
RS
5305
5306 for (i = 0; i < sizeof (lispy_accent_codes) / sizeof (int); i++)
5307 if (event->code == lispy_accent_codes[i])
5308 return modify_event_symbol (i,
5309 event->modifiers,
80e4aa30 5310 Qfunction_key, Qnil,
e9bf89a0
RS
5311 lispy_accent_keys, &accent_key_syms,
5312 (sizeof (lispy_accent_keys)
5313 / sizeof (lispy_accent_keys[0])));
5314
ed3230db 5315#if 0
37cd9f30
KH
5316#ifdef XK_kana_A
5317 if (event->code >= 0x400 && event->code < 0x500)
5318 return modify_event_symbol (event->code - 0x400,
5319 event->modifiers & ~shift_modifier,
5320 Qfunction_key, Qnil,
5321 lispy_kana_keys, &func_key_syms,
5322 (sizeof (lispy_kana_keys)
5323 / sizeof (lispy_kana_keys[0])));
5324#endif /* XK_kana_A */
ed3230db 5325#endif /* 0 */
37cd9f30 5326
111c4138 5327#ifdef ISO_FUNCTION_KEY_OFFSET
04f215f0
RS
5328 if (event->code < FUNCTION_KEY_OFFSET
5329 && event->code >= ISO_FUNCTION_KEY_OFFSET)
5330 return modify_event_symbol (event->code - ISO_FUNCTION_KEY_OFFSET,
5331 event->modifiers,
5332 Qfunction_key, Qnil,
5333 iso_lispy_function_keys, &func_key_syms,
5334 (sizeof (iso_lispy_function_keys)
5335 / sizeof (iso_lispy_function_keys[0])));
111c4138 5336#endif
656280a6 5337
4c8bc894
SM
5338 /* Handle system-specific or unknown keysyms. */
5339 if (event->code & (1 << 28)
5340 || event->code - FUNCTION_KEY_OFFSET < 0
656280a6 5341 || (event->code - FUNCTION_KEY_OFFSET
4c8bc894
SM
5342 >= sizeof lispy_function_keys / sizeof *lispy_function_keys)
5343 || !lispy_function_keys[event->code - FUNCTION_KEY_OFFSET])
656280a6 5344 {
4c8bc894
SM
5345 /* We need to use an alist rather than a vector as the cache
5346 since we can't make a vector long enuf. */
5347 if (NILP (current_kboard->system_key_syms))
5348 current_kboard->system_key_syms = Fcons (Qnil, Qnil);
5349 return modify_event_symbol (event->code,
5350 event->modifiers,
5351 Qfunction_key,
5352 current_kboard->Vsystem_key_alist,
5353 0, &current_kboard->system_key_syms,
5354 (unsigned) -1);
656280a6 5355 }
656280a6
GM
5356
5357 return modify_event_symbol (event->code - FUNCTION_KEY_OFFSET,
5358 event->modifiers,
5359 Qfunction_key, Qnil,
5360 lispy_function_keys, &func_key_syms,
5361 (sizeof (lispy_function_keys)
5362 / sizeof (lispy_function_keys[0])));
284f4730 5363
514354e9 5364#ifdef HAVE_MOUSE
df0f2ba1 5365 /* A mouse click. Figure out where it is, decide whether it's
88cb0656 5366 a press, click or drag, and build the appropriate structure. */
3b8f9651 5367 case MOUSE_CLICK_EVENT:
7ee32cda 5368#ifndef USE_TOOLKIT_SCROLL_BARS
3b8f9651 5369 case SCROLL_BAR_CLICK_EVENT:
7ee32cda 5370#endif
284f4730 5371 {
e9bf89a0 5372 int button = event->code;
559f9d04 5373 int is_double;
7b4aedb9 5374 Lisp_Object position;
dbc4e1c1
JB
5375 Lisp_Object *start_pos_ptr;
5376 Lisp_Object start_pos;
284f4730 5377
8c907a56
GM
5378 position = Qnil;
5379
7b4aedb9 5380 /* Build the position as appropriate for this mouse click. */
3b8f9651 5381 if (event->kind == MOUSE_CLICK_EVENT)
284f4730 5382 {
c5cf2109 5383 struct frame *f = XFRAME (event->frame_or_window);
3d566707 5384#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
9e20143a 5385 int row, column;
3d566707 5386#endif
9e20143a 5387
5da3133a
RS
5388 /* Ignore mouse events that were made on frame that
5389 have been deleted. */
5390 if (! FRAME_LIVE_P (f))
5391 return Qnil;
5392
3d566707 5393#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
7ee32cda
GM
5394 /* EVENT->x and EVENT->y are frame-relative pixel
5395 coordinates at this place. Under old redisplay, COLUMN
5396 and ROW are set to frame relative glyph coordinates
5397 which are then used to determine whether this click is
5398 in a menu (non-toolkit version). */
5399 pixel_to_glyph_coords (f, XINT (event->x), XINT (event->y),
5400 &column, &row, NULL, 1);
7b4aedb9 5401
eef045bf
RS
5402 /* In the non-toolkit version, clicks on the menu bar
5403 are ordinary button events in the event buffer.
5404 Distinguish them, and invoke the menu.
5405
5406 (In the toolkit version, the toolkit handles the menu bar
5407 and Emacs doesn't know about it until after the user
5408 makes a selection.) */
2ee250ec
RS
5409 if (row >= 0 && row < FRAME_MENU_BAR_LINES (f)
5410 && (event->modifiers & down_modifier))
bb936752 5411 {
b7c49376 5412 Lisp_Object items, item;
0a0e8fe6
RS
5413 int hpos;
5414 int i;
5415
2ee250ec 5416#if 0
0a0e8fe6
RS
5417 /* Activate the menu bar on the down event. If the
5418 up event comes in before the menu code can deal with it,
5419 just ignore it. */
5420 if (! (event->modifiers & down_modifier))
5421 return Qnil;
2ee250ec 5422#endif
0aafc975 5423
7ee32cda 5424 /* Find the menu bar item under `column'. */
f2ae6b3f 5425 item = Qnil;
5ec75a55 5426 items = FRAME_MENU_BAR_ITEMS (f);
35b3402f 5427 for (i = 0; i < XVECTOR (items)->size; i += 4)
5ec75a55
RS
5428 {
5429 Lisp_Object pos, string;
129004d3
GM
5430 string = AREF (items, i + 1);
5431 pos = AREF (items, i + 3);
b7c49376
RS
5432 if (NILP (string))
5433 break;
9e20143a 5434 if (column >= XINT (pos)
d5db4077 5435 && column < XINT (pos) + SCHARS (string))
b7c49376 5436 {
129004d3 5437 item = AREF (items, i);
b7c49376
RS
5438 break;
5439 }
5ec75a55 5440 }
9e20143a 5441
7ee32cda
GM
5442 /* ELisp manual 2.4b says (x y) are window relative but
5443 code says they are frame-relative. */
5ec75a55
RS
5444 position
5445 = Fcons (event->frame_or_window,
5446 Fcons (Qmenu_bar,
5447 Fcons (Fcons (event->x, event->y),
5448 Fcons (make_number (event->timestamp),
5449 Qnil))));
5450
b7c49376 5451 return Fcons (item, Fcons (position, Qnil));
5ec75a55 5452 }
488dd4c4 5453#endif /* not USE_X_TOOLKIT && not USE_GTK */
0aafc975 5454
3d566707
KS
5455 position = make_lispy_position (f, &event->x, &event->y,
5456 event->timestamp);
284f4730 5457 }
7ee32cda 5458#ifndef USE_TOOLKIT_SCROLL_BARS
7b4aedb9 5459 else
88cb0656 5460 {
7ee32cda 5461 /* It's a scrollbar click. */
3d566707 5462 Lisp_Object window;
9e20143a
RS
5463 Lisp_Object portion_whole;
5464 Lisp_Object part;
5465
5466 window = event->frame_or_window;
5467 portion_whole = Fcons (event->x, event->y);
5468 part = *scroll_bar_parts[(int) event->part];
7b4aedb9 5469
db08707d
RS
5470 position
5471 = Fcons (window,
5472 Fcons (Qvertical_scroll_bar,
5473 Fcons (portion_whole,
5474 Fcons (make_number (event->timestamp),
5475 Fcons (part, Qnil)))));
88cb0656 5476 }
7ee32cda 5477#endif /* not USE_TOOLKIT_SCROLL_BARS */
88cb0656 5478
129004d3 5479 if (button >= ASIZE (button_down_location))
8e1e4240
GM
5480 {
5481 button_down_location = larger_vector (button_down_location,
5482 button + 1, Qnil);
5483 mouse_syms = larger_vector (mouse_syms, button + 1, Qnil);
5484 }
c60ee5e7 5485
129004d3 5486 start_pos_ptr = &AREF (button_down_location, button);
dbc4e1c1
JB
5487 start_pos = *start_pos_ptr;
5488 *start_pos_ptr = Qnil;
7b4aedb9 5489
c5cf2109
GM
5490 {
5491 /* On window-system frames, use the value of
5492 double-click-fuzz as is. On other frames, interpret it
5493 as a multiple of 1/8 characters. */
5494 struct frame *f;
5495 int fuzz;
5496
5497 if (WINDOWP (event->frame_or_window))
5498 f = XFRAME (XWINDOW (event->frame_or_window)->frame);
5499 else if (FRAMEP (event->frame_or_window))
5500 f = XFRAME (event->frame_or_window);
5501 else
5502 abort ();
5503
5504 if (FRAME_WINDOW_P (f))
5505 fuzz = double_click_fuzz;
5506 else
5507 fuzz = double_click_fuzz / 8;
5508
5509 is_double = (button == last_mouse_button
5510 && (abs (XINT (event->x) - last_mouse_x) <= fuzz)
5511 && (abs (XINT (event->y) - last_mouse_y) <= fuzz)
5512 && button_down_time != 0
5513 && (EQ (Vdouble_click_time, Qt)
5514 || (INTEGERP (Vdouble_click_time)
5515 && ((int)(event->timestamp - button_down_time)
5516 < XINT (Vdouble_click_time)))));
5517 }
c60ee5e7 5518
559f9d04
RS
5519 last_mouse_button = button;
5520 last_mouse_x = XINT (event->x);
5521 last_mouse_y = XINT (event->y);
5522
7b4aedb9
JB
5523 /* If this is a button press, squirrel away the location, so
5524 we can decide later whether it was a click or a drag. */
5525 if (event->modifiers & down_modifier)
559f9d04
RS
5526 {
5527 if (is_double)
5528 {
5529 double_click_count++;
5530 event->modifiers |= ((double_click_count > 2)
5531 ? triple_modifier
5532 : double_modifier);
5533 }
5534 else
5535 double_click_count = 1;
5536 button_down_time = event->timestamp;
5537 *start_pos_ptr = Fcopy_alist (position);
5538 }
7b4aedb9 5539
88cb0656 5540 /* Now we're releasing a button - check the co-ordinates to
7b4aedb9 5541 see if this was a click or a drag. */
88cb0656
JB
5542 else if (event->modifiers & up_modifier)
5543 {
129004d3
GM
5544 /* If we did not see a down before this up, ignore the up.
5545 Probably this happened because the down event chose a
5546 menu item. It would be an annoyance to treat the
5547 release of the button that chose the menu item as a
5548 separate event. */
48e416d4 5549
8c18cbfb 5550 if (!CONSP (start_pos))
48e416d4
RS
5551 return Qnil;
5552
88cb0656 5553 event->modifiers &= ~up_modifier;
48e416d4 5554#if 0 /* Formerly we treated an up with no down as a click event. */
8c18cbfb 5555 if (!CONSP (start_pos))
dbc4e1c1
JB
5556 event->modifiers |= click_modifier;
5557 else
48e416d4 5558#endif
dbc4e1c1 5559 {
9b8eb840 5560 Lisp_Object down;
d31053f9 5561 EMACS_INT xdiff = double_click_fuzz, ydiff = double_click_fuzz;
dbc4e1c1 5562
d31053f9
RS
5563 /* The third element of every position
5564 should be the (x,y) pair. */
5565 down = Fcar (Fcdr (Fcdr (start_pos)));
7a6a97d7
SM
5566 if (CONSP (down)
5567 && INTEGERP (XCAR (down)) && INTEGERP (XCDR (down)))
d31053f9 5568 {
4156359e
SM
5569 xdiff = XINT (event->x) - XINT (XCAR (down));
5570 ydiff = XINT (event->y) - XINT (XCDR (down));
d31053f9
RS
5571 }
5572
5573 if (xdiff < double_click_fuzz && xdiff > - double_click_fuzz
4156359e
SM
5574 && ydiff < double_click_fuzz && ydiff > - double_click_fuzz
5575 /* Maybe the mouse has moved a lot, caused scrolling, and
5576 eventually ended up at the same screen position (but
5577 not buffer position) in which case it is a drag, not
5578 a click. */
5579 /* FIXME: OTOH if the buffer position has changed
5580 because of a timer or process filter rather than
5581 because of mouse movement, it should be considered as
5582 a click. But mouse-drag-region completely ignores
5583 this case and it hasn't caused any real problem, so
5584 it's probably OK to ignore it as well. */
5585 && EQ (Fcar (Fcdr (start_pos)), Fcar (Fcdr (position))))
d31053f9 5586 /* Mouse hasn't moved (much). */
129004d3 5587 event->modifiers |= click_modifier;
fbcd35bd
JB
5588 else
5589 {
d31053f9
RS
5590 button_down_time = 0;
5591 event->modifiers |= drag_modifier;
fbcd35bd 5592 }
c60ee5e7 5593
bc536d84
RS
5594 /* Don't check is_double; treat this as multiple
5595 if the down-event was multiple. */
5596 if (double_click_count > 1)
5597 event->modifiers |= ((double_click_count > 2)
5598 ? triple_modifier
5599 : double_modifier);
dbc4e1c1 5600 }
88cb0656
JB
5601 }
5602 else
5603 /* Every mouse event should either have the down_modifier or
7b4aedb9 5604 the up_modifier set. */
88cb0656
JB
5605 abort ();
5606
88cb0656 5607 {
7b4aedb9 5608 /* Get the symbol we should use for the mouse click. */
9b8eb840
KH
5609 Lisp_Object head;
5610
5611 head = modify_event_symbol (button,
5612 event->modifiers,
8e1e4240
GM
5613 Qmouse_click, Vlispy_mouse_stem,
5614 NULL,
5615 &mouse_syms,
5616 XVECTOR (mouse_syms)->size);
88cb0656 5617 if (event->modifiers & drag_modifier)
dbc4e1c1
JB
5618 return Fcons (head,
5619 Fcons (start_pos,
5620 Fcons (position,
5621 Qnil)));
fbcd35bd
JB
5622 else if (event->modifiers & (double_modifier | triple_modifier))
5623 return Fcons (head,
5624 Fcons (position,
5625 Fcons (make_number (double_click_count),
5626 Qnil)));
88cb0656
JB
5627 else
5628 return Fcons (head,
7b4aedb9 5629 Fcons (position,
88cb0656
JB
5630 Qnil));
5631 }
284f4730 5632 }
db08707d 5633
8006e4bb
JR
5634 case WHEEL_EVENT:
5635 {
5636 Lisp_Object position;
8006e4bb 5637 Lisp_Object head;
2320865d 5638
87d386ff 5639 /* Build the position as appropriate for this mouse click. */
87d386ff 5640 struct frame *f = XFRAME (event->frame_or_window);
87d386ff
JR
5641
5642 /* Ignore wheel events that were made on frame that have been
5643 deleted. */
5644 if (! FRAME_LIVE_P (f))
5645 return Qnil;
5646
3d566707
KS
5647 position = make_lispy_position (f, &event->x, &event->y,
5648 event->timestamp);
87d386ff
JR
5649
5650 /* Set double or triple modifiers to indicate the wheel speed. */
5651 {
5652 /* On window-system frames, use the value of
5653 double-click-fuzz as is. On other frames, interpret it
5654 as a multiple of 1/8 characters. */
5655 struct frame *f;
5656 int fuzz;
5657 int is_double;
5658
5659 if (WINDOWP (event->frame_or_window))
5660 f = XFRAME (XWINDOW (event->frame_or_window)->frame);
5661 else if (FRAMEP (event->frame_or_window))
5662 f = XFRAME (event->frame_or_window);
5663 else
5664 abort ();
5665
5666 if (FRAME_WINDOW_P (f))
5667 fuzz = double_click_fuzz;
5668 else
5669 fuzz = double_click_fuzz / 8;
5670
5671 is_double = (last_mouse_button < 0
5672 && (abs (XINT (event->x) - last_mouse_x) <= fuzz)
5673 && (abs (XINT (event->y) - last_mouse_y) <= fuzz)
5674 && button_down_time != 0
5675 && (EQ (Vdouble_click_time, Qt)
5676 || (INTEGERP (Vdouble_click_time)
5677 && ((int)(event->timestamp - button_down_time)
5678 < XINT (Vdouble_click_time)))));
5679 if (is_double)
5680 {
5681 double_click_count++;
5682 event->modifiers |= ((double_click_count > 2)
5683 ? triple_modifier
5684 : double_modifier);
5685 }
5686 else
5687 {
5688 double_click_count = 1;
5689 event->modifiers |= click_modifier;
5690 }
5691
5692 button_down_time = event->timestamp;
5693 /* Use a negative value to distinguish wheel from mouse button. */
5694 last_mouse_button = -1;
5695 last_mouse_x = XINT (event->x);
5696 last_mouse_y = XINT (event->y);
5697 }
5698
5699 {
5700 int symbol_num;
5701
5702 if (event->modifiers & up_modifier)
5703 {
5704 /* Emit a wheel-up event. */
5705 event->modifiers &= ~up_modifier;
5706 symbol_num = 0;
5707 }
5708 else if (event->modifiers & down_modifier)
5709 {
5710 /* Emit a wheel-down event. */
5711 event->modifiers &= ~down_modifier;
5712 symbol_num = 1;
5713 }
5714 else
5715 /* Every wheel event should either have the down_modifier or
5716 the up_modifier set. */
5717 abort ();
5718
5719 /* Get the symbol we should use for the wheel event. */
5720 head = modify_event_symbol (symbol_num,
5721 event->modifiers,
5722 Qmouse_click,
5723 Qnil,
5724 lispy_wheel_names,
5725 &wheel_syms,
5726 ASIZE (wheel_syms));
5727 }
5728
5729 if (event->modifiers & (double_modifier | triple_modifier))
5730 return Fcons (head,
5731 Fcons (position,
5732 Fcons (make_number (double_click_count),
5733 Qnil)));
5734 else
5735 return Fcons (head,
5736 Fcons (position,
5737 Qnil));
8006e4bb
JR
5738 }
5739
5740
05be3964 5741#ifdef USE_TOOLKIT_SCROLL_BARS
7ee32cda
GM
5742
5743 /* We don't have down and up events if using toolkit scroll bars,
5744 so make this always a click event. Store in the `part' of
5745 the Lisp event a symbol which maps to the following actions:
5746
5747 `above_handle' page up
5748 `below_handle' page down
5749 `up' line up
5750 `down' line down
5751 `top' top of buffer
5752 `bottom' bottom of buffer
5753 `handle' thumb has been dragged.
5754 `end-scroll' end of interaction with scroll bar
5755
5756 The incoming input_event contains in its `part' member an
5757 index of type `enum scroll_bar_part' which we can use as an
5758 index in scroll_bar_parts to get the appropriate symbol. */
c60ee5e7 5759
3b8f9651 5760 case SCROLL_BAR_CLICK_EVENT:
7ee32cda
GM
5761 {
5762 Lisp_Object position, head, window, portion_whole, part;
5763
5764 window = event->frame_or_window;
5765 portion_whole = Fcons (event->x, event->y);
5766 part = *scroll_bar_parts[(int) event->part];
5767
5768 position
5769 = Fcons (window,
5770 Fcons (Qvertical_scroll_bar,
5771 Fcons (portion_whole,
5772 Fcons (make_number (event->timestamp),
5773 Fcons (part, Qnil)))));
5774
5775 /* Always treat scroll bar events as clicks. */
5776 event->modifiers |= click_modifier;
05be3964 5777 event->modifiers &= ~up_modifier;
7ee32cda 5778
257f40f2
JD
5779 if (event->code >= ASIZE (mouse_syms))
5780 mouse_syms = larger_vector (mouse_syms, event->code + 1, Qnil);
5781
7ee32cda
GM
5782 /* Get the symbol we should use for the mouse click. */
5783 head = modify_event_symbol (event->code,
5784 event->modifiers,
14e40288 5785 Qmouse_click,
8e1e4240
GM
5786 Vlispy_mouse_stem,
5787 NULL, &mouse_syms,
5788 XVECTOR (mouse_syms)->size);
7ee32cda
GM
5789 return Fcons (head, Fcons (position, Qnil));
5790 }
c60ee5e7 5791
7ee32cda
GM
5792#endif /* USE_TOOLKIT_SCROLL_BARS */
5793
db08707d 5794#ifdef WINDOWSNT
3b8f9651 5795 case W32_SCROLL_BAR_CLICK_EVENT:
db08707d
RS
5796 {
5797 int button = event->code;
5798 int is_double;
5799 Lisp_Object position;
5800 Lisp_Object *start_pos_ptr;
5801 Lisp_Object start_pos;
5802
db08707d
RS
5803 {
5804 Lisp_Object window;
5805 Lisp_Object portion_whole;
5806 Lisp_Object part;
5807
5808 window = event->frame_or_window;
5809 portion_whole = Fcons (event->x, event->y);
5810 part = *scroll_bar_parts[(int) event->part];
5811
e8886a1d
RS
5812 position
5813 = Fcons (window,
5814 Fcons (Qvertical_scroll_bar,
5815 Fcons (portion_whole,
5816 Fcons (make_number (event->timestamp),
5817 Fcons (part, Qnil)))));
db08707d
RS
5818 }
5819
fbd6baed 5820 /* Always treat W32 scroll bar events as clicks. */
db08707d
RS
5821 event->modifiers |= click_modifier;
5822
5823 {
5824 /* Get the symbol we should use for the mouse click. */
5825 Lisp_Object head;
5826
5827 head = modify_event_symbol (button,
5828 event->modifiers,
c60ee5e7 5829 Qmouse_click,
8e1e4240
GM
5830 Vlispy_mouse_stem,
5831 NULL, &mouse_syms,
5832 XVECTOR (mouse_syms)->size);
db08707d
RS
5833 return Fcons (head,
5834 Fcons (position,
5835 Qnil));
5836 }
5837 }
1e7c162f 5838#endif /* WINDOWSNT */
a24dc617 5839
3b8f9651 5840 case DRAG_N_DROP_EVENT:
a24dc617 5841 {
a24dc617 5842 FRAME_PTR f;
3d566707 5843 Lisp_Object head, position;
a24dc617 5844 Lisp_Object files;
a24dc617 5845
82de1de9
YM
5846 f = XFRAME (event->frame_or_window);
5847 files = event->arg;
a24dc617
RS
5848
5849 /* Ignore mouse events that were made on frames that
5850 have been deleted. */
5851 if (! FRAME_LIVE_P (f))
5852 return Qnil;
afabdbe5 5853
3d566707
KS
5854 position = make_lispy_position (f, &event->x, &event->y,
5855 event->timestamp);
5856
5857 head = modify_event_symbol (0, event->modifiers,
5858 Qdrag_n_drop, Qnil,
5859 lispy_drag_n_drop_names,
5860 &drag_n_drop_syms, 1);
5861 return Fcons (head,
5862 Fcons (position,
5863 Fcons (files,
5864 Qnil)));
a24dc617 5865 }
514354e9 5866#endif /* HAVE_MOUSE */
284f4730 5867
488dd4c4
JD
5868#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) || defined (MAC_OS) \
5869 || defined (USE_GTK)
da8f7368
GM
5870 case MENU_BAR_EVENT:
5871 if (EQ (event->arg, event->frame_or_window))
5872 /* This is the prefix key. We translate this to
5873 `(menu_bar)' because the code in keyboard.c for menu
5874 events, which we use, relies on this. */
5875 return Fcons (Qmenu_bar, Qnil);
5876 return event->arg;
2470a66f
KH
5877#endif
5878
a4e19f6e
SM
5879 case SELECT_WINDOW_EVENT:
5880 /* Make an event (select-window (WINDOW)). */
5881 return Fcons (Qselect_window,
5882 Fcons (Fcons (event->frame_or_window, Qnil),
5883 Qnil));
5884
9ea173e8 5885 case TOOL_BAR_EVENT:
da8f7368
GM
5886 if (EQ (event->arg, event->frame_or_window))
5887 /* This is the prefix key. We translate this to
27fd22dc 5888 `(tool_bar)' because the code in keyboard.c for tool bar
da8f7368
GM
5889 events, which we use, relies on this. */
5890 return Fcons (Qtool_bar, Qnil);
5891 else if (SYMBOLP (event->arg))
5892 return apply_modifiers (event->modifiers, event->arg);
5893 return event->arg;
5894
5895 case USER_SIGNAL_EVENT:
5bf68f6e
AS
5896 /* A user signal. */
5897 return *lispy_user_signals[event->code];
c60ee5e7 5898
3b8f9651 5899 case SAVE_SESSION_EVENT:
4ebc27a5 5900 return Qsave_session;
c60ee5e7 5901
f66c49cc
YM
5902#ifdef MAC_OS
5903 case MAC_APPLE_EVENT:
5904 {
5905 Lisp_Object spec[2];
5906
5907 spec[0] = event->x;
5908 spec[1] = event->y;
5909 return Fcons (Qmac_apple_event,
5910 Fcons (Fvector (2, spec),
2e1df0e6 5911 Fcons (event->arg, Qnil)));
f66c49cc
YM
5912 }
5913#endif
5914
284f4730
JB
5915 /* The 'kind' field of the event is something we don't recognize. */
5916 default:
48e416d4 5917 abort ();
284f4730
JB
5918 }
5919}
5920
514354e9 5921#ifdef HAVE_MOUSE
6cbff1cb 5922
284f4730 5923static Lisp_Object
7b4aedb9 5924make_lispy_movement (frame, bar_window, part, x, y, time)
ff11dfa1 5925 FRAME_PTR frame;
7b4aedb9 5926 Lisp_Object bar_window;
3c370943 5927 enum scroll_bar_part part;
284f4730 5928 Lisp_Object x, y;
e5d77022 5929 unsigned long time;
284f4730 5930{
3c370943 5931 /* Is it a scroll bar movement? */
7b4aedb9 5932 if (frame && ! NILP (bar_window))
4bb994d1 5933 {
9b8eb840 5934 Lisp_Object part_sym;
4bb994d1 5935
9b8eb840 5936 part_sym = *scroll_bar_parts[(int) part];
3c370943 5937 return Fcons (Qscroll_bar_movement,
7b4aedb9 5938 (Fcons (Fcons (bar_window,
3c370943 5939 Fcons (Qvertical_scroll_bar,
4bb994d1
JB
5940 Fcons (Fcons (x, y),
5941 Fcons (make_number (time),
cb5df6ae 5942 Fcons (part_sym,
4bb994d1
JB
5943 Qnil))))),
5944 Qnil)));
5945 }
5946
5947 /* Or is it an ordinary mouse movement? */
284f4730
JB
5948 else
5949 {
3d566707 5950 Lisp_Object position;
4bb994d1 5951
3d566707 5952 position = make_lispy_position (frame, &x, &y, time);
284f4730 5953
4bb994d1 5954 return Fcons (Qmouse_movement,
3d566707 5955 Fcons (position,
4bb994d1
JB
5956 Qnil));
5957 }
284f4730
JB
5958}
5959
514354e9 5960#endif /* HAVE_MOUSE */
6cbff1cb 5961
cd21b839
JB
5962/* Construct a switch frame event. */
5963static Lisp_Object
5964make_lispy_switch_frame (frame)
5965 Lisp_Object frame;
5966{
5967 return Fcons (Qswitch_frame, Fcons (frame, Qnil));
5968}
0a7f1fc0
JB
5969\f
5970/* Manipulating modifiers. */
284f4730 5971
0a7f1fc0 5972/* Parse the name of SYMBOL, and return the set of modifiers it contains.
284f4730 5973
0a7f1fc0
JB
5974 If MODIFIER_END is non-zero, set *MODIFIER_END to the position in
5975 SYMBOL's name of the end of the modifiers; the string from this
5976 position is the unmodified symbol name.
284f4730 5977
0a7f1fc0 5978 This doesn't use any caches. */
6da3dd3a 5979
0a7f1fc0
JB
5980static int
5981parse_modifiers_uncached (symbol, modifier_end)
284f4730 5982 Lisp_Object symbol;
0a7f1fc0 5983 int *modifier_end;
284f4730 5984{
1b049b51 5985 Lisp_Object name;
284f4730
JB
5986 int i;
5987 int modifiers;
284f4730 5988
b7826503 5989 CHECK_SYMBOL (symbol);
df0f2ba1 5990
284f4730 5991 modifiers = 0;
1b049b51 5992 name = SYMBOL_NAME (symbol);
284f4730 5993
1b049b51 5994 for (i = 0; i+2 <= SBYTES (name); )
6da3dd3a
RS
5995 {
5996 int this_mod_end = 0;
5997 int this_mod = 0;
284f4730 5998
6da3dd3a
RS
5999 /* See if the name continues with a modifier word.
6000 Check that the word appears, but don't check what follows it.
6001 Set this_mod and this_mod_end to record what we find. */
fce33686 6002
1b049b51 6003 switch (SREF (name, i))
6da3dd3a
RS
6004 {
6005#define SINGLE_LETTER_MOD(BIT) \
6006 (this_mod_end = i + 1, this_mod = BIT)
6007
6da3dd3a
RS
6008 case 'A':
6009 SINGLE_LETTER_MOD (alt_modifier);
6010 break;
284f4730 6011
6da3dd3a
RS
6012 case 'C':
6013 SINGLE_LETTER_MOD (ctrl_modifier);
6014 break;
284f4730 6015
6da3dd3a
RS
6016 case 'H':
6017 SINGLE_LETTER_MOD (hyper_modifier);
6018 break;
6019
6da3dd3a
RS
6020 case 'M':
6021 SINGLE_LETTER_MOD (meta_modifier);
6022 break;
6023
6da3dd3a
RS
6024 case 'S':
6025 SINGLE_LETTER_MOD (shift_modifier);
6026 break;
6027
6028 case 's':
6da3dd3a
RS
6029 SINGLE_LETTER_MOD (super_modifier);
6030 break;
6031
0a7f1fc0 6032#undef SINGLE_LETTER_MOD
65470b52
SM
6033
6034#define MULTI_LETTER_MOD(BIT, NAME, LEN) \
6035 if (i + LEN + 1 <= SBYTES (name) \
6036 && ! strncmp (SDATA (name) + i, NAME, LEN)) \
6037 { \
6038 this_mod_end = i + LEN; \
6039 this_mod = BIT; \
6040 }
6041
6042 case 'd':
6043 MULTI_LETTER_MOD (drag_modifier, "drag", 4);
6044 MULTI_LETTER_MOD (down_modifier, "down", 4);
6045 MULTI_LETTER_MOD (double_modifier, "double", 6);
6046 break;
6047
6048 case 't':
6049 MULTI_LETTER_MOD (triple_modifier, "triple", 6);
6050 break;
6051#undef MULTI_LETTER_MOD
6052
6da3dd3a
RS
6053 }
6054
6055 /* If we found no modifier, stop looking for them. */
6056 if (this_mod_end == 0)
6057 break;
6058
6059 /* Check there is a dash after the modifier, so that it
6060 really is a modifier. */
1b049b51
KR
6061 if (this_mod_end >= SBYTES (name)
6062 || SREF (name, this_mod_end) != '-')
6da3dd3a
RS
6063 break;
6064
6065 /* This modifier is real; look for another. */
6066 modifiers |= this_mod;
6067 i = this_mod_end + 1;
6068 }
284f4730 6069
0a7f1fc0 6070 /* Should we include the `click' modifier? */
fbcd35bd
JB
6071 if (! (modifiers & (down_modifier | drag_modifier
6072 | double_modifier | triple_modifier))
1b049b51
KR
6073 && i + 7 == SBYTES (name)
6074 && strncmp (SDATA (name) + i, "mouse-", 6) == 0
6075 && ('0' <= SREF (name, i + 6) && SREF (name, i + 6) <= '9'))
0a7f1fc0
JB
6076 modifiers |= click_modifier;
6077
6078 if (modifier_end)
6079 *modifier_end = i;
6080
6081 return modifiers;
6082}
6083
0a7f1fc0
JB
6084/* Return a symbol whose name is the modifier prefixes for MODIFIERS
6085 prepended to the string BASE[0..BASE_LEN-1].
6086 This doesn't use any caches. */
6087static Lisp_Object
301738ed 6088apply_modifiers_uncached (modifiers, base, base_len, base_len_byte)
0a7f1fc0
JB
6089 int modifiers;
6090 char *base;
301738ed 6091 int base_len, base_len_byte;
0a7f1fc0
JB
6092{
6093 /* Since BASE could contain nulls, we can't use intern here; we have
6094 to use Fintern, which expects a genuine Lisp_String, and keeps a
6095 reference to it. */
301738ed
RS
6096 char *new_mods
6097 = (char *) alloca (sizeof ("A-C-H-M-S-s-down-drag-double-triple-"));
0a7f1fc0 6098 int mod_len;
284f4730 6099
284f4730 6100 {
0a7f1fc0
JB
6101 char *p = new_mods;
6102
6103 /* Only the event queue may use the `up' modifier; it should always
6104 be turned into a click or drag event before presented to lisp code. */
6105 if (modifiers & up_modifier)
6106 abort ();
6107
6108 if (modifiers & alt_modifier) { *p++ = 'A'; *p++ = '-'; }
6109 if (modifiers & ctrl_modifier) { *p++ = 'C'; *p++ = '-'; }
6110 if (modifiers & hyper_modifier) { *p++ = 'H'; *p++ = '-'; }
6111 if (modifiers & meta_modifier) { *p++ = 'M'; *p++ = '-'; }
6112 if (modifiers & shift_modifier) { *p++ = 'S'; *p++ = '-'; }
86e5706b 6113 if (modifiers & super_modifier) { *p++ = 's'; *p++ = '-'; }
fbcd35bd
JB
6114 if (modifiers & double_modifier) { strcpy (p, "double-"); p += 7; }
6115 if (modifiers & triple_modifier) { strcpy (p, "triple-"); p += 7; }
559f9d04
RS
6116 if (modifiers & down_modifier) { strcpy (p, "down-"); p += 5; }
6117 if (modifiers & drag_modifier) { strcpy (p, "drag-"); p += 5; }
0a7f1fc0
JB
6118 /* The click modifier is denoted by the absence of other modifiers. */
6119
6120 *p = '\0';
6121
6122 mod_len = p - new_mods;
6123 }
284f4730 6124
0a7f1fc0 6125 {
9b8eb840 6126 Lisp_Object new_name;
df0f2ba1 6127
301738ed
RS
6128 new_name = make_uninit_multibyte_string (mod_len + base_len,
6129 mod_len + base_len_byte);
d5db4077
KR
6130 bcopy (new_mods, SDATA (new_name), mod_len);
6131 bcopy (base, SDATA (new_name) + mod_len, base_len_byte);
284f4730
JB
6132
6133 return Fintern (new_name, Qnil);
6134 }
6135}
6136
6137
0a7f1fc0
JB
6138static char *modifier_names[] =
6139{
fbcd35bd 6140 "up", "down", "drag", "click", "double", "triple", 0, 0,
f335fabe 6141 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86e5706b 6142 0, 0, "alt", "super", "hyper", "shift", "control", "meta"
0a7f1fc0 6143};
80645119 6144#define NUM_MOD_NAMES (sizeof (modifier_names) / sizeof (modifier_names[0]))
0a7f1fc0
JB
6145
6146static Lisp_Object modifier_symbols;
6147
6148/* Return the list of modifier symbols corresponding to the mask MODIFIERS. */
6149static Lisp_Object
6150lispy_modifier_list (modifiers)
6151 int modifiers;
6152{
6153 Lisp_Object modifier_list;
6154 int i;
6155
6156 modifier_list = Qnil;
80645119 6157 for (i = 0; (1<<i) <= modifiers && i < NUM_MOD_NAMES; i++)
0a7f1fc0 6158 if (modifiers & (1<<i))
80645119
JB
6159 modifier_list = Fcons (XVECTOR (modifier_symbols)->contents[i],
6160 modifier_list);
0a7f1fc0
JB
6161
6162 return modifier_list;
6163}
6164
6165
6166/* Parse the modifiers on SYMBOL, and return a list like (UNMODIFIED MASK),
6167 where UNMODIFIED is the unmodified form of SYMBOL,
6168 MASK is the set of modifiers present in SYMBOL's name.
6169 This is similar to parse_modifiers_uncached, but uses the cache in
6170 SYMBOL's Qevent_symbol_element_mask property, and maintains the
6171 Qevent_symbol_elements property. */
3d31316f 6172
1161d367 6173Lisp_Object
0a7f1fc0
JB
6174parse_modifiers (symbol)
6175 Lisp_Object symbol;
6176{
9b8eb840 6177 Lisp_Object elements;
0a7f1fc0 6178
9b8eb840 6179 elements = Fget (symbol, Qevent_symbol_element_mask);
0a7f1fc0
JB
6180 if (CONSP (elements))
6181 return elements;
6182 else
6183 {
6184 int end;
ec0faad2 6185 int modifiers = parse_modifiers_uncached (symbol, &end);
9b8eb840 6186 Lisp_Object unmodified;
0a7f1fc0
JB
6187 Lisp_Object mask;
6188
d5db4077
KR
6189 unmodified = Fintern (make_string (SDATA (SYMBOL_NAME (symbol)) + end,
6190 SBYTES (SYMBOL_NAME (symbol)) - end),
9b8eb840
KH
6191 Qnil);
6192
e22216b8 6193 if (modifiers & ~INTMASK)
734fef94 6194 abort ();
bb9e9bed 6195 XSETFASTINT (mask, modifiers);
0a7f1fc0
JB
6196 elements = Fcons (unmodified, Fcons (mask, Qnil));
6197
6198 /* Cache the parsing results on SYMBOL. */
6199 Fput (symbol, Qevent_symbol_element_mask,
6200 elements);
6201 Fput (symbol, Qevent_symbol_elements,
6202 Fcons (unmodified, lispy_modifier_list (modifiers)));
6203
6204 /* Since we know that SYMBOL is modifiers applied to unmodified,
6205 it would be nice to put that in unmodified's cache.
6206 But we can't, since we're not sure that parse_modifiers is
6207 canonical. */
6208
6209 return elements;
6210 }
6211}
6212
6213/* Apply the modifiers MODIFIERS to the symbol BASE.
6214 BASE must be unmodified.
6215
6216 This is like apply_modifiers_uncached, but uses BASE's
6217 Qmodifier_cache property, if present. It also builds
cd21b839
JB
6218 Qevent_symbol_elements properties, since it has that info anyway.
6219
6220 apply_modifiers copies the value of BASE's Qevent_kind property to
6221 the modified symbol. */
0a7f1fc0
JB
6222static Lisp_Object
6223apply_modifiers (modifiers, base)
6224 int modifiers;
6225 Lisp_Object base;
6226{
7b4aedb9 6227 Lisp_Object cache, index, entry, new_symbol;
0a7f1fc0 6228
80645119 6229 /* Mask out upper bits. We don't know where this value's been. */
e22216b8 6230 modifiers &= INTMASK;
80645119 6231
0a7f1fc0 6232 /* The click modifier never figures into cache indices. */
0a7f1fc0 6233 cache = Fget (base, Qmodifier_cache);
bb9e9bed 6234 XSETFASTINT (index, (modifiers & ~click_modifier));
697e4895 6235 entry = assq_no_quit (index, cache);
0a7f1fc0
JB
6236
6237 if (CONSP (entry))
7539e11f 6238 new_symbol = XCDR (entry);
7b4aedb9
JB
6239 else
6240 {
df0f2ba1 6241 /* We have to create the symbol ourselves. */
7b4aedb9 6242 new_symbol = apply_modifiers_uncached (modifiers,
d5db4077
KR
6243 SDATA (SYMBOL_NAME (base)),
6244 SCHARS (SYMBOL_NAME (base)),
6245 SBYTES (SYMBOL_NAME (base)));
7b4aedb9
JB
6246
6247 /* Add the new symbol to the base's cache. */
6248 entry = Fcons (index, new_symbol);
6249 Fput (base, Qmodifier_cache, Fcons (entry, cache));
6250
35fb885d
SM
6251 /* We have the parsing info now for free, so we could add it to
6252 the caches:
6253 XSETFASTINT (index, modifiers);
6254 Fput (new_symbol, Qevent_symbol_element_mask,
6255 Fcons (base, Fcons (index, Qnil)));
6256 Fput (new_symbol, Qevent_symbol_elements,
6257 Fcons (base, lispy_modifier_list (modifiers)));
6258 Sadly, this is only correct if `base' is indeed a base event,
6259 which is not necessarily the case. -stef */
7b4aedb9 6260 }
0a7f1fc0 6261
df0f2ba1 6262 /* Make sure this symbol is of the same kind as BASE.
7b4aedb9
JB
6263
6264 You'd think we could just set this once and for all when we
6265 intern the symbol above, but reorder_modifiers may call us when
6266 BASE's property isn't set right; we can't assume that just
80645119
JB
6267 because it has a Qmodifier_cache property it must have its
6268 Qevent_kind set right as well. */
7b4aedb9
JB
6269 if (NILP (Fget (new_symbol, Qevent_kind)))
6270 {
9b8eb840 6271 Lisp_Object kind;
7b4aedb9 6272
9b8eb840 6273 kind = Fget (base, Qevent_kind);
7b4aedb9
JB
6274 if (! NILP (kind))
6275 Fput (new_symbol, Qevent_kind, kind);
6276 }
6277
6278 return new_symbol;
0a7f1fc0
JB
6279}
6280
6281
6282/* Given a symbol whose name begins with modifiers ("C-", "M-", etc),
6283 return a symbol with the modifiers placed in the canonical order.
6284 Canonical order is alphabetical, except for down and drag, which
6285 always come last. The 'click' modifier is never written out.
6286
6287 Fdefine_key calls this to make sure that (for example) C-M-foo
6288 and M-C-foo end up being equivalent in the keymap. */
6289
6290Lisp_Object
6291reorder_modifiers (symbol)
6292 Lisp_Object symbol;
6293{
6294 /* It's hopefully okay to write the code this way, since everything
6295 will soon be in caches, and no consing will be done at all. */
9b8eb840 6296 Lisp_Object parsed;
0a7f1fc0 6297
9b8eb840 6298 parsed = parse_modifiers (symbol);
7539e11f
KR
6299 return apply_modifiers ((int) XINT (XCAR (XCDR (parsed))),
6300 XCAR (parsed));
0a7f1fc0
JB
6301}
6302
6303
284f4730
JB
6304/* For handling events, we often want to produce a symbol whose name
6305 is a series of modifier key prefixes ("M-", "C-", etcetera) attached
6306 to some base, like the name of a function key or mouse button.
6307 modify_event_symbol produces symbols of this sort.
6308
6309 NAME_TABLE should point to an array of strings, such that NAME_TABLE[i]
6310 is the name of the i'th symbol. TABLE_SIZE is the number of elements
6311 in the table.
6312
8e1e4240
GM
6313 Alternatively, NAME_ALIST_OR_STEM is either an alist mapping codes
6314 into symbol names, or a string specifying a name stem used to
a50e723f 6315 construct a symbol name or the form `STEM-N', where N is the decimal
8e1e4240
GM
6316 representation of SYMBOL_NUM. NAME_ALIST_OR_STEM is used if it is
6317 non-nil; otherwise NAME_TABLE is used.
80e4aa30 6318
284f4730
JB
6319 SYMBOL_TABLE should be a pointer to a Lisp_Object whose value will
6320 persist between calls to modify_event_symbol that it can use to
6321 store a cache of the symbols it's generated for this NAME_TABLE
80e4aa30 6322 before. The object stored there may be a vector or an alist.
284f4730
JB
6323
6324 SYMBOL_NUM is the number of the base name we want from NAME_TABLE.
df0f2ba1 6325
284f4730
JB
6326 MODIFIERS is a set of modifier bits (as given in struct input_events)
6327 whose prefixes should be applied to the symbol name.
6328
6329 SYMBOL_KIND is the value to be placed in the event_kind property of
df0f2ba1 6330 the returned symbol.
88cb0656
JB
6331
6332 The symbols we create are supposed to have an
eb8c3be9 6333 `event-symbol-elements' property, which lists the modifiers present
88cb0656
JB
6334 in the symbol's name. */
6335
284f4730 6336static Lisp_Object
8e1e4240 6337modify_event_symbol (symbol_num, modifiers, symbol_kind, name_alist_or_stem,
80e4aa30 6338 name_table, symbol_table, table_size)
284f4730
JB
6339 int symbol_num;
6340 unsigned modifiers;
6341 Lisp_Object symbol_kind;
8e1e4240 6342 Lisp_Object name_alist_or_stem;
284f4730
JB
6343 char **name_table;
6344 Lisp_Object *symbol_table;
2c834fb3 6345 unsigned int table_size;
284f4730 6346{
80e4aa30
RS
6347 Lisp_Object value;
6348 Lisp_Object symbol_int;
6349
2c834fb3
KH
6350 /* Get rid of the "vendor-specific" bit here. */
6351 XSETINT (symbol_int, symbol_num & 0xffffff);
284f4730
JB
6352
6353 /* Is this a request for a valid symbol? */
88cb0656 6354 if (symbol_num < 0 || symbol_num >= table_size)
0c2611c5 6355 return Qnil;
284f4730 6356
80e4aa30
RS
6357 if (CONSP (*symbol_table))
6358 value = Fcdr (assq_no_quit (symbol_int, *symbol_table));
6359
0a7f1fc0 6360 /* If *symbol_table doesn't seem to be initialized properly, fix that.
88cb0656 6361 *symbol_table should be a lisp vector TABLE_SIZE elements long,
4bb994d1
JB
6362 where the Nth element is the symbol for NAME_TABLE[N], or nil if
6363 we've never used that symbol before. */
80e4aa30 6364 else
88cb0656 6365 {
80e4aa30
RS
6366 if (! VECTORP (*symbol_table)
6367 || XVECTOR (*symbol_table)->size != table_size)
6368 {
6369 Lisp_Object size;
0a7f1fc0 6370
bb9e9bed 6371 XSETFASTINT (size, table_size);
80e4aa30
RS
6372 *symbol_table = Fmake_vector (size, Qnil);
6373 }
284f4730 6374
80e4aa30
RS
6375 value = XVECTOR (*symbol_table)->contents[symbol_num];
6376 }
284f4730 6377
0a7f1fc0 6378 /* Have we already used this symbol before? */
80e4aa30 6379 if (NILP (value))
284f4730 6380 {
0a7f1fc0 6381 /* No; let's create it. */
8e1e4240
GM
6382 if (CONSP (name_alist_or_stem))
6383 value = Fcdr_safe (Fassq (symbol_int, name_alist_or_stem));
6384 else if (STRINGP (name_alist_or_stem))
6385 {
d5db4077 6386 int len = SBYTES (name_alist_or_stem);
8e1e4240 6387 char *buf = (char *) alloca (len + 50);
cea5d0d4
AS
6388 sprintf (buf, "%s-%ld", SDATA (name_alist_or_stem),
6389 (long) XINT (symbol_int) + 1);
8e1e4240
GM
6390 value = intern (buf);
6391 }
2ff6714d 6392 else if (name_table != 0 && name_table[symbol_num])
80e4aa30 6393 value = intern (name_table[symbol_num]);
b64b4075 6394
e98a93eb 6395#ifdef HAVE_WINDOW_SYSTEM
2c834fb3
KH
6396 if (NILP (value))
6397 {
6398 char *name = x_get_keysym_name (symbol_num);
6399 if (name)
6400 value = intern (name);
6401 }
6402#endif
6403
b64b4075 6404 if (NILP (value))
d1f50460
RS
6405 {
6406 char buf[20];
6407 sprintf (buf, "key-%d", symbol_num);
80e4aa30 6408 value = intern (buf);
d1f50460 6409 }
0a7f1fc0 6410
80e4aa30 6411 if (CONSP (*symbol_table))
4205cb08 6412 *symbol_table = Fcons (Fcons (symbol_int, value), *symbol_table);
80e4aa30
RS
6413 else
6414 XVECTOR (*symbol_table)->contents[symbol_num] = value;
6415
df0f2ba1 6416 /* Fill in the cache entries for this symbol; this also
0a7f1fc0
JB
6417 builds the Qevent_symbol_elements property, which the user
6418 cares about. */
80e4aa30
RS
6419 apply_modifiers (modifiers & click_modifier, value);
6420 Fput (value, Qevent_kind, symbol_kind);
284f4730 6421 }
88cb0656 6422
0a7f1fc0 6423 /* Apply modifiers to that symbol. */
80e4aa30 6424 return apply_modifiers (modifiers, value);
284f4730 6425}
6da3dd3a
RS
6426\f
6427/* Convert a list that represents an event type,
6428 such as (ctrl meta backspace), into the usual representation of that
6429 event type as a number or a symbol. */
6430
a1706c30 6431DEFUN ("event-convert-list", Fevent_convert_list, Sevent_convert_list, 1, 1, 0,
4707d2d0
PJ
6432 doc: /* Convert the event description list EVENT-DESC to an event type.
6433EVENT-DESC should contain one base event type (a character or symbol)
6434and zero or more modifier names (control, meta, hyper, super, shift, alt,
6435drag, down, double or triple). The base must be last.
6436The return value is an event type (a character or symbol) which
6437has the same base event type and all the specified modifiers. */)
6438 (event_desc)
e57d8fd8 6439 Lisp_Object event_desc;
6da3dd3a
RS
6440{
6441 Lisp_Object base;
6442 int modifiers = 0;
6443 Lisp_Object rest;
6444
6445 base = Qnil;
e57d8fd8 6446 rest = event_desc;
6da3dd3a
RS
6447 while (CONSP (rest))
6448 {
6449 Lisp_Object elt;
6450 int this = 0;
6451
7539e11f
KR
6452 elt = XCAR (rest);
6453 rest = XCDR (rest);
6da3dd3a 6454
3d31316f 6455 /* Given a symbol, see if it is a modifier name. */
377f24f5 6456 if (SYMBOLP (elt) && CONSP (rest))
3d31316f 6457 this = parse_solitary_modifier (elt);
6da3dd3a
RS
6458
6459 if (this != 0)
6460 modifiers |= this;
6461 else if (!NILP (base))
6462 error ("Two bases given in one event");
6463 else
6464 base = elt;
6465
6da3dd3a
RS
6466 }
6467
3d31316f 6468 /* Let the symbol A refer to the character A. */
d5db4077 6469 if (SYMBOLP (base) && SCHARS (SYMBOL_NAME (base)) == 1)
4069e0f8 6470 XSETINT (base, SREF (SYMBOL_NAME (base), 0));
3d31316f 6471
6da3dd3a
RS
6472 if (INTEGERP (base))
6473 {
3d31316f
RS
6474 /* Turn (shift a) into A. */
6475 if ((modifiers & shift_modifier) != 0
6476 && (XINT (base) >= 'a' && XINT (base) <= 'z'))
6477 {
6478 XSETINT (base, XINT (base) - ('a' - 'A'));
6479 modifiers &= ~shift_modifier;
6480 }
6481
6482 /* Turn (control a) into C-a. */
6da3dd3a 6483 if (modifiers & ctrl_modifier)
3d31316f 6484 return make_number ((modifiers & ~ctrl_modifier)
6da3dd3a
RS
6485 | make_ctrl_char (XINT (base)));
6486 else
6487 return make_number (modifiers | XINT (base));
6488 }
6489 else if (SYMBOLP (base))
6490 return apply_modifiers (modifiers, base);
6491 else
8c907a56
GM
6492 {
6493 error ("Invalid base event");
6494 return Qnil;
6495 }
6da3dd3a
RS
6496}
6497
3d31316f
RS
6498/* Try to recognize SYMBOL as a modifier name.
6499 Return the modifier flag bit, or 0 if not recognized. */
6500
6501static int
6502parse_solitary_modifier (symbol)
6503 Lisp_Object symbol;
6504{
1b049b51 6505 Lisp_Object name = SYMBOL_NAME (symbol);
3d31316f 6506
1b049b51 6507 switch (SREF (name, 0))
3d31316f
RS
6508 {
6509#define SINGLE_LETTER_MOD(BIT) \
1b049b51 6510 if (SBYTES (name) == 1) \
3d31316f
RS
6511 return BIT;
6512
6513#define MULTI_LETTER_MOD(BIT, NAME, LEN) \
1b049b51
KR
6514 if (LEN == SBYTES (name) \
6515 && ! strncmp (SDATA (name), NAME, LEN)) \
3d31316f
RS
6516 return BIT;
6517
6518 case 'A':
6519 SINGLE_LETTER_MOD (alt_modifier);
6520 break;
6521
6522 case 'a':
6523 MULTI_LETTER_MOD (alt_modifier, "alt", 3);
6524 break;
6525
6526 case 'C':
6527 SINGLE_LETTER_MOD (ctrl_modifier);
6528 break;
6529
6530 case 'c':
6531 MULTI_LETTER_MOD (ctrl_modifier, "ctrl", 4);
6532 MULTI_LETTER_MOD (ctrl_modifier, "control", 7);
6533 break;
6534
6535 case 'H':
6536 SINGLE_LETTER_MOD (hyper_modifier);
6537 break;
6538
6539 case 'h':
6540 MULTI_LETTER_MOD (hyper_modifier, "hyper", 5);
6541 break;
6542
6543 case 'M':
6544 SINGLE_LETTER_MOD (meta_modifier);
6545 break;
6546
6547 case 'm':
6548 MULTI_LETTER_MOD (meta_modifier, "meta", 4);
6549 break;
6550
6551 case 'S':
6552 SINGLE_LETTER_MOD (shift_modifier);
6553 break;
6554
6555 case 's':
6556 MULTI_LETTER_MOD (shift_modifier, "shift", 5);
6557 MULTI_LETTER_MOD (super_modifier, "super", 5);
6558 SINGLE_LETTER_MOD (super_modifier);
6559 break;
6560
6561 case 'd':
6562 MULTI_LETTER_MOD (drag_modifier, "drag", 4);
6563 MULTI_LETTER_MOD (down_modifier, "down", 4);
6564 MULTI_LETTER_MOD (double_modifier, "double", 6);
6565 break;
6566
6567 case 't':
6568 MULTI_LETTER_MOD (triple_modifier, "triple", 6);
6569 break;
6570
6571#undef SINGLE_LETTER_MOD
6572#undef MULTI_LETTER_MOD
6573 }
6574
6575 return 0;
6576}
6577
6da3dd3a
RS
6578/* Return 1 if EVENT is a list whose elements are all integers or symbols.
6579 Such a list is not valid as an event,
6580 but it can be a Lucid-style event type list. */
6581
6582int
6583lucid_event_type_list_p (object)
6584 Lisp_Object object;
6585{
6586 Lisp_Object tail;
6587
6588 if (! CONSP (object))
6589 return 0;
902ae620
GM
6590
6591 if (EQ (XCAR (object), Qhelp_echo)
6592 || EQ (XCAR (object), Qvertical_line)
6593 || EQ (XCAR (object), Qmode_line)
6594 || EQ (XCAR (object), Qheader_line))
6595 return 0;
6da3dd3a 6596
7539e11f 6597 for (tail = object; CONSP (tail); tail = XCDR (tail))
6da3dd3a
RS
6598 {
6599 Lisp_Object elt;
7539e11f 6600 elt = XCAR (tail);
6da3dd3a
RS
6601 if (! (INTEGERP (elt) || SYMBOLP (elt)))
6602 return 0;
6603 }
6604
6605 return NILP (tail);
6606}
284f4730 6607\f
284f4730
JB
6608/* Store into *addr a value nonzero if terminal input chars are available.
6609 Serves the purpose of ioctl (0, FIONREAD, addr)
6610 but works even if FIONREAD does not exist.
d9d4c147
KH
6611 (In fact, this may actually read some input.)
6612
a2d5fca0
JD
6613 If READABLE_EVENTS_DO_TIMERS_NOW is set in FLAGS, actually run
6614 timer events that are ripe.
6615 If READABLE_EVENTS_FILTER_EVENTS is set in FLAGS, ignore internal
6616 events (FOCUS_IN_EVENT).
6617 If READABLE_EVENTS_IGNORE_SQUEEZABLES is set in FLAGS, ignore mouse
354344a2 6618 movements and toolkit scroll bar thumb drags. */
284f4730
JB
6619
6620static void
a2d5fca0 6621get_input_pending (addr, flags)
284f4730 6622 int *addr;
a2d5fca0 6623 int flags;
284f4730
JB
6624{
6625 /* First of all, have we already counted some input? */
a2d5fca0 6626 *addr = (!NILP (Vquit_flag) || readable_events (flags));
284f4730
JB
6627
6628 /* If input is being read as it arrives, and we have none, there is none. */
6629 if (*addr > 0 || (interrupt_input && ! interrupts_deferred))
6630 return;
6631
6632 /* Try to read some input and see how much we get. */
6633 gobble_input (0);
a2d5fca0 6634 *addr = (!NILP (Vquit_flag) || readable_events (flags));
284f4730
JB
6635}
6636
81931ba1 6637/* Interface to read_avail_input, blocking SIGIO or SIGALRM if necessary. */
284f4730 6638
07a59269 6639void
284f4730
JB
6640gobble_input (expected)
6641 int expected;
6642{
6643#ifndef VMS
6644#ifdef SIGIO
6645 if (interrupt_input)
6646 {
32676c08 6647 SIGMASKTYPE mask;
4f8aaa74 6648 mask = sigblock (sigmask (SIGIO));
284f4730 6649 read_avail_input (expected);
e065a56e 6650 sigsetmask (mask);
284f4730
JB
6651 }
6652 else
81931ba1
RS
6653#ifdef POLL_FOR_INPUT
6654 if (read_socket_hook && !interrupt_input && poll_suppress_count == 0)
6655 {
6656 SIGMASKTYPE mask;
4f8aaa74 6657 mask = sigblock (sigmask (SIGALRM));
81931ba1
RS
6658 read_avail_input (expected);
6659 sigsetmask (mask);
6660 }
6661 else
87485d6f 6662#endif
284f4730
JB
6663#endif
6664 read_avail_input (expected);
6665#endif
6666}
a8015ab5 6667
3b8f9651 6668/* Put a BUFFER_SWITCH_EVENT in the buffer
241ceaf7
RS
6669 so that read_key_sequence will notice the new current buffer. */
6670
07a59269 6671void
a8015ab5
KH
6672record_asynch_buffer_change ()
6673{
6674 struct input_event event;
a30f0615 6675 Lisp_Object tem;
1269a761 6676 EVENT_INIT (event);
a30f0615 6677
3b8f9651 6678 event.kind = BUFFER_SWITCH_EVENT;
a8015ab5 6679 event.frame_or_window = Qnil;
da8f7368 6680 event.arg = Qnil;
241ceaf7 6681
f65e6f7d 6682#ifdef subprocesses
a30f0615
RS
6683 /* We don't need a buffer-switch event unless Emacs is waiting for input.
6684 The purpose of the event is to make read_key_sequence look up the
6685 keymaps again. If we aren't in read_key_sequence, we don't need one,
6686 and the event could cause trouble by messing up (input-pending-p). */
6687 tem = Fwaiting_for_user_input_p ();
6688 if (NILP (tem))
6689 return;
f65e6f7d
RS
6690#else
6691 /* We never need these events if we have no asynchronous subprocesses. */
6692 return;
6693#endif
a30f0615 6694
241ceaf7
RS
6695 /* Make sure no interrupt happens while storing the event. */
6696#ifdef SIGIO
6697 if (interrupt_input)
6698 {
6699 SIGMASKTYPE mask;
4f8aaa74 6700 mask = sigblock (sigmask (SIGIO));
241ceaf7
RS
6701 kbd_buffer_store_event (&event);
6702 sigsetmask (mask);
6703 }
6704 else
6705#endif
6706 {
6707 stop_polling ();
6708 kbd_buffer_store_event (&event);
6709 start_polling ();
6710 }
a8015ab5 6711}
284f4730
JB
6712\f
6713#ifndef VMS
6714
6715/* Read any terminal input already buffered up by the system
6716 into the kbd_buffer, but do not wait.
6717
6718 EXPECTED should be nonzero if the caller knows there is some input.
6719
6720 Except on VMS, all input is read by this function.
6721 If interrupt_input is nonzero, this function MUST be called
6722 only when SIGIO is blocked.
6723
6724 Returns the number of keyboard chars read, or -1 meaning
0fc0bac9 6725 this is a bad time to try to read input. */
284f4730
JB
6726
6727static int
6728read_avail_input (expected)
6729 int expected;
6730{
284f4730 6731 register int i;
351d2e14 6732 int nread = 0;
284f4730 6733
351d2e14 6734 if (read_socket_hook)
7371cef0 6735 {
351d2e14 6736 int nr;
0fc0bac9 6737 struct input_event hold_quit;
1269a761 6738
0fc0bac9
KS
6739 EVENT_INIT (hold_quit);
6740 hold_quit.kind = NO_EVENT;
351d2e14 6741
0fc0bac9
KS
6742 /* No need for FIONREAD or fcntl; just say don't wait. */
6743 while (nr = (*read_socket_hook) (input_fd, expected, &hold_quit), nr > 0)
6744 {
6745 nread += nr;
6746 expected = 0;
6747 }
6748 if (hold_quit.kind != NO_EVENT)
6749 kbd_buffer_store_event (&hold_quit);
351d2e14 6750 }
284f4730
JB
6751 else
6752 {
17270835
RS
6753 /* Using KBD_BUFFER_SIZE - 1 here avoids reading more than
6754 the kbd_buffer can really hold. That may prevent loss
6755 of characters on some systems when input is stuffed at us. */
6756 unsigned char cbuf[KBD_BUFFER_SIZE - 1];
58788063 6757 int n_to_read;
284f4730 6758
58788063 6759 /* Determine how many characters we should *try* to read. */
bc536d84 6760#ifdef WINDOWSNT
7371cef0 6761 return 0;
bc536d84 6762#else /* not WINDOWSNT */
80e4aa30 6763#ifdef MSDOS
58788063
RS
6764 n_to_read = dos_keysns ();
6765 if (n_to_read == 0)
351d2e14 6766 return 0;
c3a2738c 6767#else /* not MSDOS */
284f4730
JB
6768#ifdef FIONREAD
6769 /* Find out how much input is available. */
437f6112 6770 if (ioctl (input_fd, FIONREAD, &n_to_read) < 0)
284f4730
JB
6771 /* Formerly simply reported no input, but that sometimes led to
6772 a failure of Emacs to terminate.
6773 SIGHUP seems appropriate if we can't reach the terminal. */
e4535288
RS
6774 /* ??? Is it really right to send the signal just to this process
6775 rather than to the whole process group?
6776 Perhaps on systems with FIONREAD Emacs is alone in its group. */
f1871a7d
RS
6777 {
6778 if (! noninteractive)
6779 kill (getpid (), SIGHUP);
6780 else
6781 n_to_read = 0;
6782 }
58788063 6783 if (n_to_read == 0)
351d2e14 6784 return 0;
58788063
RS
6785 if (n_to_read > sizeof cbuf)
6786 n_to_read = sizeof cbuf;
284f4730 6787#else /* no FIONREAD */
c60ee5e7 6788#if defined (USG) || defined (DGUX) || defined(CYGWIN)
284f4730 6789 /* Read some input if available, but don't wait. */
58788063 6790 n_to_read = sizeof cbuf;
437f6112 6791 fcntl (input_fd, F_SETFL, O_NDELAY);
284f4730
JB
6792#else
6793 you lose;
6794#endif
6795#endif
80e4aa30 6796#endif /* not MSDOS */
bc536d84 6797#endif /* not WINDOWSNT */
284f4730 6798
58788063
RS
6799 /* Now read; for one reason or another, this will not block.
6800 NREAD is set to the number of chars read. */
9134775b 6801 do
284f4730 6802 {
80e4aa30 6803#ifdef MSDOS
0c04a67e 6804 cbuf[0] = dos_keyread ();
80e4aa30
RS
6805 nread = 1;
6806#else
68c45bf0 6807 nread = emacs_read (input_fd, cbuf, n_to_read);
80e4aa30 6808#endif
49854566
RS
6809 /* POSIX infers that processes which are not in the session leader's
6810 process group won't get SIGHUP's at logout time. BSDI adheres to
e8886a1d 6811 this part standard and returns -1 from read (0) with errno==EIO
49854566
RS
6812 when the control tty is taken away.
6813 Jeffrey Honig <jch@bsdi.com> says this is generally safe. */
6814 if (nread == -1 && errno == EIO)
6815 kill (0, SIGHUP);
762f2b92 6816#if defined (AIX) && (! defined (aix386) && defined (_BSD))
284f4730
JB
6817 /* The kernel sometimes fails to deliver SIGHUP for ptys.
6818 This looks incorrect, but it isn't, because _BSD causes
6819 O_NDELAY to be defined in fcntl.h as O_NONBLOCK,
6820 and that causes a value other than 0 when there is no input. */
854f3a54 6821 if (nread == 0)
80e4aa30 6822 kill (0, SIGHUP);
284f4730 6823#endif
9134775b 6824 }
791587ee
KH
6825 while (
6826 /* We used to retry the read if it was interrupted.
6827 But this does the wrong thing when O_NDELAY causes
6828 an EAGAIN error. Does anybody know of a situation
6829 where a retry is actually needed? */
6830#if 0
6831 nread < 0 && (errno == EAGAIN
6aec06f5 6832#ifdef EFAULT
9134775b 6833 || errno == EFAULT
80e4aa30 6834#endif
284f4730 6835#ifdef EBADSLT
9134775b 6836 || errno == EBADSLT
284f4730 6837#endif
791587ee
KH
6838 )
6839#else
6840 0
6841#endif
6842 );
284f4730
JB
6843
6844#ifndef FIONREAD
c60ee5e7 6845#if defined (USG) || defined (DGUX) || defined (CYGWIN)
437f6112 6846 fcntl (input_fd, F_SETFL, 0);
c60ee5e7 6847#endif /* USG or DGUX or CYGWIN */
284f4730
JB
6848#endif /* no FIONREAD */
6849 for (i = 0; i < nread; i++)
6850 {
351d2e14
KS
6851 struct input_event buf;
6852 EVENT_INIT (buf);
6853 buf.kind = ASCII_KEYSTROKE_EVENT;
6854 buf.modifiers = 0;
b04904fb 6855 if (meta_key == 1 && (cbuf[i] & 0x80))
351d2e14 6856 buf.modifiers = meta_modifier;
b04904fb
RS
6857 if (meta_key != 2)
6858 cbuf[i] &= ~0x80;
f3e59d5e 6859
351d2e14
KS
6860 buf.code = cbuf[i];
6861 buf.frame_or_window = selected_frame;
6862 buf.arg = Qnil;
2320865d 6863
351d2e14
KS
6864 kbd_buffer_store_event (&buf);
6865 /* Don't look at input that follows a C-g too closely.
6866 This reduces lossage due to autorepeat on C-g. */
6867 if (buf.kind == ASCII_KEYSTROKE_EVENT
6868 && buf.code == quit_char)
6869 break;
284f4730
JB
6870 }
6871 }
6872
99402311 6873 return nread;
284f4730
JB
6874}
6875#endif /* not VMS */
6876\f
b65c1b44
SM
6877void
6878handle_async_input ()
6879{
6880#ifdef BSD4_1
6881 extern int select_alarmed;
6882#endif
aa477689 6883
b65c1b44
SM
6884 interrupt_input_pending = 0;
6885
6886 while (1)
6887 {
6888 int nread;
6889 nread = read_avail_input (1);
6890 /* -1 means it's not ok to read the input now.
6891 UNBLOCK_INPUT will read it later; now, avoid infinite loop.
6892 0 means there was no keyboard input available. */
6893 if (nread <= 0)
6894 break;
6895
6896#ifdef BSD4_1
6897 select_alarmed = 1; /* Force the select emulator back to life */
6898#endif
6899 }
6900}
6901
284f4730
JB
6902#ifdef SIGIO /* for entire page */
6903/* Note SIGIO has been undef'd if FIONREAD is missing. */
6904
4216b545 6905static SIGTYPE
284f4730
JB
6906input_available_signal (signo)
6907 int signo;
6908{
6909 /* Must preserve main program's value of errno. */
6910 int old_errno = errno;
5970a8cb 6911#if defined (USG) && !defined (POSIX_SIGNALS)
284f4730
JB
6912 /* USG systems forget handlers when they are used;
6913 must reestablish each time */
6914 signal (signo, input_available_signal);
6915#endif /* USG */
6916
6917#ifdef BSD4_1
6918 sigisheld (SIGIO);
6919#endif
6920
b65c1b44
SM
6921#ifdef SYNC_INPUT
6922 interrupt_input_pending = 1;
6923#else
333f1b6f 6924 SIGNAL_THREAD_CHECK (signo);
bd55c35c 6925#endif
a25f766a 6926
bd55c35c
JD
6927 if (input_available_clear_time)
6928 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
6929
6930#ifndef SYNC_INPUT
b65c1b44 6931 handle_async_input ();
284f4730 6932#endif
284f4730
JB
6933
6934#ifdef BSD4_1
6935 sigfree ();
6936#endif
6937 errno = old_errno;
6938}
6939#endif /* SIGIO */
ad163903
JB
6940
6941/* Send ourselves a SIGIO.
6942
6943 This function exists so that the UNBLOCK_INPUT macro in
6944 blockinput.h can have some way to take care of input we put off
6945 dealing with, without assuming that every file which uses
6946 UNBLOCK_INPUT also has #included the files necessary to get SIGIO. */
6947void
6948reinvoke_input_signal ()
6949{
df0f2ba1 6950#ifdef SIGIO
b65c1b44 6951 handle_async_input ();
ad163903
JB
6952#endif
6953}
6954
6955
284f4730 6956\f
318ab85c
SM
6957static void menu_bar_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, void*));
6958static Lisp_Object menu_bar_one_keymap_changed_items;
b7c49376
RS
6959
6960/* These variables hold the vector under construction within
6961 menu_bar_items and its subroutines, and the current index
6962 for storing into that vector. */
6963static Lisp_Object menu_bar_items_vector;
9343ab07 6964static int menu_bar_items_index;
5ec75a55 6965
b7c49376
RS
6966/* Return a vector of menu items for a menu bar, appropriate
6967 to the current buffer. Each item has three elements in the vector:
f5e09c8b 6968 KEY STRING MAPLIST.
b7c49376
RS
6969
6970 OLD is an old vector we can optionally reuse, or nil. */
5ec75a55
RS
6971
6972Lisp_Object
b7c49376
RS
6973menu_bar_items (old)
6974 Lisp_Object old;
5ec75a55
RS
6975{
6976 /* The number of keymaps we're scanning right now, and the number of
6977 keymaps we have allocated space for. */
6978 int nmaps;
6979
6980 /* maps[0..nmaps-1] are the prefix definitions of KEYBUF[0..t-1]
6981 in the current keymaps, or nil where it is not a prefix. */
6982 Lisp_Object *maps;
6983
aebfea68 6984 Lisp_Object def, tail;
5ec75a55
RS
6985
6986 Lisp_Object result;
6987
6988 int mapno;
47d319aa 6989 Lisp_Object oquit;
5ec75a55 6990
b7c49376
RS
6991 int i;
6992
db60d856
JB
6993 /* In order to build the menus, we need to call the keymap
6994 accessors. They all call QUIT. But this function is called
6995 during redisplay, during which a quit is fatal. So inhibit
47d319aa
RS
6996 quitting while building the menus.
6997 We do this instead of specbind because (1) errors will clear it anyway
6998 and (2) this avoids risk of specpdl overflow. */
6999 oquit = Vinhibit_quit;
df0f2ba1 7000 Vinhibit_quit = Qt;
db60d856 7001
b7c49376
RS
7002 if (!NILP (old))
7003 menu_bar_items_vector = old;
7004 else
7005 menu_bar_items_vector = Fmake_vector (make_number (24), Qnil);
7006 menu_bar_items_index = 0;
7007
5ec75a55
RS
7008 /* Build our list of keymaps.
7009 If we recognize a function key and replace its escape sequence in
7010 keybuf with its symbol, or if the sequence starts with a mouse
7011 click and we need to switch buffers, we jump back here to rebuild
7012 the initial keymaps from the current buffer. */
df0f2ba1 7013 {
5ec75a55
RS
7014 Lisp_Object *tmaps;
7015
217258d5 7016 /* Should overriding-terminal-local-map and overriding-local-map apply? */
d0a49716 7017 if (!NILP (Voverriding_local_map_menu_flag))
9dd3131c 7018 {
217258d5
KH
7019 /* Yes, use them (if non-nil) as well as the global map. */
7020 maps = (Lisp_Object *) alloca (3 * sizeof (maps[0]));
7021 nmaps = 0;
7022 if (!NILP (current_kboard->Voverriding_terminal_local_map))
7023 maps[nmaps++] = current_kboard->Voverriding_terminal_local_map;
7024 if (!NILP (Voverriding_local_map))
7025 maps[nmaps++] = Voverriding_local_map;
9dd3131c
RS
7026 }
7027 else
7028 {
fd646341
KS
7029 /* No, so use major and minor mode keymaps and keymap property.
7030 Note that menu-bar bindings in the local-map and keymap
7031 properties may not work reliable, as they are only
7032 recognized when the menu-bar (or mode-line) is updated,
7033 which does not normally happen after every command. */
7034 Lisp_Object tem;
7035 int nminor;
7036 nminor = current_minor_maps (NULL, &tmaps);
7037 maps = (Lisp_Object *) alloca ((nminor + 3) * sizeof (maps[0]));
7038 nmaps = 0;
7039 if (tem = get_local_map (PT, current_buffer, Qkeymap), !NILP (tem))
7040 maps[nmaps++] = tem;
7041 bcopy (tmaps, (void *) (maps + nmaps), nminor * sizeof (maps[0]));
7042 nmaps += nminor;
7043 maps[nmaps++] = get_local_map (PT, current_buffer, Qlocal_map);
9dd3131c 7044 }
217258d5 7045 maps[nmaps++] = current_global_map;
5ec75a55
RS
7046 }
7047
7048 /* Look up in each map the dummy prefix key `menu-bar'. */
7049
7050 result = Qnil;
7051
e58aa385 7052 for (mapno = nmaps - 1; mapno >= 0; mapno--)
25126faa
GM
7053 if (!NILP (maps[mapno]))
7054 {
341a09cf
SM
7055 def = get_keymap (access_keymap (maps[mapno], Qmenu_bar, 1, 0, 1),
7056 0, 1);
02067692 7057 if (CONSP (def))
4216b545
SM
7058 {
7059 menu_bar_one_keymap_changed_items = Qnil;
7060 map_keymap (def, menu_bar_item, Qnil, NULL, 1);
7061 }
25126faa 7062 }
5ec75a55 7063
b7c49376
RS
7064 /* Move to the end those items that should be at the end. */
7065
7539e11f 7066 for (tail = Vmenu_bar_final_items; CONSP (tail); tail = XCDR (tail))
9f9c0e27 7067 {
b7c49376
RS
7068 int i;
7069 int end = menu_bar_items_index;
7070
35b3402f 7071 for (i = 0; i < end; i += 4)
7539e11f 7072 if (EQ (XCAR (tail), XVECTOR (menu_bar_items_vector)->contents[i]))
b7c49376 7073 {
35b3402f 7074 Lisp_Object tem0, tem1, tem2, tem3;
0301268e
RS
7075 /* Move the item at index I to the end,
7076 shifting all the others forward. */
7077 tem0 = XVECTOR (menu_bar_items_vector)->contents[i + 0];
7078 tem1 = XVECTOR (menu_bar_items_vector)->contents[i + 1];
7079 tem2 = XVECTOR (menu_bar_items_vector)->contents[i + 2];
35b3402f
RS
7080 tem3 = XVECTOR (menu_bar_items_vector)->contents[i + 3];
7081 if (end > i + 4)
7082 bcopy (&XVECTOR (menu_bar_items_vector)->contents[i + 4],
0301268e 7083 &XVECTOR (menu_bar_items_vector)->contents[i],
35b3402f
RS
7084 (end - i - 4) * sizeof (Lisp_Object));
7085 XVECTOR (menu_bar_items_vector)->contents[end - 4] = tem0;
7086 XVECTOR (menu_bar_items_vector)->contents[end - 3] = tem1;
7087 XVECTOR (menu_bar_items_vector)->contents[end - 2] = tem2;
7088 XVECTOR (menu_bar_items_vector)->contents[end - 1] = tem3;
0301268e 7089 break;
b7c49376
RS
7090 }
7091 }
9f9c0e27 7092
0c9071cd 7093 /* Add nil, nil, nil, nil at the end. */
b7c49376 7094 i = menu_bar_items_index;
35b3402f 7095 if (i + 4 > XVECTOR (menu_bar_items_vector)->size)
b7c49376
RS
7096 {
7097 Lisp_Object tem;
b7c49376
RS
7098 tem = Fmake_vector (make_number (2 * i), Qnil);
7099 bcopy (XVECTOR (menu_bar_items_vector)->contents,
7100 XVECTOR (tem)->contents, i * sizeof (Lisp_Object));
7101 menu_bar_items_vector = tem;
9f9c0e27 7102 }
b7c49376
RS
7103 /* Add this item. */
7104 XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
7105 XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
7106 XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
35b3402f 7107 XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
b7c49376 7108 menu_bar_items_index = i;
a73c5e29 7109
47d319aa 7110 Vinhibit_quit = oquit;
b7c49376 7111 return menu_bar_items_vector;
5ec75a55
RS
7112}
7113\f
f5e09c8b
RS
7114/* Add one item to menu_bar_items_vector, for KEY, ITEM_STRING and DEF.
7115 If there's already an item for KEY, add this DEF to it. */
7116
e8886a1d
RS
7117Lisp_Object item_properties;
7118
b7c49376 7119static void
4216b545
SM
7120menu_bar_item (key, item, dummy1, dummy2)
7121 Lisp_Object key, item, dummy1;
7122 void *dummy2;
5ec75a55 7123{
e8886a1d 7124 struct gcpro gcpro1;
b7c49376 7125 int i;
759860a6 7126 Lisp_Object tem;
5ec75a55 7127
e8886a1d 7128 if (EQ (item, Qundefined))
e58aa385 7129 {
f5e09c8b 7130 /* If a map has an explicit `undefined' as definition,
e58aa385 7131 discard any previously made menu bar item. */
b7c49376 7132
35b3402f 7133 for (i = 0; i < menu_bar_items_index; i += 4)
b7c49376
RS
7134 if (EQ (key, XVECTOR (menu_bar_items_vector)->contents[i]))
7135 {
35b3402f
RS
7136 if (menu_bar_items_index > i + 4)
7137 bcopy (&XVECTOR (menu_bar_items_vector)->contents[i + 4],
b7c49376 7138 &XVECTOR (menu_bar_items_vector)->contents[i],
35b3402f
RS
7139 (menu_bar_items_index - i - 4) * sizeof (Lisp_Object));
7140 menu_bar_items_index -= 4;
b7c49376 7141 }
e58aa385
RS
7142 }
7143
759860a6
RS
7144 /* If this keymap has already contributed to this KEY,
7145 don't contribute to it a second time. */
7146 tem = Fmemq (key, menu_bar_one_keymap_changed_items);
9cd2ced7 7147 if (!NILP (tem) || NILP (item))
759860a6
RS
7148 return;
7149
7150 menu_bar_one_keymap_changed_items
7151 = Fcons (key, menu_bar_one_keymap_changed_items);
7152
9cd2ced7
SM
7153 /* We add to menu_bar_one_keymap_changed_items before doing the
7154 parse_menu_item, so that if it turns out it wasn't a menu item,
7155 it still correctly hides any further menu item. */
7156 GCPRO1 (key);
7157 i = parse_menu_item (item, 0, 1);
7158 UNGCPRO;
7159 if (!i)
7160 return;
7161
e8886a1d
RS
7162 item = XVECTOR (item_properties)->contents[ITEM_PROPERTY_DEF];
7163
f5e09c8b 7164 /* Find any existing item for this KEY. */
35b3402f 7165 for (i = 0; i < menu_bar_items_index; i += 4)
b7c49376
RS
7166 if (EQ (key, XVECTOR (menu_bar_items_vector)->contents[i]))
7167 break;
7168
f5e09c8b 7169 /* If we did not find this KEY, add it at the end. */
b7c49376
RS
7170 if (i == menu_bar_items_index)
7171 {
7172 /* If vector is too small, get a bigger one. */
35b3402f 7173 if (i + 4 > XVECTOR (menu_bar_items_vector)->size)
b7c49376
RS
7174 {
7175 Lisp_Object tem;
b7c49376
RS
7176 tem = Fmake_vector (make_number (2 * i), Qnil);
7177 bcopy (XVECTOR (menu_bar_items_vector)->contents,
7178 XVECTOR (tem)->contents, i * sizeof (Lisp_Object));
7179 menu_bar_items_vector = tem;
7180 }
e8886a1d 7181
b7c49376
RS
7182 /* Add this item. */
7183 XVECTOR (menu_bar_items_vector)->contents[i++] = key;
e8886a1d
RS
7184 XVECTOR (menu_bar_items_vector)->contents[i++]
7185 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME];
7186 XVECTOR (menu_bar_items_vector)->contents[i++] = Fcons (item, Qnil);
35b3402f 7187 XVECTOR (menu_bar_items_vector)->contents[i++] = make_number (0);
b7c49376
RS
7188 menu_bar_items_index = i;
7189 }
e8886a1d 7190 /* We did find an item for this KEY. Add ITEM to its list of maps. */
f5e09c8b
RS
7191 else
7192 {
7193 Lisp_Object old;
7194 old = XVECTOR (menu_bar_items_vector)->contents[i + 2];
4216b545
SM
7195 /* If the new and the old items are not both keymaps,
7196 the lookup will only find `item'. */
7197 item = Fcons (item, KEYMAPP (item) && KEYMAPP (XCAR (old)) ? old : Qnil);
7198 XVECTOR (menu_bar_items_vector)->contents[i + 2] = item;
f5e09c8b 7199 }
5ec75a55
RS
7200}
7201\f
e8886a1d
RS
7202 /* This is used as the handler when calling menu_item_eval_property. */
7203static Lisp_Object
7204menu_item_eval_property_1 (arg)
7205 Lisp_Object arg;
7206{
7207 /* If we got a quit from within the menu computation,
7208 quit all the way out of it. This takes care of C-] in the debugger. */
7539e11f 7209 if (CONSP (arg) && EQ (XCAR (arg), Qquit))
e8886a1d
RS
7210 Fsignal (Qquit, Qnil);
7211
7212 return Qnil;
7213}
7214
c60ee5e7 7215/* Evaluate an expression and return the result (or nil if something
e8886a1d 7216 went wrong). Used to evaluate dynamic parts of menu items. */
7ee32cda 7217Lisp_Object
e8886a1d
RS
7218menu_item_eval_property (sexpr)
7219 Lisp_Object sexpr;
7220{
aed13378 7221 int count = SPECPDL_INDEX ();
e8886a1d 7222 Lisp_Object val;
44e553a3 7223 specbind (Qinhibit_redisplay, Qt);
e8886a1d
RS
7224 val = internal_condition_case_1 (Feval, sexpr, Qerror,
7225 menu_item_eval_property_1);
44e553a3 7226 return unbind_to (count, val);
e8886a1d
RS
7227}
7228
7229/* This function parses a menu item and leaves the result in the
7230 vector item_properties.
7231 ITEM is a key binding, a possible menu item.
7232 If NOTREAL is nonzero, only check for equivalent key bindings, don't
7233 evaluate dynamic expressions in the menu item.
fd3613d7 7234 INMENUBAR is > 0 when this is considered for an entry in a menu bar
e8886a1d 7235 top level.
fd3613d7 7236 INMENUBAR is < 0 when this is considered for an entry in a keyboard menu.
e8886a1d
RS
7237 parse_menu_item returns true if the item is a menu item and false
7238 otherwise. */
7239
7240int
7241parse_menu_item (item, notreal, inmenubar)
7242 Lisp_Object item;
7243 int notreal, inmenubar;
7244{
adc1d5c8 7245 Lisp_Object def, tem, item_string, start;
07ba902e
RS
7246 Lisp_Object cachelist;
7247 Lisp_Object filter;
7248 Lisp_Object keyhint;
e8886a1d 7249 int i;
74c1de23
RS
7250 int newcache = 0;
7251
07ba902e
RS
7252 cachelist = Qnil;
7253 filter = Qnil;
7254 keyhint = Qnil;
7255
e8886a1d
RS
7256 if (!CONSP (item))
7257 return 0;
7258
e8886a1d
RS
7259 /* Create item_properties vector if necessary. */
7260 if (NILP (item_properties))
7261 item_properties
7262 = Fmake_vector (make_number (ITEM_PROPERTY_ENABLE + 1), Qnil);
7263
7264 /* Initialize optional entries. */
7265 for (i = ITEM_PROPERTY_DEF; i < ITEM_PROPERTY_ENABLE; i++)
3626fb1a
GM
7266 AREF (item_properties, i) = Qnil;
7267 AREF (item_properties, ITEM_PROPERTY_ENABLE) = Qt;
c60ee5e7 7268
e8886a1d 7269 /* Save the item here to protect it from GC. */
3626fb1a 7270 AREF (item_properties, ITEM_PROPERTY_ITEM) = item;
e8886a1d 7271
7539e11f 7272 item_string = XCAR (item);
e8886a1d
RS
7273
7274 start = item;
7539e11f 7275 item = XCDR (item);
e8886a1d
RS
7276 if (STRINGP (item_string))
7277 {
7278 /* Old format menu item. */
3626fb1a 7279 AREF (item_properties, ITEM_PROPERTY_NAME) = item_string;
e8886a1d
RS
7280
7281 /* Maybe help string. */
7539e11f 7282 if (CONSP (item) && STRINGP (XCAR (item)))
e8886a1d 7283 {
3626fb1a 7284 AREF (item_properties, ITEM_PROPERTY_HELP) = XCAR (item);
e8886a1d 7285 start = item;
7539e11f 7286 item = XCDR (item);
e8886a1d 7287 }
c60ee5e7 7288
31f84d03 7289 /* Maybe key binding cache. */
7539e11f
KR
7290 if (CONSP (item) && CONSP (XCAR (item))
7291 && (NILP (XCAR (XCAR (item)))
7292 || VECTORP (XCAR (XCAR (item)))))
e8886a1d 7293 {
7539e11f
KR
7294 cachelist = XCAR (item);
7295 item = XCDR (item);
e8886a1d 7296 }
c60ee5e7 7297
e8886a1d 7298 /* This is the real definition--the function to run. */
3626fb1a 7299 AREF (item_properties, ITEM_PROPERTY_DEF) = item;
e8886a1d
RS
7300
7301 /* Get enable property, if any. */
7302 if (SYMBOLP (item))
7303 {
7304 tem = Fget (item, Qmenu_enable);
9d56e0da
EZ
7305 if (!NILP (Venable_disabled_menus_and_buttons))
7306 AREF (item_properties, ITEM_PROPERTY_ENABLE) = Qt;
7307 else if (!NILP (tem))
3626fb1a 7308 AREF (item_properties, ITEM_PROPERTY_ENABLE) = tem;
e8886a1d
RS
7309 }
7310 }
7311 else if (EQ (item_string, Qmenu_item) && CONSP (item))
7312 {
7313 /* New format menu item. */
3626fb1a 7314 AREF (item_properties, ITEM_PROPERTY_NAME) = XCAR (item);
7539e11f 7315 start = XCDR (item);
e8886a1d
RS
7316 if (CONSP (start))
7317 {
7318 /* We have a real binding. */
3626fb1a 7319 AREF (item_properties, ITEM_PROPERTY_DEF) = XCAR (start);
e8886a1d 7320
7539e11f 7321 item = XCDR (start);
e8886a1d 7322 /* Is there a cache list with key equivalences. */
7539e11f 7323 if (CONSP (item) && CONSP (XCAR (item)))
e8886a1d 7324 {
7539e11f
KR
7325 cachelist = XCAR (item);
7326 item = XCDR (item);
e8886a1d
RS
7327 }
7328
7329 /* Parse properties. */
7539e11f 7330 while (CONSP (item) && CONSP (XCDR (item)))
e8886a1d 7331 {
7539e11f
KR
7332 tem = XCAR (item);
7333 item = XCDR (item);
e8886a1d
RS
7334
7335 if (EQ (tem, QCenable))
9d56e0da
EZ
7336 {
7337 if (!NILP (Venable_disabled_menus_and_buttons))
7338 AREF (item_properties, ITEM_PROPERTY_ENABLE) = Qt;
7339 else
7340 AREF (item_properties, ITEM_PROPERTY_ENABLE) = XCAR (item);
7341 }
e8886a1d
RS
7342 else if (EQ (tem, QCvisible) && !notreal)
7343 {
7344 /* If got a visible property and that evaluates to nil
7345 then ignore this item. */
7539e11f 7346 tem = menu_item_eval_property (XCAR (item));
e8886a1d 7347 if (NILP (tem))
adc1d5c8 7348 return 0;
e8886a1d
RS
7349 }
7350 else if (EQ (tem, QChelp))
3626fb1a 7351 AREF (item_properties, ITEM_PROPERTY_HELP) = XCAR (item);
e8886a1d 7352 else if (EQ (tem, QCfilter))
74c1de23
RS
7353 filter = item;
7354 else if (EQ (tem, QCkey_sequence))
7355 {
7539e11f 7356 tem = XCAR (item);
74c1de23
RS
7357 if (NILP (cachelist)
7358 && (SYMBOLP (tem) || STRINGP (tem) || VECTORP (tem)))
7359 /* Be GC protected. Set keyhint to item instead of tem. */
7360 keyhint = item;
7361 }
7362 else if (EQ (tem, QCkeys))
7363 {
7539e11f 7364 tem = XCAR (item);
03cee6ae 7365 if (CONSP (tem) || (STRINGP (tem) && NILP (cachelist)))
3626fb1a 7366 AREF (item_properties, ITEM_PROPERTY_KEYEQ) = tem;
74c1de23 7367 }
7539e11f 7368 else if (EQ (tem, QCbutton) && CONSP (XCAR (item)))
e8886a1d 7369 {
74c1de23 7370 Lisp_Object type;
7539e11f
KR
7371 tem = XCAR (item);
7372 type = XCAR (tem);
e8886a1d
RS
7373 if (EQ (type, QCtoggle) || EQ (type, QCradio))
7374 {
3626fb1a 7375 AREF (item_properties, ITEM_PROPERTY_SELECTED)
7539e11f 7376 = XCDR (tem);
3626fb1a 7377 AREF (item_properties, ITEM_PROPERTY_TYPE)
e8886a1d
RS
7378 = type;
7379 }
7380 }
7539e11f 7381 item = XCDR (item);
e8886a1d
RS
7382 }
7383 }
7384 else if (inmenubar || !NILP (start))
adc1d5c8 7385 return 0;
e8886a1d
RS
7386 }
7387 else
adc1d5c8 7388 return 0; /* not a menu item */
e8886a1d
RS
7389
7390 /* If item string is not a string, evaluate it to get string.
7391 If we don't get a string, skip this item. */
3626fb1a 7392 item_string = AREF (item_properties, ITEM_PROPERTY_NAME);
e8886a1d
RS
7393 if (!(STRINGP (item_string) || notreal))
7394 {
7395 item_string = menu_item_eval_property (item_string);
7396 if (!STRINGP (item_string))
adc1d5c8 7397 return 0;
3626fb1a 7398 AREF (item_properties, ITEM_PROPERTY_NAME) = item_string;
e8886a1d 7399 }
c60ee5e7 7400
e8886a1d 7401 /* If got a filter apply it on definition. */
3626fb1a 7402 def = AREF (item_properties, ITEM_PROPERTY_DEF);
e8886a1d
RS
7403 if (!NILP (filter))
7404 {
7539e11f 7405 def = menu_item_eval_property (list2 (XCAR (filter),
c5c5a6f8
RS
7406 list2 (Qquote, def)));
7407
3626fb1a 7408 AREF (item_properties, ITEM_PROPERTY_DEF) = def;
e8886a1d
RS
7409 }
7410
e8886a1d 7411 /* Enable or disable selection of item. */
3626fb1a 7412 tem = AREF (item_properties, ITEM_PROPERTY_ENABLE);
e8886a1d
RS
7413 if (!EQ (tem, Qt))
7414 {
7415 if (notreal)
7416 tem = Qt;
7417 else
7418 tem = menu_item_eval_property (tem);
7419 if (inmenubar && NILP (tem))
adc1d5c8 7420 return 0; /* Ignore disabled items in menu bar. */
3626fb1a 7421 AREF (item_properties, ITEM_PROPERTY_ENABLE) = tem;
e8886a1d
RS
7422 }
7423
7189cad8
SM
7424 /* If we got no definition, this item is just unselectable text which
7425 is OK in a submenu but not in the menubar. */
7426 if (NILP (def))
7427 return (inmenubar ? 0 : 1);
c60ee5e7 7428
e8886a1d 7429 /* See if this is a separate pane or a submenu. */
3626fb1a 7430 def = AREF (item_properties, ITEM_PROPERTY_DEF);
02067692 7431 tem = get_keymap (def, 0, 1);
9ac425d1 7432 /* For a subkeymap, just record its details and exit. */
02067692 7433 if (CONSP (tem))
e8886a1d 7434 {
3626fb1a
GM
7435 AREF (item_properties, ITEM_PROPERTY_MAP) = tem;
7436 AREF (item_properties, ITEM_PROPERTY_DEF) = tem;
e8886a1d
RS
7437 return 1;
7438 }
c60ee5e7 7439
9ac425d1
RS
7440 /* At the top level in the menu bar, do likewise for commands also.
7441 The menu bar does not display equivalent key bindings anyway.
7442 ITEM_PROPERTY_DEF is already set up properly. */
7443 if (inmenubar > 0)
7444 return 1;
e8886a1d
RS
7445
7446 /* This is a command. See if there is an equivalent key binding. */
7447 if (NILP (cachelist))
7448 {
74c1de23 7449 /* We have to create a cachelist. */
e8886a1d 7450 CHECK_IMPURE (start);
f3fbd155 7451 XSETCDR (start, Fcons (Fcons (Qnil, Qnil), XCDR (start)));
7539e11f 7452 cachelist = XCAR (XCDR (start));
74c1de23 7453 newcache = 1;
3626fb1a 7454 tem = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
74c1de23
RS
7455 if (!NILP (keyhint))
7456 {
f3fbd155 7457 XSETCAR (cachelist, XCAR (keyhint));
74c1de23
RS
7458 newcache = 0;
7459 }
7460 else if (STRINGP (tem))
7461 {
f3fbd155
KR
7462 XSETCDR (cachelist, Fsubstitute_command_keys (tem));
7463 XSETCAR (cachelist, Qt);
74c1de23
RS
7464 }
7465 }
c60ee5e7 7466
7539e11f 7467 tem = XCAR (cachelist);
74c1de23
RS
7468 if (!EQ (tem, Qt))
7469 {
7470 int chkcache = 0;
7471 Lisp_Object prefix;
7472
7473 if (!NILP (tem))
8b9940e6 7474 tem = Fkey_binding (tem, Qnil, Qnil);
74c1de23 7475
3626fb1a 7476 prefix = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
74c1de23
RS
7477 if (CONSP (prefix))
7478 {
7539e11f
KR
7479 def = XCAR (prefix);
7480 prefix = XCDR (prefix);
74c1de23 7481 }
e8886a1d 7482 else
3626fb1a 7483 def = AREF (item_properties, ITEM_PROPERTY_DEF);
74c1de23 7484
9867523c 7485 if (NILP (XCAR (cachelist))) /* Have no saved key. */
74c1de23
RS
7486 {
7487 if (newcache /* Always check first time. */
7488 /* Should we check everything when precomputing key
7489 bindings? */
74c1de23
RS
7490 /* If something had no key binding before, don't recheck it
7491 because that is too slow--except if we have a list of
7492 rebound commands in Vdefine_key_rebound_commands, do
7493 recheck any command that appears in that list. */
7494 || (CONSP (Vdefine_key_rebound_commands)
7495 && !NILP (Fmemq (def, Vdefine_key_rebound_commands))))
7496 chkcache = 1;
7497 }
7498 /* We had a saved key. Is it still bound to the command? */
7499 else if (NILP (tem)
03cee6ae
GM
7500 || (!EQ (tem, def)
7501 /* If the command is an alias for another
7502 (such as lmenu.el set it up), check if the
7503 original command matches the cached command. */
7504 && !(SYMBOLP (def) && EQ (tem, XSYMBOL (def)->function))))
74c1de23
RS
7505 chkcache = 1; /* Need to recompute key binding. */
7506
7507 if (chkcache)
7508 {
7509 /* Recompute equivalent key binding. If the command is an alias
7510 for another (such as lmenu.el set it up), see if the original
7511 command name has equivalent keys. Otherwise look up the
7512 specified command itself. We don't try both, because that
7513 makes lmenu menus slow. */
3626fb1a
GM
7514 if (SYMBOLP (def)
7515 && SYMBOLP (XSYMBOL (def)->function)
74c1de23
RS
7516 && ! NILP (Fget (def, Qmenu_alias)))
7517 def = XSYMBOL (def)->function;
8b9940e6 7518 tem = Fwhere_is_internal (def, Qnil, Qt, Qnil, Qt);
f3fbd155 7519 XSETCAR (cachelist, tem);
74c1de23
RS
7520 if (NILP (tem))
7521 {
f3fbd155 7522 XSETCDR (cachelist, Qnil);
74c1de23
RS
7523 chkcache = 0;
7524 }
7525 }
7539e11f 7526 else if (!NILP (keyhint) && !NILP (XCAR (cachelist)))
74c1de23 7527 {
7539e11f 7528 tem = XCAR (cachelist);
74c1de23
RS
7529 chkcache = 1;
7530 }
7531
7532 newcache = chkcache;
7533 if (chkcache)
7534 {
a1bfe073 7535 tem = Fkey_description (tem, Qnil);
74c1de23
RS
7536 if (CONSP (prefix))
7537 {
7539e11f
KR
7538 if (STRINGP (XCAR (prefix)))
7539 tem = concat2 (XCAR (prefix), tem);
7540 if (STRINGP (XCDR (prefix)))
7541 tem = concat2 (tem, XCDR (prefix));
74c1de23 7542 }
f3fbd155 7543 XSETCDR (cachelist, tem);
74c1de23
RS
7544 }
7545 }
7546
7539e11f 7547 tem = XCDR (cachelist);
74c1de23 7548 if (newcache && !NILP (tem))
e8886a1d 7549 {
74c1de23 7550 tem = concat3 (build_string (" ("), tem, build_string (")"));
f3fbd155 7551 XSETCDR (cachelist, tem);
e8886a1d
RS
7552 }
7553
7554 /* If we only want to precompute equivalent key bindings, stop here. */
7555 if (notreal)
adc1d5c8 7556 return 1;
e8886a1d
RS
7557
7558 /* If we have an equivalent key binding, use that. */
3626fb1a 7559 AREF (item_properties, ITEM_PROPERTY_KEYEQ) = tem;
adc1d5c8
RS
7560
7561 /* Include this when menu help is implemented.
7562 tem = XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP];
7563 if (!(NILP (tem) || STRINGP (tem)))
7564 {
7565 tem = menu_item_eval_property (tem);
7566 if (!STRINGP (tem))
7567 tem = Qnil;
7568 XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP] = tem;
7569 }
e8886a1d
RS
7570 */
7571
c60ee5e7 7572 /* Handle radio buttons or toggle boxes. */
3626fb1a 7573 tem = AREF (item_properties, ITEM_PROPERTY_SELECTED);
e8886a1d 7574 if (!NILP (tem))
3626fb1a 7575 AREF (item_properties, ITEM_PROPERTY_SELECTED)
e8886a1d
RS
7576 = menu_item_eval_property (tem);
7577
e8886a1d
RS
7578 return 1;
7579}
7ee32cda
GM
7580
7581
7582\f
7583/***********************************************************************
7584 Tool-bars
7585 ***********************************************************************/
7586
9ea173e8 7587/* A vector holding tool bar items while they are parsed in function
27fd22dc 7588 tool_bar_items. Each item occupies TOOL_BAR_ITEM_NSCLOTS elements
9ea173e8 7589 in the vector. */
7ee32cda 7590
9ea173e8 7591static Lisp_Object tool_bar_items_vector;
7ee32cda 7592
9ea173e8
GM
7593/* A vector holding the result of parse_tool_bar_item. Layout is like
7594 the one for a single item in tool_bar_items_vector. */
7ee32cda 7595
9ea173e8 7596static Lisp_Object tool_bar_item_properties;
7ee32cda 7597
9ea173e8 7598/* Next free index in tool_bar_items_vector. */
7ee32cda 7599
9ea173e8 7600static int ntool_bar_items;
7ee32cda 7601
9ea173e8 7602/* The symbols `tool-bar', and `:image'. */
7ee32cda 7603
9ea173e8 7604extern Lisp_Object Qtool_bar;
7ee32cda
GM
7605Lisp_Object QCimage;
7606
7607/* Function prototypes. */
7608
9ea173e8 7609static void init_tool_bar_items P_ ((Lisp_Object));
9c8c4d5b 7610static void process_tool_bar_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, void*));
9ea173e8
GM
7611static int parse_tool_bar_item P_ ((Lisp_Object, Lisp_Object));
7612static void append_tool_bar_item P_ ((void));
7ee32cda
GM
7613
7614
9ea173e8 7615/* Return a vector of tool bar items for keymaps currently in effect.
7ee32cda 7616 Reuse vector REUSE if non-nil. Return in *NITEMS the number of
9ea173e8 7617 tool bar items found. */
7ee32cda
GM
7618
7619Lisp_Object
9ea173e8 7620tool_bar_items (reuse, nitems)
7ee32cda
GM
7621 Lisp_Object reuse;
7622 int *nitems;
7623{
7624 Lisp_Object *maps;
7625 int nmaps, i;
7626 Lisp_Object oquit;
7627 Lisp_Object *tmaps;
7ee32cda
GM
7628
7629 *nitems = 0;
7630
7631 /* In order to build the menus, we need to call the keymap
7632 accessors. They all call QUIT. But this function is called
7633 during redisplay, during which a quit is fatal. So inhibit
7634 quitting while building the menus. We do this instead of
7635 specbind because (1) errors will clear it anyway and (2) this
7636 avoids risk of specpdl overflow. */
7637 oquit = Vinhibit_quit;
7638 Vinhibit_quit = Qt;
c60ee5e7 7639
9ea173e8
GM
7640 /* Initialize tool_bar_items_vector and protect it from GC. */
7641 init_tool_bar_items (reuse);
7ee32cda
GM
7642
7643 /* Build list of keymaps in maps. Set nmaps to the number of maps
7644 to process. */
c60ee5e7 7645
7ee32cda
GM
7646 /* Should overriding-terminal-local-map and overriding-local-map apply? */
7647 if (!NILP (Voverriding_local_map_menu_flag))
7648 {
7649 /* Yes, use them (if non-nil) as well as the global map. */
7650 maps = (Lisp_Object *) alloca (3 * sizeof (maps[0]));
7651 nmaps = 0;
7652 if (!NILP (current_kboard->Voverriding_terminal_local_map))
7653 maps[nmaps++] = current_kboard->Voverriding_terminal_local_map;
7654 if (!NILP (Voverriding_local_map))
7655 maps[nmaps++] = Voverriding_local_map;
7656 }
7657 else
7658 {
fd646341
KS
7659 /* No, so use major and minor mode keymaps and keymap property.
7660 Note that tool-bar bindings in the local-map and keymap
7661 properties may not work reliable, as they are only
7662 recognized when the tool-bar (or mode-line) is updated,
7663 which does not normally happen after every command. */
7664 Lisp_Object tem;
7665 int nminor;
7666 nminor = current_minor_maps (NULL, &tmaps);
7667 maps = (Lisp_Object *) alloca ((nminor + 3) * sizeof (maps[0]));
7668 nmaps = 0;
7669 if (tem = get_local_map (PT, current_buffer, Qkeymap), !NILP (tem))
7670 maps[nmaps++] = tem;
7671 bcopy (tmaps, (void *) (maps + nmaps), nminor * sizeof (maps[0]));
7672 nmaps += nminor;
7673 maps[nmaps++] = get_local_map (PT, current_buffer, Qlocal_map);
7ee32cda
GM
7674 }
7675
7676 /* Add global keymap at the end. */
7677 maps[nmaps++] = current_global_map;
7678
7679 /* Process maps in reverse order and look up in each map the prefix
9ea173e8 7680 key `tool-bar'. */
7ee32cda
GM
7681 for (i = nmaps - 1; i >= 0; --i)
7682 if (!NILP (maps[i]))
7683 {
7684 Lisp_Object keymap;
db785038 7685
341a09cf 7686 keymap = get_keymap (access_keymap (maps[i], Qtool_bar, 1, 0, 1), 0, 1);
02067692 7687 if (CONSP (keymap))
293bd733 7688 map_keymap (keymap, process_tool_bar_item, Qnil, NULL, 1);
7ee32cda
GM
7689 }
7690
7691 Vinhibit_quit = oquit;
9ea173e8
GM
7692 *nitems = ntool_bar_items / TOOL_BAR_ITEM_NSLOTS;
7693 return tool_bar_items_vector;
7ee32cda
GM
7694}
7695
7696
7697/* Process the definition of KEY which is DEF. */
7698
7699static void
9c8c4d5b 7700process_tool_bar_item (key, def, data, args)
293bd733
SM
7701 Lisp_Object key, def, data;
7702 void *args;
7ee32cda
GM
7703{
7704 int i;
7705 extern Lisp_Object Qundefined;
7706 struct gcpro gcpro1, gcpro2;
7707
9ea173e8 7708 /* Protect KEY and DEF from GC because parse_tool_bar_item may call
7ee32cda
GM
7709 eval. */
7710 GCPRO2 (key, def);
7711
7712 if (EQ (def, Qundefined))
7713 {
7714 /* If a map has an explicit `undefined' as definition,
7715 discard any previously made item. */
9ea173e8 7716 for (i = 0; i < ntool_bar_items; i += TOOL_BAR_ITEM_NSLOTS)
7ee32cda 7717 {
9ea173e8 7718 Lisp_Object *v = XVECTOR (tool_bar_items_vector)->contents + i;
c60ee5e7 7719
9ea173e8 7720 if (EQ (key, v[TOOL_BAR_ITEM_KEY]))
7ee32cda 7721 {
9ea173e8
GM
7722 if (ntool_bar_items > i + TOOL_BAR_ITEM_NSLOTS)
7723 bcopy (v + TOOL_BAR_ITEM_NSLOTS, v,
7724 ((ntool_bar_items - i - TOOL_BAR_ITEM_NSLOTS)
7ee32cda 7725 * sizeof (Lisp_Object)));
9ea173e8 7726 ntool_bar_items -= TOOL_BAR_ITEM_NSLOTS;
7ee32cda
GM
7727 break;
7728 }
7729 }
7730 }
9ea173e8
GM
7731 else if (parse_tool_bar_item (key, def))
7732 /* Append a new tool bar item to tool_bar_items_vector. Accept
7ee32cda 7733 more than one definition for the same key. */
9ea173e8 7734 append_tool_bar_item ();
7ee32cda
GM
7735
7736 UNGCPRO;
7737}
7738
7739
9ea173e8
GM
7740/* Parse a tool bar item specification ITEM for key KEY and return the
7741 result in tool_bar_item_properties. Value is zero if ITEM is
7ee32cda
GM
7742 invalid.
7743
7744 ITEM is a list `(menu-item CAPTION BINDING PROPS...)'.
c60ee5e7 7745
7ee32cda
GM
7746 CAPTION is the caption of the item, If it's not a string, it is
7747 evaluated to get a string.
c60ee5e7 7748
9ea173e8 7749 BINDING is the tool bar item's binding. Tool-bar items with keymaps
7ee32cda
GM
7750 as binding are currently ignored.
7751
7752 The following properties are recognized:
7753
7754 - `:enable FORM'.
c60ee5e7 7755
9ea173e8
GM
7756 FORM is evaluated and specifies whether the tool bar item is
7757 enabled or disabled.
c60ee5e7 7758
7ee32cda 7759 - `:visible FORM'
c60ee5e7 7760
9ea173e8 7761 FORM is evaluated and specifies whether the tool bar item is visible.
c60ee5e7 7762
7ee32cda
GM
7763 - `:filter FUNCTION'
7764
7765 FUNCTION is invoked with one parameter `(quote BINDING)'. Its
7766 result is stored as the new binding.
c60ee5e7 7767
7ee32cda
GM
7768 - `:button (TYPE SELECTED)'
7769
7770 TYPE must be one of `:radio' or `:toggle'. SELECTED is evaluated
7771 and specifies whether the button is selected (pressed) or not.
c60ee5e7 7772
7ee32cda
GM
7773 - `:image IMAGES'
7774
7775 IMAGES is either a single image specification or a vector of four
9ea173e8 7776 image specifications. See enum tool_bar_item_images.
c60ee5e7 7777
7ee32cda 7778 - `:help HELP-STRING'.
c60ee5e7 7779
9ea173e8 7780 Gives a help string to display for the tool bar item. */
7ee32cda
GM
7781
7782static int
9ea173e8 7783parse_tool_bar_item (key, item)
7ee32cda
GM
7784 Lisp_Object key, item;
7785{
9ea173e8
GM
7786 /* Access slot with index IDX of vector tool_bar_item_properties. */
7787#define PROP(IDX) XVECTOR (tool_bar_item_properties)->contents[IDX]
7ee32cda
GM
7788
7789 Lisp_Object filter = Qnil;
7790 Lisp_Object caption;
7ee32cda 7791 int i;
7ee32cda 7792
8c907a56
GM
7793 /* Defininition looks like `(menu-item CAPTION BINDING PROPS...)'.
7794 Rule out items that aren't lists, don't start with
7795 `menu-item' or whose rest following `tool-bar-item' is not a
7ee32cda
GM
7796 list. */
7797 if (!CONSP (item)
7798 || !EQ (XCAR (item), Qmenu_item)
7799 || (item = XCDR (item),
7800 !CONSP (item)))
7801 return 0;
7802
9ea173e8 7803 /* Create tool_bar_item_properties vector if necessary. Reset it to
7ee32cda 7804 defaults. */
9ea173e8 7805 if (VECTORP (tool_bar_item_properties))
7ee32cda 7806 {
9ea173e8 7807 for (i = 0; i < TOOL_BAR_ITEM_NSLOTS; ++i)
7ee32cda
GM
7808 PROP (i) = Qnil;
7809 }
7810 else
9ea173e8
GM
7811 tool_bar_item_properties
7812 = Fmake_vector (make_number (TOOL_BAR_ITEM_NSLOTS), Qnil);
c60ee5e7 7813
7ee32cda 7814 /* Set defaults. */
9ea173e8
GM
7815 PROP (TOOL_BAR_ITEM_KEY) = key;
7816 PROP (TOOL_BAR_ITEM_ENABLED_P) = Qt;
c60ee5e7 7817
7ee32cda
GM
7818 /* Get the caption of the item. If the caption is not a string,
7819 evaluate it to get a string. If we don't get a string, skip this
7820 item. */
7821 caption = XCAR (item);
7822 if (!STRINGP (caption))
7823 {
7824 caption = menu_item_eval_property (caption);
7825 if (!STRINGP (caption))
7826 return 0;
7827 }
9ea173e8 7828 PROP (TOOL_BAR_ITEM_CAPTION) = caption;
7ee32cda
GM
7829
7830 /* Give up if rest following the caption is not a list. */
7831 item = XCDR (item);
7832 if (!CONSP (item))
7833 return 0;
7834
7835 /* Store the binding. */
9ea173e8 7836 PROP (TOOL_BAR_ITEM_BINDING) = XCAR (item);
7ee32cda
GM
7837 item = XCDR (item);
7838
8c907a56
GM
7839 /* Ignore cached key binding, if any. */
7840 if (CONSP (item) && CONSP (XCAR (item)))
7841 item = XCDR (item);
7842
7ee32cda
GM
7843 /* Process the rest of the properties. */
7844 for (; CONSP (item) && CONSP (XCDR (item)); item = XCDR (XCDR (item)))
7845 {
7846 Lisp_Object key, value;
7847
7848 key = XCAR (item);
7849 value = XCAR (XCDR (item));
7850
7851 if (EQ (key, QCenable))
9d56e0da
EZ
7852 {
7853 /* `:enable FORM'. */
7854 if (!NILP (Venable_disabled_menus_and_buttons))
7855 PROP (TOOL_BAR_ITEM_ENABLED_P) = Qt;
7856 else
7857 PROP (TOOL_BAR_ITEM_ENABLED_P) = value;
7858 }
7ee32cda
GM
7859 else if (EQ (key, QCvisible))
7860 {
7861 /* `:visible FORM'. If got a visible property and that
7862 evaluates to nil then ignore this item. */
7863 if (NILP (menu_item_eval_property (value)))
7864 return 0;
7865 }
7866 else if (EQ (key, QChelp))
7867 /* `:help HELP-STRING'. */
9ea173e8 7868 PROP (TOOL_BAR_ITEM_HELP) = value;
7ee32cda
GM
7869 else if (EQ (key, QCfilter))
7870 /* ':filter FORM'. */
7871 filter = value;
7872 else if (EQ (key, QCbutton) && CONSP (value))
7873 {
7874 /* `:button (TYPE . SELECTED)'. */
7875 Lisp_Object type, selected;
7876
7877 type = XCAR (value);
7878 selected = XCDR (value);
7879 if (EQ (type, QCtoggle) || EQ (type, QCradio))
7880 {
9ea173e8
GM
7881 PROP (TOOL_BAR_ITEM_SELECTED_P) = selected;
7882 PROP (TOOL_BAR_ITEM_TYPE) = type;
7ee32cda
GM
7883 }
7884 }
7885 else if (EQ (key, QCimage)
7886 && (CONSP (value)
7887 || (VECTORP (value) && XVECTOR (value)->size == 4)))
7888 /* Value is either a single image specification or a vector
27fd22dc 7889 of 4 such specifications for the different button states. */
9ea173e8 7890 PROP (TOOL_BAR_ITEM_IMAGES) = value;
7ee32cda
GM
7891 }
7892
7893 /* If got a filter apply it on binding. */
7894 if (!NILP (filter))
9ea173e8 7895 PROP (TOOL_BAR_ITEM_BINDING)
7ee32cda
GM
7896 = menu_item_eval_property (list2 (filter,
7897 list2 (Qquote,
9ea173e8 7898 PROP (TOOL_BAR_ITEM_BINDING))));
7ee32cda
GM
7899
7900 /* See if the binding is a keymap. Give up if it is. */
02067692 7901 if (CONSP (get_keymap (PROP (TOOL_BAR_ITEM_BINDING), 0, 1)))
7ee32cda
GM
7902 return 0;
7903
7904 /* Enable or disable selection of item. */
9ea173e8
GM
7905 if (!EQ (PROP (TOOL_BAR_ITEM_ENABLED_P), Qt))
7906 PROP (TOOL_BAR_ITEM_ENABLED_P)
7907 = menu_item_eval_property (PROP (TOOL_BAR_ITEM_ENABLED_P));
7ee32cda 7908
c60ee5e7 7909 /* Handle radio buttons or toggle boxes. */
9ea173e8
GM
7910 if (!NILP (PROP (TOOL_BAR_ITEM_SELECTED_P)))
7911 PROP (TOOL_BAR_ITEM_SELECTED_P)
7912 = menu_item_eval_property (PROP (TOOL_BAR_ITEM_SELECTED_P));
7ee32cda
GM
7913
7914 return 1;
c60ee5e7 7915
7ee32cda
GM
7916#undef PROP
7917}
7918
7919
9ea173e8
GM
7920/* Initialize tool_bar_items_vector. REUSE, if non-nil, is a vector
7921 that can be reused. */
7ee32cda
GM
7922
7923static void
9ea173e8 7924init_tool_bar_items (reuse)
7ee32cda
GM
7925 Lisp_Object reuse;
7926{
7927 if (VECTORP (reuse))
9ea173e8 7928 tool_bar_items_vector = reuse;
7ee32cda 7929 else
9ea173e8
GM
7930 tool_bar_items_vector = Fmake_vector (make_number (64), Qnil);
7931 ntool_bar_items = 0;
7ee32cda
GM
7932}
7933
7934
9ea173e8
GM
7935/* Append parsed tool bar item properties from
7936 tool_bar_item_properties */
7ee32cda
GM
7937
7938static void
9ea173e8 7939append_tool_bar_item ()
7ee32cda
GM
7940{
7941 Lisp_Object *to, *from;
c60ee5e7 7942
9ea173e8
GM
7943 /* Enlarge tool_bar_items_vector if necessary. */
7944 if (ntool_bar_items + TOOL_BAR_ITEM_NSLOTS
7945 >= XVECTOR (tool_bar_items_vector)->size)
7ee32cda
GM
7946 {
7947 Lisp_Object new_vector;
9ea173e8 7948 int old_size = XVECTOR (tool_bar_items_vector)->size;
7ee32cda
GM
7949
7950 new_vector = Fmake_vector (make_number (2 * old_size), Qnil);
9ea173e8 7951 bcopy (XVECTOR (tool_bar_items_vector)->contents,
7ee32cda
GM
7952 XVECTOR (new_vector)->contents,
7953 old_size * sizeof (Lisp_Object));
9ea173e8 7954 tool_bar_items_vector = new_vector;
7ee32cda
GM
7955 }
7956
9ea173e8
GM
7957 /* Append entries from tool_bar_item_properties to the end of
7958 tool_bar_items_vector. */
7959 to = XVECTOR (tool_bar_items_vector)->contents + ntool_bar_items;
7960 from = XVECTOR (tool_bar_item_properties)->contents;
7961 bcopy (from, to, TOOL_BAR_ITEM_NSLOTS * sizeof *to);
7962 ntool_bar_items += TOOL_BAR_ITEM_NSLOTS;
7ee32cda
GM
7963}
7964
7965
7966
7967
e8886a1d 7968\f
dcc408a0
RS
7969/* Read a character using menus based on maps in the array MAPS.
7970 NMAPS is the length of MAPS. Return nil if there are no menus in the maps.
7971 Return t if we displayed a menu but the user rejected it.
7d6de002
RS
7972
7973 PREV_EVENT is the previous input event, or nil if we are reading
7974 the first event of a key sequence.
7975
83d68044 7976 If USED_MOUSE_MENU is non-null, then we set *USED_MOUSE_MENU to 1
6569cc8d 7977 if we used a mouse menu to read the input, or zero otherwise. If
83d68044 7978 USED_MOUSE_MENU is null, we don't dereference it.
284f4730
JB
7979
7980 The prompting is done based on the prompt-string of the map
df0f2ba1 7981 and the strings associated with various map elements.
8150596a
RS
7982
7983 This can be done with X menus or with menus put in the minibuf.
7984 These are done in different ways, depending on how the input will be read.
7985 Menus using X are done after auto-saving in read-char, getting the input
7986 event from Fx_popup_menu; menus using the minibuf use read_char recursively
7987 and do auto-saving in the inner call of read_char. */
284f4730 7988
7617111f 7989static Lisp_Object
8150596a 7990read_char_x_menu_prompt (nmaps, maps, prev_event, used_mouse_menu)
7d6de002
RS
7991 int nmaps;
7992 Lisp_Object *maps;
7993 Lisp_Object prev_event;
7994 int *used_mouse_menu;
284f4730 7995{
7d6de002 7996 int mapno;
14e40288 7997 register Lisp_Object name = Qnil;
7d6de002 7998
6569cc8d
JB
7999 if (used_mouse_menu)
8000 *used_mouse_menu = 0;
284f4730
JB
8001
8002 /* Use local over global Menu maps */
8003
7d6de002
RS
8004 if (! menu_prompting)
8005 return Qnil;
8006
03361bcc
RS
8007 /* Optionally disregard all but the global map. */
8008 if (inhibit_local_menu_bar_menus)
8009 {
8010 maps += (nmaps - 1);
8011 nmaps = 1;
8012 }
8013
7d6de002
RS
8014 /* Get the menu name from the first map that has one (a prompt string). */
8015 for (mapno = 0; mapno < nmaps; mapno++)
8016 {
bdb7aa47 8017 name = Fkeymap_prompt (maps[mapno]);
7d6de002
RS
8018 if (!NILP (name))
8019 break;
8020 }
284f4730 8021
7d6de002 8022 /* If we don't have any menus, just read a character normally. */
fa113341 8023 if (!STRINGP (name))
7d6de002
RS
8024 return Qnil;
8025
1f5b1641 8026#ifdef HAVE_MENUS
7d6de002
RS
8027 /* If we got to this point via a mouse click,
8028 use a real menu for mouse selection. */
5a8d99e0 8029 if (EVENT_HAS_PARAMETERS (prev_event)
7539e11f
KR
8030 && !EQ (XCAR (prev_event), Qmenu_bar)
8031 && !EQ (XCAR (prev_event), Qtool_bar))
7d6de002
RS
8032 {
8033 /* Display the menu and get the selection. */
8034 Lisp_Object *realmaps
8035 = (Lisp_Object *) alloca (nmaps * sizeof (Lisp_Object));
8036 Lisp_Object value;
8037 int nmaps1 = 0;
8038
8039 /* Use the maps that are not nil. */
8040 for (mapno = 0; mapno < nmaps; mapno++)
8041 if (!NILP (maps[mapno]))
8042 realmaps[nmaps1++] = maps[mapno];
8043
8044 value = Fx_popup_menu (prev_event, Flist (nmaps1, realmaps));
663258f2
JB
8045 if (CONSP (value))
8046 {
68f297c5
RS
8047 Lisp_Object tem;
8048
7539e11f 8049 record_menu_key (XCAR (value));
8eb4d8ef 8050
68f297c5
RS
8051 /* If we got multiple events, unread all but
8052 the first.
8053 There is no way to prevent those unread events
8054 from showing up later in last_nonmenu_event.
8055 So turn symbol and integer events into lists,
8056 to indicate that they came from a mouse menu,
8057 so that when present in last_nonmenu_event
8058 they won't confuse things. */
f4e05d97 8059 for (tem = XCDR (value); !NILP (tem); tem = XCDR (tem))
8eb4d8ef 8060 {
7539e11f
KR
8061 record_menu_key (XCAR (tem));
8062 if (SYMBOLP (XCAR (tem))
8063 || INTEGERP (XCAR (tem)))
f3fbd155 8064 XSETCAR (tem, Fcons (XCAR (tem), Qdisabled));
8eb4d8ef 8065 }
68f297c5 8066
663258f2
JB
8067 /* If we got more than one event, put all but the first
8068 onto this list to be read later.
8069 Return just the first event now. */
24597608 8070 Vunread_command_events
7539e11f
KR
8071 = nconc2 (XCDR (value), Vunread_command_events);
8072 value = XCAR (value);
663258f2 8073 }
1c90c381 8074 else if (NILP (value))
dcc408a0 8075 value = Qt;
6569cc8d
JB
8076 if (used_mouse_menu)
8077 *used_mouse_menu = 1;
7d6de002
RS
8078 return value;
8079 }
1f5b1641 8080#endif /* HAVE_MENUS */
8150596a
RS
8081 return Qnil ;
8082}
8083
af2b7cc9
KS
8084/* Buffer in use so far for the minibuf prompts for menu keymaps.
8085 We make this bigger when necessary, and never free it. */
8086static char *read_char_minibuf_menu_text;
8087/* Size of that buffer. */
8088static int read_char_minibuf_menu_width;
8089
8150596a 8090static Lisp_Object
24597608 8091read_char_minibuf_menu_prompt (commandflag, nmaps, maps)
8150596a
RS
8092 int commandflag ;
8093 int nmaps;
8094 Lisp_Object *maps;
8095{
8096 int mapno;
8097 register Lisp_Object name;
af2b7cc9 8098 int nlength;
14e40288 8099 /* FIXME: Use the minibuffer's frame width. */
2cdbe73e 8100 int width = FRAME_COLS (SELECTED_FRAME ()) - 4;
8150596a 8101 int idx = -1;
af2b7cc9 8102 int nobindings = 1;
8150596a 8103 Lisp_Object rest, vector;
af2b7cc9 8104 char *menu;
8150596a 8105
8c907a56 8106 vector = Qnil;
7189cad8 8107 name = Qnil;
8c907a56 8108
8150596a
RS
8109 if (! menu_prompting)
8110 return Qnil;
8111
af2b7cc9
KS
8112 /* Make sure we have a big enough buffer for the menu text. */
8113 if (read_char_minibuf_menu_text == 0)
8114 {
8115 read_char_minibuf_menu_width = width + 4;
8116 read_char_minibuf_menu_text = (char *) xmalloc (width + 4);
8117 }
8118 else if (width + 4 > read_char_minibuf_menu_width)
8119 {
8120 read_char_minibuf_menu_width = width + 4;
8121 read_char_minibuf_menu_text
8122 = (char *) xrealloc (read_char_minibuf_menu_text, width + 4);
8123 }
8124 menu = read_char_minibuf_menu_text;
8125
8150596a
RS
8126 /* Get the menu name from the first map that has one (a prompt string). */
8127 for (mapno = 0; mapno < nmaps; mapno++)
8128 {
bdb7aa47 8129 name = Fkeymap_prompt (maps[mapno]);
8150596a
RS
8130 if (!NILP (name))
8131 break;
8132 }
8133
8134 /* If we don't have any menus, just read a character normally. */
fa113341 8135 if (!STRINGP (name))
8150596a 8136 return Qnil;
284f4730 8137
af2b7cc9 8138 /* Prompt string always starts with map's prompt, and a space. */
d5db4077
KR
8139 strcpy (menu, SDATA (name));
8140 nlength = SBYTES (name);
af2b7cc9
KS
8141 menu[nlength++] = ':';
8142 menu[nlength++] = ' ';
8143 menu[nlength] = 0;
8144
7d6de002
RS
8145 /* Start prompting at start of first map. */
8146 mapno = 0;
8147 rest = maps[mapno];
284f4730 8148
af2b7cc9
KS
8149 /* Present the documented bindings, a line at a time. */
8150 while (1)
284f4730 8151 {
af2b7cc9
KS
8152 int notfirst = 0;
8153 int i = nlength;
8154 Lisp_Object obj;
8155 int ch;
8156 Lisp_Object orig_defn_macro;
284f4730 8157
af2b7cc9
KS
8158 /* Loop over elements of map. */
8159 while (i < width)
284f4730 8160 {
af2b7cc9 8161 Lisp_Object elt;
284f4730 8162
af2b7cc9
KS
8163 /* If reached end of map, start at beginning of next map. */
8164 if (NILP (rest))
8165 {
8166 mapno++;
8167 /* At end of last map, wrap around to first map if just starting,
8168 or end this line if already have something on it. */
8169 if (mapno == nmaps)
8170 {
8171 mapno = 0;
8172 if (notfirst || nobindings) break;
8173 }
8174 rest = maps[mapno];
8175 }
7d6de002 8176
af2b7cc9
KS
8177 /* Look at the next element of the map. */
8178 if (idx >= 0)
8179 elt = XVECTOR (vector)->contents[idx];
8180 else
8181 elt = Fcar_safe (rest);
7d6de002 8182
af2b7cc9 8183 if (idx < 0 && VECTORP (elt))
284f4730 8184 {
af2b7cc9
KS
8185 /* If we found a dense table in the keymap,
8186 advanced past it, but start scanning its contents. */
8187 rest = Fcdr_safe (rest);
8188 vector = elt;
8189 idx = 0;
284f4730 8190 }
7d6de002
RS
8191 else
8192 {
af2b7cc9
KS
8193 /* An ordinary element. */
8194 Lisp_Object event, tem;
7d6de002 8195
af2b7cc9
KS
8196 if (idx < 0)
8197 {
8198 event = Fcar_safe (elt); /* alist */
8199 elt = Fcdr_safe (elt);
8200 }
8201 else
8202 {
8203 XSETINT (event, idx); /* vector */
8204 }
284f4730 8205
af2b7cc9
KS
8206 /* Ignore the element if it has no prompt string. */
8207 if (INTEGERP (event) && parse_menu_item (elt, 0, -1))
8208 {
8209 /* 1 if the char to type matches the string. */
8210 int char_matches;
8211 Lisp_Object upcased_event, downcased_event;
8212 Lisp_Object desc = Qnil;
8213 Lisp_Object s
8214 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME];
8215
8216 upcased_event = Fupcase (event);
8217 downcased_event = Fdowncase (event);
d5db4077
KR
8218 char_matches = (XINT (upcased_event) == SREF (s, 0)
8219 || XINT (downcased_event) == SREF (s, 0));
af2b7cc9
KS
8220 if (! char_matches)
8221 desc = Fsingle_key_description (event, Qnil);
8222
8223#if 0 /* It is redundant to list the equivalent key bindings because
8224 the prefix is what the user has already typed. */
8225 tem
8226 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_KEYEQ];
8227 if (!NILP (tem))
8228 /* Insert equivalent keybinding. */
8229 s = concat2 (s, tem);
8230#endif
8231 tem
8232 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE];
8233 if (EQ (tem, QCradio) || EQ (tem, QCtoggle))
8234 {
8235 /* Insert button prefix. */
8236 Lisp_Object selected
8237 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED];
8238 if (EQ (tem, QCradio))
8239 tem = build_string (NILP (selected) ? "(*) " : "( ) ");
8240 else
8241 tem = build_string (NILP (selected) ? "[X] " : "[ ] ");
8242 s = concat2 (tem, s);
8243 }
c60ee5e7 8244
af2b7cc9
KS
8245
8246 /* If we have room for the prompt string, add it to this line.
8247 If this is the first on the line, always add it. */
d5db4077
KR
8248 if ((SCHARS (s) + i + 2
8249 + (char_matches ? 0 : SCHARS (desc) + 3))
af2b7cc9
KS
8250 < width
8251 || !notfirst)
8252 {
8253 int thiswidth;
8254
8255 /* Punctuate between strings. */
8256 if (notfirst)
8257 {
8258 strcpy (menu + i, ", ");
8259 i += 2;
8260 }
8261 notfirst = 1;
8262 nobindings = 0 ;
8263
8264 /* If the char to type doesn't match the string's
8265 first char, explicitly show what char to type. */
8266 if (! char_matches)
8267 {
8268 /* Add as much of string as fits. */
d5db4077 8269 thiswidth = SCHARS (desc);
af2b7cc9
KS
8270 if (thiswidth + i > width)
8271 thiswidth = width - i;
d5db4077 8272 bcopy (SDATA (desc), menu + i, thiswidth);
af2b7cc9
KS
8273 i += thiswidth;
8274 strcpy (menu + i, " = ");
8275 i += 3;
8276 }
8277
8278 /* Add as much of string as fits. */
d5db4077 8279 thiswidth = SCHARS (s);
af2b7cc9
KS
8280 if (thiswidth + i > width)
8281 thiswidth = width - i;
d5db4077 8282 bcopy (SDATA (s), menu + i, thiswidth);
af2b7cc9
KS
8283 i += thiswidth;
8284 menu[i] = 0;
8285 }
8286 else
8287 {
8288 /* If this element does not fit, end the line now,
8289 and save the element for the next line. */
8290 strcpy (menu + i, "...");
8291 break;
8292 }
8293 }
8294
8295 /* Move past this element. */
8296 if (idx >= 0 && idx + 1 >= XVECTOR (vector)->size)
8297 /* Handle reaching end of dense table. */
8298 idx = -1;
8299 if (idx >= 0)
8300 idx++;
8301 else
8302 rest = Fcdr_safe (rest);
8303 }
325309f5 8304 }
8150596a 8305
af2b7cc9 8306 /* Prompt with that and read response. */
c60ee5e7 8307 message2_nolog (menu, strlen (menu),
af2b7cc9 8308 ! NILP (current_buffer->enable_multibyte_characters));
284f4730 8309
af2b7cc9
KS
8310 /* Make believe its not a keyboard macro in case the help char
8311 is pressed. Help characters are not recorded because menu prompting
8312 is not used on replay.
8313 */
8314 orig_defn_macro = current_kboard->defining_kbd_macro;
8315 current_kboard->defining_kbd_macro = Qnil;
8316 do
179f689c 8317 obj = read_char (commandflag, 0, 0, Qt, 0, NULL);
af2b7cc9
KS
8318 while (BUFFERP (obj));
8319 current_kboard->defining_kbd_macro = orig_defn_macro;
284f4730 8320
af2b7cc9
KS
8321 if (!INTEGERP (obj))
8322 return obj;
8323 else
8324 ch = XINT (obj);
8325
8326 if (! EQ (obj, menu_prompt_more_char)
8327 && (!INTEGERP (menu_prompt_more_char)
8328 || ! EQ (obj, make_number (Ctl (XINT (menu_prompt_more_char))))))
8329 {
8330 if (!NILP (current_kboard->defining_kbd_macro))
8331 store_kbd_macro_char (obj);
8332 return obj;
8333 }
8334 /* Help char - go round again */
8335 }
284f4730 8336}
284f4730
JB
8337\f
8338/* Reading key sequences. */
8339
8340/* Follow KEY in the maps in CURRENT[0..NMAPS-1], placing its bindings
8341 in DEFS[0..NMAPS-1]. Set NEXT[i] to DEFS[i] if DEFS[i] is a
8342 keymap, or nil otherwise. Return the index of the first keymap in
8343 which KEY has any binding, or NMAPS if no map has a binding.
8344
8345 If KEY is a meta ASCII character, treat it like meta-prefix-char
8346 followed by the corresponding non-meta character. Keymaps in
8347 CURRENT with non-prefix bindings for meta-prefix-char become nil in
8348 NEXT.
8349
88cb0656
JB
8350 If KEY has no bindings in any of the CURRENT maps, NEXT is left
8351 unmodified.
8352
569871d2 8353 NEXT may be the same array as CURRENT. */
284f4730
JB
8354
8355static int
4e50f26a 8356follow_key (key, nmaps, current, defs, next)
284f4730
JB
8357 Lisp_Object key;
8358 Lisp_Object *current, *defs, *next;
8359 int nmaps;
8360{
8361 int i, first_binding;
8362
284f4730
JB
8363 first_binding = nmaps;
8364 for (i = nmaps - 1; i >= 0; i--)
8365 {
8366 if (! NILP (current[i]))
8367 {
fe5b94c5 8368 defs[i] = access_keymap (current[i], key, 1, 0, 1);
284f4730
JB
8369 if (! NILP (defs[i]))
8370 first_binding = i;
8371 }
8372 else
8373 defs[i] = Qnil;
8374 }
8375
284f4730 8376 /* Given the set of bindings we've found, produce the next set of maps. */
0a7f1fc0
JB
8377 if (first_binding < nmaps)
8378 for (i = 0; i < nmaps; i++)
02067692 8379 next[i] = NILP (defs[i]) ? Qnil : get_keymap (defs[i], 0, 1);
284f4730
JB
8380
8381 return first_binding;
8382}
8383
a7f26f28
SM
8384/* Structure used to keep track of partial application of key remapping
8385 such as Vfunction_key_map and Vkey_translation_map. */
8386typedef struct keyremap
8387{
24d80a06 8388 Lisp_Object map, parent;
a7f26f28
SM
8389 int start, end;
8390} keyremap;
8391
fe5b94c5
SM
8392/* Lookup KEY in MAP.
8393 MAP is a keymap mapping keys to key vectors or functions.
8394 If the mapping is a function and DO_FUNCTION is non-zero, then
8395 the function is called with PROMPT as parameter and its return
8396 value is used as the return value of this function (after checking
8397 that it is indeed a vector). */
8398
8399static Lisp_Object
8400access_keymap_keyremap (map, key, prompt, do_funcall)
8401 Lisp_Object map, key, prompt;
8402 int do_funcall;
8403{
8404 Lisp_Object next;
2320865d 8405
fe5b94c5
SM
8406 next = access_keymap (map, key, 1, 0, 1);
8407
8408 /* Handle symbol with autoload definition. */
8409 if (SYMBOLP (next) && !NILP (Ffboundp (next))
8410 && CONSP (XSYMBOL (next)->function)
8411 && EQ (XCAR (XSYMBOL (next)->function), Qautoload))
8412 do_autoload (XSYMBOL (next)->function, next);
8413
8414 /* Handle a symbol whose function definition is a keymap
8415 or an array. */
8416 if (SYMBOLP (next) && !NILP (Ffboundp (next))
592c0e80 8417 && (ARRAYP (XSYMBOL (next)->function)
fe5b94c5
SM
8418 || KEYMAPP (XSYMBOL (next)->function)))
8419 next = XSYMBOL (next)->function;
2320865d 8420
fe5b94c5
SM
8421 /* If the keymap gives a function, not an
8422 array, then call the function with one arg and use
8423 its value instead. */
8424 if (SYMBOLP (next) && !NILP (Ffboundp (next)) && do_funcall)
8425 {
8426 Lisp_Object tem;
8427 tem = next;
8428
8429 next = call1 (next, prompt);
8430 /* If the function returned something invalid,
8431 barf--don't ignore it.
8432 (To ignore it safely, we would need to gcpro a bunch of
8433 other variables.) */
8434 if (! (VECTORP (next) || STRINGP (next)))
8435 error ("Function %s returns invalid key sequence", tem);
8436 }
8437 return next;
8438}
8439
8440/* Do one step of the key remapping used for function-key-map and
8441 key-translation-map:
8442 KEYBUF is the buffer holding the input events.
8443 BUFSIZE is its maximum size.
8444 FKEY is a pointer to the keyremap structure to use.
8445 INPUT is the index of the last element in KEYBUF.
8446 DOIT if non-zero says that the remapping can actually take place.
8447 DIFF is used to return the number of keys added/removed by the remapping.
8448 PARENT is the root of the keymap.
8449 PROMPT is the prompt to use if the remapping happens through a function.
8450 The return value is non-zero if the remapping actually took place. */
8451
8452static int
24d80a06
SM
8453keyremap_step (keybuf, bufsize, fkey, input, doit, diff, prompt)
8454 Lisp_Object *keybuf, prompt;
fe5b94c5
SM
8455 keyremap *fkey;
8456 int input, doit, *diff, bufsize;
8457{
8458 Lisp_Object next, key;
8459
8460 key = keybuf[fkey->end++];
8461 next = access_keymap_keyremap (fkey->map, key, prompt, doit);
8462
8463 /* If keybuf[fkey->start..fkey->end] is bound in the
8464 map and we're in a position to do the key remapping, replace it with
8465 the binding and restart with fkey->start at the end. */
8466 if ((VECTORP (next) || STRINGP (next)) && doit)
8467 {
8468 int len = XFASTINT (Flength (next));
8469 int i;
8470
8471 *diff = len - (fkey->end - fkey->start);
8472
8473 if (input + *diff >= bufsize)
8474 error ("Key sequence too long");
8475
8476 /* Shift the keys that follow fkey->end. */
8477 if (*diff < 0)
8478 for (i = fkey->end; i < input; i++)
8479 keybuf[i + *diff] = keybuf[i];
8480 else if (*diff > 0)
8481 for (i = input - 1; i >= fkey->end; i--)
8482 keybuf[i + *diff] = keybuf[i];
8483 /* Overwrite the old keys with the new ones. */
8484 for (i = 0; i < len; i++)
8485 keybuf[fkey->start + i]
8486 = Faref (next, make_number (i));
8487
8488 fkey->start = fkey->end += *diff;
24d80a06 8489 fkey->map = fkey->parent;
fe5b94c5
SM
8490
8491 return 1;
8492 }
8493
8494 fkey->map = get_keymap (next, 0, 1);
8495
8496 /* If we no longer have a bound suffix, try a new position for
8497 fkey->start. */
8498 if (!CONSP (fkey->map))
8499 {
8500 fkey->end = ++fkey->start;
24d80a06 8501 fkey->map = fkey->parent;
fe5b94c5
SM
8502 }
8503 return 0;
8504}
a7f26f28 8505
df0f2ba1 8506/* Read a sequence of keys that ends with a non prefix character,
f4255cd1
JB
8507 storing it in KEYBUF, a buffer of size BUFSIZE.
8508 Prompt with PROMPT.
284f4730 8509 Return the length of the key sequence stored.
dcc408a0 8510 Return -1 if the user rejected a command menu.
284f4730 8511
f4255cd1
JB
8512 Echo starting immediately unless `prompt' is 0.
8513
8514 Where a key sequence ends depends on the currently active keymaps.
8515 These include any minor mode keymaps active in the current buffer,
8516 the current buffer's local map, and the global map.
8517
8518 If a key sequence has no other bindings, we check Vfunction_key_map
8519 to see if some trailing subsequence might be the beginning of a
8520 function key's sequence. If so, we try to read the whole function
8521 key, and substitute its symbolic name into the key sequence.
8522
fbcd35bd
JB
8523 We ignore unbound `down-' mouse clicks. We turn unbound `drag-' and
8524 `double-' events into similar click events, if that would make them
8525 bound. We try to turn `triple-' events first into `double-' events,
8526 then into clicks.
f4255cd1
JB
8527
8528 If we get a mouse click in a mode line, vertical divider, or other
8529 non-text area, we treat the click as if it were prefixed by the
8530 symbol denoting that area - `mode-line', `vertical-line', or
8531 whatever.
8532
8533 If the sequence starts with a mouse click, we read the key sequence
8534 with respect to the buffer clicked on, not the current buffer.
284f4730 8535
f4255cd1
JB
8536 If the user switches frames in the midst of a key sequence, we put
8537 off the switch-frame event until later; the next call to
f571ae0d
RS
8538 read_char will return it.
8539
8540 If FIX_CURRENT_BUFFER is nonzero, we restore current_buffer
8541 from the selected window's buffer. */
48e416d4 8542
284f4730 8543static int
ce98e608 8544read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
f571ae0d 8545 can_return_switch_frame, fix_current_buffer)
284f4730
JB
8546 Lisp_Object *keybuf;
8547 int bufsize;
84d91fda 8548 Lisp_Object prompt;
309b0fc8 8549 int dont_downcase_last;
ce98e608 8550 int can_return_switch_frame;
f571ae0d 8551 int fix_current_buffer;
284f4730 8552{
db14cfc5 8553 volatile Lisp_Object from_string;
aed13378 8554 volatile int count = SPECPDL_INDEX ();
f4255cd1 8555
284f4730 8556 /* How many keys there are in the current key sequence. */
8c907a56 8557 volatile int t;
284f4730 8558
284f4730
JB
8559 /* The length of the echo buffer when we started reading, and
8560 the length of this_command_keys when we started reading. */
8c907a56
GM
8561 volatile int echo_start;
8562 volatile int keys_start;
284f4730
JB
8563
8564 /* The number of keymaps we're scanning right now, and the number of
8565 keymaps we have allocated space for. */
8c907a56
GM
8566 volatile int nmaps;
8567 volatile int nmaps_allocated = 0;
284f4730 8568
284f4730
JB
8569 /* defs[0..nmaps-1] are the definitions of KEYBUF[0..t-1] in
8570 the current keymaps. */
8c907a56 8571 Lisp_Object *volatile defs = NULL;
284f4730 8572
f4255cd1
JB
8573 /* submaps[0..nmaps-1] are the prefix definitions of KEYBUF[0..t-1]
8574 in the current keymaps, or nil where it is not a prefix. */
8c907a56 8575 Lisp_Object *volatile submaps = NULL;
f4255cd1 8576
e0dff5f6 8577 /* The local map to start out with at start of key sequence. */
8c907a56 8578 volatile Lisp_Object orig_local_map;
e0dff5f6 8579
30690496
DL
8580 /* The map from the `keymap' property to start out with at start of
8581 key sequence. */
8c907a56 8582 volatile Lisp_Object orig_keymap;
30690496 8583
e0dff5f6
RS
8584 /* 1 if we have already considered switching to the local-map property
8585 of the place where a mouse click occurred. */
8c907a56 8586 volatile int localized_local_map = 0;
e0dff5f6 8587
f4255cd1
JB
8588 /* The index in defs[] of the first keymap that has a binding for
8589 this key sequence. In other words, the lowest i such that
8590 defs[i] is non-nil. */
8c907a56 8591 volatile int first_binding;
7189cad8 8592 /* Index of the first key that has no binding.
a7f26f28 8593 It is useless to try fkey.start larger than that. */
7189cad8 8594 volatile int first_unbound;
284f4730 8595
f4255cd1 8596 /* If t < mock_input, then KEYBUF[t] should be read as the next
253598e4
JB
8597 input key.
8598
8599 We use this to recover after recognizing a function key. Once we
8600 realize that a suffix of the current key sequence is actually a
8601 function key's escape sequence, we replace the suffix with the
8602 function key's binding from Vfunction_key_map. Now keybuf
f4255cd1
JB
8603 contains a new and different key sequence, so the echo area,
8604 this_command_keys, and the submaps and defs arrays are wrong. In
8605 this situation, we set mock_input to t, set t to 0, and jump to
8606 restart_sequence; the loop will read keys from keybuf up until
8607 mock_input, thus rebuilding the state; and then it will resume
8608 reading characters from the keyboard. */
8c907a56 8609 volatile int mock_input = 0;
284f4730 8610
253598e4 8611 /* If the sequence is unbound in submaps[], then
a7f26f28
SM
8612 keybuf[fkey.start..fkey.end-1] is a prefix in Vfunction_key_map,
8613 and fkey.map is its binding.
253598e4 8614
f4255cd1
JB
8615 These might be > t, indicating that all function key scanning
8616 should hold off until t reaches them. We do this when we've just
8617 recognized a function key, to avoid searching for the function
8618 key's again in Vfunction_key_map. */
a7f26f28 8619 volatile keyremap fkey;
284f4730 8620
a612e298 8621 /* Likewise, for key_translation_map. */
a7f26f28 8622 volatile keyremap keytran;
a612e298 8623
fe5b94c5
SM
8624 /* If we receive a `switch-frame' or `select-window' event in the middle of
8625 a key sequence, we put it off for later.
8626 While we're reading, we keep the event here. */
8c907a56 8627 volatile Lisp_Object delayed_switch_frame;
cd21b839 8628
51763820
BF
8629 /* See the comment below... */
8630#if defined (GOBBLE_FIRST_EVENT)
4efda7dd 8631 Lisp_Object first_event;
51763820 8632#endif
4efda7dd 8633
8c907a56
GM
8634 volatile Lisp_Object original_uppercase;
8635 volatile int original_uppercase_position = -1;
309b0fc8 8636
bc536d84 8637 /* Gets around Microsoft compiler limitations. */
309b0fc8 8638 int dummyflag = 0;
bc536d84 8639
3b9189f8
RS
8640 struct buffer *starting_buffer;
8641
2dc00208
GM
8642 /* List of events for which a fake prefix key has been generated. */
8643 volatile Lisp_Object fake_prefixed_keys = Qnil;
8644
03cee6ae 8645#if defined (GOBBLE_FIRST_EVENT)
4efda7dd 8646 int junk;
03cee6ae 8647#endif
4efda7dd 8648
2dc00208
GM
8649 struct gcpro gcpro1;
8650
8651 GCPRO1 (fake_prefixed_keys);
7d18f9ae
RS
8652 raw_keybuf_count = 0;
8653
4efda7dd
RS
8654 last_nonmenu_event = Qnil;
8655
8656 delayed_switch_frame = Qnil;
24d80a06
SM
8657 fkey.map = fkey.parent = Vfunction_key_map;
8658 keytran.map = keytran.parent = Vkey_translation_map;
a7f26f28
SM
8659 /* If there is no translation-map, turn off scanning. */
8660 fkey.start = fkey.end = KEYMAPP (fkey.map) ? 0 : bufsize + 1;
8661 keytran.start = keytran.end = KEYMAPP (keytran.map) ? 0 : bufsize + 1;
a612e298 8662
284f4730
JB
8663 if (INTERACTIVE)
8664 {
84d91fda 8665 if (!NILP (prompt))
a4ef85ee 8666 echo_prompt (prompt);
f2647d04
DL
8667 else if (cursor_in_echo_area
8668 && (FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
8669 && NILP (Fzerop (Vecho_keystrokes)))
284f4730
JB
8670 /* This doesn't put in a dash if the echo buffer is empty, so
8671 you don't always see a dash hanging out in the minibuffer. */
8672 echo_dash ();
284f4730
JB
8673 }
8674
f4255cd1
JB
8675 /* Record the initial state of the echo area and this_command_keys;
8676 we will need to restore them if we replay a key sequence. */
0a7f1fc0 8677 if (INTERACTIVE)
df0f2ba1 8678 echo_start = echo_length ();
f4255cd1 8679 keys_start = this_command_key_count;
6321824f 8680 this_single_command_key_start = keys_start;
0a7f1fc0 8681
51763820
BF
8682#if defined (GOBBLE_FIRST_EVENT)
8683 /* This doesn't quite work, because some of the things that read_char
8684 does cannot safely be bypassed. It seems too risky to try to make
df0f2ba1 8685 this work right. */
51763820 8686
4efda7dd
RS
8687 /* Read the first char of the sequence specially, before setting
8688 up any keymaps, in case a filter runs and switches buffers on us. */
84d91fda 8689 first_event = read_char (NILP (prompt), 0, submaps, last_nonmenu_event,
179f689c 8690 &junk, NULL);
51763820 8691#endif /* GOBBLE_FIRST_EVENT */
4efda7dd 8692
24a40fbb
GM
8693 orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
8694 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
db14cfc5 8695 from_string = Qnil;
e0dff5f6 8696
7b4aedb9
JB
8697 /* We jump here when the key sequence has been thoroughly changed, and
8698 we need to rescan it starting from the beginning. When we jump here,
8699 keybuf[0..mock_input] holds the sequence we should reread. */
07d2b8de 8700 replay_sequence:
7b4aedb9 8701
3b9189f8 8702 starting_buffer = current_buffer;
7189cad8 8703 first_unbound = bufsize + 1;
3b9189f8 8704
f4255cd1 8705 /* Build our list of keymaps.
07d2b8de
JB
8706 If we recognize a function key and replace its escape sequence in
8707 keybuf with its symbol, or if the sequence starts with a mouse
8708 click and we need to switch buffers, we jump back here to rebuild
8709 the initial keymaps from the current buffer. */
4cbedc16 8710 nmaps = 0;
284f4730 8711
4cbedc16
RS
8712 if (!NILP (current_kboard->Voverriding_terminal_local_map)
8713 || !NILP (Voverriding_local_map))
8714 {
8715 if (3 > nmaps_allocated)
8716 {
8717 submaps = (Lisp_Object *) alloca (3 * sizeof (submaps[0]));
8718 defs = (Lisp_Object *) alloca (3 * sizeof (defs[0]));
8719 nmaps_allocated = 3;
8720 }
8721 if (!NILP (current_kboard->Voverriding_terminal_local_map))
8722 submaps[nmaps++] = current_kboard->Voverriding_terminal_local_map;
8723 if (!NILP (Voverriding_local_map))
8724 submaps[nmaps++] = Voverriding_local_map;
8725 }
8726 else
8727 {
4cbedc16
RS
8728 int nminor;
8729 int total;
8730 Lisp_Object *maps;
8731
8732 nminor = current_minor_maps (0, &maps);
8733 total = nminor + (!NILP (orig_keymap) ? 3 : 2);
8734
8735 if (total > nmaps_allocated)
8736 {
8737 submaps = (Lisp_Object *) alloca (total * sizeof (submaps[0]));
8738 defs = (Lisp_Object *) alloca (total * sizeof (defs[0]));
8739 nmaps_allocated = total;
8740 }
8741
8742 if (!NILP (orig_keymap))
8743 submaps[nmaps++] = orig_keymap;
8744
7d1c4866 8745 bcopy (maps, (void *) (submaps + nmaps),
4cbedc16
RS
8746 nminor * sizeof (submaps[0]));
8747
8748 nmaps += nminor;
8749
8750 submaps[nmaps++] = orig_local_map;
8751 }
8752 submaps[nmaps++] = current_global_map;
284f4730
JB
8753
8754 /* Find an accurate initial value for first_binding. */
8755 for (first_binding = 0; first_binding < nmaps; first_binding++)
253598e4 8756 if (! NILP (submaps[first_binding]))
284f4730
JB
8757 break;
8758
3b9189f8 8759 /* Start from the beginning in keybuf. */
f4255cd1
JB
8760 t = 0;
8761
8762 /* These are no-ops the first time through, but if we restart, they
8763 revert the echo area and this_command_keys to their original state. */
8764 this_command_key_count = keys_start;
df0f2ba1 8765 if (INTERACTIVE && t < mock_input)
f4255cd1
JB
8766 echo_truncate (echo_start);
8767
cca310da
JB
8768 /* If the best binding for the current key sequence is a keymap, or
8769 we may be looking at a function key's escape sequence, keep on
8770 reading. */
a7f26f28
SM
8771 while (first_binding < nmaps
8772 /* Keep reading as long as there's a prefix binding. */
8773 ? !NILP (submaps[first_binding])
e9bf89a0
RS
8774 /* Don't return in the middle of a possible function key sequence,
8775 if the only bindings we found were via case conversion.
8776 Thus, if ESC O a has a function-key-map translation
8777 and ESC o has a binding, don't return after ESC O,
8778 so that we can translate ESC O plus the next character. */
a7f26f28 8779 : (fkey.start < t || keytran.start < t))
284f4730
JB
8780 {
8781 Lisp_Object key;
7d6de002 8782 int used_mouse_menu = 0;
284f4730 8783
7b4aedb9
JB
8784 /* Where the last real key started. If we need to throw away a
8785 key that has expanded into more than one element of keybuf
8786 (say, a mouse click on the mode line which is being treated
8787 as [mode-line (mouse-...)], then we backtrack to this point
8788 of keybuf. */
8c907a56 8789 volatile int last_real_key_start;
7b4aedb9 8790
0a7f1fc0
JB
8791 /* These variables are analogous to echo_start and keys_start;
8792 while those allow us to restart the entire key sequence,
8793 echo_local_start and keys_local_start allow us to throw away
8794 just one key. */
8c907a56 8795 volatile int echo_local_start, keys_local_start, local_first_binding;
f4255cd1 8796
fe5b94c5
SM
8797 eassert (fkey.end == t || (fkey.end > t && fkey.end <= mock_input));
8798 eassert (fkey.start <= fkey.end);
8799 eassert (keytran.start <= keytran.end);
2cf4b7b2 8800 /* key-translation-map is applied *after* function-key-map. */
a7f26f28 8801 eassert (keytran.end <= fkey.start);
7189cad8 8802
a7f26f28 8803 if (first_unbound < fkey.start && first_unbound < keytran.start)
7189cad8
SM
8804 { /* The prefix upto first_unbound has no binding and has
8805 no translation left to do either, so we know it's unbound.
8806 If we don't stop now, we risk staying here indefinitely
8807 (if the user keeps entering fkey or keytran prefixes
8808 like C-c ESC ESC ESC ESC ...) */
8809 int i;
8810 for (i = first_unbound + 1; i < t; i++)
8811 keybuf[i - first_unbound - 1] = keybuf[i];
8812 mock_input = t - first_unbound - 1;
a7f26f28 8813 fkey.end = fkey.start -= first_unbound + 1;
24d80a06 8814 fkey.map = fkey.parent;
a7f26f28 8815 keytran.end = keytran.start -= first_unbound + 1;
24d80a06 8816 keytran.map = keytran.parent;
7189cad8
SM
8817 goto replay_sequence;
8818 }
8819
284f4730 8820 if (t >= bufsize)
3fe8e9a2 8821 error ("Key sequence too long");
284f4730 8822
f4255cd1
JB
8823 if (INTERACTIVE)
8824 echo_local_start = echo_length ();
8825 keys_local_start = this_command_key_count;
8826 local_first_binding = first_binding;
df0f2ba1 8827
f4255cd1 8828 replay_key:
0a7f1fc0 8829 /* These are no-ops, unless we throw away a keystroke below and
f4255cd1
JB
8830 jumped back up to replay_key; in that case, these restore the
8831 variables to their original state, allowing us to replay the
0a7f1fc0 8832 loop. */
40932d1a 8833 if (INTERACTIVE && t < mock_input)
f4255cd1 8834 echo_truncate (echo_local_start);
0a7f1fc0
JB
8835 this_command_key_count = keys_local_start;
8836 first_binding = local_first_binding;
8837
7e85b935
RS
8838 /* By default, assume each event is "real". */
8839 last_real_key_start = t;
8840
f4255cd1 8841 /* Does mock_input indicate that we are re-reading a key sequence? */
284f4730
JB
8842 if (t < mock_input)
8843 {
8844 key = keybuf[t];
8845 add_command_key (key);
f2647d04
DL
8846 if ((FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
8847 && NILP (Fzerop (Vecho_keystrokes)))
a98ea3f9 8848 echo_char (key);
284f4730 8849 }
253598e4
JB
8850
8851 /* If not, we should actually read a character. */
284f4730
JB
8852 else
8853 {
beecf6a1 8854 {
c5fdd383
KH
8855#ifdef MULTI_KBOARD
8856 KBOARD *interrupted_kboard = current_kboard;
788f89eb 8857 struct frame *interrupted_frame = SELECTED_FRAME ();
c5fdd383 8858 if (setjmp (wrong_kboard_jmpbuf))
beecf6a1 8859 {
5798cf15
KH
8860 if (!NILP (delayed_switch_frame))
8861 {
c5fdd383 8862 interrupted_kboard->kbd_queue
5798cf15 8863 = Fcons (delayed_switch_frame,
c5fdd383 8864 interrupted_kboard->kbd_queue);
5798cf15
KH
8865 delayed_switch_frame = Qnil;
8866 }
beecf6a1 8867 while (t > 0)
c5fdd383
KH
8868 interrupted_kboard->kbd_queue
8869 = Fcons (keybuf[--t], interrupted_kboard->kbd_queue);
5798cf15
KH
8870
8871 /* If the side queue is non-empty, ensure it begins with a
8872 switch-frame, so we'll replay it in the right context. */
c5fdd383 8873 if (CONSP (interrupted_kboard->kbd_queue)
7539e11f 8874 && (key = XCAR (interrupted_kboard->kbd_queue),
5798cf15
KH
8875 !(EVENT_HAS_PARAMETERS (key)
8876 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (key)),
8877 Qswitch_frame))))
df0f2ba1
KH
8878 {
8879 Lisp_Object frame;
8880 XSETFRAME (frame, interrupted_frame);
c5fdd383 8881 interrupted_kboard->kbd_queue
df0f2ba1 8882 = Fcons (make_lispy_switch_frame (frame),
c5fdd383 8883 interrupted_kboard->kbd_queue);
df0f2ba1 8884 }
beecf6a1 8885 mock_input = 0;
24a40fbb
GM
8886 orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
8887 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
beecf6a1
KH
8888 goto replay_sequence;
8889 }
bded54dd 8890#endif
8c907a56
GM
8891 key = read_char (NILP (prompt), nmaps,
8892 (Lisp_Object *) submaps, last_nonmenu_event,
179f689c 8893 &used_mouse_menu, NULL);
beecf6a1 8894 }
284f4730 8895
dcc408a0
RS
8896 /* read_char returns t when it shows a menu and the user rejects it.
8897 Just return -1. */
8898 if (EQ (key, Qt))
7d18f9ae
RS
8899 {
8900 unbind_to (count, Qnil);
2dc00208 8901 UNGCPRO;
7d18f9ae
RS
8902 return -1;
8903 }
dcc408a0 8904
f4255cd1 8905 /* read_char returns -1 at the end of a macro.
284f4730
JB
8906 Emacs 18 handles this by returning immediately with a
8907 zero, so that's what we'll do. */
8c18cbfb 8908 if (INTEGERP (key) && XINT (key) == -1)
cd21b839 8909 {
f4255cd1 8910 t = 0;
bc536d84
RS
8911 /* The Microsoft C compiler can't handle the goto that
8912 would go here. */
309b0fc8 8913 dummyflag = 1;
bc536d84 8914 break;
cd21b839 8915 }
df0f2ba1 8916
3cb81011
KH
8917 /* If the current buffer has been changed from under us, the
8918 keymap may have changed, so replay the sequence. */
8c18cbfb 8919 if (BUFFERP (key))
3cb81011 8920 {
5c12e63f 8921 timer_resume_idle ();
3021d3a9 8922
3cb81011 8923 mock_input = t;
f571ae0d
RS
8924 /* Reset the current buffer from the selected window
8925 in case something changed the former and not the latter.
8926 This is to be more consistent with the behavior
8927 of the command_loop_1. */
8928 if (fix_current_buffer)
a94a4335 8929 {
788f89eb 8930 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
a94a4335
KH
8931 Fkill_emacs (Qnil);
8932 if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
8933 Fset_buffer (XWINDOW (selected_window)->buffer);
8934 }
f571ae0d 8935
24a40fbb
GM
8936 orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
8937 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
3cb81011
KH
8938 goto replay_sequence;
8939 }
8940
3b9189f8
RS
8941 /* If we have a quit that was typed in another frame, and
8942 quit_throw_to_read_char switched buffers,
8943 replay to get the right keymap. */
f4e05d97
GM
8944 if (INTEGERP (key)
8945 && XINT (key) == quit_char
8946 && current_buffer != starting_buffer)
3b9189f8 8947 {
7d18f9ae
RS
8948 GROW_RAW_KEYBUF;
8949 XVECTOR (raw_keybuf)->contents[raw_keybuf_count++] = key;
3b9189f8
RS
8950 keybuf[t++] = key;
8951 mock_input = t;
8952 Vquit_flag = Qnil;
24a40fbb
GM
8953 orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
8954 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
3b9189f8
RS
8955 goto replay_sequence;
8956 }
3cb81011 8957
284f4730 8958 Vquit_flag = Qnil;
7d18f9ae
RS
8959
8960 if (EVENT_HAS_PARAMETERS (key)
fe5b94c5 8961 /* Either a `switch-frame' or a `select-window' event. */
7d18f9ae
RS
8962 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (key)), Qswitch_frame))
8963 {
8964 /* If we're at the beginning of a key sequence, and the caller
8965 says it's okay, go ahead and return this event. If we're
8966 in the midst of a key sequence, delay it until the end. */
8967 if (t > 0 || !can_return_switch_frame)
8968 {
8969 delayed_switch_frame = key;
8970 goto replay_key;
8971 }
8972 }
8973
8974 GROW_RAW_KEYBUF;
8975 XVECTOR (raw_keybuf)->contents[raw_keybuf_count++] = key;
7e85b935 8976 }
284f4730 8977
df0f2ba1 8978 /* Clicks in non-text areas get prefixed by the symbol
7e85b935
RS
8979 in their CHAR-ADDRESS field. For example, a click on
8980 the mode line is prefixed by the symbol `mode-line'.
8981
8982 Furthermore, key sequences beginning with mouse clicks
8983 are read using the keymaps of the buffer clicked on, not
8984 the current buffer. So we may have to switch the buffer
8985 here.
8986
8987 When we turn one event into two events, we must make sure
8988 that neither of the two looks like the original--so that,
8989 if we replay the events, they won't be expanded again.
8990 If not for this, such reexpansion could happen either here
8991 or when user programs play with this-command-keys. */
8992 if (EVENT_HAS_PARAMETERS (key))
8993 {
9b8eb840 8994 Lisp_Object kind;
45de137a 8995 Lisp_Object string;
cca310da 8996
9b8eb840 8997 kind = EVENT_HEAD_KIND (EVENT_HEAD (key));
7e85b935 8998 if (EQ (kind, Qmouse_click))
0a7f1fc0 8999 {
9b8eb840 9000 Lisp_Object window, posn;
f4255cd1 9001
9b8eb840 9002 window = POSN_WINDOW (EVENT_START (key));
eee5863b 9003 posn = POSN_POSN (EVENT_START (key));
7ee32cda 9004
2cf066c3
GM
9005 if (CONSP (posn)
9006 || (!NILP (fake_prefixed_keys)
9007 && !NILP (Fmemq (key, fake_prefixed_keys))))
0a7f1fc0 9008 {
2cf066c3
GM
9009 /* We're looking a second time at an event for which
9010 we generated a fake prefix key. Set
7e85b935
RS
9011 last_real_key_start appropriately. */
9012 if (t > 0)
9013 last_real_key_start = t - 1;
cd21b839 9014 }
7e85b935
RS
9015
9016 /* Key sequences beginning with mouse clicks are
9017 read using the keymaps in the buffer clicked on,
9018 not the current buffer. If we're at the
9019 beginning of a key sequence, switch buffers. */
9020 if (last_real_key_start == 0
8c18cbfb
KH
9021 && WINDOWP (window)
9022 && BUFFERP (XWINDOW (window)->buffer)
7e85b935 9023 && XBUFFER (XWINDOW (window)->buffer) != current_buffer)
cd21b839 9024 {
7d18f9ae 9025 XVECTOR (raw_keybuf)->contents[raw_keybuf_count++] = key;
7e85b935
RS
9026 keybuf[t] = key;
9027 mock_input = t + 1;
9028
9029 /* Arrange to go back to the original buffer once we're
9030 done reading the key sequence. Note that we can't
9031 use save_excursion_{save,restore} here, because they
9032 save point as well as the current buffer; we don't
9033 want to save point, because redisplay may change it,
9034 to accommodate a Fset_window_start or something. We
9035 don't want to do this at the top of the function,
9036 because we may get input from a subprocess which
9037 wants to change the selected window and stuff (say,
9038 emacsclient). */
9039 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
9040
788f89eb 9041 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
a94a4335 9042 Fkill_emacs (Qnil);
24a40fbb 9043 set_buffer_internal (XBUFFER (XWINDOW (window)->buffer));
30690496 9044 orig_local_map = get_local_map (PT, current_buffer,
24a40fbb
GM
9045 Qlocal_map);
9046 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
7e85b935 9047 goto replay_sequence;
0a7f1fc0 9048 }
c60ee5e7 9049
e0dff5f6
RS
9050 /* For a mouse click, get the local text-property keymap
9051 of the place clicked on, rather than point. */
7ee32cda 9052 if (last_real_key_start == 0
7539e11f 9053 && CONSP (XCDR (key))
e0dff5f6 9054 && ! localized_local_map)
5ec75a55 9055 {
e0dff5f6
RS
9056 Lisp_Object map_here, start, pos;
9057
9058 localized_local_map = 1;
9059 start = EVENT_START (key);
c60ee5e7 9060
eee5863b 9061 if (CONSP (start) && POSN_INBUFFER_P (start))
e0dff5f6
RS
9062 {
9063 pos = POSN_BUFFER_POSN (start);
b78ce8fb
RS
9064 if (INTEGERP (pos)
9065 && XINT (pos) >= BEG && XINT (pos) <= Z)
e0dff5f6 9066 {
30690496 9067 map_here = get_local_map (XINT (pos),
24a40fbb 9068 current_buffer, Qlocal_map);
e0dff5f6
RS
9069 if (!EQ (map_here, orig_local_map))
9070 {
9071 orig_local_map = map_here;
9072 keybuf[t] = key;
9073 mock_input = t + 1;
5ec75a55 9074
30690496
DL
9075 goto replay_sequence;
9076 }
9077 map_here = get_local_map (XINT (pos),
24a40fbb 9078 current_buffer, Qkeymap);
30690496
DL
9079 if (!EQ (map_here, orig_keymap))
9080 {
9081 orig_keymap = map_here;
9082 keybuf[t] = key;
9083 mock_input = t + 1;
9084
e0dff5f6
RS
9085 goto replay_sequence;
9086 }
9087 }
9088 }
9089 }
9090
9091 /* Expand mode-line and scroll-bar events into two events:
9092 use posn as a fake prefix key. */
2dc00208
GM
9093 if (SYMBOLP (posn)
9094 && (NILP (fake_prefixed_keys)
9095 || NILP (Fmemq (key, fake_prefixed_keys))))
e0dff5f6 9096 {
7e85b935 9097 if (t + 1 >= bufsize)
3fe8e9a2 9098 error ("Key sequence too long");
c60ee5e7 9099
2dc00208
GM
9100 keybuf[t] = posn;
9101 keybuf[t + 1] = key;
9102 mock_input = t + 2;
9103
9104 /* Record that a fake prefix key has been generated
9105 for KEY. Don't modify the event; this would
9106 prevent proper action when the event is pushed
c7f4f573 9107 back into unread-command-events. */
2dc00208 9108 fake_prefixed_keys = Fcons (key, fake_prefixed_keys);
7ee32cda
GM
9109
9110 /* If on a mode line string with a local keymap,
9111 reconsider the key sequence with that keymap. */
45de137a
KS
9112 if (string = POSN_STRING (EVENT_START (key)),
9113 (CONSP (string) && STRINGP (XCAR (string))))
7ee32cda 9114 {
45de137a 9115 Lisp_Object pos, map, map2;
7ee32cda 9116
7ee32cda
GM
9117 pos = XCDR (string);
9118 string = XCAR (string);
52e386c2 9119 if (XINT (pos) >= 0
d5db4077 9120 && XINT (pos) < SCHARS (string))
30690496
DL
9121 {
9122 map = Fget_text_property (pos, Qlocal_map, string);
9123 if (!NILP (map))
9124 orig_local_map = map;
9125 map2 = Fget_text_property (pos, Qkeymap, string);
9126 if (!NILP (map2))
9127 orig_keymap = map2;
9128 if (!NILP (map) || !NILP (map2))
9129 goto replay_sequence;
9130 }
7ee32cda
GM
9131 }
9132
7e85b935 9133 goto replay_key;
5ec75a55 9134 }
45de137a
KS
9135 else if (NILP (from_string)
9136 && (string = POSN_STRING (EVENT_START (key)),
9137 (CONSP (string) && STRINGP (XCAR (string)))))
db14cfc5
GM
9138 {
9139 /* For a click on a string, i.e. overlay string or a
9140 string displayed via the `display' property,
9141 consider `local-map' and `keymap' properties of
9142 that string. */
45de137a 9143 Lisp_Object pos, map, map2;
db14cfc5 9144
db14cfc5
GM
9145 pos = XCDR (string);
9146 string = XCAR (string);
9147 if (XINT (pos) >= 0
d5db4077 9148 && XINT (pos) < SCHARS (string))
db14cfc5
GM
9149 {
9150 map = Fget_text_property (pos, Qlocal_map, string);
9151 if (!NILP (map))
9152 orig_local_map = map;
9153 map2 = Fget_text_property (pos, Qkeymap, string);
9154 if (!NILP (map2))
9155 orig_keymap = map2;
9156
9157 if (!NILP (map) || !NILP (map2))
9158 {
9159 from_string = string;
9160 goto replay_sequence;
9161 }
9162 }
9163 }
0a7f1fc0 9164 }
7539e11f 9165 else if (CONSP (XCDR (key))
7a80a6f6 9166 && CONSP (EVENT_START (key))
7539e11f 9167 && CONSP (XCDR (EVENT_START (key))))
7e85b935 9168 {
9b8eb840 9169 Lisp_Object posn;
7e85b935 9170
eee5863b 9171 posn = POSN_POSN (EVENT_START (key));
7e85b935
RS
9172 /* Handle menu-bar events:
9173 insert the dummy prefix event `menu-bar'. */
9ea173e8 9174 if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
7e85b935
RS
9175 {
9176 if (t + 1 >= bufsize)
3fe8e9a2 9177 error ("Key sequence too long");
7e85b935
RS
9178 keybuf[t] = posn;
9179 keybuf[t+1] = key;
9180
9181 /* Zap the position in key, so we know that we've
9182 expanded it, and don't try to do so again. */
eee5863b
KS
9183 POSN_SET_POSN (EVENT_START (key),
9184 Fcons (posn, Qnil));
7e85b935
RS
9185
9186 mock_input = t + 2;
9187 goto replay_sequence;
9188 }
8c18cbfb 9189 else if (CONSP (posn))
7e85b935
RS
9190 {
9191 /* We're looking at the second event of a
9192 sequence which we expanded before. Set
9193 last_real_key_start appropriately. */
9194 if (last_real_key_start == t && t > 0)
9195 last_real_key_start = t - 1;
9196 }
a6d53864 9197 }
284f4730 9198 }
f4255cd1
JB
9199
9200 /* We have finally decided that KEY is something we might want
9201 to look up. */
284f4730
JB
9202 first_binding = (follow_key (key,
9203 nmaps - first_binding,
253598e4 9204 submaps + first_binding,
284f4730 9205 defs + first_binding,
4e50f26a 9206 submaps + first_binding)
284f4730 9207 + first_binding);
0a7f1fc0 9208
f4255cd1 9209 /* If KEY wasn't bound, we'll try some fallbacks. */
65e0fbbf
SM
9210 if (first_binding < nmaps)
9211 /* This is needed for the following scenario:
9212 event 0: a down-event that gets dropped by calling replay_key.
9213 event 1: some normal prefix like C-h.
a7f26f28
SM
9214 After event 0, first_unbound is 0, after event 1 fkey.start
9215 and keytran.start are both 1, so when we see that C-h is bound,
65e0fbbf
SM
9216 we need to update first_unbound. */
9217 first_unbound = max (t + 1, first_unbound);
9218 else
0a7f1fc0 9219 {
9b8eb840 9220 Lisp_Object head;
c60ee5e7 9221
a7f26f28 9222 /* Remember the position to put an upper bound on fkey.start. */
7189cad8 9223 first_unbound = min (t, first_unbound);
0a7f1fc0 9224
9b8eb840 9225 head = EVENT_HEAD (key);
24736fbc 9226 if (help_char_p (head) && t > 0)
7e85b935
RS
9227 {
9228 read_key_sequence_cmd = Vprefix_help_command;
9229 keybuf[t++] = key;
9230 last_nonmenu_event = key;
bc536d84
RS
9231 /* The Microsoft C compiler can't handle the goto that
9232 would go here. */
309b0fc8 9233 dummyflag = 1;
0d882d52 9234 break;
7e85b935
RS
9235 }
9236
8c18cbfb 9237 if (SYMBOLP (head))
0a7f1fc0 9238 {
9b8eb840
KH
9239 Lisp_Object breakdown;
9240 int modifiers;
0a7f1fc0 9241
9b8eb840 9242 breakdown = parse_modifiers (head);
7539e11f 9243 modifiers = XINT (XCAR (XCDR (breakdown)));
559f9d04
RS
9244 /* Attempt to reduce an unbound mouse event to a simpler
9245 event that is bound:
9246 Drags reduce to clicks.
9247 Double-clicks reduce to clicks.
9248 Triple-clicks reduce to double-clicks, then to clicks.
9249 Down-clicks are eliminated.
9250 Double-downs reduce to downs, then are eliminated.
9251 Triple-downs reduce to double-downs, then to downs,
9252 then are eliminated. */
9253 if (modifiers & (down_modifier | drag_modifier
9254 | double_modifier | triple_modifier))
0a7f1fc0 9255 {
559f9d04
RS
9256 while (modifiers & (down_modifier | drag_modifier
9257 | double_modifier | triple_modifier))
fbcd35bd
JB
9258 {
9259 Lisp_Object new_head, new_click;
9260 if (modifiers & triple_modifier)
9261 modifiers ^= (double_modifier | triple_modifier);
bc536d84
RS
9262 else if (modifiers & double_modifier)
9263 modifiers &= ~double_modifier;
9264 else if (modifiers & drag_modifier)
9265 modifiers &= ~drag_modifier;
559f9d04
RS
9266 else
9267 {
9268 /* Dispose of this `down' event by simply jumping
9269 back to replay_key, to get another event.
9270
9271 Note that if this event came from mock input,
9272 then just jumping back to replay_key will just
9273 hand it to us again. So we have to wipe out any
9274 mock input.
9275
9276 We could delete keybuf[t] and shift everything
9277 after that to the left by one spot, but we'd also
9278 have to fix up any variable that points into
9279 keybuf, and shifting isn't really necessary
9280 anyway.
9281
9282 Adding prefixes for non-textual mouse clicks
9283 creates two characters of mock input, and both
9284 must be thrown away. If we're only looking at
9285 the prefix now, we can just jump back to
9286 replay_key. On the other hand, if we've already
9287 processed the prefix, and now the actual click
9288 itself is giving us trouble, then we've lost the
9289 state of the keymaps we want to backtrack to, and
9290 we need to replay the whole sequence to rebuild
9291 it.
9292
9293 Beyond that, only function key expansion could
9294 create more than two keys, but that should never
9295 generate mouse events, so it's okay to zero
9296 mock_input in that case too.
9297
65e0fbbf
SM
9298 FIXME: The above paragraph seems just plain
9299 wrong, if you consider things like
9300 xterm-mouse-mode. -stef
9301
559f9d04 9302 Isn't this just the most wonderful code ever? */
017be6c7
SM
9303
9304 /* If mock_input > t + 1, the above simplification
9305 will actually end up dropping keys on the floor.
9306 This is probably OK for now, but even
9307 if mock_input <= t + 1, we need to adjust fkey
9308 and keytran.
9309 Typical case [header-line down-mouse-N]:
9310 mock_input = 2, t = 1, fkey.end = 1,
9311 last_real_key_start = 0. */
9312 if (fkey.end > last_real_key_start)
9313 {
9314 fkey.end = fkey.start
9315 = min (last_real_key_start, fkey.start);
9316 fkey.map = fkey.parent;
9317 if (keytran.end > last_real_key_start)
9318 {
9319 keytran.end = keytran.start
9320 = min (last_real_key_start, keytran.start);
9321 keytran.map = keytran.parent;
9322 }
9323 }
559f9d04
RS
9324 if (t == last_real_key_start)
9325 {
9326 mock_input = 0;
9327 goto replay_key;
9328 }
9329 else
9330 {
9331 mock_input = last_real_key_start;
9332 goto replay_sequence;
9333 }
9334 }
9335
27203ead 9336 new_head
7539e11f 9337 = apply_modifiers (modifiers, XCAR (breakdown));
27203ead
RS
9338 new_click
9339 = Fcons (new_head, Fcons (EVENT_START (key), Qnil));
fbcd35bd
JB
9340
9341 /* Look for a binding for this new key. follow_key
9342 promises that it didn't munge submaps the
9343 last time we called it, since key was unbound. */
27203ead
RS
9344 first_binding
9345 = (follow_key (new_click,
9346 nmaps - local_first_binding,
9347 submaps + local_first_binding,
9348 defs + local_first_binding,
4e50f26a 9349 submaps + local_first_binding)
27203ead 9350 + local_first_binding);
fbcd35bd
JB
9351
9352 /* If that click is bound, go for it. */
9353 if (first_binding < nmaps)
9354 {
9355 key = new_click;
9356 break;
9357 }
9358 /* Otherwise, we'll leave key set to the drag event. */
9359 }
0a7f1fc0
JB
9360 }
9361 }
9362 }
9363
284f4730 9364 keybuf[t++] = key;
7d6de002
RS
9365 /* Normally, last_nonmenu_event gets the previous key we read.
9366 But when a mouse popup menu is being used,
9367 we don't update last_nonmenu_event; it continues to hold the mouse
9368 event that preceded the first level of menu. */
9369 if (!used_mouse_menu)
9370 last_nonmenu_event = key;
284f4730 9371
6321824f
RS
9372 /* Record what part of this_command_keys is the current key sequence. */
9373 this_single_command_key_start = this_command_key_count - t;
9374
65e0fbbf
SM
9375 if (first_binding < nmaps && NILP (submaps[first_binding]))
9376 /* There is a binding and it's not a prefix.
9377 There is thus no function-key in this sequence.
9378 Moving fkey.start is important in this case to allow keytran.start
9379 to go over the sequence before we return (since we keep the
9380 invariant that keytran.end <= fkey.start). */
9381 {
a7f26f28 9382 if (fkey.start < t)
24d80a06 9383 (fkey.start = fkey.end = t, fkey.map = fkey.parent);
65e0fbbf
SM
9384 }
9385 else
9386 /* If the sequence is unbound, see if we can hang a function key
9387 off the end of it. */
fe5b94c5
SM
9388 /* Continue scan from fkey.end until we find a bound suffix. */
9389 while (fkey.end < t)
a612e298 9390 {
fe5b94c5
SM
9391 struct gcpro gcpro1, gcpro2, gcpro3;
9392 int done, diff;
9393
9394 GCPRO3 (fkey.map, keytran.map, delayed_switch_frame);
9395 done = keyremap_step (keybuf, bufsize, &fkey,
9396 max (t, mock_input),
9397 /* If there's a binding (i.e.
9398 first_binding >= nmaps) we don't want
9399 to apply this function-key-mapping. */
9400 fkey.end + 1 == t && first_binding >= nmaps,
24d80a06 9401 &diff, prompt);
fe5b94c5
SM
9402 UNGCPRO;
9403 if (done)
a612e298 9404 {
fe5b94c5 9405 mock_input = diff + max (t, mock_input);
a612e298
RS
9406 goto replay_sequence;
9407 }
fe5b94c5 9408 }
a612e298 9409
fe5b94c5
SM
9410 /* Look for this sequence in key-translation-map.
9411 Scan from keytran.end until we find a bound suffix. */
9412 while (keytran.end < fkey.start)
9413 {
9414 struct gcpro gcpro1, gcpro2, gcpro3;
9415 int done, diff;
a612e298 9416
fe5b94c5
SM
9417 GCPRO3 (fkey.map, keytran.map, delayed_switch_frame);
9418 done = keyremap_step (keybuf, bufsize, &keytran, max (t, mock_input),
24d80a06 9419 1, &diff, prompt);
fe5b94c5
SM
9420 UNGCPRO;
9421 if (done)
9422 {
9423 mock_input = diff + max (t, mock_input);
9424 /* Adjust the function-key-map counters. */
9425 fkey.end += diff;
9426 fkey.start += diff;
2320865d 9427
fe5b94c5
SM
9428 goto replay_sequence;
9429 }
9430 }
4e50f26a
RS
9431
9432 /* If KEY is not defined in any of the keymaps,
9433 and cannot be part of a function key or translation,
9434 and is an upper case letter
9435 use the corresponding lower-case letter instead. */
65e0fbbf 9436 if (first_binding >= nmaps
a7f26f28 9437 && fkey.start >= t && keytran.start >= t
8c18cbfb 9438 && INTEGERP (key)
4e50f26a 9439 && ((((XINT (key) & 0x3ffff)
301738ed 9440 < XCHAR_TABLE (current_buffer->downcase_table)->size)
4e50f26a
RS
9441 && UPPERCASEP (XINT (key) & 0x3ffff))
9442 || (XINT (key) & shift_modifier)))
9443 {
569871d2 9444 Lisp_Object new_key;
569871d2 9445
309b0fc8
RS
9446 original_uppercase = key;
9447 original_uppercase_position = t - 1;
9448
831f35a2 9449 if (XINT (key) & shift_modifier)
569871d2 9450 XSETINT (new_key, XINT (key) & ~shift_modifier);
4e50f26a 9451 else
569871d2
RS
9452 XSETINT (new_key, (DOWNCASE (XINT (key) & 0x3ffff)
9453 | (XINT (key) & ~0x3ffff)));
9454
3fe8e9a2
RS
9455 /* We have to do this unconditionally, regardless of whether
9456 the lower-case char is defined in the keymaps, because they
9457 might get translated through function-key-map. */
9458 keybuf[t - 1] = new_key;
2cf4b7b2 9459 mock_input = max (t, mock_input);
3fe8e9a2
RS
9460
9461 goto replay_sequence;
4e50f26a 9462 }
ef8fd672
RS
9463 /* If KEY is not defined in any of the keymaps,
9464 and cannot be part of a function key or translation,
9465 and is a shifted function key,
9466 use the corresponding unshifted function key instead. */
65e0fbbf 9467 if (first_binding >= nmaps
a7f26f28 9468 && fkey.start >= t && keytran.start >= t
ef8fd672
RS
9469 && SYMBOLP (key))
9470 {
9471 Lisp_Object breakdown;
9472 int modifiers;
9473
9474 breakdown = parse_modifiers (key);
7539e11f 9475 modifiers = XINT (XCAR (XCDR (breakdown)));
ef8fd672
RS
9476 if (modifiers & shift_modifier)
9477 {
569871d2 9478 Lisp_Object new_key;
3fe8e9a2
RS
9479
9480 original_uppercase = key;
9481 original_uppercase_position = t - 1;
ef8fd672 9482
569871d2
RS
9483 modifiers &= ~shift_modifier;
9484 new_key = apply_modifiers (modifiers,
7539e11f 9485 XCAR (breakdown));
569871d2 9486
3fe8e9a2 9487 keybuf[t - 1] = new_key;
2cf4b7b2 9488 mock_input = max (t, mock_input);
f1871a7d
RS
9489 fkey.start = fkey.end = KEYMAPP (fkey.map) ? 0 : bufsize + 1;
9490 keytran.start = keytran.end = KEYMAPP (keytran.map) ? 0 : bufsize + 1;
3fe8e9a2
RS
9491
9492 goto replay_sequence;
ef8fd672
RS
9493 }
9494 }
284f4730
JB
9495 }
9496
309b0fc8 9497 if (!dummyflag)
bc536d84
RS
9498 read_key_sequence_cmd = (first_binding < nmaps
9499 ? defs[first_binding]
9500 : Qnil);
284f4730 9501
cd21b839 9502 unread_switch_frame = delayed_switch_frame;
f4255cd1 9503 unbind_to (count, Qnil);
07f76a14 9504
3fe8e9a2
RS
9505 /* Don't downcase the last character if the caller says don't.
9506 Don't downcase it if the result is undefined, either. */
9507 if ((dont_downcase_last || first_binding >= nmaps)
a53fe666 9508 && t > 0
3fe8e9a2 9509 && t - 1 == original_uppercase_position)
309b0fc8
RS
9510 keybuf[t - 1] = original_uppercase;
9511
07f76a14
JB
9512 /* Occasionally we fabricate events, perhaps by expanding something
9513 according to function-key-map, or by adding a prefix symbol to a
9514 mouse click in the scroll bar or modeline. In this cases, return
9515 the entire generated key sequence, even if we hit an unbound
9516 prefix or a definition before the end. This means that you will
9517 be able to push back the event properly, and also means that
9518 read-key-sequence will always return a logical unit.
9519
9520 Better ideas? */
cca310da
JB
9521 for (; t < mock_input; t++)
9522 {
f2647d04
DL
9523 if ((FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
9524 && NILP (Fzerop (Vecho_keystrokes)))
a98ea3f9 9525 echo_char (keybuf[t]);
cca310da
JB
9526 add_command_key (keybuf[t]);
9527 }
07f76a14 9528
c60ee5e7 9529
7d18f9ae 9530
2dc00208 9531 UNGCPRO;
284f4730
JB
9532 return t;
9533}
9534
d5eecefb 9535DEFUN ("read-key-sequence", Fread_key_sequence, Sread_key_sequence, 1, 5, 0,
4707d2d0
PJ
9536 doc: /* Read a sequence of keystrokes and return as a string or vector.
9537The sequence is sufficient to specify a non-prefix command in the
9538current local and global maps.
9539
9540First arg PROMPT is a prompt string. If nil, do not prompt specially.
9541Second (optional) arg CONTINUE-ECHO, if non-nil, means this key echos
9542as a continuation of the previous key.
9543
9544The third (optional) arg DONT-DOWNCASE-LAST, if non-nil, means do not
9545convert the last event to lower case. (Normally any upper case event
9546is converted to lower case if the original event is undefined and the lower
9547case equivalent is defined.) A non-nil value is appropriate for reading
9548a key sequence to be defined.
9549
9550A C-g typed while in this function is treated like any other character,
9551and `quit-flag' is not set.
9552
9553If the key sequence starts with a mouse click, then the sequence is read
9554using the keymaps of the buffer of the window clicked in, not the buffer
9555of the selected window as normal.
9556
9557`read-key-sequence' drops unbound button-down events, since you normally
9558only care about the click or drag events which follow them. If a drag
9559or multi-click event is unbound, but the corresponding click event would
9560be bound, `read-key-sequence' turns the event into a click event at the
9561drag's starting position. This means that you don't have to distinguish
9562between click and drag, double, or triple events unless you want to.
9563
9564`read-key-sequence' prefixes mouse events on mode lines, the vertical
9565lines separating windows, and scroll bars with imaginary keys
9566`mode-line', `vertical-line', and `vertical-scroll-bar'.
9567
9568Optional fourth argument CAN-RETURN-SWITCH-FRAME non-nil means that this
9569function will process a switch-frame event if the user switches frames
9570before typing anything. If the user switches frames in the middle of a
9571key sequence, or at the start of the sequence but CAN-RETURN-SWITCH-FRAME
9572is nil, then the event will be put off until after the current key sequence.
9573
9574`read-key-sequence' checks `function-key-map' for function key
9575sequences, where they wouldn't conflict with ordinary bindings. See
9576`function-key-map' for more details.
9577
9578The optional fifth argument COMMAND-LOOP, if non-nil, means
9579that this key sequence is being read by something that will
9580read commands one after another. It should be nil if the caller
9581will read just one key sequence. */)
d5eecefb
RS
9582 (prompt, continue_echo, dont_downcase_last, can_return_switch_frame,
9583 command_loop)
309b0fc8 9584 Lisp_Object prompt, continue_echo, dont_downcase_last;
d5eecefb 9585 Lisp_Object can_return_switch_frame, command_loop;
284f4730
JB
9586{
9587 Lisp_Object keybuf[30];
9588 register int i;
03cee6ae 9589 struct gcpro gcpro1;
aed13378 9590 int count = SPECPDL_INDEX ();
284f4730
JB
9591
9592 if (!NILP (prompt))
b7826503 9593 CHECK_STRING (prompt);
284f4730
JB
9594 QUIT;
9595
d5eecefb
RS
9596 specbind (Qinput_method_exit_on_first_char,
9597 (NILP (command_loop) ? Qt : Qnil));
9598 specbind (Qinput_method_use_echo_area,
9599 (NILP (command_loop) ? Qt : Qnil));
9600
284f4730
JB
9601 bzero (keybuf, sizeof keybuf);
9602 GCPRO1 (keybuf[0]);
9603 gcpro1.nvars = (sizeof keybuf/sizeof (keybuf[0]));
9604
daa37602 9605 if (NILP (continue_echo))
6321824f
RS
9606 {
9607 this_command_key_count = 0;
63020c46 9608 this_command_key_count_reset = 0;
6321824f
RS
9609 this_single_command_key_start = 0;
9610 }
c0a58692 9611
d0c48478 9612#ifdef HAVE_X_WINDOWS
526a058f
GM
9613 if (display_hourglass_p)
9614 cancel_hourglass ();
d0c48478
GM
9615#endif
9616
309b0fc8 9617 i = read_key_sequence (keybuf, (sizeof keybuf/sizeof (keybuf[0])),
ce98e608 9618 prompt, ! NILP (dont_downcase_last),
f571ae0d 9619 ! NILP (can_return_switch_frame), 0);
284f4730 9620
ae18aa3b 9621#if 0 /* The following is fine for code reading a key sequence and
f95c4fe5 9622 then proceeding with a lenghty computation, but it's not good
ae18aa3b 9623 for code reading keys in a loop, like an input method. */
d0c48478 9624#ifdef HAVE_X_WINDOWS
526a058f
GM
9625 if (display_hourglass_p)
9626 start_hourglass ();
ae18aa3b 9627#endif
d0c48478
GM
9628#endif
9629
dcc408a0
RS
9630 if (i == -1)
9631 {
9632 Vquit_flag = Qt;
9633 QUIT;
9634 }
284f4730 9635 UNGCPRO;
d5eecefb 9636 return unbind_to (count, make_event_array (i, keybuf));
284f4730 9637}
e39da3d7
RS
9638
9639DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,
d5eecefb 9640 Sread_key_sequence_vector, 1, 5, 0,
4707d2d0
PJ
9641 doc: /* Like `read-key-sequence' but always return a vector. */)
9642 (prompt, continue_echo, dont_downcase_last, can_return_switch_frame,
9643 command_loop)
e39da3d7 9644 Lisp_Object prompt, continue_echo, dont_downcase_last;
d5eecefb 9645 Lisp_Object can_return_switch_frame, command_loop;
e39da3d7
RS
9646{
9647 Lisp_Object keybuf[30];
9648 register int i;
03cee6ae 9649 struct gcpro gcpro1;
aed13378 9650 int count = SPECPDL_INDEX ();
e39da3d7
RS
9651
9652 if (!NILP (prompt))
b7826503 9653 CHECK_STRING (prompt);
e39da3d7
RS
9654 QUIT;
9655
d5eecefb
RS
9656 specbind (Qinput_method_exit_on_first_char,
9657 (NILP (command_loop) ? Qt : Qnil));
9658 specbind (Qinput_method_use_echo_area,
9659 (NILP (command_loop) ? Qt : Qnil));
9660
e39da3d7
RS
9661 bzero (keybuf, sizeof keybuf);
9662 GCPRO1 (keybuf[0]);
9663 gcpro1.nvars = (sizeof keybuf/sizeof (keybuf[0]));
9664
9665 if (NILP (continue_echo))
9666 {
9667 this_command_key_count = 0;
63020c46 9668 this_command_key_count_reset = 0;
e39da3d7
RS
9669 this_single_command_key_start = 0;
9670 }
9671
d0c48478 9672#ifdef HAVE_X_WINDOWS
526a058f
GM
9673 if (display_hourglass_p)
9674 cancel_hourglass ();
d0c48478
GM
9675#endif
9676
e39da3d7
RS
9677 i = read_key_sequence (keybuf, (sizeof keybuf/sizeof (keybuf[0])),
9678 prompt, ! NILP (dont_downcase_last),
9679 ! NILP (can_return_switch_frame), 0);
9680
d0c48478 9681#ifdef HAVE_X_WINDOWS
526a058f
GM
9682 if (display_hourglass_p)
9683 start_hourglass ();
d0c48478
GM
9684#endif
9685
e39da3d7
RS
9686 if (i == -1)
9687 {
9688 Vquit_flag = Qt;
9689 QUIT;
9690 }
9691 UNGCPRO;
d5eecefb 9692 return unbind_to (count, Fvector (i, keybuf));
e39da3d7 9693}
284f4730 9694\f
158f7532 9695DEFUN ("command-execute", Fcommand_execute, Scommand_execute, 1, 4, 0,
4707d2d0
PJ
9696 doc: /* Execute CMD as an editor command.
9697CMD must be a symbol that satisfies the `commandp' predicate.
9698Optional second arg RECORD-FLAG non-nil
9699means unconditionally put this command in `command-history'.
9700Otherwise, that is done only if an arg is read using the minibuffer.
9701The argument KEYS specifies the value to use instead of (this-command-keys)
9702when reading the arguments; if it is nil, (this-command-keys) is used.
9703The argument SPECIAL, if non-nil, means that this command is executing
9704a special event, so ignore the prefix argument and don't clear it. */)
158f7532
RS
9705 (cmd, record_flag, keys, special)
9706 Lisp_Object cmd, record_flag, keys, special;
284f4730
JB
9707{
9708 register Lisp_Object final;
9709 register Lisp_Object tem;
9710 Lisp_Object prefixarg;
9711 struct backtrace backtrace;
9712 extern int debug_on_next_call;
9713
284f4730
JB
9714 debug_on_next_call = 0;
9715
158f7532
RS
9716 if (NILP (special))
9717 {
9718 prefixarg = current_kboard->Vprefix_arg;
9719 Vcurrent_prefix_arg = prefixarg;
9720 current_kboard->Vprefix_arg = Qnil;
9721 }
9722 else
9723 prefixarg = Qnil;
9724
8c18cbfb 9725 if (SYMBOLP (cmd))
284f4730
JB
9726 {
9727 tem = Fget (cmd, Qdisabled);
88ce066e 9728 if (!NILP (tem) && !NILP (Vrun_hooks))
b78ce8fb 9729 {
971e4c98 9730 tem = Fsymbol_value (Qdisabled_command_function);
b78ce8fb 9731 if (!NILP (tem))
971e4c98 9732 return call1 (Vrun_hooks, Qdisabled_command_function);
b78ce8fb 9733 }
284f4730
JB
9734 }
9735
01e26217 9736 while (1)
284f4730 9737 {
a7f96a35 9738 final = Findirect_function (cmd, Qnil);
284f4730
JB
9739
9740 if (CONSP (final) && (tem = Fcar (final), EQ (tem, Qautoload)))
b516a185
RS
9741 {
9742 struct gcpro gcpro1, gcpro2;
9743
9744 GCPRO2 (cmd, prefixarg);
9745 do_autoload (final, cmd);
9746 UNGCPRO;
9747 }
284f4730
JB
9748 else
9749 break;
9750 }
9751
8c18cbfb 9752 if (STRINGP (final) || VECTORP (final))
284f4730
JB
9753 {
9754 /* If requested, place the macro in the command history. For
9755 other sorts of commands, call-interactively takes care of
9756 this. */
e57d8fd8 9757 if (!NILP (record_flag))
f4385381
RS
9758 {
9759 Vcommand_history
9760 = Fcons (Fcons (Qexecute_kbd_macro,
9761 Fcons (final, Fcons (prefixarg, Qnil))),
9762 Vcommand_history);
9763
9764 /* Don't keep command history around forever. */
9765 if (NUMBERP (Vhistory_length) && XINT (Vhistory_length) > 0)
9766 {
9767 tem = Fnthcdr (Vhistory_length, Vcommand_history);
9768 if (CONSP (tem))
f3fbd155 9769 XSETCDR (tem, Qnil);
f4385381
RS
9770 }
9771 }
284f4730 9772
caa06051 9773 return Fexecute_kbd_macro (final, prefixarg, Qnil);
284f4730 9774 }
f4385381 9775
8c18cbfb 9776 if (CONSP (final) || SUBRP (final) || COMPILEDP (final))
284f4730
JB
9777 {
9778 backtrace.next = backtrace_list;
9779 backtrace_list = &backtrace;
9780 backtrace.function = &Qcall_interactively;
9781 backtrace.args = &cmd;
9782 backtrace.nargs = 1;
9783 backtrace.evalargs = 0;
080e18b1 9784 backtrace.debug_on_exit = 0;
284f4730 9785
e57d8fd8 9786 tem = Fcall_interactively (cmd, record_flag, keys);
284f4730
JB
9787
9788 backtrace_list = backtrace.next;
9789 return tem;
9790 }
9791 return Qnil;
9792}
c970a760
GM
9793
9794
284f4730 9795\f
284f4730 9796DEFUN ("execute-extended-command", Fexecute_extended_command, Sexecute_extended_command,
4707d2d0 9797 1, 1, "P",
dfb4bff5
EZ
9798 doc: /* Read function name, then read its arguments and call it.
9799
9800To pass a numeric argument to the command you are invoking with, specify
9801the numeric argument to this command.
9802
9803Noninteractively, the argument PREFIXARG is the prefix argument to
9804give to the command you invoke, if it asks for an argument. */)
4707d2d0 9805 (prefixarg)
284f4730
JB
9806 Lisp_Object prefixarg;
9807{
9808 Lisp_Object function;
9809 char buf[40];
2e1a49ad
SM
9810 int saved_last_point_position;
9811 Lisp_Object saved_keys, saved_last_point_position_buffer;
5434fce6 9812 Lisp_Object bindings, value;
2e1a49ad 9813 struct gcpro gcpro1, gcpro2, gcpro3;
a25e44b2
JD
9814#ifdef HAVE_X_WINDOWS
9815 /* The call to Fcompleting_read wil start and cancel the hourglass,
9816 but if the hourglass was already scheduled, this means that no
9817 hourglass will be shown for the actual M-x command itself.
9818 So we restart it if it is already scheduled. Note that checking
9819 hourglass_shown_p is not enough, normally the hourglass is not shown,
9820 just scheduled to be shown. */
9821 int hstarted = hourglass_started ();
9822#endif
284f4730 9823
b0f2a7bf
KH
9824 saved_keys = Fvector (this_command_key_count,
9825 XVECTOR (this_command_keys)->contents);
2e1a49ad
SM
9826 saved_last_point_position_buffer = last_point_position_buffer;
9827 saved_last_point_position = last_point_position;
284f4730 9828 buf[0] = 0;
2e1a49ad 9829 GCPRO3 (saved_keys, prefixarg, saved_last_point_position_buffer);
284f4730
JB
9830
9831 if (EQ (prefixarg, Qminus))
9832 strcpy (buf, "- ");
7539e11f 9833 else if (CONSP (prefixarg) && XINT (XCAR (prefixarg)) == 4)
284f4730 9834 strcpy (buf, "C-u ");
7539e11f 9835 else if (CONSP (prefixarg) && INTEGERP (XCAR (prefixarg)))
cea5d0d4 9836 sprintf (buf, "%ld ", (long) XINT (XCAR (prefixarg)));
8c18cbfb 9837 else if (INTEGERP (prefixarg))
cea5d0d4 9838 sprintf (buf, "%ld ", (long) XINT (prefixarg));
284f4730
JB
9839
9840 /* This isn't strictly correct if execute-extended-command
9841 is bound to anything else. Perhaps it should use
9842 this_command_keys? */
9843 strcat (buf, "M-x ");
9844
9845 /* Prompt with buf, and then read a string, completing from and
9846 restricting to the set of all defined commands. Don't provide
51763820 9847 any initial input. Save the command read on the extended-command
03b4122a 9848 history list. */
284f4730
JB
9849 function = Fcompleting_read (build_string (buf),
9850 Vobarray, Qcommandp,
4328577a
KH
9851 Qt, Qnil, Qextended_command_history, Qnil,
9852 Qnil);
284f4730 9853
a25e44b2
JD
9854#ifdef HAVE_X_WINDOWS
9855 if (hstarted) start_hourglass ();
9856#endif
9857
d5db4077 9858 if (STRINGP (function) && SCHARS (function) == 0)
1f5b1641
RS
9859 error ("No command name given");
9860
1113d9db
JB
9861 /* Set this_command_keys to the concatenation of saved_keys and
9862 function, followed by a RET. */
284f4730 9863 {
b0f2a7bf 9864 Lisp_Object *keys;
284f4730 9865 int i;
284f4730 9866
1113d9db 9867 this_command_key_count = 0;
63020c46 9868 this_command_key_count_reset = 0;
6321824f 9869 this_single_command_key_start = 0;
1113d9db 9870
b0f2a7bf
KH
9871 keys = XVECTOR (saved_keys)->contents;
9872 for (i = 0; i < XVECTOR (saved_keys)->size; i++)
9873 add_command_key (keys[i]);
1113d9db 9874
1b049b51 9875 for (i = 0; i < SCHARS (function); i++)
301738ed 9876 add_command_key (Faref (function, make_number (i)));
1113d9db 9877
301738ed 9878 add_command_key (make_number ('\015'));
284f4730
JB
9879 }
9880
2e1a49ad
SM
9881 last_point_position = saved_last_point_position;
9882 last_point_position_buffer = saved_last_point_position_buffer;
9883
284f4730
JB
9884 UNGCPRO;
9885
0a7f1fc0 9886 function = Fintern (function, Qnil);
d8bcf58e 9887 current_kboard->Vprefix_arg = prefixarg;
d5eecefb
RS
9888 Vthis_command = function;
9889 real_this_command = function;
284f4730 9890
6526ab49
RS
9891 /* If enabled, show which key runs this command. */
9892 if (!NILP (Vsuggest_key_bindings)
ce0d2858 9893 && NILP (Vexecuting_kbd_macro)
6526ab49 9894 && SYMBOLP (function))
5434fce6 9895 bindings = Fwhere_is_internal (function, Voverriding_local_map,
8b9940e6 9896 Qt, Qnil, Qnil);
5434fce6
RS
9897 else
9898 bindings = Qnil;
6526ab49 9899
5434fce6
RS
9900 value = Qnil;
9901 GCPRO2 (bindings, value);
9902 value = Fcommand_execute (function, Qt, Qnil, Qnil);
6526ab49 9903
5434fce6 9904 /* If the command has a key binding, print it now. */
3ababa60 9905 if (!NILP (bindings)
ee112567
KH
9906 && ! (VECTORP (bindings) && EQ (Faref (bindings, make_number (0)),
9907 Qmouse_movement)))
5434fce6
RS
9908 {
9909 /* But first wait, and skip the message if there is input. */
7ba07a1a
CY
9910 Lisp_Object waited;
9911
666dc232
KS
9912 /* If this command displayed something in the echo area;
9913 wait a few seconds, then display our suggestion message. */
9914 if (NILP (echo_area_buffer[0]))
9915 waited = sit_for (make_number (0), 0, 2);
9916 else if (NUMBERP (Vsuggest_key_bindings))
9917 waited = sit_for (Vminibuffer_message_timeout, 0, 2);
426939cc 9918 else
666dc232 9919 waited = sit_for (make_number (2), 0, 2);
426939cc 9920
7ba07a1a 9921 if (!NILP (waited) && ! CONSP (Vunread_command_events))
6526ab49 9922 {
5434fce6
RS
9923 Lisp_Object binding;
9924 char *newmessage;
985f9f66 9925 int message_p = push_message ();
331379bf 9926 int count = SPECPDL_INDEX ();
5434fce6 9927
65efd7da 9928 record_unwind_protect (pop_message_unwind, Qnil);
a1bfe073 9929 binding = Fkey_description (bindings, Qnil);
5434fce6
RS
9930
9931 newmessage
d5db4077
KR
9932 = (char *) alloca (SCHARS (SYMBOL_NAME (function))
9933 + SBYTES (binding)
5434fce6 9934 + 100);
3ababa60 9935 sprintf (newmessage, "You can run the command `%s' with %s",
d5db4077
KR
9936 SDATA (SYMBOL_NAME (function)),
9937 SDATA (binding));
301738ed
RS
9938 message2_nolog (newmessage,
9939 strlen (newmessage),
9940 STRING_MULTIBYTE (binding));
7ba07a1a 9941 if (NUMBERP (Vsuggest_key_bindings))
666dc232 9942 waited = sit_for (Vsuggest_key_bindings, 0, 2);
7ba07a1a 9943 else
666dc232 9944 waited = sit_for (make_number (2), 0, 2);
7ba07a1a
CY
9945
9946 if (!NILP (waited) && message_p)
985f9f66
GM
9947 restore_message ();
9948
c970a760 9949 unbind_to (count, Qnil);
6526ab49
RS
9950 }
9951 }
9952
5434fce6 9953 RETURN_UNGCPRO (value);
284f4730 9954}
6526ab49 9955
284f4730 9956\f
d9d4c147 9957/* Return nonzero if input events are pending. */
284f4730 9958
dfcf069d 9959int
284f4730
JB
9960detect_input_pending ()
9961{
9962 if (!input_pending)
d9d4c147
KH
9963 get_input_pending (&input_pending, 0);
9964
9965 return input_pending;
9966}
9967
a2d5fca0
JD
9968/* Return nonzero if input events other than mouse movements are
9969 pending. */
9970
9971int
9972detect_input_pending_ignore_squeezables ()
9973{
9974 if (!input_pending)
9975 get_input_pending (&input_pending, READABLE_EVENTS_IGNORE_SQUEEZABLES);
9976
9977 return input_pending;
9978}
9979
b1878f45 9980/* Return nonzero if input events are pending, and run any pending timers. */
d9d4c147 9981
dfcf069d 9982int
87dd9b9b
RS
9983detect_input_pending_run_timers (do_display)
9984 int do_display;
d9d4c147 9985{
87dd9b9b
RS
9986 int old_timers_run = timers_run;
9987
d9d4c147 9988 if (!input_pending)
a2d5fca0 9989 get_input_pending (&input_pending, READABLE_EVENTS_DO_TIMERS_NOW);
284f4730 9990
87dd9b9b 9991 if (old_timers_run != timers_run && do_display)
7ee32cda 9992 {
3007ebfb 9993 redisplay_preserve_echo_area (8);
7ee32cda
GM
9994 /* The following fixes a bug when using lazy-lock with
9995 lazy-lock-defer-on-the-fly set to t, i.e. when fontifying
9996 from an idle timer function. The symptom of the bug is that
9997 the cursor sometimes doesn't become visible until the next X
9998 event is processed. --gerd. */
9999 if (rif)
10000 rif->flush_display (NULL);
10001 }
87dd9b9b 10002
284f4730
JB
10003 return input_pending;
10004}
10005
ffd56f97
JB
10006/* This is called in some cases before a possible quit.
10007 It cases the next call to detect_input_pending to recompute input_pending.
10008 So calling this function unnecessarily can't do any harm. */
07a59269
KH
10009
10010void
ffd56f97
JB
10011clear_input_pending ()
10012{
10013 input_pending = 0;
10014}
10015
b1878f45 10016/* Return nonzero if there are pending requeued events.
d64b707c 10017 This isn't used yet. The hope is to make wait_reading_process_output
27fd22dc 10018 call it, and return if it runs Lisp code that unreads something.
b1878f45
RS
10019 The problem is, kbd_buffer_get_event needs to be fixed to know what
10020 to do in that case. It isn't trivial. */
10021
dfcf069d 10022int
b1878f45
RS
10023requeued_events_pending_p ()
10024{
10025 return (!NILP (Vunread_command_events) || unread_command_char != -1);
10026}
10027
10028
284f4730 10029DEFUN ("input-pending-p", Finput_pending_p, Sinput_pending_p, 0, 0, 0,
a064684d
RS
10030 doc: /* Return t if command input is currently available with no wait.
10031Actually, the value is nil only if we can be sure that no input is available;
10032if there is a doubt, the value is t. */)
4707d2d0 10033 ()
284f4730 10034{
24597608 10035 if (!NILP (Vunread_command_events) || unread_command_char != -1)
284f4730
JB
10036 return (Qt);
10037
a2d5fca0
JD
10038 get_input_pending (&input_pending,
10039 READABLE_EVENTS_DO_TIMERS_NOW
10040 | READABLE_EVENTS_FILTER_EVENTS);
d9d4c147 10041 return input_pending > 0 ? Qt : Qnil;
284f4730
JB
10042}
10043
10044DEFUN ("recent-keys", Frecent_keys, Srecent_keys, 0, 0, 0,
4707d2d0
PJ
10045 doc: /* Return vector of last 100 events, not counting those from keyboard macros. */)
10046 ()
284f4730 10047{
5160df46 10048 Lisp_Object *keys = XVECTOR (recent_keys)->contents;
284f4730
JB
10049 Lisp_Object val;
10050
10051 if (total_keys < NUM_RECENT_KEYS)
5160df46 10052 return Fvector (total_keys, keys);
284f4730
JB
10053 else
10054 {
5160df46
JB
10055 val = Fvector (NUM_RECENT_KEYS, keys);
10056 bcopy (keys + recent_keys_index,
284f4730
JB
10057 XVECTOR (val)->contents,
10058 (NUM_RECENT_KEYS - recent_keys_index) * sizeof (Lisp_Object));
5160df46 10059 bcopy (keys,
284f4730
JB
10060 XVECTOR (val)->contents + NUM_RECENT_KEYS - recent_keys_index,
10061 recent_keys_index * sizeof (Lisp_Object));
10062 return val;
10063 }
10064}
10065
10066DEFUN ("this-command-keys", Fthis_command_keys, Sthis_command_keys, 0, 0, 0,
4707d2d0 10067 doc: /* Return the key sequence that invoked this command.
92501652 10068However, if the command has called `read-key-sequence', it returns
4052e7bb 10069the last key sequence that has been read.
4707d2d0
PJ
10070The value is a string or a vector. */)
10071 ()
284f4730 10072{
86e5706b
RS
10073 return make_event_array (this_command_key_count,
10074 XVECTOR (this_command_keys)->contents);
284f4730
JB
10075}
10076
e39da3d7 10077DEFUN ("this-command-keys-vector", Fthis_command_keys_vector, Sthis_command_keys_vector, 0, 0, 0,
92501652
RS
10078 doc: /* Return the key sequence that invoked this command, as a vector.
10079However, if the command has called `read-key-sequence', it returns
4052e7bb 10080the last key sequence that has been read. */)
4707d2d0 10081 ()
e39da3d7
RS
10082{
10083 return Fvector (this_command_key_count,
10084 XVECTOR (this_command_keys)->contents);
10085}
10086
6321824f
RS
10087DEFUN ("this-single-command-keys", Fthis_single_command_keys,
10088 Sthis_single_command_keys, 0, 0, 0,
4707d2d0 10089 doc: /* Return the key sequence that invoked this command.
92501652
RS
10090More generally, it returns the last key sequence read, either by
10091the command loop or by `read-key-sequence'.
4707d2d0
PJ
10092Unlike `this-command-keys', this function's value
10093does not include prefix arguments.
10094The value is always a vector. */)
10095 ()
6321824f 10096{
e39da3d7
RS
10097 return Fvector (this_command_key_count
10098 - this_single_command_key_start,
10099 (XVECTOR (this_command_keys)->contents
10100 + this_single_command_key_start));
6321824f
RS
10101}
10102
7d18f9ae
RS
10103DEFUN ("this-single-command-raw-keys", Fthis_single_command_raw_keys,
10104 Sthis_single_command_raw_keys, 0, 0, 0,
4707d2d0 10105 doc: /* Return the raw events that were read for this command.
92501652
RS
10106More generally, it returns the last key sequence read, either by
10107the command loop or by `read-key-sequence'.
4707d2d0
PJ
10108Unlike `this-single-command-keys', this function's value
10109shows the events before all translations (except for input methods).
10110The value is always a vector. */)
10111 ()
7d18f9ae
RS
10112{
10113 return Fvector (raw_keybuf_count,
10114 (XVECTOR (raw_keybuf)->contents));
10115}
10116
71918b75 10117DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,
4707d2d0 10118 Sreset_this_command_lengths, 0, 0, 0,
63020c46
RS
10119 doc: /* Make the unread events replace the last command and echo.
10120Used in `universal-argument-other-key'.
4707d2d0
PJ
10121
10122`universal-argument-other-key' rereads the event just typed.
10123It then gets translated through `function-key-map'.
63020c46
RS
10124The translated event has to replace the real events,
10125both in the value of (this-command-keys) and in echoing.
10126To achieve this, `universal-argument-other-key' calls
10127`reset-this-command-lengths', which discards the record of reading
10128these events the first time. */)
4707d2d0 10129 ()
71918b75 10130{
22b94eeb
RS
10131 this_command_key_count = before_command_key_count;
10132 if (this_command_key_count < this_single_command_key_start)
10133 this_single_command_key_start = this_command_key_count;
63020c46 10134
22b94eeb
RS
10135 echo_truncate (before_command_echo_length);
10136
63020c46
RS
10137 /* Cause whatever we put into unread-command-events
10138 to echo as if it were being freshly read from the keyboard. */
10139 this_command_key_count_reset = 1;
10140
6e5742a0 10141 return Qnil;
71918b75
RS
10142}
10143
82e6e5af 10144DEFUN ("clear-this-command-keys", Fclear_this_command_keys,
ab1959fc 10145 Sclear_this_command_keys, 0, 1, 0,
4707d2d0 10146 doc: /* Clear out the vector that `this-command-keys' returns.
ab1959fc
KS
10147Also clear the record of the last 100 events, unless optional arg
10148KEEP-RECORD is non-nil. */)
10149 (keep_record)
10150 Lisp_Object keep_record;
82e6e5af 10151{
fb0dde6c 10152 int i;
c60ee5e7 10153
82e6e5af 10154 this_command_key_count = 0;
63020c46 10155 this_command_key_count_reset = 0;
fb0dde6c 10156
ab1959fc
KS
10157 if (NILP (keep_record))
10158 {
10159 for (i = 0; i < XVECTOR (recent_keys)->size; ++i)
10160 XVECTOR (recent_keys)->contents[i] = Qnil;
10161 total_keys = 0;
10162 recent_keys_index = 0;
10163 }
82e6e5af
RS
10164 return Qnil;
10165}
10166
284f4730 10167DEFUN ("recursion-depth", Frecursion_depth, Srecursion_depth, 0, 0, 0,
4707d2d0
PJ
10168 doc: /* Return the current depth in recursive edits. */)
10169 ()
284f4730
JB
10170{
10171 Lisp_Object temp;
bb9e9bed 10172 XSETFASTINT (temp, command_loop_level + minibuf_level);
284f4730
JB
10173 return temp;
10174}
10175
10176DEFUN ("open-dribble-file", Fopen_dribble_file, Sopen_dribble_file, 1, 1,
4707d2d0
PJ
10177 "FOpen dribble file: ",
10178 doc: /* Start writing all keyboard characters to a dribble file called FILE.
10179If FILE is nil, close any open dribble file. */)
10180 (file)
284f4730
JB
10181 Lisp_Object file;
10182{
6cb52def 10183 if (dribble)
284f4730 10184 {
6cb52def
KH
10185 fclose (dribble);
10186 dribble = 0;
284f4730 10187 }
6cb52def 10188 if (!NILP (file))
284f4730
JB
10189 {
10190 file = Fexpand_file_name (file, Qnil);
d5db4077 10191 dribble = fopen (SDATA (file), "w");
ab6ca1de
KH
10192 if (dribble == 0)
10193 report_file_error ("Opening dribble", Fcons (file, Qnil));
284f4730
JB
10194 }
10195 return Qnil;
10196}
10197
10198DEFUN ("discard-input", Fdiscard_input, Sdiscard_input, 0, 0, 0,
4707d2d0 10199 doc: /* Discard the contents of the terminal input buffer.
2b17d5ed 10200Also end any kbd macro being defined. */)
4707d2d0 10201 ()
284f4730 10202{
2b17d5ed
KS
10203 if (!NILP (current_kboard->defining_kbd_macro))
10204 {
10205 /* Discard the last command from the macro. */
10206 Fcancel_kbd_macro_events ();
10207 end_kbd_macro ();
10208 }
10209
284f4730
JB
10210 update_mode_lines++;
10211
24597608 10212 Vunread_command_events = Qnil;
86e5706b 10213 unread_command_char = -1;
284f4730
JB
10214
10215 discard_tty_input ();
10216
7ee32cda 10217 kbd_fetch_ptr = kbd_store_ptr;
284f4730
JB
10218 input_pending = 0;
10219
10220 return Qnil;
10221}
10222\f
10223DEFUN ("suspend-emacs", Fsuspend_emacs, Ssuspend_emacs, 0, 1, "",
4707d2d0
PJ
10224 doc: /* Stop Emacs and return to superior process. You can resume later.
10225If `cannot-suspend' is non-nil, or if the system doesn't support job
10226control, run a subshell instead.
10227
10228If optional arg STUFFSTRING is non-nil, its characters are stuffed
10229to be read as terminal input by Emacs's parent, after suspension.
10230
10231Before suspending, run the normal hook `suspend-hook'.
10232After resumption run the normal hook `suspend-resume-hook'.
10233
10234Some operating systems cannot stop the Emacs process and resume it later.
10235On such systems, Emacs starts a subshell instead of suspending. */)
10236 (stuffstring)
284f4730
JB
10237 Lisp_Object stuffstring;
10238{
aed13378 10239 int count = SPECPDL_INDEX ();
284f4730
JB
10240 int old_height, old_width;
10241 int width, height;
03cee6ae 10242 struct gcpro gcpro1;
284f4730
JB
10243
10244 if (!NILP (stuffstring))
b7826503 10245 CHECK_STRING (stuffstring);
284f4730 10246
1e95ed28
JB
10247 /* Run the functions in suspend-hook. */
10248 if (!NILP (Vrun_hooks))
10249 call1 (Vrun_hooks, intern ("suspend-hook"));
284f4730 10250
b7d2ebbf 10251 GCPRO1 (stuffstring);
ff11dfa1 10252 get_frame_size (&old_width, &old_height);
284f4730
JB
10253 reset_sys_modes ();
10254 /* sys_suspend can get an error if it tries to fork a subshell
10255 and the system resources aren't available for that. */
91a0da02 10256 record_unwind_protect ((Lisp_Object (*) P_ ((Lisp_Object))) init_sys_modes,
d52a7a92 10257 Qnil);
284f4730 10258 stuff_buffered_input (stuffstring);
8026024c
KH
10259 if (cannot_suspend)
10260 sys_subshell ();
10261 else
10262 sys_suspend ();
284f4730
JB
10263 unbind_to (count, Qnil);
10264
10265 /* Check if terminal/window size has changed.
10266 Note that this is not useful when we are running directly
10267 with a window system; but suspend should be disabled in that case. */
ff11dfa1 10268 get_frame_size (&width, &height);
284f4730 10269 if (width != old_width || height != old_height)
788f89eb 10270 change_frame_size (SELECTED_FRAME (), height, width, 0, 0, 0);
284f4730 10271
1e95ed28 10272 /* Run suspend-resume-hook. */
284f4730
JB
10273 if (!NILP (Vrun_hooks))
10274 call1 (Vrun_hooks, intern ("suspend-resume-hook"));
df0f2ba1 10275
284f4730
JB
10276 UNGCPRO;
10277 return Qnil;
10278}
10279
10280/* If STUFFSTRING is a string, stuff its contents as pending terminal input.
eb8c3be9 10281 Then in any case stuff anything Emacs has read ahead and not used. */
284f4730 10282
07a59269 10283void
284f4730
JB
10284stuff_buffered_input (stuffstring)
10285 Lisp_Object stuffstring;
10286{
0c1c1b93 10287#ifdef SIGTSTP /* stuff_char is defined if SIGTSTP. */
612b78ef 10288 register unsigned char *p;
612b78ef 10289
8c18cbfb 10290 if (STRINGP (stuffstring))
284f4730
JB
10291 {
10292 register int count;
10293
d5db4077
KR
10294 p = SDATA (stuffstring);
10295 count = SBYTES (stuffstring);
284f4730
JB
10296 while (count-- > 0)
10297 stuff_char (*p++);
10298 stuff_char ('\n');
10299 }
c60ee5e7 10300
284f4730 10301 /* Anything we have read ahead, put back for the shell to read. */
beecf6a1 10302 /* ?? What should this do when we have multiple keyboards??
0c1c1b93 10303 Should we ignore anything that was typed in at the "wrong" kboard?
26503ad2 10304
0c1c1b93
RS
10305 rms: we should stuff everything back into the kboard
10306 it came from. */
beecf6a1 10307 for (; kbd_fetch_ptr != kbd_store_ptr; kbd_fetch_ptr++)
284f4730 10308 {
c60ee5e7 10309
beecf6a1
KH
10310 if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
10311 kbd_fetch_ptr = kbd_buffer;
3b8f9651 10312 if (kbd_fetch_ptr->kind == ASCII_KEYSTROKE_EVENT)
beecf6a1 10313 stuff_char (kbd_fetch_ptr->code);
c60ee5e7 10314
d92f48d3 10315 clear_event (kbd_fetch_ptr);
284f4730 10316 }
c60ee5e7 10317
284f4730 10318 input_pending = 0;
0c1c1b93 10319#endif /* SIGTSTP */
284f4730
JB
10320}
10321\f
dfcf069d 10322void
ffd56f97
JB
10323set_waiting_for_input (time_to_clear)
10324 EMACS_TIME *time_to_clear;
284f4730 10325{
ffd56f97 10326 input_available_clear_time = time_to_clear;
284f4730
JB
10327
10328 /* Tell interrupt_signal to throw back to read_char, */
10329 waiting_for_input = 1;
10330
10331 /* If interrupt_signal was called before and buffered a C-g,
10332 make it run again now, to avoid timing error. */
10333 if (!NILP (Vquit_flag))
10334 quit_throw_to_read_char ();
284f4730
JB
10335}
10336
07a59269 10337void
284f4730
JB
10338clear_waiting_for_input ()
10339{
10340 /* Tell interrupt_signal not to throw back to read_char, */
10341 waiting_for_input = 0;
ffd56f97 10342 input_available_clear_time = 0;
284f4730
JB
10343}
10344
27fd22dc 10345/* This routine is called at interrupt level in response to C-g.
c60ee5e7 10346
d4e68eea
GM
10347 If interrupt_input, this is the handler for SIGINT. Otherwise, it
10348 is called from kbd_buffer_store_event, in handling SIGIO or
10349 SIGTINT.
284f4730 10350
d4e68eea
GM
10351 If `waiting_for_input' is non zero, then unless `echoing' is
10352 nonzero, immediately throw back to read_char.
284f4730 10353
d4e68eea
GM
10354 Otherwise it sets the Lisp variable quit-flag not-nil. This causes
10355 eval to throw, when it gets a chance. If quit-flag is already
10356 non-nil, it stops the job right away. */
284f4730 10357
14e40288 10358static SIGTYPE
91c049d4
RS
10359interrupt_signal (signalnum) /* If we don't have an argument, */
10360 int signalnum; /* some compilers complain in signal calls. */
284f4730
JB
10361{
10362 char c;
10363 /* Must preserve main program's value of errno. */
10364 int old_errno = errno;
788f89eb 10365 struct frame *sf = SELECTED_FRAME ();
284f4730 10366
5970a8cb 10367#if defined (USG) && !defined (POSIX_SIGNALS)
7a80a6f6
RS
10368 if (!read_socket_hook && NILP (Vwindow_system))
10369 {
10370 /* USG systems forget handlers when they are used;
10371 must reestablish each time */
10372 signal (SIGINT, interrupt_signal);
10373 signal (SIGQUIT, interrupt_signal);
10374 }
284f4730
JB
10375#endif /* USG */
10376
333f1b6f 10377 SIGNAL_THREAD_CHECK (signalnum);
284f4730
JB
10378 cancel_echoing ();
10379
31e4e97b 10380 if (!NILP (Vquit_flag)
788f89eb 10381 && (FRAME_TERMCAP_P (sf) || FRAME_MSDOS_P (sf)))
284f4730 10382 {
31e4e97b
EZ
10383 /* If SIGINT isn't blocked, don't let us be interrupted by
10384 another SIGINT, it might be harmful due to non-reentrancy
10385 in I/O functions. */
10386 sigblock (sigmask (SIGINT));
10387
284f4730
JB
10388 fflush (stdout);
10389 reset_sys_modes ();
31e4e97b 10390
284f4730
JB
10391#ifdef SIGTSTP /* Support possible in later USG versions */
10392/*
10393 * On systems which can suspend the current process and return to the original
10394 * shell, this command causes the user to end up back at the shell.
10395 * The "Auto-save" and "Abort" questions are not asked until
10396 * the user elects to return to emacs, at which point he can save the current
10397 * job and either dump core or continue.
10398 */
10399 sys_suspend ();
10400#else
10401#ifdef VMS
10402 if (sys_suspend () == -1)
10403 {
10404 printf ("Not running as a subprocess;\n");
10405 printf ("you can continue or abort.\n");
10406 }
10407#else /* not VMS */
10408 /* Perhaps should really fork an inferior shell?
10409 But that would not provide any way to get back
10410 to the original shell, ever. */
10411 printf ("No support for stopping a process on this operating system;\n");
10412 printf ("you can continue or abort.\n");
10413#endif /* not VMS */
10414#endif /* not SIGTSTP */
80e4aa30
RS
10415#ifdef MSDOS
10416 /* We must remain inside the screen area when the internal terminal
10417 is used. Note that [Enter] is not echoed by dos. */
10418 cursor_to (0, 0);
10419#endif
118d6ca9
RS
10420 /* It doesn't work to autosave while GC is in progress;
10421 the code used for auto-saving doesn't cope with the mark bit. */
10422 if (!gc_in_progress)
9fd7d808 10423 {
118d6ca9
RS
10424 printf ("Auto-save? (y or n) ");
10425 fflush (stdout);
10426 if (((c = getchar ()) & ~040) == 'Y')
10427 {
10428 Fdo_auto_save (Qt, Qnil);
80e4aa30 10429#ifdef MSDOS
118d6ca9 10430 printf ("\r\nAuto-save done");
80e4aa30 10431#else /* not MSDOS */
118d6ca9 10432 printf ("Auto-save done\n");
80e4aa30 10433#endif /* not MSDOS */
118d6ca9
RS
10434 }
10435 while (c != '\n') c = getchar ();
9fd7d808 10436 }
c60ee5e7 10437 else
118d6ca9
RS
10438 {
10439 /* During GC, it must be safe to reenable quitting again. */
10440 Vinhibit_quit = Qnil;
10441#ifdef MSDOS
10442 printf ("\r\n");
10443#endif /* not MSDOS */
10444 printf ("Garbage collection in progress; cannot auto-save now\r\n");
10445 printf ("but will instead do a real quit after garbage collection ends\r\n");
10446 fflush (stdout);
10447 }
10448
80e4aa30
RS
10449#ifdef MSDOS
10450 printf ("\r\nAbort? (y or n) ");
10451#else /* not MSDOS */
284f4730
JB
10452#ifdef VMS
10453 printf ("Abort (and enter debugger)? (y or n) ");
10454#else /* not VMS */
10455 printf ("Abort (and dump core)? (y or n) ");
10456#endif /* not VMS */
80e4aa30 10457#endif /* not MSDOS */
284f4730
JB
10458 fflush (stdout);
10459 if (((c = getchar ()) & ~040) == 'Y')
10460 abort ();
10461 while (c != '\n') c = getchar ();
80e4aa30
RS
10462#ifdef MSDOS
10463 printf ("\r\nContinuing...\r\n");
10464#else /* not MSDOS */
284f4730 10465 printf ("Continuing...\n");
80e4aa30 10466#endif /* not MSDOS */
284f4730
JB
10467 fflush (stdout);
10468 init_sys_modes ();
31e4e97b 10469 sigfree ();
284f4730
JB
10470 }
10471 else
10472 {
10473 /* If executing a function that wants to be interrupted out of
10474 and the user has not deferred quitting by binding `inhibit-quit'
10475 then quit right away. */
10476 if (immediate_quit && NILP (Vinhibit_quit))
10477 {
e39da3d7
RS
10478 struct gl_state_s saved;
10479 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
10480
284f4730
JB
10481 immediate_quit = 0;
10482 sigfree ();
e39da3d7
RS
10483 saved = gl_state;
10484 GCPRO4 (saved.object, saved.global_code,
10485 saved.current_syntax_table, saved.old_prop);
284f4730 10486 Fsignal (Qquit, Qnil);
e39da3d7
RS
10487 gl_state = saved;
10488 UNGCPRO;
284f4730
JB
10489 }
10490 else
10491 /* Else request quit when it's safe */
10492 Vquit_flag = Qt;
10493 }
10494
10495 if (waiting_for_input && !echoing)
10496 quit_throw_to_read_char ();
10497
10498 errno = old_errno;
10499}
10500
10501/* Handle a C-g by making read_char return C-g. */
10502
07a59269 10503void
284f4730
JB
10504quit_throw_to_read_char ()
10505{
284f4730
JB
10506 sigfree ();
10507 /* Prevent another signal from doing this before we finish. */
f76475ad 10508 clear_waiting_for_input ();
284f4730
JB
10509 input_pending = 0;
10510
24597608 10511 Vunread_command_events = Qnil;
86e5706b 10512 unread_command_char = -1;
284f4730 10513
087feab3
RS
10514#if 0 /* Currently, sit_for is called from read_char without turning
10515 off polling. And that can call set_waiting_for_input.
10516 It seems to be harmless. */
e6b01c14
JB
10517#ifdef POLL_FOR_INPUT
10518 /* May be > 1 if in recursive minibuffer. */
10519 if (poll_suppress_count == 0)
10520 abort ();
10521#endif
087feab3 10522#endif
4c52b668 10523 if (FRAMEP (internal_last_event_frame)
788f89eb 10524 && !EQ (internal_last_event_frame, selected_frame))
719191cf 10525 do_switch_frame (make_lispy_switch_frame (internal_last_event_frame),
827c686c 10526 0, 0);
e6b01c14 10527
284f4730
JB
10528 _longjmp (getcjmp, 1);
10529}
10530\f
10531DEFUN ("set-input-mode", Fset_input_mode, Sset_input_mode, 3, 4, 0,
4707d2d0
PJ
10532 doc: /* Set mode of reading keyboard input.
10533First arg INTERRUPT non-nil means use input interrupts;
10534 nil means use CBREAK mode.
10535Second arg FLOW non-nil means use ^S/^Q flow control for output to terminal
10536 (no effect except in CBREAK mode).
10537Third arg META t means accept 8-bit input (for a Meta key).
10538 META nil means ignore the top bit, on the assumption it is parity.
10539 Otherwise, accept 8-bit input and don't use the top bit for Meta.
10540Optional fourth arg QUIT if non-nil specifies character to use for quitting.
10541See also `current-input-mode'. */)
10542 (interrupt, flow, meta, quit)
284f4730
JB
10543 Lisp_Object interrupt, flow, meta, quit;
10544{
10545 if (!NILP (quit)
8c18cbfb 10546 && (!INTEGERP (quit) || XINT (quit) < 0 || XINT (quit) > 0400))
34f04431
RS
10547 error ("set-input-mode: QUIT must be an ASCII character");
10548
10549#ifdef POLL_FOR_INPUT
10550 stop_polling ();
10551#endif
284f4730 10552
07de30b9 10553#ifndef DOS_NT
2ee250ec 10554 /* this causes startup screen to be restored and messes with the mouse */
284f4730 10555 reset_sys_modes ();
2ee250ec
RS
10556#endif
10557
284f4730
JB
10558#ifdef SIGIO
10559/* Note SIGIO has been undef'd if FIONREAD is missing. */
284f4730 10560 if (read_socket_hook)
9a0f60bb
KH
10561 {
10562 /* When using X, don't give the user a real choice,
10563 because we haven't implemented the mechanisms to support it. */
10564#ifdef NO_SOCK_SIGIO
10565 interrupt_input = 0;
10566#else /* not NO_SOCK_SIGIO */
10567 interrupt_input = 1;
284f4730 10568#endif /* NO_SOCK_SIGIO */
9a0f60bb
KH
10569 }
10570 else
284f4730
JB
10571 interrupt_input = !NILP (interrupt);
10572#else /* not SIGIO */
10573 interrupt_input = 0;
10574#endif /* not SIGIO */
9a0f60bb 10575
284f4730
JB
10576/* Our VMS input only works by interrupts, as of now. */
10577#ifdef VMS
10578 interrupt_input = 1;
10579#endif
9a0f60bb 10580
284f4730 10581 flow_control = !NILP (flow);
b04904fb
RS
10582 if (NILP (meta))
10583 meta_key = 0;
10584 else if (EQ (meta, Qt))
10585 meta_key = 1;
10586 else
10587 meta_key = 2;
284f4730
JB
10588 if (!NILP (quit))
10589 /* Don't let this value be out of range. */
10590 quit_char = XINT (quit) & (meta_key ? 0377 : 0177);
10591
07de30b9 10592#ifndef DOS_NT
284f4730 10593 init_sys_modes ();
2ee250ec 10594#endif
34f04431
RS
10595
10596#ifdef POLL_FOR_INPUT
10597 poll_suppress_count = 1;
10598 start_polling ();
10599#endif
284f4730
JB
10600 return Qnil;
10601}
80645119
JB
10602
10603DEFUN ("current-input-mode", Fcurrent_input_mode, Scurrent_input_mode, 0, 0, 0,
4707d2d0
PJ
10604 doc: /* Return information about the way Emacs currently reads keyboard input.
10605The value is a list of the form (INTERRUPT FLOW META QUIT), where
10606 INTERRUPT is non-nil if Emacs is using interrupt-driven input; if
10607 nil, Emacs is using CBREAK mode.
10608 FLOW is non-nil if Emacs uses ^S/^Q flow control for output to the
10609 terminal; this does not apply if Emacs uses interrupt-driven input.
10610 META is t if accepting 8-bit input with 8th bit as Meta flag.
10611 META nil means ignoring the top bit, on the assumption it is parity.
10612 META is neither t nor nil if accepting 8-bit input and using
10613 all 8 bits as the character code.
10614 QUIT is the character Emacs currently uses to quit.
10615The elements of this list correspond to the arguments of
10616`set-input-mode'. */)
10617 ()
80645119
JB
10618{
10619 Lisp_Object val[4];
10620
10621 val[0] = interrupt_input ? Qt : Qnil;
10622 val[1] = flow_control ? Qt : Qnil;
a8ee7ef9 10623 val[2] = meta_key == 2 ? make_number (0) : meta_key == 1 ? Qt : Qnil;
bb9e9bed 10624 XSETFASTINT (val[3], quit_char);
80645119 10625
bf673a7a 10626 return Flist (sizeof (val) / sizeof (val[0]), val);
80645119
JB
10627}
10628
a25f766a 10629DEFUN ("posn-at-x-y", Fposn_at_x_y, Sposn_at_x_y, 2, 4, 0,
ec026e7a
KS
10630 doc: /* Return position information for pixel coordinates X and Y.
10631By default, X and Y are relative to text area of the selected window.
6e604a9b 10632Optional third arg FRAME-OR-WINDOW non-nil specifies frame or window.
a25f766a
KS
10633If optional fourth arg WHOLE is non-nil, X is relative to the left
10634edge of the window.
ec026e7a
KS
10635
10636The return value is similar to a mouse click position:
10637 (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
10638 IMAGE (DX . DY) (WIDTH . HEIGHT))
10639The `posn-' functions access elements of such lists. */)
a25f766a
KS
10640 (x, y, frame_or_window, whole)
10641 Lisp_Object x, y, frame_or_window, whole;
ec026e7a 10642{
f4a5a485
SM
10643 CHECK_NATNUM (x);
10644 CHECK_NATNUM (y);
10645
ec026e7a
KS
10646 if (NILP (frame_or_window))
10647 frame_or_window = selected_window;
10648
10649 if (WINDOWP (frame_or_window))
10650 {
10651 struct window *w;
10652
10653 CHECK_LIVE_WINDOW (frame_or_window);
10654
10655 w = XWINDOW (frame_or_window);
6507c4c7
KS
10656 XSETINT (x, (XINT (x)
10657 + WINDOW_LEFT_EDGE_X (w)
a25f766a
KS
10658 + (NILP (whole)
10659 ? window_box_left_offset (w, TEXT_AREA)
6507c4c7 10660 : 0)));
ec026e7a
KS
10661 XSETINT (y, WINDOW_TO_FRAME_PIXEL_Y (w, XINT (y)));
10662 frame_or_window = w->frame;
10663 }
10664
10665 CHECK_LIVE_FRAME (frame_or_window);
10666
10667 return make_lispy_position (XFRAME (frame_or_window), &x, &y, 0);
10668}
10669
10670DEFUN ("posn-at-point", Fposn_at_point, Sposn_at_point, 0, 2, 0,
10671 doc: /* Return position information for buffer POS in WINDOW.
10672POS defaults to point in WINDOW; WINDOW defaults to the selected window.
10673
10674Return nil if position is not visible in window. Otherwise,
883d272e 10675the return value is similar to that returned by `event-start' for
ec026e7a
KS
10676a mouse click at the upper left corner of the glyph corresponding
10677to the given buffer position:
10678 (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
10679 IMAGE (DX . DY) (WIDTH . HEIGHT))
8f1657f0 10680The `posn-' functions access elements of such lists. */)
ec026e7a
KS
10681 (pos, window)
10682 Lisp_Object pos, window;
10683{
10684 Lisp_Object tem;
10685
6507c4c7
KS
10686 if (NILP (window))
10687 window = selected_window;
10688
ec026e7a
KS
10689 tem = Fpos_visible_in_window_p (pos, window, Qt);
10690 if (!NILP (tem))
6507c4c7
KS
10691 {
10692 Lisp_Object x = XCAR (tem);
10693 Lisp_Object y = XCAR (XCDR (tem));
10694
10695 /* Point invisible due to hscrolling? */
10696 if (XINT (x) < 0)
10697 return Qnil;
10698 tem = Fposn_at_x_y (x, y, window, Qnil);
10699 }
10700
ec026e7a
KS
10701 return tem;
10702}
10703
284f4730 10704\f
6c6083a9 10705/*
c5fdd383 10706 * Set up a new kboard object with reasonable initial values.
6c6083a9
KH
10707 */
10708void
c5fdd383
KH
10709init_kboard (kb)
10710 KBOARD *kb;
6c6083a9 10711{
217258d5 10712 kb->Voverriding_terminal_local_map = Qnil;
6c7178b9 10713 kb->Vlast_command = Qnil;
75045dcb 10714 kb->Vreal_last_command = Qnil;
d8bcf58e 10715 kb->Vprefix_arg = Qnil;
75045dcb 10716 kb->Vlast_prefix_arg = Qnil;
c5fdd383
KH
10717 kb->kbd_queue = Qnil;
10718 kb->kbd_queue_has_data = 0;
10719 kb->immediate_echo = 0;
678e9d18 10720 kb->echo_string = Qnil;
c5fdd383
KH
10721 kb->echo_after_prompt = -1;
10722 kb->kbd_macro_buffer = 0;
10723 kb->kbd_macro_bufsize = 0;
10724 kb->defining_kbd_macro = Qnil;
10725 kb->Vlast_kbd_macro = Qnil;
10726 kb->reference_count = 0;
7c97ffdc 10727 kb->Vsystem_key_alist = Qnil;
142e6c73 10728 kb->system_key_syms = Qnil;
9ba47203 10729 kb->Vdefault_minibuffer_frame = Qnil;
6c6083a9
KH
10730}
10731
10732/*
c5fdd383 10733 * Destroy the contents of a kboard object, but not the object itself.
8e6208c5 10734 * We use this just before deleting it, or if we're going to initialize
6c6083a9
KH
10735 * it a second time.
10736 */
e50b8090 10737static void
c5fdd383
KH
10738wipe_kboard (kb)
10739 KBOARD *kb;
6c6083a9 10740{
c5fdd383
KH
10741 if (kb->kbd_macro_buffer)
10742 xfree (kb->kbd_macro_buffer);
6c6083a9
KH
10743}
10744
e50b8090 10745#ifdef MULTI_KBOARD
a122a38e
GM
10746
10747/* Free KB and memory referenced from it. */
10748
e50b8090
KH
10749void
10750delete_kboard (kb)
a122a38e 10751 KBOARD *kb;
e50b8090
KH
10752{
10753 KBOARD **kbp;
c60ee5e7 10754
e50b8090
KH
10755 for (kbp = &all_kboards; *kbp != kb; kbp = &(*kbp)->next_kboard)
10756 if (*kbp == NULL)
10757 abort ();
10758 *kbp = kb->next_kboard;
a122a38e
GM
10759
10760 /* Prevent a dangling reference to KB. */
18f534df
GM
10761 if (kb == current_kboard
10762 && FRAMEP (selected_frame)
10763 && FRAME_LIVE_P (XFRAME (selected_frame)))
a122a38e 10764 {
18f534df 10765 current_kboard = XFRAME (selected_frame)->kboard;
a122a38e
GM
10766 if (current_kboard == kb)
10767 abort ();
10768 }
c60ee5e7 10769
e50b8090
KH
10770 wipe_kboard (kb);
10771 xfree (kb);
10772}
a122a38e
GM
10773
10774#endif /* MULTI_KBOARD */
e50b8090 10775
dfcf069d 10776void
284f4730
JB
10777init_keyboard ()
10778{
284f4730
JB
10779 /* This is correct before outermost invocation of the editor loop */
10780 command_loop_level = -1;
10781 immediate_quit = 0;
10782 quit_char = Ctl ('g');
24597608 10783 Vunread_command_events = Qnil;
86e5706b 10784 unread_command_char = -1;
87dd9b9b 10785 EMACS_SET_SECS_USECS (timer_idleness_start_time, -1, -1);
284f4730 10786 total_keys = 0;
9deb415a 10787 recent_keys_index = 0;
beecf6a1
KH
10788 kbd_fetch_ptr = kbd_buffer;
10789 kbd_store_ptr = kbd_buffer;
2eb6bfbe 10790#ifdef HAVE_MOUSE
a9d77f1f 10791 do_mouse_tracking = Qnil;
2eb6bfbe 10792#endif
284f4730
JB
10793 input_pending = 0;
10794
4c52b668
KH
10795 /* This means that command_loop_1 won't try to select anything the first
10796 time through. */
10797 internal_last_event_frame = Qnil;
10798 Vlast_event_frame = internal_last_event_frame;
4c52b668 10799
c5fdd383 10800#ifdef MULTI_KBOARD
aaca43a1 10801 current_kboard = initial_kboard;
6c6083a9 10802#endif
aaca43a1 10803 wipe_kboard (current_kboard);
c5fdd383 10804 init_kboard (current_kboard);
07d2b8de 10805
7a80a6f6 10806 if (!noninteractive && !read_socket_hook && NILP (Vwindow_system))
284f4730
JB
10807 {
10808 signal (SIGINT, interrupt_signal);
cb5df6ae 10809#if defined (HAVE_TERMIO) || defined (HAVE_TERMIOS)
284f4730
JB
10810 /* For systems with SysV TERMIO, C-g is set up for both SIGINT and
10811 SIGQUIT and we can't tell which one it will give us. */
10812 signal (SIGQUIT, interrupt_signal);
10813#endif /* HAVE_TERMIO */
7a80a6f6 10814 }
284f4730
JB
10815/* Note SIGIO has been undef'd if FIONREAD is missing. */
10816#ifdef SIGIO
7a80a6f6
RS
10817 if (!noninteractive)
10818 signal (SIGIO, input_available_signal);
8ea0a720 10819#endif /* SIGIO */
284f4730
JB
10820
10821/* Use interrupt input by default, if it works and noninterrupt input
10822 has deficiencies. */
10823
10824#ifdef INTERRUPT_INPUT
10825 interrupt_input = 1;
10826#else
10827 interrupt_input = 0;
10828#endif
10829
10830/* Our VMS input only works by interrupts, as of now. */
10831#ifdef VMS
10832 interrupt_input = 1;
10833#endif
10834
10835 sigfree ();
10836 dribble = 0;
10837
10838 if (keyboard_init_hook)
10839 (*keyboard_init_hook) ();
10840
10841#ifdef POLL_FOR_INPUT
10842 poll_suppress_count = 1;
10843 start_polling ();
10844#endif
10845}
10846
df0f2ba1 10847/* This type's only use is in syms_of_keyboard, to initialize the
284f4730
JB
10848 event header symbols and put properties on them. */
10849struct event_head {
10850 Lisp_Object *var;
10851 char *name;
10852 Lisp_Object *kind;
10853};
10854
10855struct event_head head_table[] = {
7406e988
PJ
10856 {&Qmouse_movement, "mouse-movement", &Qmouse_movement},
10857 {&Qscroll_bar_movement, "scroll-bar-movement", &Qmouse_movement},
10858 {&Qswitch_frame, "switch-frame", &Qswitch_frame},
10859 {&Qdelete_frame, "delete-frame", &Qdelete_frame},
10860 {&Qiconify_frame, "iconify-frame", &Qiconify_frame},
a697f886 10861 {&Qmake_frame_visible, "make-frame-visible", &Qmake_frame_visible},
6901b111
SM
10862 /* `select-window' should be handled just like `switch-frame'
10863 in read_key_sequence. */
10864 {&Qselect_window, "select-window", &Qswitch_frame}
284f4730
JB
10865};
10866
dfcf069d 10867void
284f4730
JB
10868syms_of_keyboard ()
10869{
f0c1cc56
GM
10870 Vpre_help_message = Qnil;
10871 staticpro (&Vpre_help_message);
c60ee5e7 10872
8e1e4240
GM
10873 Vlispy_mouse_stem = build_string ("mouse");
10874 staticpro (&Vlispy_mouse_stem);
f0c1cc56 10875
9ea173e8 10876 /* Tool-bars. */
7ee32cda
GM
10877 QCimage = intern (":image");
10878 staticpro (&QCimage);
10879
10880 staticpro (&Qhelp_echo);
10881 Qhelp_echo = intern ("help-echo");
10882
e8886a1d
RS
10883 staticpro (&item_properties);
10884 item_properties = Qnil;
10885
9ea173e8
GM
10886 staticpro (&tool_bar_item_properties);
10887 tool_bar_item_properties = Qnil;
10888 staticpro (&tool_bar_items_vector);
10889 tool_bar_items_vector = Qnil;
7ee32cda 10890
d5eecefb
RS
10891 staticpro (&real_this_command);
10892 real_this_command = Qnil;
10893
d925fb39
RS
10894 Qtimer_event_handler = intern ("timer-event-handler");
10895 staticpro (&Qtimer_event_handler);
10896
971e4c98
LT
10897 Qdisabled_command_function = intern ("disabled-command-function");
10898 staticpro (&Qdisabled_command_function);
2e894dab 10899
284f4730
JB
10900 Qself_insert_command = intern ("self-insert-command");
10901 staticpro (&Qself_insert_command);
10902
10903 Qforward_char = intern ("forward-char");
10904 staticpro (&Qforward_char);
10905
10906 Qbackward_char = intern ("backward-char");
10907 staticpro (&Qbackward_char);
10908
10909 Qdisabled = intern ("disabled");
10910 staticpro (&Qdisabled);
10911
e58aa385
RS
10912 Qundefined = intern ("undefined");
10913 staticpro (&Qundefined);
10914
86e5706b
RS
10915 Qpre_command_hook = intern ("pre-command-hook");
10916 staticpro (&Qpre_command_hook);
10917
10918 Qpost_command_hook = intern ("post-command-hook");
10919 staticpro (&Qpost_command_hook);
10920
3ef14e46
RS
10921 Qdeferred_action_function = intern ("deferred-action-function");
10922 staticpro (&Qdeferred_action_function);
10923
40932d1a
RS
10924 Qcommand_hook_internal = intern ("command-hook-internal");
10925 staticpro (&Qcommand_hook_internal);
10926
284f4730
JB
10927 Qfunction_key = intern ("function-key");
10928 staticpro (&Qfunction_key);
13b5e56c 10929 Qmouse_click = intern ("mouse-click");
284f4730 10930 staticpro (&Qmouse_click);
c16dab62 10931#if defined (WINDOWSNT) || defined (MAC_OS)
1161d367
GV
10932 Qlanguage_change = intern ("language-change");
10933 staticpro (&Qlanguage_change);
07de30b9 10934#endif
a24dc617
RS
10935 Qdrag_n_drop = intern ("drag-n-drop");
10936 staticpro (&Qdrag_n_drop);
284f4730 10937
4ebc27a5 10938 Qsave_session = intern ("save-session");
6e604a9b 10939 staticpro (&Qsave_session);
c60ee5e7 10940
f66c49cc
YM
10941#ifdef MAC_OS
10942 Qmac_apple_event = intern ("mac-apple-event");
10943 staticpro (&Qmac_apple_event);
10944#endif
10945
5bf68f6e
AS
10946 Qusr1_signal = intern ("usr1-signal");
10947 staticpro (&Qusr1_signal);
10948 Qusr2_signal = intern ("usr2-signal");
10949 staticpro (&Qusr2_signal);
10950
598a9fa7
JB
10951 Qmenu_enable = intern ("menu-enable");
10952 staticpro (&Qmenu_enable);
e8886a1d
RS
10953 Qmenu_alias = intern ("menu-alias");
10954 staticpro (&Qmenu_alias);
10955 QCenable = intern (":enable");
10956 staticpro (&QCenable);
10957 QCvisible = intern (":visible");
10958 staticpro (&QCvisible);
7ee32cda
GM
10959 QChelp = intern (":help");
10960 staticpro (&QChelp);
e8886a1d
RS
10961 QCfilter = intern (":filter");
10962 staticpro (&QCfilter);
10963 QCbutton = intern (":button");
10964 staticpro (&QCbutton);
74c1de23
RS
10965 QCkeys = intern (":keys");
10966 staticpro (&QCkeys);
10967 QCkey_sequence = intern (":key-sequence");
10968 staticpro (&QCkey_sequence);
e8886a1d
RS
10969 QCtoggle = intern (":toggle");
10970 staticpro (&QCtoggle);
10971 QCradio = intern (":radio");
10972 staticpro (&QCradio);
598a9fa7 10973
284f4730
JB
10974 Qmode_line = intern ("mode-line");
10975 staticpro (&Qmode_line);
e5d77022
JB
10976 Qvertical_line = intern ("vertical-line");
10977 staticpro (&Qvertical_line);
3c370943
JB
10978 Qvertical_scroll_bar = intern ("vertical-scroll-bar");
10979 staticpro (&Qvertical_scroll_bar);
5ec75a55
RS
10980 Qmenu_bar = intern ("menu-bar");
10981 staticpro (&Qmenu_bar);
4bb994d1 10982
c22237f7
KS
10983#ifdef HAVE_MOUSE
10984 Qmouse_fixup_help_message = intern ("mouse-fixup-help-message");
10985 staticpro (&Qmouse_fixup_help_message);
10986#endif
10987
4bb994d1
JB
10988 Qabove_handle = intern ("above-handle");
10989 staticpro (&Qabove_handle);
10990 Qhandle = intern ("handle");
10991 staticpro (&Qhandle);
10992 Qbelow_handle = intern ("below-handle");
10993 staticpro (&Qbelow_handle);
db08707d
RS
10994 Qup = intern ("up");
10995 staticpro (&Qup);
10996 Qdown = intern ("down");
10997 staticpro (&Qdown);
7ee32cda
GM
10998 Qtop = intern ("top");
10999 staticpro (&Qtop);
11000 Qbottom = intern ("bottom");
11001 staticpro (&Qbottom);
11002 Qend_scroll = intern ("end-scroll");
11003 staticpro (&Qend_scroll);
eef28553
SM
11004 Qratio = intern ("ratio");
11005 staticpro (&Qratio);
284f4730 11006
cd21b839 11007 Qevent_kind = intern ("event-kind");
284f4730 11008 staticpro (&Qevent_kind);
88cb0656
JB
11009 Qevent_symbol_elements = intern ("event-symbol-elements");
11010 staticpro (&Qevent_symbol_elements);
0a7f1fc0
JB
11011 Qevent_symbol_element_mask = intern ("event-symbol-element-mask");
11012 staticpro (&Qevent_symbol_element_mask);
11013 Qmodifier_cache = intern ("modifier-cache");
11014 staticpro (&Qmodifier_cache);
284f4730 11015
48e416d4
RS
11016 Qrecompute_lucid_menubar = intern ("recompute-lucid-menubar");
11017 staticpro (&Qrecompute_lucid_menubar);
11018 Qactivate_menubar_hook = intern ("activate-menubar-hook");
11019 staticpro (&Qactivate_menubar_hook);
11020
f4eef8b4
RS
11021 Qpolling_period = intern ("polling-period");
11022 staticpro (&Qpolling_period);
11023
7d18f9ae
RS
11024 Qinput_method_function = intern ("input-method-function");
11025 staticpro (&Qinput_method_function);
11026
d5eecefb
RS
11027 Qinput_method_exit_on_first_char = intern ("input-method-exit-on-first-char");
11028 staticpro (&Qinput_method_exit_on_first_char);
11029 Qinput_method_use_echo_area = intern ("input-method-use-echo-area");
11030 staticpro (&Qinput_method_use_echo_area);
11031
11032 Fset (Qinput_method_exit_on_first_char, Qnil);
11033 Fset (Qinput_method_use_echo_area, Qnil);
11034
e18dfbf4 11035 last_point_position_buffer = Qnil;
bb0e1d19 11036 last_point_position_window = Qnil;
e18dfbf4 11037
284f4730
JB
11038 {
11039 struct event_head *p;
11040
11041 for (p = head_table;
11042 p < head_table + (sizeof (head_table) / sizeof (head_table[0]));
11043 p++)
11044 {
11045 *p->var = intern (p->name);
11046 staticpro (p->var);
11047 Fput (*p->var, Qevent_kind, *p->kind);
88cb0656 11048 Fput (*p->var, Qevent_symbol_elements, Fcons (*p->var, Qnil));
284f4730
JB
11049 }
11050 }
11051
8e1e4240 11052 button_down_location = Fmake_vector (make_number (1), Qnil);
7b4aedb9 11053 staticpro (&button_down_location);
8e1e4240
GM
11054 mouse_syms = Fmake_vector (make_number (1), Qnil);
11055 staticpro (&mouse_syms);
8006e4bb
JR
11056 wheel_syms = Fmake_vector (make_number (2), Qnil);
11057 staticpro (&wheel_syms);
88cb0656
JB
11058
11059 {
11060 int i;
11061 int len = sizeof (modifier_names) / sizeof (modifier_names[0]);
11062
11063 modifier_symbols = Fmake_vector (make_number (len), Qnil);
11064 for (i = 0; i < len; i++)
86e5706b
RS
11065 if (modifier_names[i])
11066 XVECTOR (modifier_symbols)->contents[i] = intern (modifier_names[i]);
88cb0656
JB
11067 staticpro (&modifier_symbols);
11068 }
11069
9deb415a
JB
11070 recent_keys = Fmake_vector (make_number (NUM_RECENT_KEYS), Qnil);
11071 staticpro (&recent_keys);
11072
6569cc8d 11073 this_command_keys = Fmake_vector (make_number (40), Qnil);
715d9345 11074 staticpro (&this_command_keys);
6569cc8d 11075
7d18f9ae
RS
11076 raw_keybuf = Fmake_vector (make_number (30), Qnil);
11077 staticpro (&raw_keybuf);
11078
03b4122a
BF
11079 Qextended_command_history = intern ("extended-command-history");
11080 Fset (Qextended_command_history, Qnil);
11081 staticpro (&Qextended_command_history);
11082
24597608
RS
11083 accent_key_syms = Qnil;
11084 staticpro (&accent_key_syms);
11085
284f4730
JB
11086 func_key_syms = Qnil;
11087 staticpro (&func_key_syms);
11088
a24dc617
RS
11089 drag_n_drop_syms = Qnil;
11090 staticpro (&drag_n_drop_syms);
07de30b9 11091
cd21b839
JB
11092 unread_switch_frame = Qnil;
11093 staticpro (&unread_switch_frame);
11094
fe412364
EN
11095 internal_last_event_frame = Qnil;
11096 staticpro (&internal_last_event_frame);
11097
11098 read_key_sequence_cmd = Qnil;
11099 staticpro (&read_key_sequence_cmd);
11100
759860a6
RS
11101 menu_bar_one_keymap_changed_items = Qnil;
11102 staticpro (&menu_bar_one_keymap_changed_items);
11103
7320c7de
KS
11104 menu_bar_items_vector = Qnil;
11105 staticpro (&menu_bar_items_vector);
11106
a1706c30 11107 defsubr (&Sevent_convert_list);
284f4730 11108 defsubr (&Sread_key_sequence);
e39da3d7 11109 defsubr (&Sread_key_sequence_vector);
284f4730 11110 defsubr (&Srecursive_edit);
2eb6bfbe 11111#ifdef HAVE_MOUSE
284f4730 11112 defsubr (&Strack_mouse);
2eb6bfbe 11113#endif
284f4730
JB
11114 defsubr (&Sinput_pending_p);
11115 defsubr (&Scommand_execute);
11116 defsubr (&Srecent_keys);
11117 defsubr (&Sthis_command_keys);
e39da3d7 11118 defsubr (&Sthis_command_keys_vector);
6321824f 11119 defsubr (&Sthis_single_command_keys);
7d18f9ae 11120 defsubr (&Sthis_single_command_raw_keys);
71918b75 11121 defsubr (&Sreset_this_command_lengths);
82e6e5af 11122 defsubr (&Sclear_this_command_keys);
284f4730
JB
11123 defsubr (&Ssuspend_emacs);
11124 defsubr (&Sabort_recursive_edit);
11125 defsubr (&Sexit_recursive_edit);
11126 defsubr (&Srecursion_depth);
11127 defsubr (&Stop_level);
11128 defsubr (&Sdiscard_input);
11129 defsubr (&Sopen_dribble_file);
11130 defsubr (&Sset_input_mode);
80645119 11131 defsubr (&Scurrent_input_mode);
284f4730 11132 defsubr (&Sexecute_extended_command);
ec026e7a
KS
11133 defsubr (&Sposn_at_point);
11134 defsubr (&Sposn_at_x_y);
284f4730 11135
284f4730 11136 DEFVAR_LISP ("last-command-char", &last_command_char,
4707d2d0 11137 doc: /* Last input event that was part of a command. */);
86e5706b 11138
186cf719 11139 DEFVAR_LISP_NOPRO ("last-command-event", &last_command_char,
4707d2d0 11140 doc: /* Last input event that was part of a command. */);
284f4730 11141
7d6de002 11142 DEFVAR_LISP ("last-nonmenu-event", &last_nonmenu_event,
4707d2d0
PJ
11143 doc: /* Last input event in a command, except for mouse menu events.
11144Mouse menus give back keys that don't look like mouse events;
11145this variable holds the actual mouse event that led to the menu,
11146so that you can determine whether the command was run by mouse or not. */);
7d6de002 11147
284f4730 11148 DEFVAR_LISP ("last-input-char", &last_input_char,
fa1361cb 11149 doc: /* Last input event. */);
86e5706b 11150
186cf719 11151 DEFVAR_LISP_NOPRO ("last-input-event", &last_input_char,
4707d2d0 11152 doc: /* Last input event. */);
284f4730 11153
24597608 11154 DEFVAR_LISP ("unread-command-events", &Vunread_command_events,
4707d2d0
PJ
11155 doc: /* List of events to be read as the command input.
11156These events are processed first, before actual keyboard input. */);
7d18f9ae 11157 Vunread_command_events = Qnil;
284f4730 11158
86e5706b 11159 DEFVAR_INT ("unread-command-char", &unread_command_char,
4707d2d0 11160 doc: /* If not -1, an object to be read as next command input event. */);
86e5706b 11161
7d18f9ae 11162 DEFVAR_LISP ("unread-post-input-method-events", &Vunread_post_input_method_events,
4707d2d0
PJ
11163 doc: /* List of events to be processed as input by input methods.
11164These events are processed after `unread-command-events', but
11165before actual keyboard input. */);
7d18f9ae
RS
11166 Vunread_post_input_method_events = Qnil;
11167
11168 DEFVAR_LISP ("unread-input-method-events", &Vunread_input_method_events,
4707d2d0
PJ
11169 doc: /* List of events to be processed as input by input methods.
11170These events are processed after `unread-command-events', but
11171before actual keyboard input. */);
7d18f9ae
RS
11172 Vunread_input_method_events = Qnil;
11173
284f4730 11174 DEFVAR_LISP ("meta-prefix-char", &meta_prefix_char,
4707d2d0
PJ
11175 doc: /* Meta-prefix character code.
11176Meta-foo as command input turns into this character followed by foo. */);
18cd2eeb 11177 XSETINT (meta_prefix_char, 033);
284f4730 11178
6c7178b9 11179 DEFVAR_KBOARD ("last-command", Vlast_command,
4707d2d0
PJ
11180 doc: /* The last command executed.
11181Normally a symbol with a function definition, but can be whatever was found
11182in the keymap, or whatever the variable `this-command' was set to by that
11183command.
11184
11185The value `mode-exit' is special; it means that the previous command
11186read an event that told it to exit, and it did so and unread that event.
11187In other words, the present command is the event that made the previous
11188command exit.
11189
11190The value `kill-region' is special; it means that the previous command
11191was a kill command. */);
284f4730 11192
75045dcb 11193 DEFVAR_KBOARD ("real-last-command", Vreal_last_command,
4707d2d0 11194 doc: /* Same as `last-command', but never altered by Lisp code. */);
75045dcb 11195
d5eecefb 11196 DEFVAR_LISP ("this-command", &Vthis_command,
4707d2d0
PJ
11197 doc: /* The command now being executed.
11198The command can set this variable; whatever is put here
11199will be in `last-command' during the following command. */);
d5eecefb 11200 Vthis_command = Qnil;
284f4730 11201
8b9940e6 11202 DEFVAR_LISP ("this-original-command", &Vthis_original_command,
f5613d1e
KS
11203 doc: /* The command bound to the current key sequence before remapping.
11204It equals `this-command' if the original command was not remapped through
11205any of the active keymaps. Otherwise, the value of `this-command' is the
177c0ea7 11206result of looking up the original command in the active keymaps. */);
8b9940e6
KS
11207 Vthis_original_command = Qnil;
11208
284f4730 11209 DEFVAR_INT ("auto-save-interval", &auto_save_interval,
4707d2d0
PJ
11210 doc: /* *Number of input events between auto-saves.
11211Zero means disable autosaving due to number of characters typed. */);
284f4730
JB
11212 auto_save_interval = 300;
11213
11214 DEFVAR_LISP ("auto-save-timeout", &Vauto_save_timeout,
4707d2d0
PJ
11215 doc: /* *Number of seconds idle time before auto-save.
11216Zero or nil means disable auto-saving due to idleness.
11217After auto-saving due to this many seconds of idle time,
11218Emacs also does a garbage collection if that seems to be warranted. */);
bb9e9bed 11219 XSETFASTINT (Vauto_save_timeout, 30);
284f4730 11220
39aab679 11221 DEFVAR_LISP ("echo-keystrokes", &Vecho_keystrokes,
4707d2d0
PJ
11222 doc: /* *Nonzero means echo unfinished commands after this many seconds of pause.
11223The value may be integer or floating point. */);
39aab679 11224 Vecho_keystrokes = make_number (1);
284f4730
JB
11225
11226 DEFVAR_INT ("polling-period", &polling_period,
4707d2d0
PJ
11227 doc: /* *Interval between polling for input during Lisp execution.
11228The reason for polling is to make C-g work to stop a running program.
11229Polling is needed only when using X windows and SIGIO does not work.
11230Polling is automatically disabled in all other cases. */);
284f4730 11231 polling_period = 2;
df0f2ba1 11232
564dc952 11233 DEFVAR_LISP ("double-click-time", &Vdouble_click_time,
4707d2d0
PJ
11234 doc: /* *Maximum time between mouse clicks to make a double-click.
11235Measured in milliseconds. nil means disable double-click recognition;
11236t means double-clicks have no time limit and are detected
11237by position only. */);
aab06933 11238 Vdouble_click_time = make_number (500);
fbcd35bd 11239
222d557c 11240 DEFVAR_INT ("double-click-fuzz", &double_click_fuzz,
4707d2d0
PJ
11241 doc: /* *Maximum mouse movement between clicks to make a double-click.
11242On window-system frames, value is the number of pixels the mouse may have
11243moved horizontally or vertically between two clicks to make a double-click.
11244On non window-system frames, value is interpreted in units of 1/8 characters
1ca6a9c4
RS
11245instead of pixels.
11246
11247This variable is also the threshold for motion of the mouse
11248to count as a drag. */);
222d557c 11249 double_click_fuzz = 3;
c60ee5e7 11250
03361bcc 11251 DEFVAR_BOOL ("inhibit-local-menu-bar-menus", &inhibit_local_menu_bar_menus,
4707d2d0 11252 doc: /* *Non-nil means inhibit local map menu bar menus. */);
03361bcc
RS
11253 inhibit_local_menu_bar_menus = 0;
11254
284f4730 11255 DEFVAR_INT ("num-input-keys", &num_input_keys,
4707d2d0
PJ
11256 doc: /* Number of complete key sequences read as input so far.
11257This includes key sequences read from keyboard macros.
11258The number is effectively the number of interactive command invocations. */);
284f4730
JB
11259 num_input_keys = 0;
11260
c43b1734 11261 DEFVAR_INT ("num-nonmacro-input-events", &num_nonmacro_input_events,
4707d2d0
PJ
11262 doc: /* Number of input events read from the keyboard so far.
11263This does not include events generated by keyboard macros. */);
c43b1734 11264 num_nonmacro_input_events = 0;
fa90970d 11265
4c52b668 11266 DEFVAR_LISP ("last-event-frame", &Vlast_event_frame,
4707d2d0
PJ
11267 doc: /* The frame in which the most recently read event occurred.
11268If the last event came from a keyboard macro, this is set to `macro'. */);
4c52b668
KH
11269 Vlast_event_frame = Qnil;
11270
fa90970d
RS
11271 /* This variable is set up in sysdep.c. */
11272 DEFVAR_LISP ("tty-erase-char", &Vtty_erase_char,
4707d2d0 11273 doc: /* The ERASE character as set by the user with stty. */);
fa90970d 11274
7e85b935 11275 DEFVAR_LISP ("help-char", &Vhelp_char,
4707d2d0
PJ
11276 doc: /* Character to recognize as meaning Help.
11277When it is read, do `(eval help-form)', and display result if it's a string.
11278If the value of `help-form' is nil, this char can be read normally. */);
18cd2eeb 11279 XSETINT (Vhelp_char, Ctl ('H'));
284f4730 11280
ecb7cb34 11281 DEFVAR_LISP ("help-event-list", &Vhelp_event_list,
4707d2d0
PJ
11282 doc: /* List of input events to recognize as meaning Help.
11283These work just like the value of `help-char' (see that). */);
ecb7cb34
KH
11284 Vhelp_event_list = Qnil;
11285
284f4730 11286 DEFVAR_LISP ("help-form", &Vhelp_form,
4707d2d0
PJ
11287 doc: /* Form to execute when character `help-char' is read.
11288If the form returns a string, that string is displayed.
11289If `help-form' is nil, the help char is not recognized. */);
284f4730
JB
11290 Vhelp_form = Qnil;
11291
7e85b935 11292 DEFVAR_LISP ("prefix-help-command", &Vprefix_help_command,
4707d2d0
PJ
11293 doc: /* Command to run when `help-char' character follows a prefix key.
11294This command is used only when there is no actual binding
11295for that character after that prefix key. */);
7e85b935
RS
11296 Vprefix_help_command = Qnil;
11297
284f4730 11298 DEFVAR_LISP ("top-level", &Vtop_level,
4707d2d0
PJ
11299 doc: /* Form to evaluate when Emacs starts up.
11300Useful to set before you dump a modified Emacs. */);
284f4730
JB
11301 Vtop_level = Qnil;
11302
11303 DEFVAR_LISP ("keyboard-translate-table", &Vkeyboard_translate_table,
4707d2d0 11304 doc: /* Translate table for keyboard input, or nil.
669de2fb
LT
11305If non-nil, the value should be a char-table. Each character read
11306from the keyboard is looked up in this char-table. If the value found
11307there is non-nil, then it is used instead of the actual input character.
11308
11309The value can also be a string or vector, but this is considered obsolete.
11310If it is a string or vector of length N, character codes N and up are left
11311untranslated. In a vector, an element which is nil means "no translation".
a0acc6c7
DL
11312
11313This is applied to the characters supplied to input methods, not their
11314output. See also `translation-table-for-input'. */);
284f4730
JB
11315 Vkeyboard_translate_table = Qnil;
11316
8026024c 11317 DEFVAR_BOOL ("cannot-suspend", &cannot_suspend,
4707d2d0
PJ
11318 doc: /* Non-nil means to always spawn a subshell instead of suspending.
11319\(Even if the operating system has support for stopping a process.\) */);
8026024c
KH
11320 cannot_suspend = 0;
11321
284f4730 11322 DEFVAR_BOOL ("menu-prompting", &menu_prompting,
4707d2d0
PJ
11323 doc: /* Non-nil means prompt with menus when appropriate.
11324This is done when reading from a keymap that has a prompt string,
11325for elements that have prompt strings.
11326The menu is displayed on the screen
11327if X menus were enabled at configuration
11328time and the previous event was a mouse click prefix key.
11329Otherwise, menu prompting uses the echo area. */);
284f4730
JB
11330 menu_prompting = 1;
11331
11332 DEFVAR_LISP ("menu-prompt-more-char", &menu_prompt_more_char,
4707d2d0
PJ
11333 doc: /* Character to see next line of menu prompt.
11334Type this character while in a menu prompt to rotate around the lines of it. */);
18cd2eeb 11335 XSETINT (menu_prompt_more_char, ' ');
9fa4395d
RS
11336
11337 DEFVAR_INT ("extra-keyboard-modifiers", &extra_keyboard_modifiers,
4707d2d0
PJ
11338 doc: /* A mask of additional modifier keys to use with every keyboard character.
11339Emacs applies the modifiers of the character stored here to each keyboard
11340character it reads. For example, after evaluating the expression
11341 (setq extra-keyboard-modifiers ?\\C-x)
11342all input characters will have the control modifier applied to them.
11343
11344Note that the character ?\\C-@, equivalent to the integer zero, does
11345not count as a control character; rather, it counts as a character
11346with no modifiers; thus, setting `extra-keyboard-modifiers' to zero
11347cancels any modification. */);
9fa4395d 11348 extra_keyboard_modifiers = 0;
86e5706b
RS
11349
11350 DEFVAR_LISP ("deactivate-mark", &Vdeactivate_mark,
4707d2d0
PJ
11351 doc: /* If an editing command sets this to t, deactivate the mark afterward.
11352The command loop sets this to nil before each command,
11353and tests the value when the command returns.
11354Buffer modification stores t in this variable. */);
86e5706b
RS
11355 Vdeactivate_mark = Qnil;
11356
b0f2a7bf 11357 DEFVAR_LISP ("command-hook-internal", &Vcommand_hook_internal,
4707d2d0 11358 doc: /* Temporary storage of pre-command-hook or post-command-hook. */);
b0f2a7bf
KH
11359 Vcommand_hook_internal = Qnil;
11360
86e5706b 11361 DEFVAR_LISP ("pre-command-hook", &Vpre_command_hook,
4707d2d0
PJ
11362 doc: /* Normal hook run before each command is executed.
11363If an unhandled error happens in running this hook,
11364the hook value is set to nil, since otherwise the error
11365might happen repeatedly and make Emacs nonfunctional. */);
86e5706b
RS
11366 Vpre_command_hook = Qnil;
11367
11368 DEFVAR_LISP ("post-command-hook", &Vpost_command_hook,
4707d2d0
PJ
11369 doc: /* Normal hook run after each command is executed.
11370If an unhandled error happens in running this hook,
11371the hook value is set to nil, since otherwise the error
11372might happen repeatedly and make Emacs nonfunctional. */);
86e5706b 11373 Vpost_command_hook = Qnil;
48e416d4 11374
cf24f894
RS
11375#if 0
11376 DEFVAR_LISP ("echo-area-clear-hook", ...,
4707d2d0 11377 doc: /* Normal hook run when clearing the echo area. */);
cf24f894
RS
11378#endif
11379 Qecho_area_clear_hook = intern ("echo-area-clear-hook");
c8e16a02 11380 staticpro (&Qecho_area_clear_hook);
cf24f894 11381 SET_SYMBOL_VALUE (Qecho_area_clear_hook, Qnil);
cdb9d665 11382
48e416d4 11383 DEFVAR_LISP ("lucid-menu-bar-dirty-flag", &Vlucid_menu_bar_dirty_flag,
fa1361cb 11384 doc: /* Non-nil means menu bar, specified Lucid style, needs to be recomputed. */);
48e416d4 11385 Vlucid_menu_bar_dirty_flag = Qnil;
a73c5e29 11386
9f9c0e27 11387 DEFVAR_LISP ("menu-bar-final-items", &Vmenu_bar_final_items,
4707d2d0
PJ
11388 doc: /* List of menu bar items to move to the end of the menu bar.
11389The elements of the list are event types that may have menu bar bindings. */);
9f9c0e27 11390 Vmenu_bar_final_items = Qnil;
e9bf89a0 11391
217258d5
KH
11392 DEFVAR_KBOARD ("overriding-terminal-local-map",
11393 Voverriding_terminal_local_map,
4707d2d0
PJ
11394 doc: /* Per-terminal keymap that overrides all other local keymaps.
11395If this variable is non-nil, it is used as a keymap instead of the
11396buffer's local map, and the minor mode keymaps and text property keymaps.
5a45dd33
RS
11397It also replaces `overriding-local-map'.
11398
4707d2d0
PJ
11399This variable is intended to let commands such as `universal-argument'
11400set up a different keymap for reading the next command. */);
217258d5 11401
9dd3131c 11402 DEFVAR_LISP ("overriding-local-map", &Voverriding_local_map,
4707d2d0 11403 doc: /* Keymap that overrides all other local keymaps.
5a45dd33
RS
11404If this variable is non-nil, it is used as a keymap--replacing the
11405buffer's local map, the minor mode keymaps, and char property keymaps. */);
9dd3131c
RS
11406 Voverriding_local_map = Qnil;
11407
d0a49716 11408 DEFVAR_LISP ("overriding-local-map-menu-flag", &Voverriding_local_map_menu_flag,
4707d2d0
PJ
11409 doc: /* Non-nil means `overriding-local-map' applies to the menu bar.
11410Otherwise, the menu bar continues to reflect the buffer's local map
11411and the minor mode maps regardless of `overriding-local-map'. */);
d0a49716
RS
11412 Voverriding_local_map_menu_flag = Qnil;
11413
7f07d5ca 11414 DEFVAR_LISP ("special-event-map", &Vspecial_event_map,
4707d2d0 11415 doc: /* Keymap defining bindings for special events to execute at low level. */);
7f07d5ca
RS
11416 Vspecial_event_map = Fcons (intern ("keymap"), Qnil);
11417
71edead1 11418 DEFVAR_LISP ("track-mouse", &do_mouse_tracking,
4707d2d0 11419 doc: /* *Non-nil means generate motion events for mouse motion. */);
80e4aa30 11420
7c97ffdc 11421 DEFVAR_KBOARD ("system-key-alist", Vsystem_key_alist,
4707d2d0
PJ
11422 doc: /* Alist of system-specific X windows key symbols.
11423Each element should have the form (N . SYMBOL) where N is the
11424numeric keysym code (sans the \"system-specific\" bit 1<<28)
11425and SYMBOL is its name. */);
8a792f3a
RS
11426
11427 DEFVAR_LISP ("deferred-action-list", &Vdeferred_action_list,
4707d2d0
PJ
11428 doc: /* List of deferred actions to be performed at a later time.
11429The precise format isn't relevant here; we just check whether it is nil. */);
8a792f3a
RS
11430 Vdeferred_action_list = Qnil;
11431
11432 DEFVAR_LISP ("deferred-action-function", &Vdeferred_action_function,
4707d2d0
PJ
11433 doc: /* Function to call to handle deferred actions, after each command.
11434This function is called with no arguments after each command
11435whenever `deferred-action-list' is non-nil. */);
8a792f3a 11436 Vdeferred_action_function = Qnil;
6526ab49
RS
11437
11438 DEFVAR_LISP ("suggest-key-bindings", &Vsuggest_key_bindings,
4707d2d0
PJ
11439 doc: /* *Non-nil means show the equivalent key-binding when M-x command has one.
11440The value can be a length of time to show the message for.
11441If the value is non-nil and not a number, we wait 2 seconds. */);
6526ab49 11442 Vsuggest_key_bindings = Qt;
8bb1c042 11443
c04cbc3b 11444 DEFVAR_LISP ("timer-list", &Vtimer_list,
4707d2d0 11445 doc: /* List of active absolute time timers in order of increasing time. */);
c04cbc3b 11446 Vtimer_list = Qnil;
d9d4c147
KH
11447
11448 DEFVAR_LISP ("timer-idle-list", &Vtimer_idle_list,
4707d2d0 11449 doc: /* List of active idle-time timers in order of increasing time. */);
d9d4c147 11450 Vtimer_idle_list = Qnil;
7d18f9ae
RS
11451
11452 DEFVAR_LISP ("input-method-function", &Vinput_method_function,
4707d2d0
PJ
11453 doc: /* If non-nil, the function that implements the current input method.
11454It's called with one argument, a printing character that was just read.
11455\(That means a character with code 040...0176.)
11456Typically this function uses `read-event' to read additional events.
11457When it does so, it should first bind `input-method-function' to nil
11458so it will not be called recursively.
11459
11460The function should return a list of zero or more events
11461to be used as input. If it wants to put back some events
11462to be reconsidered, separately, by the input method,
11463it can add them to the beginning of `unread-command-events'.
11464
11465The input method function can find in `input-method-previous-method'
11466the previous echo area message.
11467
11468The input method function should refer to the variables
11469`input-method-use-echo-area' and `input-method-exit-on-first-char'
11470for guidance on what to do. */);
7d18f9ae 11471 Vinput_method_function = Qnil;
d5eecefb
RS
11472
11473 DEFVAR_LISP ("input-method-previous-message",
11474 &Vinput_method_previous_message,
4707d2d0
PJ
11475 doc: /* When `input-method-function' is called, hold the previous echo area message.
11476This variable exists because `read-event' clears the echo area
11477before running the input method. It is nil if there was no message. */);
d5eecefb 11478 Vinput_method_previous_message = Qnil;
7ee32cda
GM
11479
11480 DEFVAR_LISP ("show-help-function", &Vshow_help_function,
4707d2d0
PJ
11481 doc: /* If non-nil, the function that implements the display of help.
11482It's called with one argument, the help string to display. */);
7ee32cda 11483 Vshow_help_function = Qnil;
adf5cb9c
KH
11484
11485 DEFVAR_LISP ("disable-point-adjustment", &Vdisable_point_adjustment,
4707d2d0
PJ
11486 doc: /* If non-nil, suppress point adjustment after executing a command.
11487
11488After a command is executed, if point is moved into a region that has
11489special properties (e.g. composition, display), we adjust point to
5fee9a2f
LT
11490the boundary of the region. But, when a command sets this variable to
11491non-nil, we suppress the point adjustment.
4707d2d0
PJ
11492
11493This variable is set to nil before reading a command, and is checked
11494just after executing the command. */);
adf5cb9c
KH
11495 Vdisable_point_adjustment = Qnil;
11496
11497 DEFVAR_LISP ("global-disable-point-adjustment",
11498 &Vglobal_disable_point_adjustment,
4707d2d0
PJ
11499 doc: /* *If non-nil, always suppress point adjustment.
11500
11501The default value is nil, in which case, point adjustment are
11502suppressed only after special commands that set
11503`disable-point-adjustment' (which see) to non-nil. */);
adf5cb9c 11504 Vglobal_disable_point_adjustment = Qnil;
3626fb1a 11505
00392ce6 11506 DEFVAR_LISP ("minibuffer-message-timeout", &Vminibuffer_message_timeout,
4707d2d0
PJ
11507 doc: /* *How long to display an echo-area message when the minibuffer is active.
11508If the value is not a number, such messages don't time out. */);
00392ce6 11509 Vminibuffer_message_timeout = make_number (2);
2a84c6da
KS
11510
11511 DEFVAR_LISP ("throw-on-input", &Vthrow_on_input,
11512 doc: /* If non-nil, any keyboard input throws to this symbol.
11513The value of that variable is passed to `quit-flag' and later causes a
11514peculiar kind of quitting. */);
11515 Vthrow_on_input = Qnil;
9d56e0da 11516
04d8c47d
RS
11517 DEFVAR_LISP ("command-error-function", &Vcommand_error_function,
11518 doc: /* If non-nil, function to output error messages.
11519The arguments are the error data, a list of the form
11520 (SIGNALED-CONDITIONS . SIGNAL-DATA)
11521such as just as `condition-case' would bind its variable to,
11522the context (a string which normally goes at the start of the message),
11523and the Lisp function within which the error was signaled. */);
11524 Vcommand_error_function = Qnil;
11525
9d56e0da
EZ
11526 DEFVAR_LISP ("enable-disabled-menus-and-buttons",
11527 &Venable_disabled_menus_and_buttons,
11528 doc: /* If non-nil, don't ignore events produced by disabled menu items and tool-bar.
11529
11530Help functions bind this to allow help on disabled menu items
11531and tool-bar buttons. */);
11532 Venable_disabled_menus_and_buttons = Qnil;
284f4730
JB
11533}
11534
dfcf069d 11535void
284f4730
JB
11536keys_of_keyboard ()
11537{
11538 initial_define_key (global_map, Ctl ('Z'), "suspend-emacs");
11539 initial_define_key (control_x_map, Ctl ('Z'), "suspend-emacs");
11540 initial_define_key (meta_map, Ctl ('C'), "exit-recursive-edit");
11541 initial_define_key (global_map, Ctl (']'), "abort-recursive-edit");
11542 initial_define_key (meta_map, 'x', "execute-extended-command");
7f07d5ca
RS
11543
11544 initial_define_lispy_key (Vspecial_event_map, "delete-frame",
11545 "handle-delete-frame");
a18bf897
SM
11546 /* Here we used to use `ignore-event' which would simple set prefix-arg to
11547 current-prefix-arg, as is done in `handle-switch-frame'.
11548 But `handle-switch-frame is not run from the special-map.
11549 Commands from that map are run in a special way that automatically
11550 preserves the prefix-arg. Restoring the prefix arg here is not just
11551 redundant but harmful:
11552 - C-u C-x v =
11553 - current-prefix-arg is set to non-nil, prefix-arg is set to nil.
11554 - after the first prompt, the exit-minibuffer-hook is run which may
11555 iconify a frame and thus push a `iconify-frame' event.
11556 - after running exit-minibuffer-hook, current-prefix-arg is
11557 restored to the non-nil value it had before the prompt.
11558 - we enter the second prompt.
11559 current-prefix-arg is non-nil, prefix-arg is nil.
11560 - before running the first real event, we run the special iconify-frame
11561 event, but we pass the `special' arg to execute-command so
11562 current-prefix-arg and prefix-arg are left untouched.
11563 - here we foolishly copy the non-nil current-prefix-arg to prefix-arg.
11564 - the next key event will have a spuriously non-nil current-prefix-arg. */
7f07d5ca 11565 initial_define_lispy_key (Vspecial_event_map, "iconify-frame",
a18bf897 11566 "ignore");
7f07d5ca 11567 initial_define_lispy_key (Vspecial_event_map, "make-frame-visible",
a18bf897 11568 "ignore");
a4e19f6e
SM
11569 /* Handling it at such a low-level causes read_key_sequence to get
11570 * confused because it doesn't realize that the current_buffer was
11571 * changed by read_char.
2320865d 11572 *
a4e19f6e
SM
11573 * initial_define_lispy_key (Vspecial_event_map, "select-window",
11574 * "handle-select-window"); */
4ebc27a5
JD
11575 initial_define_lispy_key (Vspecial_event_map, "save-session",
11576 "handle-save-session");
284f4730 11577}
1269a761
SM
11578
11579/* Mark the pointers in the kboard objects.
11580 Called by the Fgarbage_collector. */
11581void
11582mark_kboards ()
11583{
11584 KBOARD *kb;
11585 Lisp_Object *p;
11586 for (kb = all_kboards; kb; kb = kb->next_kboard)
11587 {
11588 if (kb->kbd_macro_buffer)
11589 for (p = kb->kbd_macro_buffer; p < kb->kbd_macro_ptr; p++)
3ebb8729
SM
11590 mark_object (*p);
11591 mark_object (kb->Voverriding_terminal_local_map);
11592 mark_object (kb->Vlast_command);
11593 mark_object (kb->Vreal_last_command);
11594 mark_object (kb->Vprefix_arg);
11595 mark_object (kb->Vlast_prefix_arg);
11596 mark_object (kb->kbd_queue);
11597 mark_object (kb->defining_kbd_macro);
11598 mark_object (kb->Vlast_kbd_macro);
11599 mark_object (kb->Vsystem_key_alist);
11600 mark_object (kb->system_key_syms);
11601 mark_object (kb->Vdefault_minibuffer_frame);
11602 mark_object (kb->echo_string);
1269a761
SM
11603 }
11604 {
11605 struct input_event *event;
11606 for (event = kbd_fetch_ptr; event != kbd_store_ptr; event++)
11607 {
11608 if (event == kbd_buffer + KBD_BUFFER_SIZE)
11609 event = kbd_buffer;
e3f6e7c7
KS
11610 if (event->kind != SELECTION_REQUEST_EVENT
11611 && event->kind != SELECTION_CLEAR_EVENT)
0161caf9
KS
11612 {
11613 mark_object (event->x);
11614 mark_object (event->y);
11615 }
3ebb8729
SM
11616 mark_object (event->frame_or_window);
11617 mark_object (event->arg);
1269a761
SM
11618 }
11619 }
11620}
ab5796a9
MB
11621
11622/* arch-tag: 774e34d7-6d31-42f3-8397-e079a4e4c9ca
11623 (do not change this comment) */