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