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