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