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