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