* xfns.c (syms_of_xfns): Use make_pure_string instead of build_string.
[bpt/emacs.git] / src / keyboard.c
CommitLineData
284f4730 1/* Keyboard and mouse input; editor command loop.
0b5538bd
TTN
2 Copyright (C) 1985, 1986, 1987, 1988, 1989, 1993, 1994, 1995,
3 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004,
76b6f707 4 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
284f4730
JB
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
284f4730 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
284f4730
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
284f4730 20
18160b98 21#include <config.h>
68c45bf0 22#include <signal.h>
284f4730 23#include <stdio.h>
d7306fe6 24#include <setjmp.h>
9628b887 25#include "lisp.h"
284f4730
JB
26#include "termchar.h"
27#include "termopts.h"
428a555e 28#include "frame.h"
284f4730
JB
29#include "termhooks.h"
30#include "macros.h"
02639609 31#include "keyboard.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
aa477689
JD
48#ifdef HAVE_GTK_AND_PTHREAD
49#include <pthread.h>
50#endif
80e4aa30
RS
51#ifdef MSDOS
52#include "msdos.h"
53#include <time.h>
54#else /* not MSDOS */
284f4730 55#include <sys/ioctl.h>
80e4aa30 56#endif /* not MSDOS */
284f4730 57
52baf19e 58#include "syssignal.h"
52baf19e 59
03cee6ae
GM
60#include <sys/types.h>
61#ifdef HAVE_UNISTD_H
62#include <unistd.h>
63#endif
64
e31d908f
DN
65#ifdef HAVE_FCNTL_H
66#include <fcntl.h>
67#endif
68
c5e3b6c5
RS
69/* This is to get the definitions of the XK_ symbols. */
70#ifdef HAVE_X_WINDOWS
71#include "xterm.h"
72#endif
73
e98a93eb
GV
74#ifdef HAVE_NTGUI
75#include "w32term.h"
76#endif /* HAVE_NTGUI */
77
edfda783
AR
78#ifdef HAVE_NS
79#include "nsterm.h"
edfda783
AR
80#endif
81
02639609 82#ifndef USE_CRT_DLL
52baf19e 83extern int errno;
02639609 84#endif
52baf19e 85
9ac0d9e0
JB
86/* Variables for blockinput.h: */
87
88/* Non-zero if interrupt input is blocked right now. */
cf2db145 89volatile int interrupt_input_blocked;
9ac0d9e0
JB
90
91/* Nonzero means an input interrupt has arrived
92 during the current critical section. */
63927c41 93int interrupt_input_pending;
9ac0d9e0 94
ceb18827
CY
95/* This var should be (interrupt_input_pending || pending_atimers).
96 The QUIT macro checks this instead of interrupt_input_pending and
97 pending_atimers separately, to reduce code size. So, any code that
98 changes interrupt_input_pending or pending_atimers should update
99 this too. */
07a1e794 100#ifdef SYNC_INPUT
ceb18827 101int pending_signals;
07a1e794 102#endif
ceb18827 103
de11c1ea 104#define KBD_BUFFER_SIZE 4096
284f4730 105
c5fdd383
KH
106KBOARD *initial_kboard;
107KBOARD *current_kboard;
108KBOARD *all_kboards;
1e8bd3da 109int single_kboard;
612b78ef 110
284f4730 111/* Non-nil disable property on a command means
971e4c98
LT
112 do not execute it; call disabled-command-function's value instead. */
113Lisp_Object Qdisabled, Qdisabled_command_function;
284f4730 114
0721f230 115#define NUM_RECENT_KEYS (300)
284f4730
JB
116int recent_keys_index; /* Index for storing next element into recent_keys */
117int total_keys; /* Total number of elements stored into recent_keys */
0721f230 118Lisp_Object recent_keys; /* Vector holds the last NUM_RECENT_KEYS keystrokes */
284f4730 119
6569cc8d
JB
120/* Vector holding the key sequence that invoked the current command.
121 It is reused for each command, and it may be longer than the current
122 sequence; this_command_key_count indicates how many elements
123 actually mean something.
124 It's easier to staticpro a single Lisp_Object than an array. */
125Lisp_Object this_command_keys;
126int this_command_key_count;
284f4730 127
63020c46
RS
128/* 1 after calling Freset_this_command_lengths.
129 Usually it is 0. */
130int this_command_key_count_reset;
131
7d18f9ae
RS
132/* This vector is used as a buffer to record the events that were actually read
133 by read_key_sequence. */
134Lisp_Object raw_keybuf;
135int raw_keybuf_count;
136
025ae953
CY
137/* Non-nil if the present key sequence was obtained by shift translation. */
138Lisp_Object Vthis_command_keys_shift_translated;
139
7d18f9ae 140#define GROW_RAW_KEYBUF \
7189cad8 141 if (raw_keybuf_count == XVECTOR (raw_keybuf)->size) \
6bf377e2 142 raw_keybuf = larger_vector (raw_keybuf, raw_keybuf_count * 2, Qnil) \
7d18f9ae 143
6321824f
RS
144/* Number of elements of this_command_keys
145 that precede this key sequence. */
146int this_single_command_key_start;
147
71918b75
RS
148/* Record values of this_command_key_count and echo_length ()
149 before this command was read. */
150static int before_command_key_count;
151static int before_command_echo_length;
71918b75 152
284f4730
JB
153extern int minbuf_level;
154
a59b172a
RS
155extern int message_enable_multibyte;
156
7ee32cda
GM
157/* If non-nil, the function that implements the display of help.
158 It's called with one argument, the help string to display. */
159
160Lisp_Object Vshow_help_function;
161
284f4730 162/* Nonzero means do menu prompting. */
f0c1cc56 163
284f4730
JB
164static int menu_prompting;
165
166/* Character to see next line of menu prompt. */
f0c1cc56 167
284f4730
JB
168static Lisp_Object menu_prompt_more_char;
169
170/* For longjmp to where kbd input is being done. */
f0c1cc56 171
284f4730
JB
172static jmp_buf getcjmp;
173
174/* True while doing kbd input. */
175int waiting_for_input;
176
177/* True while displaying for echoing. Delays C-g throwing. */
985f9f66 178
c843d6c6 179int echoing;
284f4730 180
985f9f66
GM
181/* Non-null means we can start echoing at the next input pause even
182 though there is something in the echo area. */
183
184static struct kboard *ok_to_echo_at_next_pause;
185
59a84f8e
GM
186/* The kboard last echoing, or null for none. Reset to 0 in
187 cancel_echoing. If non-null, and a current echo area message
188 exists, and echo_message_buffer is eq to the current message
189 buffer, we know that the message comes from echo_kboard. */
985f9f66 190
f49aedfd 191struct kboard *echo_kboard;
1fc93d49 192
59a84f8e
GM
193/* The buffer used for echoing. Set in echo_now, reset in
194 cancel_echoing. */
195
c843d6c6 196Lisp_Object echo_message_buffer;
59a84f8e 197
03361bcc
RS
198/* Nonzero means disregard local maps for the menu bar. */
199static int inhibit_local_menu_bar_menus;
200
80e4aa30 201/* Nonzero means C-g should cause immediate error-signal. */
284f4730
JB
202int immediate_quit;
203
04d8c47d
RS
204/* The user's hook function for outputting an error message. */
205Lisp_Object Vcommand_error_function;
206
fa90970d
RS
207/* The user's ERASE setting. */
208Lisp_Object Vtty_erase_char;
209
284f4730 210/* Character to recognize as the help char. */
7e85b935 211Lisp_Object Vhelp_char;
284f4730 212
ecb7cb34
KH
213/* List of other event types to recognize as meaning "help". */
214Lisp_Object Vhelp_event_list;
215
284f4730
JB
216/* Form to execute when help char is typed. */
217Lisp_Object Vhelp_form;
218
7e85b935
RS
219/* Command to run when the help character follows a prefix key. */
220Lisp_Object Vprefix_help_command;
221
9f9c0e27
RS
222/* List of items that should move to the end of the menu bar. */
223Lisp_Object Vmenu_bar_final_items;
a73c5e29 224
6526ab49
RS
225/* Non-nil means show the equivalent key-binding for
226 any M-x command that has one.
227 The value can be a length of time to show the message for.
228 If the value is non-nil and not a number, we wait 2 seconds. */
229Lisp_Object Vsuggest_key_bindings;
230
00392ce6
MB
231/* How long to display an echo-area message when the minibuffer is active.
232 If the value is not a number, such messages don't time out. */
233Lisp_Object Vminibuffer_message_timeout;
234
284f4730
JB
235/* Character that causes a quit. Normally C-g.
236
237 If we are running on an ordinary terminal, this must be an ordinary
238 ASCII char, since we want to make it our interrupt character.
239
240 If we are not running on an ordinary terminal, it still needs to be
241 an ordinary ASCII char. This character needs to be recognized in
242 the input interrupt handler. At this point, the keystroke is
243 represented as a struct input_event, while the desired quit
244 character is specified as a lispy event. The mapping from struct
245 input_events to lispy events cannot run in an interrupt handler,
246 and the reverse mapping is difficult for anything but ASCII
247 keystrokes.
248
249 FOR THESE ELABORATE AND UNSATISFYING REASONS, quit_char must be an
250 ASCII character. */
251int quit_char;
252
253extern Lisp_Object current_global_map;
254extern int minibuf_level;
255
9dd3131c
RS
256/* If non-nil, this is a map that overrides all other local maps. */
257Lisp_Object Voverriding_local_map;
258
d0a49716
RS
259/* If non-nil, Voverriding_local_map applies to the menu bar. */
260Lisp_Object Voverriding_local_map_menu_flag;
261
7f07d5ca
RS
262/* Keymap that defines special misc events that should
263 be processed immediately at a low level. */
264Lisp_Object Vspecial_event_map;
265
284f4730
JB
266/* Current depth in recursive edits. */
267int command_loop_level;
268
269/* Total number of times command_loop has read a key sequence. */
31ade731 270EMACS_INT num_input_keys;
284f4730 271
4b09796d
GM
272/* Last input event read as a command. */
273Lisp_Object last_command_event;
284f4730 274
7d6de002
RS
275/* Last input character read as a command, not counting menus
276 reached by the mouse. */
277Lisp_Object last_nonmenu_event;
278
4b09796d
GM
279/* Last input event read for any purpose. */
280Lisp_Object last_input_event;
284f4730 281
dbc4e1c1 282/* If not Qnil, a list of objects to be read as subsequent command input. */
24597608 283Lisp_Object Vunread_command_events;
284f4730 284
7d18f9ae
RS
285/* If not Qnil, a list of objects to be read as subsequent command input
286 including input method processing. */
287Lisp_Object Vunread_input_method_events;
288
289/* If not Qnil, a list of objects to be read as subsequent command input
290 but NOT including input method processing. */
291Lisp_Object Vunread_post_input_method_events;
292
86e5706b 293/* If not -1, an event to be read as subsequent command input. */
31ade731 294EMACS_INT unread_command_char;
86e5706b 295
cd21b839
JB
296/* If not Qnil, this is a switch-frame event which we decided to put
297 off until the end of a key sequence. This should be read as the
dbc4e1c1 298 next command input, after any unread_command_events.
8f805655
JB
299
300 read_key_sequence uses this to delay switch-frame events until the
301 end of the key sequence; Fread_char uses it to put off switch-frame
302 events until a non-ASCII event is acceptable as input. */
303Lisp_Object unread_switch_frame;
cd21b839 304
9fa4395d 305/* A mask of extra modifier bits to put into every keyboard char. */
31ade731 306EMACS_INT extra_keyboard_modifiers;
9fa4395d 307
284f4730
JB
308/* Char to use as prefix when a meta character is typed in.
309 This is bound on entry to minibuffer in case ESC is changed there. */
310
311Lisp_Object meta_prefix_char;
312
313/* Last size recorded for a current buffer which is not a minibuffer. */
314static int last_non_minibuf_size;
315
06ef7355 316/* Number of idle seconds before an auto-save and garbage collection. */
284f4730
JB
317static Lisp_Object Vauto_save_timeout;
318
319/* Total number of times read_char has returned. */
4abfba1f 320int num_input_events;
284f4730 321
51172b6d 322/* Total number of times read_char has returned, outside of macros. */
31ade731 323EMACS_INT num_nonmacro_input_events;
51172b6d 324
284f4730
JB
325/* Auto-save automatically when this many characters have been typed
326 since the last time. */
327
31ade731 328static EMACS_INT auto_save_interval;
284f4730 329
c43b1734 330/* Value of num_nonmacro_input_events as of last auto save. */
284f4730
JB
331
332int last_auto_save;
333
284f4730 334/* The command being executed by the command loop.
6c7178b9
KH
335 Commands may set this, and the value set will be copied into
336 current_kboard->Vlast_command instead of the actual command. */
d5eecefb
RS
337Lisp_Object Vthis_command;
338
339/* This is like Vthis_command, except that commands never set it. */
340Lisp_Object real_this_command;
284f4730 341
8b9940e6
KS
342/* If the lookup of the command returns a binding, the original
343 command is stored in this-original-command. It is nil otherwise. */
344Lisp_Object Vthis_original_command;
345
bb0e1d19 346/* The value of point when the last command was started. */
b453f72e
KH
347int last_point_position;
348
047688cb
RS
349/* The buffer that was current when the last command was started. */
350Lisp_Object last_point_position_buffer;
351
bb0e1d19
RS
352/* The window that was selected when the last command was started. */
353Lisp_Object last_point_position_window;
354
4c52b668
KH
355/* The frame in which the last input event occurred, or Qmacro if the
356 last event came from a macro. We use this to determine when to
357 generate switch-frame events. This may be cleared by functions
358 like Fselect_frame, to make sure that a switch-frame event is
359 generated by the next character. */
360Lisp_Object internal_last_event_frame;
4c52b668
KH
361
362/* A user-visible version of the above, intended to allow users to
363 figure out where the last event came from, if the event doesn't
364 carry that information itself (i.e. if it was a character). */
365Lisp_Object Vlast_event_frame;
366
1113d9db
JB
367/* The timestamp of the last input event we received from the X server.
368 X Windows wants this for selection ownership. */
284f4730
JB
369unsigned long last_event_timestamp;
370
371Lisp_Object Qself_insert_command;
372Lisp_Object Qforward_char;
373Lisp_Object Qbackward_char;
e58aa385 374Lisp_Object Qundefined;
d925fb39 375Lisp_Object Qtimer_event_handler;
284f4730
JB
376
377/* read_key_sequence stores here the command definition of the
378 key sequence that it reads. */
379Lisp_Object read_key_sequence_cmd;
380
39aab679
DL
381/* Echo unfinished commands after this many seconds of pause. */
382Lisp_Object Vecho_keystrokes;
383
284f4730
JB
384/* Form to evaluate (if non-nil) when Emacs is started. */
385Lisp_Object Vtop_level;
386
7d18f9ae
RS
387/* If non-nil, this implements the current input method. */
388Lisp_Object Vinput_method_function;
389Lisp_Object Qinput_method_function;
390
d5eecefb
RS
391/* When we call Vinput_method_function,
392 this holds the echo area message that was just erased. */
393Lisp_Object Vinput_method_previous_message;
394
86e5706b
RS
395/* Non-nil means deactivate the mark at end of this command. */
396Lisp_Object Vdeactivate_mark;
5c4cc82a 397Lisp_Object Qdeactivate_mark;
86e5706b 398
48e416d4
RS
399/* Menu bar specified in Lucid Emacs fashion. */
400
401Lisp_Object Vlucid_menu_bar_dirty_flag;
402Lisp_Object Qrecompute_lucid_menubar, Qactivate_menubar_hook;
403
cf24f894 404Lisp_Object Qecho_area_clear_hook;
cdb9d665 405
86e5706b 406/* Hooks to run before and after each command. */
59aadc81
RS
407Lisp_Object Qpre_command_hook, Vpre_command_hook;
408Lisp_Object Qpost_command_hook, Vpost_command_hook;
40932d1a 409Lisp_Object Qcommand_hook_internal, Vcommand_hook_internal;
86e5706b 410
ac09dc1e
KL
411/* Parent keymap of terminal-local function-key-map instances. */
412Lisp_Object Vfunction_key_map;
413
4f4a84ec 414/* Keymap of key translations that can override keymaps. */
ac09dc1e 415Lisp_Object Vkey_translation_map;
4ea81208 416
8a792f3a
RS
417/* List of deferred actions to be performed at a later time.
418 The precise format isn't relevant here; we just check whether it is nil. */
419Lisp_Object Vdeferred_action_list;
420
421/* Function to call to handle deferred actions, when there are any. */
422Lisp_Object Vdeferred_action_function;
3ef14e46 423Lisp_Object Qdeferred_action_function;
8a792f3a 424
d5eecefb
RS
425Lisp_Object Qinput_method_exit_on_first_char;
426Lisp_Object Qinput_method_use_echo_area;
427
284f4730
JB
428/* File in which we write all commands we read. */
429FILE *dribble;
430
431/* Nonzero if input is available. */
432int input_pending;
433
284f4730
JB
434extern char *pending_malloc_warning;
435
beecf6a1 436/* Circular buffer for pre-read keyboard input. */
da8f7368 437
beecf6a1
KH
438static struct input_event kbd_buffer[KBD_BUFFER_SIZE];
439
beecf6a1
KH
440/* Pointer to next available character in kbd_buffer.
441 If kbd_fetch_ptr == kbd_store_ptr, the buffer is empty.
5cb6905d 442 This may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the
beecf6a1
KH
443 next available char is in kbd_buffer[0]. */
444static struct input_event *kbd_fetch_ptr;
445
446/* Pointer to next place to store character in kbd_buffer. This
447 may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the next
448 character should go in kbd_buffer[0]. */
7ee32cda 449static struct input_event * volatile kbd_store_ptr;
beecf6a1
KH
450
451/* The above pair of variables forms a "queue empty" flag. When we
452 enqueue a non-hook event, we increment kbd_store_ptr. When we
453 dequeue a non-hook event, we increment kbd_fetch_ptr. We say that
e0f24100 454 there is input available if the two pointers are not equal.
beecf6a1
KH
455
456 Why not just have a flag set and cleared by the enqueuing and
457 dequeuing functions? Such a flag could be screwed up by interrupts
458 at inopportune times. */
459
f3253854 460/* If this flag is non-nil, we check mouse_moved to see when the
a9d77f1f
RS
461 mouse moves, and motion events will appear in the input stream.
462 Otherwise, mouse motion is ignored. */
e10da507 463Lisp_Object do_mouse_tracking;
284f4730 464
284f4730
JB
465/* Symbols to head events. */
466Lisp_Object Qmouse_movement;
3c370943 467Lisp_Object Qscroll_bar_movement;
cd21b839 468Lisp_Object Qswitch_frame;
bbdc2092 469Lisp_Object Qdelete_frame;
af17bd2b
KH
470Lisp_Object Qiconify_frame;
471Lisp_Object Qmake_frame_visible;
a697f886 472Lisp_Object Qselect_window;
7ee32cda 473Lisp_Object Qhelp_echo;
cd21b839 474
224fc3d1
CY
475extern Lisp_Object Qremap;
476
ae372f41 477#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
c22237f7
KS
478Lisp_Object Qmouse_fixup_help_message;
479#endif
480
284f4730
JB
481/* Symbols to denote kinds of events. */
482Lisp_Object Qfunction_key;
483Lisp_Object Qmouse_click;
9e2a2647 484#if defined (WINDOWSNT)
1161d367 485Lisp_Object Qlanguage_change;
07de30b9 486#endif
a24dc617 487Lisp_Object Qdrag_n_drop;
4ebc27a5 488Lisp_Object Qsave_session;
033b73e2
MA
489#ifdef HAVE_DBUS
490Lisp_Object Qdbus_event;
491#endif
284f4730 492/* Lisp_Object Qmouse_movement; - also an event header */
284f4730
JB
493
494/* Properties of event headers. */
495Lisp_Object Qevent_kind;
88cb0656 496Lisp_Object Qevent_symbol_elements;
284f4730 497
e8886a1d 498/* menu item parts */
598a9fa7 499Lisp_Object Qmenu_enable;
74c1de23
RS
500Lisp_Object QCenable, QCvisible, QChelp, QCfilter, QCkeys, QCkey_sequence;
501Lisp_Object QCbutton, QCtoggle, QCradio;
e8886a1d 502extern Lisp_Object Qmenu_item;
598a9fa7 503
0a7f1fc0
JB
504/* An event header symbol HEAD may have a property named
505 Qevent_symbol_element_mask, which is of the form (BASE MODIFIERS);
506 BASE is the base, unmodified version of HEAD, and MODIFIERS is the
507 mask of modifiers applied to it. If present, this is used to help
508 speed up parse_modifiers. */
509Lisp_Object Qevent_symbol_element_mask;
510
511/* An unmodified event header BASE may have a property named
512 Qmodifier_cache, which is an alist mapping modifier masks onto
513 modified versions of BASE. If present, this helps speed up
514 apply_modifiers. */
515Lisp_Object Qmodifier_cache;
516
5ec75a55 517/* Symbols to use for parts of windows. */
284f4730 518Lisp_Object Qmode_line;
e5d77022 519Lisp_Object Qvertical_line;
3c370943 520Lisp_Object Qvertical_scroll_bar;
5ec75a55 521Lisp_Object Qmenu_bar;
7d60ad8a 522extern Lisp_Object Qleft_margin, Qright_margin;
6b61353c
KH
523extern Lisp_Object Qleft_fringe, Qright_fringe;
524extern Lisp_Object QCmap;
5ec75a55 525
f4255cd1
JB
526Lisp_Object recursive_edit_unwind (), command_loop ();
527Lisp_Object Fthis_command_keys ();
03b4122a 528Lisp_Object Qextended_command_history;
c04cbc3b 529EMACS_TIME timer_check ();
284f4730 530
a0acc6c7 531extern Lisp_Object Vhistory_length, Vtranslation_table_for_input;
f4385381 532
2c834fb3
KH
533extern char *x_get_keysym_name ();
534
8eb4d8ef 535static void record_menu_key ();
22b94eeb 536static int echo_length ();
8eb4d8ef 537
f4eef8b4
RS
538Lisp_Object Qpolling_period;
539
d9d4c147 540/* List of absolute timers. Appears in order of next scheduled event. */
c04cbc3b
RS
541Lisp_Object Vtimer_list;
542
d9d4c147
KH
543/* List of idle time timers. Appears in order of next scheduled event. */
544Lisp_Object Vtimer_idle_list;
545
87dd9b9b
RS
546/* Incremented whenever a timer is run. */
547int timers_run;
548
a9f16aa9
KH
549extern Lisp_Object Vprint_level, Vprint_length;
550
ffd56f97
JB
551/* Address (if not 0) of EMACS_TIME to zero out if a SIGIO interrupt
552 happens. */
553EMACS_TIME *input_available_clear_time;
284f4730
JB
554
555/* Nonzero means use SIGIO interrupts; zero means use CBREAK mode.
556 Default is 1 if INTERRUPT_INPUT is defined. */
557int interrupt_input;
558
559/* Nonzero while interrupts are temporarily deferred during redisplay. */
560int interrupts_deferred;
561
284f4730
JB
562/* Allow m- file to inhibit use of FIONREAD. */
563#ifdef BROKEN_FIONREAD
564#undef FIONREAD
565#endif
566
567/* We are unable to use interrupts if FIONREAD is not available,
568 so flush SIGIO so we won't try. */
fc7a70cc 569#if !defined (FIONREAD)
284f4730
JB
570#ifdef SIGIO
571#undef SIGIO
572#endif
573#endif
574
e98a93eb 575/* If we support a window system, turn on the code to poll periodically
34f04431 576 to detect C-g. It isn't actually used when doing interrupt input. */
742fbed7 577#if defined(HAVE_WINDOW_SYSTEM) && !defined(USE_ASYNC_EVENTS)
284f4730
JB
578#define POLL_FOR_INPUT
579#endif
adf5cb9c
KH
580
581/* After a command is executed, if point is moved into a region that
582 has specific properties (e.g. composition, display), we adjust
583 point to the boundary of the region. But, if a command sets this
27fd22dc 584 variable to non-nil, we suppress this point adjustment. This
adf5cb9c 585 variable is set to nil before reading a command. */
da8f7368 586
adf5cb9c
KH
587Lisp_Object Vdisable_point_adjustment;
588
589/* If non-nil, always disable point adjustment. */
da8f7368 590
adf5cb9c
KH
591Lisp_Object Vglobal_disable_point_adjustment;
592
fdbb67fe
GM
593/* The time when Emacs started being idle. */
594
595static EMACS_TIME timer_idleness_start_time;
596
3021d3a9
RS
597/* After Emacs stops being idle, this saves the last value
598 of timer_idleness_start_time from when it was idle. */
599
600static EMACS_TIME timer_last_idleness_start_time;
601
9d56e0da
EZ
602/* If non-nil, events produced by disabled menu items and tool-bar
603 buttons are not ignored. Help functions bind this to allow help on
604 those items and buttons. */
605Lisp_Object Venable_disabled_menus_and_buttons;
606
284f4730
JB
607\f
608/* Global variable declarations. */
609
a2d5fca0
JD
610/* Flags for readable_events. */
611#define READABLE_EVENTS_DO_TIMERS_NOW (1 << 0)
612#define READABLE_EVENTS_FILTER_EVENTS (1 << 1)
613#define READABLE_EVENTS_IGNORE_SQUEEZABLES (1 << 2)
614
284f4730
JB
615/* Function for init_keyboard to call with no args (if nonzero). */
616void (*keyboard_init_hook) ();
617
0bbfdc25
GM
618static int read_avail_input P_ ((int));
619static void get_input_pending P_ ((int *, int));
620static int readable_events P_ ((int));
621static Lisp_Object read_char_x_menu_prompt P_ ((int, Lisp_Object *,
622 Lisp_Object, int *));
8150596a 623static Lisp_Object read_char_x_menu_prompt ();
0bbfdc25
GM
624static Lisp_Object read_char_minibuf_menu_prompt P_ ((int, int,
625 Lisp_Object *));
626static Lisp_Object make_lispy_event P_ ((struct input_event *));
ae372f41 627#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
0bbfdc25
GM
628static Lisp_Object make_lispy_movement P_ ((struct frame *, Lisp_Object,
629 enum scroll_bar_part,
630 Lisp_Object, Lisp_Object,
631 unsigned long));
514354e9 632#endif
0bbfdc25
GM
633static Lisp_Object modify_event_symbol P_ ((int, unsigned, Lisp_Object,
634 Lisp_Object, char **,
635 Lisp_Object *, unsigned));
636static Lisp_Object make_lispy_switch_frame P_ ((Lisp_Object));
0bbfdc25 637static void save_getcjmp P_ ((jmp_buf));
dfcf069d 638static void save_getcjmp ();
0bbfdc25 639static void restore_getcjmp P_ ((jmp_buf));
7ee32cda 640static Lisp_Object apply_modifiers P_ ((int, Lisp_Object));
0bbfdc25 641static void clear_event P_ ((struct input_event *));
9148bda2 642static Lisp_Object restore_kboard_configuration P_ ((Lisp_Object));
5598c32e 643static SIGTYPE interrupt_signal P_ ((int signalnum));
114a8b8c 644static void handle_interrupt P_ ((void));
5c12e63f
KS
645static void timer_start_idle P_ ((void));
646static void timer_stop_idle P_ ((void));
647static void timer_resume_idle P_ ((void));
23479b40
YM
648static SIGTYPE handle_user_signal P_ ((int));
649static char *find_user_signal_name P_ ((int));
650static int store_user_signal_events P_ ((void));
284f4730 651
8026024c
KH
652/* Nonzero means don't try to suspend even if the operating system seems
653 to support it. */
654static int cannot_suspend;
12679e05
CY
655
656extern Lisp_Object Qidentity, Qonly;
29204e13 657\f
284f4730
JB
658/* Install the string STR as the beginning of the string of echoing,
659 so that it serves as a prompt for the next character.
660 Also start echoing. */
661
dfcf069d 662void
284f4730 663echo_prompt (str)
a4ef85ee 664 Lisp_Object str;
284f4730 665{
678e9d18 666 current_kboard->echo_string = str;
0d121f7c 667 current_kboard->echo_after_prompt = SCHARS (str);
3dbd9ee4 668 echo_now ();
284f4730
JB
669}
670
df0f2ba1 671/* Add C to the echo string, if echoing is going on.
284f4730
JB
672 C can be a character, which is printed prettily ("M-C-x" and all that
673 jazz), or a symbol, whose name is printed. */
674
dfcf069d 675void
284f4730
JB
676echo_char (c)
677 Lisp_Object c;
678{
c5fdd383 679 if (current_kboard->immediate_echo)
284f4730 680 {
678e9d18
GM
681 int size = KEY_DESCRIPTION_SIZE + 100;
682 char *buffer = (char *) alloca (size);
683 char *ptr = buffer;
684 Lisp_Object echo_string;
284f4730 685
0d121f7c 686 echo_string = current_kboard->echo_string;
c60ee5e7 687
284f4730 688 /* If someone has passed us a composite event, use its head symbol. */
88cb0656 689 c = EVENT_HEAD (c);
284f4730 690
8c18cbfb 691 if (INTEGERP (c))
284f4730 692 {
678e9d18 693 ptr = push_key_description (XINT (c), ptr, 1);
284f4730 694 }
8c18cbfb 695 else if (SYMBOLP (c))
284f4730 696 {
1b049b51
KR
697 Lisp_Object name = SYMBOL_NAME (c);
698 int nbytes = SBYTES (name);
c60ee5e7 699
0d121f7c 700 if (size - (ptr - buffer) < nbytes)
678e9d18
GM
701 {
702 int offset = ptr - buffer;
0d121f7c 703 size = max (2 * size, size + nbytes);
678e9d18
GM
704 buffer = (char *) alloca (size);
705 ptr = buffer + offset;
706 }
707
1b049b51
KR
708 ptr += copy_text (SDATA (name), ptr, nbytes,
709 STRING_MULTIBYTE (name), 1);
284f4730
JB
710 }
711
0d121f7c 712 if ((NILP (echo_string) || SCHARS (echo_string) == 0)
ecb7cb34 713 && help_char_p (c))
284f4730 714 {
678e9d18
GM
715 const char *text = " (Type ? for further options)";
716 int len = strlen (text);
c60ee5e7 717
678e9d18
GM
718 if (size - (ptr - buffer) < len)
719 {
720 int offset = ptr - buffer;
721 size += len;
722 buffer = (char *) alloca (size);
723 ptr = buffer + offset;
724 }
725
726 bcopy (text, ptr, len);
727 ptr += len;
284f4730
JB
728 }
729
0d121f7c
GM
730 /* Replace a dash from echo_dash with a space, otherwise
731 add a space at the end as a separator between keys. */
678e9d18 732 if (STRINGP (echo_string)
2ff4d3d9 733 && SCHARS (echo_string) > 1)
0d121f7c 734 {
2ff4d3d9
RS
735 Lisp_Object last_char, prev_char, idx;
736
737 idx = make_number (SCHARS (echo_string) - 2);
738 prev_char = Faref (echo_string, idx);
0d121f7c
GM
739
740 idx = make_number (SCHARS (echo_string) - 1);
741 last_char = Faref (echo_string, idx);
742
2ff4d3d9
RS
743 /* We test PREV_CHAR to make sure this isn't the echoing
744 of a minus-sign. */
745 if (XINT (last_char) == '-' && XINT (prev_char) != ' ')
0d121f7c
GM
746 Faset (echo_string, idx, make_number (' '));
747 else
748 echo_string = concat2 (echo_string, build_string (" "));
749 }
c3be81c7
RS
750 else if (STRINGP (echo_string))
751 echo_string = concat2 (echo_string, build_string (" "));
678e9d18
GM
752
753 current_kboard->echo_string
754 = concat2 (echo_string, make_string (buffer, ptr - buffer));
284f4730 755
3dbd9ee4 756 echo_now ();
284f4730
JB
757 }
758}
759
760/* Temporarily add a dash to the end of the echo string if it's not
761 empty, so that it serves as a mini-prompt for the very next character. */
762
dfcf069d 763void
284f4730
JB
764echo_dash ()
765{
678e9d18
GM
766 /* Do nothing if not echoing at all. */
767 if (NILP (current_kboard->echo_string))
768 return;
769
c5fdd383 770 if (!current_kboard->immediate_echo
0d121f7c 771 && SCHARS (current_kboard->echo_string) == 0)
284f4730 772 return;
c60ee5e7 773
7a80a6f6 774 /* Do nothing if we just printed a prompt. */
c5fdd383 775 if (current_kboard->echo_after_prompt
0d121f7c 776 == SCHARS (current_kboard->echo_string))
4bafa972 777 return;
c60ee5e7 778
366511da
MB
779 /* Do nothing if we have already put a dash at the end. */
780 if (SCHARS (current_kboard->echo_string) > 1)
781 {
c3be81c7 782 Lisp_Object last_char, prev_char, idx;
366511da 783
c3be81c7
RS
784 idx = make_number (SCHARS (current_kboard->echo_string) - 2);
785 prev_char = Faref (current_kboard->echo_string, idx);
366511da 786
c3be81c7
RS
787 idx = make_number (SCHARS (current_kboard->echo_string) - 1);
788 last_char = Faref (current_kboard->echo_string, idx);
366511da 789
c3be81c7
RS
790 if (XINT (last_char) == '-' && XINT (prev_char) != ' ')
791 return;
366511da
MB
792 }
793
284f4730
JB
794 /* Put a dash at the end of the buffer temporarily,
795 but make it go away when the next character is added. */
678e9d18
GM
796 current_kboard->echo_string = concat2 (current_kboard->echo_string,
797 build_string ("-"));
3dbd9ee4 798 echo_now ();
284f4730
JB
799}
800
801/* Display the current echo string, and begin echoing if not already
802 doing so. */
803
07a59269 804void
3dbd9ee4 805echo_now ()
284f4730 806{
c5fdd383 807 if (!current_kboard->immediate_echo)
284f4730
JB
808 {
809 int i;
c5fdd383 810 current_kboard->immediate_echo = 1;
284f4730
JB
811
812 for (i = 0; i < this_command_key_count; i++)
d0a57728
RS
813 {
814 Lisp_Object c;
22b94eeb
RS
815
816 /* Set before_command_echo_length to the value that would
817 have been saved before the start of this subcommand in
818 command_loop_1, if we had already been echoing then. */
819 if (i == this_single_command_key_start)
820 before_command_echo_length = echo_length ();
821
d0a57728
RS
822 c = XVECTOR (this_command_keys)->contents[i];
823 if (! (EVENT_HAS_PARAMETERS (c)
824 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_movement)))
825 echo_char (c);
826 }
22b94eeb
RS
827
828 /* Set before_command_echo_length to the value that would
829 have been saved before the start of this subcommand in
830 command_loop_1, if we had already been echoing then. */
831 if (this_command_key_count == this_single_command_key_start)
832 before_command_echo_length = echo_length ();
833
834 /* Put a dash at the end to invite the user to type more. */
284f4730
JB
835 echo_dash ();
836 }
837
838 echoing = 1;
678e9d18 839 message3_nolog (current_kboard->echo_string,
0d121f7c 840 SBYTES (current_kboard->echo_string),
d5db4077 841 STRING_MULTIBYTE (current_kboard->echo_string));
284f4730
JB
842 echoing = 0;
843
59a84f8e
GM
844 /* Record in what buffer we echoed, and from which kboard. */
845 echo_message_buffer = echo_area_buffer[0];
846 echo_kboard = current_kboard;
847
284f4730
JB
848 if (waiting_for_input && !NILP (Vquit_flag))
849 quit_throw_to_read_char ();
850}
851
852/* Turn off echoing, for the start of a new command. */
853
dfcf069d 854void
284f4730
JB
855cancel_echoing ()
856{
c5fdd383 857 current_kboard->immediate_echo = 0;
c5fdd383 858 current_kboard->echo_after_prompt = -1;
678e9d18 859 current_kboard->echo_string = Qnil;
59a84f8e
GM
860 ok_to_echo_at_next_pause = NULL;
861 echo_kboard = NULL;
862 echo_message_buffer = Qnil;
284f4730
JB
863}
864
865/* Return the length of the current echo string. */
866
867static int
868echo_length ()
869{
678e9d18 870 return (STRINGP (current_kboard->echo_string)
0d121f7c 871 ? SCHARS (current_kboard->echo_string)
678e9d18 872 : 0);
284f4730
JB
873}
874
875/* Truncate the current echo message to its first LEN chars.
876 This and echo_char get used by read_key_sequence when the user
ff11dfa1 877 switches frames while entering a key sequence. */
284f4730
JB
878
879static void
678e9d18
GM
880echo_truncate (nchars)
881 int nchars;
882{
883 if (STRINGP (current_kboard->echo_string))
884 current_kboard->echo_string
885 = Fsubstring (current_kboard->echo_string,
886 make_number (0), make_number (nchars));
887 truncate_echo_area (nchars);
284f4730
JB
888}
889
890\f
891/* Functions for manipulating this_command_keys. */
892static void
893add_command_key (key)
894 Lisp_Object key;
895{
22b94eeb
RS
896#if 0 /* Not needed after we made Freset_this_command_lengths
897 do the job immediately. */
71918b75
RS
898 /* If reset-this-command-length was called recently, obey it now.
899 See the doc string of that function for an explanation of why. */
900 if (before_command_restore_flag)
901 {
902 this_command_key_count = before_command_key_count_1;
6321824f
RS
903 if (this_command_key_count < this_single_command_key_start)
904 this_single_command_key_start = this_command_key_count;
71918b75
RS
905 echo_truncate (before_command_echo_length_1);
906 before_command_restore_flag = 0;
907 }
22b94eeb 908#endif
71918b75 909
f4e05d97
GM
910 if (this_command_key_count >= ASIZE (this_command_keys))
911 this_command_keys = larger_vector (this_command_keys,
912 2 * ASIZE (this_command_keys),
913 Qnil);
6569cc8d 914
b1ebcadb 915 ASET (this_command_keys, this_command_key_count, key);
f4e05d97 916 ++this_command_key_count;
284f4730 917}
f4e05d97 918
284f4730
JB
919\f
920Lisp_Object
921recursive_edit_1 ()
922{
aed13378 923 int count = SPECPDL_INDEX ();
284f4730
JB
924 Lisp_Object val;
925
926 if (command_loop_level > 0)
927 {
928 specbind (Qstandard_output, Qt);
929 specbind (Qstandard_input, Qt);
930 }
931
d148e14d 932#ifdef HAVE_WINDOW_SYSTEM
526a058f 933 /* The command loop has started an hourglass timer, so we have to
84265027 934 cancel it here, otherwise it will fire because the recursive edit
d8e2d5ba
PJ
935 can take some time. Do not check for display_hourglass_p here,
936 because it could already be nil. */
526a058f 937 cancel_hourglass ();
84265027
GM
938#endif
939
980a2d69
GM
940 /* This function may have been called from a debugger called from
941 within redisplay, for instance by Edebugging a function called
942 from fontification-functions. We want to allow redisplay in
943 the debugging session.
944
945 The recursive edit is left with a `(throw exit ...)'. The `exit'
946 tag is not caught anywhere in redisplay, i.e. when we leave the
947 recursive edit, the original redisplay leading to the recursive
948 edit will be unwound. The outcome should therefore be safe. */
949 specbind (Qinhibit_redisplay, Qnil);
950 redisplaying_p = 0;
951
284f4730
JB
952 val = command_loop ();
953 if (EQ (val, Qt))
954 Fsignal (Qquit, Qnil);
cb252880
RS
955 /* Handle throw from read_minibuf when using minibuffer
956 while it's active but we're in another window. */
957 if (STRINGP (val))
43cae48c 958 xsignal1 (Qerror, val);
284f4730 959
cb5df6ae 960 return unbind_to (count, Qnil);
284f4730
JB
961}
962
963/* When an auto-save happens, record the "time", and don't do again soon. */
5846638c 964
07a59269 965void
284f4730
JB
966record_auto_save ()
967{
c43b1734 968 last_auto_save = num_nonmacro_input_events;
284f4730 969}
5846638c
RS
970
971/* Make an auto save happen as soon as possible at command level. */
972
dfcf069d 973void
5846638c
RS
974force_auto_save_soon ()
975{
976 last_auto_save = - auto_save_interval - 1;
241ceaf7
RS
977
978 record_asynch_buffer_change ();
5846638c 979}
284f4730 980\f
284f4730 981DEFUN ("recursive-edit", Frecursive_edit, Srecursive_edit, 0, 0, "",
4707d2d0
PJ
982 doc: /* Invoke the editor command loop recursively.
983To get out of the recursive edit, a command can do `(throw 'exit nil)';
984that tells this function to return.
6e604a9b 985Alternatively, `(throw 'exit t)' makes this function signal an error.
4707d2d0
PJ
986This function is called by the editor initialization to begin editing. */)
987 ()
284f4730 988{
aed13378 989 int count = SPECPDL_INDEX ();
9ce50b1e 990 Lisp_Object buffer;
284f4730 991
96edd5d4
KS
992 /* If we enter while input is blocked, don't lock up here.
993 This may happen through the debugger during redisplay. */
994 if (INPUT_BLOCKED_P)
995 return Qnil;
996
284f4730
JB
997 command_loop_level++;
998 update_mode_lines = 1;
999
9ce50b1e
GM
1000 if (command_loop_level
1001 && current_buffer != XBUFFER (XWINDOW (selected_window)->buffer))
1002 buffer = Fcurrent_buffer ();
1003 else
1004 buffer = Qnil;
1005
1006 /* If we leave recursive_edit_1 below with a `throw' for instance,
1007 like it is done in the splash screen display, we have to
1008 make sure that we restore single_kboard as command_loop_1
1009 would have done if it were left normally. */
b3e6f69c
KL
1010 if (command_loop_level > 0)
1011 temporarily_switch_to_single_kboard (SELECTED_FRAME ());
256c9c3a 1012 record_unwind_protect (recursive_edit_unwind, buffer);
9ce50b1e 1013
284f4730
JB
1014 recursive_edit_1 ();
1015 return unbind_to (count, Qnil);
1016}
1017
1018Lisp_Object
256c9c3a
KL
1019recursive_edit_unwind (buffer)
1020 Lisp_Object buffer;
284f4730 1021{
256c9c3a
KL
1022 if (BUFFERP (buffer))
1023 Fset_buffer (buffer);
c60ee5e7 1024
284f4730
JB
1025 command_loop_level--;
1026 update_mode_lines = 1;
1027 return Qnil;
1028}
9ce50b1e 1029
284f4730 1030\f
b3e6f69c
KL
1031#if 0 /* These two functions are now replaced with
1032 temporarily_switch_to_single_kboard. */
604ccd1d 1033static void
1e8bd3da 1034any_kboard_state ()
604ccd1d 1035{
1e8bd3da
RS
1036#if 0 /* Theory: if there's anything in Vunread_command_events,
1037 it will right away be read by read_key_sequence,
1038 and then if we do switch KBOARDS, it will go into the side
1039 queue then. So we don't need to do anything special here -- rms. */
604ccd1d 1040 if (CONSP (Vunread_command_events))
4524b161 1041 {
c5fdd383
KH
1042 current_kboard->kbd_queue
1043 = nconc2 (Vunread_command_events, current_kboard->kbd_queue);
1044 current_kboard->kbd_queue_has_data = 1;
4524b161 1045 }
604ccd1d 1046 Vunread_command_events = Qnil;
1e8bd3da
RS
1047#endif
1048 single_kboard = 0;
604ccd1d 1049}
1e8bd3da
RS
1050
1051/* Switch to the single-kboard state, making current_kboard
1052 the only KBOARD from which further input is accepted. */
1053
1054void
1055single_kboard_state ()
1056{
1e8bd3da 1057 single_kboard = 1;
1e8bd3da 1058}
b3e6f69c 1059#endif
1e8bd3da 1060
0c1c1b93
RS
1061/* If we're in single_kboard state for kboard KBOARD,
1062 get out of it. */
1063
1064void
1065not_single_kboard_state (kboard)
1066 KBOARD *kboard;
1067{
1068 if (kboard == current_kboard)
1069 single_kboard = 0;
1070}
1071
1e8bd3da
RS
1072/* Maintain a stack of kboards, so other parts of Emacs
1073 can switch temporarily to the kboard of a given frame
1074 and then revert to the previous status. */
1075
1076struct kboard_stack
1077{
1078 KBOARD *kboard;
1079 struct kboard_stack *next;
1080};
1081
1082static struct kboard_stack *kboard_stack;
1083
1084void
256c9c3a
KL
1085push_kboard (k)
1086 struct kboard *k;
1e8bd3da
RS
1087{
1088 struct kboard_stack *p
1089 = (struct kboard_stack *) xmalloc (sizeof (struct kboard_stack));
1090
1091 p->next = kboard_stack;
1092 p->kboard = current_kboard;
1093 kboard_stack = p;
1094
256c9c3a 1095 current_kboard = k;
1e8bd3da
RS
1096}
1097
1098void
256c9c3a 1099pop_kboard ()
1e8bd3da 1100{
6ed8eeff 1101 struct terminal *t;
1e8bd3da 1102 struct kboard_stack *p = kboard_stack;
24f9525b 1103 int found = 0;
6ed8eeff 1104 for (t = terminal_list; t; t = t->next_terminal)
3fb8e5d7 1105 {
6ed8eeff 1106 if (t->kboard == p->kboard)
3fb8e5d7
KL
1107 {
1108 current_kboard = p->kboard;
24f9525b 1109 found = 1;
3fb8e5d7
KL
1110 break;
1111 }
1112 }
24f9525b 1113 if (!found)
3fb8e5d7 1114 {
6ed8eeff 1115 /* The terminal we remembered has been deleted. */
3fb8e5d7 1116 current_kboard = FRAME_KBOARD (SELECTED_FRAME ());
b3e6f69c 1117 single_kboard = 0;
3fb8e5d7 1118 }
1e8bd3da
RS
1119 kboard_stack = p->next;
1120 xfree (p);
1121}
256c9c3a 1122
b3e6f69c
KL
1123/* Switch to single_kboard mode, making current_kboard the only KBOARD
1124 from which further input is accepted. If F is non-nil, set its
1125 KBOARD as the current keyboard.
1126
1127 This function uses record_unwind_protect to return to the previous
1128 state later.
1129
1130 If Emacs is already in single_kboard mode, and F's keyboard is
1131 locked, then this function will throw an errow. */
256c9c3a
KL
1132
1133void
b3e6f69c
KL
1134temporarily_switch_to_single_kboard (f)
1135 struct frame *f;
256c9c3a 1136{
256c9c3a 1137 int was_locked = single_kboard;
24f9525b
KL
1138 if (was_locked)
1139 {
b3e6f69c
KL
1140 if (f != NULL && FRAME_KBOARD (f) != current_kboard)
1141 /* We can not switch keyboards while in single_kboard mode.
251bc578
KL
1142 In rare cases, Lisp code may call `recursive-edit' (or
1143 `read-minibuffer' or `y-or-n-p') after it switched to a
1144 locked frame. For example, this is likely to happen
1145 when server.el connects to a new terminal while Emacs is in
1146 single_kboard mode. It is best to throw an error instead
1147 of presenting the user with a frozen screen. */
b3e6f69c
KL
1148 error ("Terminal %d is locked, cannot read from it",
1149 FRAME_TERMINAL (f)->id);
24f9525b 1150 else
b3e6f69c
KL
1151 /* This call is unnecessary, but helps
1152 `restore_kboard_configuration' discover if somebody changed
1153 `current_kboard' behind our back. */
24f9525b
KL
1154 push_kboard (current_kboard);
1155 }
b3e6f69c
KL
1156 else if (f != NULL)
1157 current_kboard = FRAME_KBOARD (f);
1158 single_kboard = 1;
256c9c3a
KL
1159 record_unwind_protect (restore_kboard_configuration,
1160 (was_locked ? Qt : Qnil));
256c9c3a
KL
1161}
1162
b3e6f69c 1163#if 0 /* This function is not needed anymore. */
256c9c3a
KL
1164void
1165record_single_kboard_state ()
1166{
24f9525b
KL
1167 if (single_kboard)
1168 push_kboard (current_kboard);
256c9c3a
KL
1169 record_unwind_protect (restore_kboard_configuration,
1170 (single_kboard ? Qt : Qnil));
1171}
b3e6f69c 1172#endif
256c9c3a
KL
1173
1174static Lisp_Object
1175restore_kboard_configuration (was_locked)
1176 Lisp_Object was_locked;
1177{
256c9c3a 1178 if (NILP (was_locked))
b3e6f69c 1179 single_kboard = 0;
256c9c3a 1180 else
24f9525b 1181 {
b3e6f69c
KL
1182 struct kboard *prev = current_kboard;
1183 single_kboard = 1;
24f9525b 1184 pop_kboard ();
b3e6f69c
KL
1185 /* The pop should not change the kboard. */
1186 if (single_kboard && current_kboard != prev)
1187 abort ();
24f9525b 1188 }
256c9c3a
KL
1189 return Qnil;
1190}
e2dc7ae5 1191
1e8bd3da
RS
1192\f
1193/* Handle errors that are not handled at inner levels
1194 by printing an error message and returning to the editor command loop. */
604ccd1d 1195
284f4730
JB
1196Lisp_Object
1197cmd_error (data)
1198 Lisp_Object data;
a1341f75 1199{
a9f16aa9 1200 Lisp_Object old_level, old_length;
e881d8b2
RS
1201 char macroerror[50];
1202
d148e14d 1203#ifdef HAVE_WINDOW_SYSTEM
160552c5
RS
1204 if (display_hourglass_p)
1205 cancel_hourglass ();
1206#endif
1207
649d952d 1208 if (!NILP (executing_kbd_macro))
e881d8b2 1209 {
649d952d 1210 if (executing_kbd_macro_iterations == 1)
e881d8b2
RS
1211 sprintf (macroerror, "After 1 kbd macro iteration: ");
1212 else
1213 sprintf (macroerror, "After %d kbd macro iterations: ",
649d952d 1214 executing_kbd_macro_iterations);
e881d8b2
RS
1215 }
1216 else
1217 *macroerror = 0;
a9f16aa9 1218
a1341f75
RS
1219 Vstandard_output = Qt;
1220 Vstandard_input = Qt;
ce0d2858 1221 Vexecuting_kbd_macro = Qnil;
649d952d 1222 executing_kbd_macro = Qnil;
d8bcf58e 1223 current_kboard->Vprefix_arg = Qnil;
75045dcb 1224 current_kboard->Vlast_prefix_arg = Qnil;
df0f2ba1 1225 cancel_echoing ();
a9f16aa9
KH
1226
1227 /* Avoid unquittable loop if data contains a circular list. */
1228 old_level = Vprint_level;
1229 old_length = Vprint_length;
0c04a67e
RS
1230 XSETFASTINT (Vprint_level, 10);
1231 XSETFASTINT (Vprint_length, 10);
e881d8b2 1232 cmd_error_internal (data, macroerror);
a9f16aa9
KH
1233 Vprint_level = old_level;
1234 Vprint_length = old_length;
a1341f75
RS
1235
1236 Vquit_flag = Qnil;
1237
1238 Vinhibit_quit = Qnil;
b3e6f69c 1239#if 0 /* This shouldn't be necessary anymore. --lorentey */
e3ee34f0
RS
1240 if (command_loop_level == 0 && minibuf_level == 0)
1241 any_kboard_state ();
ff4b06d3 1242#endif
a1341f75
RS
1243
1244 return make_number (0);
1245}
1246
301738ed
RS
1247/* Take actions on handling an error. DATA is the data that describes
1248 the error.
1249
1250 CONTEXT is a C-string containing ASCII characters only which
1251 describes the context in which the error happened. If we need to
1252 generalize CONTEXT to allow multibyte characters, make it a Lisp
1253 string. */
1254
07a59269 1255void
a1341f75
RS
1256cmd_error_internal (data, context)
1257 Lisp_Object data;
1258 char *context;
284f4730 1259{
788f89eb 1260 struct frame *sf = SELECTED_FRAME ();
284f4730 1261
04d8c47d
RS
1262 /* The immediate context is not interesting for Quits,
1263 since they are asyncronous. */
1264 if (EQ (XCAR (data), Qquit))
1265 Vsignaling_function = Qnil;
1266
284f4730
JB
1267 Vquit_flag = Qnil;
1268 Vinhibit_quit = Qt;
284f4730 1269
04d8c47d
RS
1270 /* Use user's specified output function if any. */
1271 if (!NILP (Vcommand_error_function))
1272 call3 (Vcommand_error_function, data,
fcd69a29 1273 context ? build_string (context) : empty_unibyte_string,
04d8c47d 1274 Vsignaling_function);
ff11dfa1 1275 /* If the window system or terminal frame hasn't been initialized
04d8c47d
RS
1276 yet, or we're not interactive, write the message to stderr and exit. */
1277 else if (!sf->glyphs_initialized_p
0dad7c6f
JR
1278 /* The initial frame is a special non-displaying frame. It
1279 will be current in daemon mode when there are no frames
1280 to display, and in non-daemon mode before the real frame
1281 has finished initializing. If an error is thrown in the
1282 latter case while creating the frame, then the frame
1283 will never be displayed, so the safest thing to do is
1284 write to stderr and quit. In daemon mode, there are
1285 many other potential errors that do not prevent frames
1286 from being created, so continuing as normal is better in
1287 that case. */
1288 || (!IS_DAEMON && FRAME_INITIAL_P (sf))
04d8c47d
RS
1289 || noninteractive)
1290 {
1291 print_error_message (data, Qexternal_debugging_output,
1292 context, Vsignaling_function);
1293 Fterpri (Qexternal_debugging_output);
1294 Fkill_emacs (make_number (-1));
7ee32cda 1295 }
284f4730
JB
1296 else
1297 {
04d8c47d 1298 clear_message (1, 0);
284f4730 1299 Fdiscard_input ();
dc4854ce 1300 message_log_maybe_newline ();
284f4730 1301 bitch_at_user ();
c60ee5e7 1302
04d8c47d
RS
1303 print_error_message (data, Qt, context, Vsignaling_function);
1304 }
a1341f75 1305
dc4854ce 1306 Vsignaling_function = Qnil;
284f4730
JB
1307}
1308\f
1309Lisp_Object command_loop_1 ();
1310Lisp_Object command_loop_2 ();
1311Lisp_Object top_level_1 ();
1312
1313/* Entry to editor-command-loop.
1314 This level has the catches for exiting/returning to editor command loop.
1315 It returns nil to exit recursive edit, t to abort it. */
1316
1317Lisp_Object
1318command_loop ()
1319{
1320 if (command_loop_level > 0 || minibuf_level > 0)
1321 {
07ba902e
RS
1322 Lisp_Object val;
1323 val = internal_catch (Qexit, command_loop_2, Qnil);
649d952d 1324 executing_kbd_macro = Qnil;
68c46464 1325 return val;
284f4730
JB
1326 }
1327 else
1328 while (1)
1329 {
1330 internal_catch (Qtop_level, top_level_1, Qnil);
b3e6f69c 1331#if 0 /* This shouldn't be necessary anymore. --lorentey */
c98e2d50
KL
1332 /* Reset single_kboard in case top-level set it while
1333 evaluating an -f option, or we are stuck there for some
1334 other reason. */
1335 any_kboard_state ();
b3e6f69c 1336#endif
284f4730 1337 internal_catch (Qtop_level, command_loop_2, Qnil);
649d952d 1338 executing_kbd_macro = Qnil;
df0f2ba1 1339
284f4730
JB
1340 /* End of file in -batch run causes exit here. */
1341 if (noninteractive)
1342 Fkill_emacs (Qt);
1343 }
1344}
1345
1346/* Here we catch errors in execution of commands within the
1347 editing loop, and reenter the editing loop.
1348 When there is an error, cmd_error runs and returns a non-nil
27fd22dc 1349 value to us. A value of nil means that command_loop_1 itself
284f4730
JB
1350 returned due to end of file (or end of kbd macro). */
1351
1352Lisp_Object
1353command_loop_2 ()
1354{
1355 register Lisp_Object val;
1356
1357 do
1358 val = internal_condition_case (command_loop_1, Qerror, cmd_error);
1359 while (!NILP (val));
1360
1361 return Qnil;
1362}
1363
1364Lisp_Object
1365top_level_2 ()
1366{
1367 return Feval (Vtop_level);
1368}
1369
1370Lisp_Object
1371top_level_1 ()
1372{
1373 /* On entry to the outer level, run the startup file */
1374 if (!NILP (Vtop_level))
1375 internal_condition_case (top_level_2, Qerror, cmd_error);
1376 else if (!NILP (Vpurify_flag))
1377 message ("Bare impure Emacs (standard Lisp code not loaded)");
1378 else
1379 message ("Bare Emacs (standard Lisp code not loaded)");
1380 return Qnil;
1381}
1382
1383DEFUN ("top-level", Ftop_level, Stop_level, 0, 0, "",
9252e0c0
CY
1384 doc: /* Exit all recursive editing levels.
1385This also exits all active minibuffers. */)
4707d2d0 1386 ()
284f4730 1387{
d148e14d 1388#ifdef HAVE_WINDOW_SYSTEM
526a058f
GM
1389 if (display_hourglass_p)
1390 cancel_hourglass ();
2c9cf2c8 1391#endif
96edd5d4 1392
a25e44b2
JD
1393 /* Unblock input if we enter with input blocked. This may happen if
1394 redisplay traps e.g. during tool-bar update with input blocked. */
1395 while (INPUT_BLOCKED_P)
1396 UNBLOCK_INPUT;
1397
8c907a56 1398 return Fthrow (Qtop_level, Qnil);
284f4730
JB
1399}
1400
1401DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, "",
4707d2d0
PJ
1402 doc: /* Exit from the innermost recursive edit or minibuffer. */)
1403 ()
284f4730
JB
1404{
1405 if (command_loop_level > 0 || minibuf_level > 0)
1406 Fthrow (Qexit, Qnil);
1407
1408 error ("No recursive edit is in progress");
8c907a56 1409 return Qnil;
284f4730
JB
1410}
1411
1412DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 0, 0, "",
4707d2d0
PJ
1413 doc: /* Abort the command that requested this recursive edit or minibuffer input. */)
1414 ()
284f4730
JB
1415{
1416 if (command_loop_level > 0 || minibuf_level > 0)
1417 Fthrow (Qexit, Qt);
1418
1419 error ("No recursive edit is in progress");
8c907a56 1420 return Qnil;
284f4730
JB
1421}
1422\f
ae372f41 1423#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
c5b76d6c
CY
1424
1425/* Restore mouse tracking enablement. See Ftrack_mouse for the only use
1426 of this function. */
1427
1428static Lisp_Object
1429tracking_off (old_value)
1430 Lisp_Object old_value;
1431{
1432 do_mouse_tracking = old_value;
1433 if (NILP (old_value))
1434 {
1435 /* Redisplay may have been preempted because there was input
1436 available, and it assumes it will be called again after the
1437 input has been processed. If the only input available was
1438 the sort that we have just disabled, then we need to call
1439 redisplay. */
1440 if (!readable_events (READABLE_EVENTS_DO_TIMERS_NOW))
1441 {
1442 redisplay_preserve_echo_area (6);
1443 get_input_pending (&input_pending,
1444 READABLE_EVENTS_DO_TIMERS_NOW);
1445 }
1446 }
1447 return Qnil;
1448}
1449
1450DEFUN ("track-mouse", Ftrack_mouse, Strack_mouse, 0, UNEVALLED, 0,
1451 doc: /* Evaluate BODY with mouse movement events enabled.
1452Within a `track-mouse' form, mouse motion generates input events that
1453you can read with `read-event'.
1454Normally, mouse motion is ignored.
d514369d 1455usage: (track-mouse BODY...) */)
c5b76d6c
CY
1456 (args)
1457 Lisp_Object args;
1458{
1459 int count = SPECPDL_INDEX ();
1460 Lisp_Object val;
1461
1462 record_unwind_protect (tracking_off, do_mouse_tracking);
1463
1464 do_mouse_tracking = Qt;
1465
1466 val = Fprogn (args);
1467 return unbind_to (count, val);
1468}
1469
1470/* If mouse has moved on some frame, return one of those frames.
3b0cdcef
KS
1471
1472 Return 0 otherwise.
1473
1474 If ignore_mouse_drag_p is non-zero, ignore (implicit) mouse movement
1475 after resizing the tool-bar window. */
1476
1477int ignore_mouse_drag_p;
c5b76d6c
CY
1478
1479static FRAME_PTR
1480some_mouse_moved ()
1481{
1482 Lisp_Object tail, frame;
1483
3b0cdcef
KS
1484 if (ignore_mouse_drag_p)
1485 {
e2bb07db 1486 /* ignore_mouse_drag_p = 0; */
3b0cdcef
KS
1487 return 0;
1488 }
1489
c5b76d6c
CY
1490 FOR_EACH_FRAME (tail, frame)
1491 {
1492 if (XFRAME (frame)->mouse_moved)
1493 return XFRAME (frame);
1494 }
1495
1496 return 0;
1497}
1498
ae372f41 1499#endif /* HAVE_MOUSE || HAVE_GPM */
c5b76d6c 1500\f
284f4730
JB
1501/* This is the actual command reading loop,
1502 sans error-handling encapsulation. */
1503
a7b772c1
GM
1504static int read_key_sequence P_ ((Lisp_Object *, int, Lisp_Object,
1505 int, int, int));
1506void safe_run_hooks P_ ((Lisp_Object));
2a026b04 1507static void adjust_point_for_property P_ ((int, int));
284f4730 1508
0af912f0
JD
1509/* Cancel hourglass from protect_unwind.
1510 ARG is not used. */
d148e14d 1511#ifdef HAVE_WINDOW_SYSTEM
0af912f0
JD
1512static Lisp_Object
1513cancel_hourglass_unwind (arg)
1514 Lisp_Object arg;
1515{
1516 cancel_hourglass ();
3a0ae1f3 1517 return Qnil;
0af912f0 1518}
bb8db7e1 1519#endif
0af912f0 1520
1ac9108a
SM
1521extern int nonundocount; /* Declared in cmds.c. */
1522
284f4730
JB
1523Lisp_Object
1524command_loop_1 ()
1525{
03cee6ae
GM
1526 Lisp_Object cmd;
1527 int lose;
284f4730
JB
1528 Lisp_Object keybuf[30];
1529 int i;
a53fe666 1530 int prev_modiff = 0;
8c907a56 1531 struct buffer *prev_buffer = NULL;
b3e6f69c 1532#if 0 /* This shouldn't be necessary anymore. --lorentey */
1e8bd3da 1533 int was_locked = single_kboard;
033b73e2 1534#endif
80d4c824 1535 int already_adjusted = 0;
284f4730 1536
d9b641bb 1537 current_kboard->Vprefix_arg = Qnil;
75045dcb 1538 current_kboard->Vlast_prefix_arg = Qnil;
86e5706b 1539 Vdeactivate_mark = Qnil;
284f4730 1540 waiting_for_input = 0;
df0f2ba1 1541 cancel_echoing ();
284f4730 1542
284f4730 1543 this_command_key_count = 0;
63020c46 1544 this_command_key_count_reset = 0;
6321824f 1545 this_single_command_key_start = 0;
284f4730 1546
325309f5 1547 if (NILP (Vmemory_full))
59aadc81 1548 {
10ffcb64
RS
1549 /* Make sure this hook runs after commands that get errors and
1550 throw to top level. */
1551 /* Note that the value cell will never directly contain nil
1552 if the symbol is a local variable. */
1553 if (!NILP (Vpost_command_hook) && !NILP (Vrun_hooks))
1554 safe_run_hooks (Qpost_command_hook);
1555
1556 /* If displaying a message, resize the echo area window to fit
1557 that message's size exactly. */
1558 if (!NILP (echo_area_buffer[0]))
1559 resize_echo_area_exactly ();
1560
1561 if (!NILP (Vdeferred_action_list))
0b5d283f 1562 safe_run_hooks (Qdeferred_action_function);
59aadc81
RS
1563 }
1564
51d5a2c9 1565 /* Do this after running Vpost_command_hook, for consistency. */
d5eecefb
RS
1566 current_kboard->Vlast_command = Vthis_command;
1567 current_kboard->Vreal_last_command = real_this_command;
4b09796d 1568 if (!CONSP (last_command_event))
d0d3a311 1569 current_kboard->Vlast_repeatable_command = real_this_command;
51d5a2c9 1570
284f4730
JB
1571 while (1)
1572 {
788f89eb 1573 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
a94a4335
KH
1574 Fkill_emacs (Qnil);
1575
284f4730
JB
1576 /* Make sure the current window's buffer is selected. */
1577 if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
1578 set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer));
1579
1580 /* Display any malloc warning that just came out. Use while because
1581 displaying one warning can cause another. */
1582
1583 while (pending_malloc_warning)
1584 display_malloc_warning ();
1585
86e5706b
RS
1586 Vdeactivate_mark = Qnil;
1587
284f4730 1588 /* If minibuffer on and echo area in use,
00392ce6 1589 wait a short time and redraw minibuffer. */
284f4730 1590
7ee32cda 1591 if (minibuf_level
985f9f66 1592 && !NILP (echo_area_buffer[0])
6a8128ef
CY
1593 && EQ (minibuf_window, echo_area_window)
1594 && NUMBERP (Vminibuffer_message_timeout))
284f4730 1595 {
f1bed6d8
RS
1596 /* Bind inhibit-quit to t so that C-g gets read in
1597 rather than quitting back to the minibuffer. */
aed13378 1598 int count = SPECPDL_INDEX ();
f1bed6d8 1599 specbind (Qinhibit_quit, Qt);
f1bed6d8 1600
6a8128ef 1601 sit_for (Vminibuffer_message_timeout, 0, 2);
666dc232 1602
e6aa7813 1603 /* Clear the echo area. */
301738ed 1604 message2 (0, 0, 0);
cdb9d665 1605 safe_run_hooks (Qecho_area_clear_hook);
e6aa7813 1606
db08707d
RS
1607 unbind_to (count, Qnil);
1608
e6aa7813 1609 /* If a C-g came in before, treat it as input now. */
284f4730
JB
1610 if (!NILP (Vquit_flag))
1611 {
1612 Vquit_flag = Qnil;
24597608 1613 Vunread_command_events = Fcons (make_number (quit_char), Qnil);
284f4730
JB
1614 }
1615 }
1616
8f805655 1617#if 0
8f805655
JB
1618 /* Select the frame that the last event came from. Usually,
1619 switch-frame events will take care of this, but if some lisp
1620 code swallows a switch-frame event, we'll fix things up here.
1621 Is this a good idea? */
8c18cbfb 1622 if (FRAMEP (internal_last_event_frame)
788f89eb 1623 && !EQ (internal_last_event_frame, selected_frame))
e630dfc6 1624 Fselect_frame (internal_last_event_frame, Qnil);
284f4730 1625#endif
48e416d4
RS
1626 /* If it has changed current-menubar from previous value,
1627 really recompute the menubar from the value. */
a646e520
RS
1628 if (! NILP (Vlucid_menu_bar_dirty_flag)
1629 && !NILP (Ffboundp (Qrecompute_lucid_menubar)))
48e416d4
RS
1630 call0 (Qrecompute_lucid_menubar);
1631
71918b75
RS
1632 before_command_key_count = this_command_key_count;
1633 before_command_echo_length = echo_length ();
1634
d5eecefb
RS
1635 Vthis_command = Qnil;
1636 real_this_command = Qnil;
9d138659 1637 Vthis_original_command = Qnil;
025ae953 1638 Vthis_command_keys_shift_translated = Qnil;
d7437ef6 1639
8f805655 1640 /* Read next key sequence; i gets its length. */
ce98e608 1641 i = read_key_sequence (keybuf, sizeof keybuf / sizeof keybuf[0],
f571ae0d 1642 Qnil, 0, 1, 1);
8f805655 1643
6fac1409 1644 /* A filter may have run while we were reading the input. */
788f89eb 1645 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
a94a4335 1646 Fkill_emacs (Qnil);
6fac1409
RS
1647 if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
1648 set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer));
1649
8f805655
JB
1650 ++num_input_keys;
1651
284f4730
JB
1652 /* Now we have read a key sequence of length I,
1653 or else I is 0 and we found end of file. */
1654
1655 if (i == 0) /* End of file -- happens only in */
1656 return Qnil; /* a kbd macro, at the end. */
dcc408a0
RS
1657 /* -1 means read_key_sequence got a menu that was rejected.
1658 Just loop around and read another command. */
1659 if (i == -1)
1660 {
1661 cancel_echoing ();
1662 this_command_key_count = 0;
63020c46 1663 this_command_key_count_reset = 0;
6321824f 1664 this_single_command_key_start = 0;
ff4b06d3 1665 goto finalize;
dcc408a0 1666 }
284f4730 1667
4b09796d 1668 last_command_event = keybuf[i - 1];
284f4730 1669
75c0b143
RS
1670 /* If the previous command tried to force a specific window-start,
1671 forget about that, in case this command moves point far away
c422836d
KH
1672 from that position. But also throw away beg_unchanged and
1673 end_unchanged information in that case, so that redisplay will
1674 update the whole window properly. */
1675 if (!NILP (XWINDOW (selected_window)->force_start))
1676 {
9351ebd0 1677 struct buffer *b;
c422836d 1678 XWINDOW (selected_window)->force_start = Qnil;
9351ebd0
GM
1679 b = XBUFFER (XWINDOW (selected_window)->buffer);
1680 BUF_BEG_UNCHANGED (b) = BUF_END_UNCHANGED (b) = 0;
c422836d 1681 }
75c0b143 1682
284f4730 1683 cmd = read_key_sequence_cmd;
ce0d2858 1684 if (!NILP (Vexecuting_kbd_macro))
284f4730
JB
1685 {
1686 if (!NILP (Vquit_flag))
1687 {
ce0d2858 1688 Vexecuting_kbd_macro = Qt;
284f4730
JB
1689 QUIT; /* Make some noise. */
1690 /* Will return since macro now empty. */
1691 }
1692 }
1693
1694 /* Do redisplay processing after this command except in special
e35b6123 1695 cases identified below. */
86e5706b
RS
1696 prev_buffer = current_buffer;
1697 prev_modiff = MODIFF;
8746da95 1698 last_point_position = PT;
bb0e1d19 1699 last_point_position_window = selected_window;
18cd2eeb 1700 XSETBUFFER (last_point_position_buffer, prev_buffer);
86e5706b 1701
adf5cb9c
KH
1702 /* By default, we adjust point to a boundary of a region that
1703 has such a property that should be treated intangible
1704 (e.g. composition, display). But, some commands will set
1705 this variable differently. */
1706 Vdisable_point_adjustment = Qnil;
a7b772c1 1707
be2488ca
GM
1708 /* Process filters and timers may have messed with deactivate-mark.
1709 reset it before we execute the command. */
1710 Vdeactivate_mark = Qnil;
1711
8b9940e6
KS
1712 /* Remap command through active keymaps */
1713 Vthis_original_command = cmd;
a34cb674 1714 if (SYMBOLP (cmd))
8b9940e6
KS
1715 {
1716 Lisp_Object cmd1;
9be34f7f 1717 if (cmd1 = Fcommand_remapping (cmd, Qnil, Qnil), !NILP (cmd1))
8b9940e6
KS
1718 cmd = cmd1;
1719 }
1720
284f4730
JB
1721 /* Execute the command. */
1722
d5eecefb
RS
1723 Vthis_command = cmd;
1724 real_this_command = cmd;
a98ea3f9
RS
1725 /* Note that the value cell will never directly contain nil
1726 if the symbol is a local variable. */
e98a93eb 1727 if (!NILP (Vpre_command_hook) && !NILP (Vrun_hooks))
a98ea3f9 1728 safe_run_hooks (Qpre_command_hook);
c60ee5e7 1729
2764bebd
RS
1730 already_adjusted = 0;
1731
d5eecefb 1732 if (NILP (Vthis_command))
284f4730
JB
1733 {
1734 /* nil means key is undefined. */
1bf0e604
SM
1735 Lisp_Object keys = Fvector (i, keybuf);
1736 keys = Fkey_description (keys, Qnil);
284f4730 1737 bitch_at_user ();
1bf0e604 1738 message_with_string ("%s is undefined", keys, 0);
c5fdd383 1739 current_kboard->defining_kbd_macro = Qnil;
284f4730 1740 update_mode_lines = 1;
d8bcf58e 1741 current_kboard->Vprefix_arg = Qnil;
284f4730
JB
1742 }
1743 else
1744 {
6d0867e5 1745 if (NILP (current_kboard->Vprefix_arg))
284f4730 1746 {
75045dcb
RS
1747 /* In case we jump to directly_done. */
1748 Vcurrent_prefix_arg = current_kboard->Vprefix_arg;
1749
284f4730
JB
1750 /* Recognize some common commands in common situations and
1751 do them directly. */
025ae953
CY
1752 if (EQ (Vthis_command, Qforward_char) && PT < ZV
1753 && NILP (Vthis_command_keys_shift_translated)
1754 && !CONSP (Vtransient_mark_mode))
284f4730 1755 {
51ad8a68 1756 struct Lisp_Char_Table *dp
284f4730 1757 = window_display_table (XWINDOW (selected_window));
aaf35234 1758 lose = FETCH_CHAR (PT_BYTE);
8458ede6 1759 SET_PT (PT + 1);
d86ba5c5
RS
1760 if (! NILP (Vpost_command_hook))
1761 /* Put this before calling adjust_point_for_property
1762 so it will only get called once in any case. */
1763 goto directly_done;
22b94eeb
RS
1764 if (current_buffer == prev_buffer
1765 && last_point_position != PT
1766 && NILP (Vdisable_point_adjustment)
1767 && NILP (Vglobal_disable_point_adjustment))
1768 adjust_point_for_property (last_point_position, 0);
2764bebd
RS
1769 already_adjusted = 1;
1770 if (PT == last_point_position + 1
1771 && (dp
1772 ? (VECTORP (DISP_CHAR_VECTOR (dp, lose))
1773 ? XVECTOR (DISP_CHAR_VECTOR (dp, lose))->size == 1
1774 : (NILP (DISP_CHAR_VECTOR (dp, lose))
1775 && (lose >= 0x20 && lose < 0x7f)))
1776 : (lose >= 0x20 && lose < 0x7f))
37cd9f30
KH
1777 /* To extract the case of continuation on
1778 wide-column characters. */
8b461910 1779 && ASCII_BYTE_P (lose)
284f4730
JB
1780 && (XFASTINT (XWINDOW (selected_window)->last_modified)
1781 >= MODIFF)
598ba4c7
RS
1782 && (XFASTINT (XWINDOW (selected_window)->last_overlay_modified)
1783 >= OVERLAY_MODIFF)
284f4730 1784 && (XFASTINT (XWINDOW (selected_window)->last_point)
8001d352 1785 == PT - 1)
284f4730
JB
1786 && !windows_or_buffers_changed
1787 && EQ (current_buffer->selective_display, Qnil)
1788 && !detect_input_pending ()
962ae636 1789 && NILP (XWINDOW (selected_window)->column_number_displayed)
ce0d2858 1790 && NILP (Vexecuting_kbd_macro))
e35b6123 1791 direct_output_forward_char (1);
284f4730
JB
1792 goto directly_done;
1793 }
025ae953
CY
1794 else if (EQ (Vthis_command, Qbackward_char) && PT > BEGV
1795 && NILP (Vthis_command_keys_shift_translated)
1796 && !CONSP (Vtransient_mark_mode))
284f4730 1797 {
51ad8a68 1798 struct Lisp_Char_Table *dp
284f4730 1799 = window_display_table (XWINDOW (selected_window));
8458ede6 1800 SET_PT (PT - 1);
aaf35234 1801 lose = FETCH_CHAR (PT_BYTE);
d86ba5c5
RS
1802 if (! NILP (Vpost_command_hook))
1803 goto directly_done;
22b94eeb
RS
1804 if (current_buffer == prev_buffer
1805 && last_point_position != PT
1806 && NILP (Vdisable_point_adjustment)
1807 && NILP (Vglobal_disable_point_adjustment))
1808 adjust_point_for_property (last_point_position, 0);
2764bebd
RS
1809 already_adjusted = 1;
1810 if (PT == last_point_position - 1
1811 && (dp
1812 ? (VECTORP (DISP_CHAR_VECTOR (dp, lose))
1813 ? XVECTOR (DISP_CHAR_VECTOR (dp, lose))->size == 1
1814 : (NILP (DISP_CHAR_VECTOR (dp, lose))
1815 && (lose >= 0x20 && lose < 0x7f)))
1816 : (lose >= 0x20 && lose < 0x7f))
284f4730
JB
1817 && (XFASTINT (XWINDOW (selected_window)->last_modified)
1818 >= MODIFF)
598ba4c7
RS
1819 && (XFASTINT (XWINDOW (selected_window)->last_overlay_modified)
1820 >= OVERLAY_MODIFF)
284f4730 1821 && (XFASTINT (XWINDOW (selected_window)->last_point)
8001d352 1822 == PT + 1)
284f4730
JB
1823 && !windows_or_buffers_changed
1824 && EQ (current_buffer->selective_display, Qnil)
1825 && !detect_input_pending ()
962ae636 1826 && NILP (XWINDOW (selected_window)->column_number_displayed)
ce0d2858 1827 && NILP (Vexecuting_kbd_macro))
e35b6123 1828 direct_output_forward_char (-1);
284f4730
JB
1829 goto directly_done;
1830 }
d5eecefb 1831 else if (EQ (Vthis_command, Qself_insert_command)
14e40288 1832 /* Try this optimization only on char keystrokes. */
4b09796d
GM
1833 && NATNUMP (last_command_event)
1834 && CHAR_VALID_P (XFASTINT (last_command_event), 0))
284f4730 1835 {
d86ba5c5
RS
1836 unsigned int c
1837 = translate_char (Vtranslation_table_for_input,
4b09796d 1838 XFASTINT (last_command_event));
fc9cce4e 1839 int value;
ce0d2858 1840 if (NILP (Vexecuting_kbd_macro)
fc9cce4e 1841 && !EQ (minibuf_window, selected_window))
284f4730
JB
1842 {
1843 if (!nonundocount || nonundocount >= 20)
1844 {
1845 Fundo_boundary ();
1846 nonundocount = 0;
1847 }
1848 nonundocount++;
1849 }
c60ee5e7 1850
fc9cce4e
RS
1851 lose = ((XFASTINT (XWINDOW (selected_window)->last_modified)
1852 < MODIFF)
598ba4c7
RS
1853 || (XFASTINT (XWINDOW (selected_window)->last_overlay_modified)
1854 < OVERLAY_MODIFF)
fc9cce4e
RS
1855 || (XFASTINT (XWINDOW (selected_window)->last_point)
1856 != PT)
4c61f38e 1857 || MODIFF <= SAVE_MODIFF
fc9cce4e
RS
1858 || windows_or_buffers_changed
1859 || !EQ (current_buffer->selective_display, Qnil)
1860 || detect_input_pending ()
962ae636 1861 || !NILP (XWINDOW (selected_window)->column_number_displayed)
ce0d2858 1862 || !NILP (Vexecuting_kbd_macro));
c60ee5e7 1863
fc9cce4e 1864 value = internal_self_insert (c, 0);
7ee32cda 1865
fc9cce4e
RS
1866 if (value == 2)
1867 nonundocount = 0;
1868
e044e4fc
JD
1869 frame_make_pointer_invisible ();
1870
294d643a
RS
1871 if (! NILP (Vpost_command_hook))
1872 /* Put this before calling adjust_point_for_property
1873 so it will only get called once in any case. */
1874 goto directly_done;
1875
7ee32cda
GM
1876 /* VALUE == 1 when AFTER-CHANGE functions are
1877 installed which is the case most of the time
1878 because FONT-LOCK installs one. */
1879 if (!lose && !value)
e35b6123 1880 direct_output_for_insert (c);
284f4730
JB
1881 goto directly_done;
1882 }
1883 }
1884
1885 /* Here for a command that isn't executed directly */
1886
0af912f0 1887 {
d148e14d 1888#ifdef HAVE_WINDOW_SYSTEM
0af912f0
JD
1889 int scount = SPECPDL_INDEX ();
1890
1891 if (display_hourglass_p
ce0d2858 1892 && NILP (Vexecuting_kbd_macro))
0af912f0
JD
1893 {
1894 record_unwind_protect (cancel_hourglass_unwind, Qnil);
1895 start_hourglass ();
1896 }
7ee32cda
GM
1897#endif
1898
0af912f0 1899 nonundocount = 0;
1ac9108a 1900 if (NILP (current_kboard->Vprefix_arg)) /* FIXME: Why? --Stef */
0af912f0
JD
1901 Fundo_boundary ();
1902 Fcommand_execute (Vthis_command, Qnil, Qnil, Qnil);
d0c48478 1903
d148e14d 1904#ifdef HAVE_WINDOW_SYSTEM
4fbcc9b1
PJ
1905 /* Do not check display_hourglass_p here, because
1906 Fcommand_execute could change it, but we should cancel
e1204d39
RS
1907 hourglass cursor anyway.
1908 But don't cancel the hourglass within a macro
1909 just because a command in the macro finishes. */
ce0d2858 1910 if (NILP (Vexecuting_kbd_macro))
0af912f0 1911 unbind_to (scount, Qnil);
d0c48478 1912#endif
0af912f0 1913 }
284f4730 1914 }
a764a753 1915 directly_done: ;
75045dcb 1916 current_kboard->Vlast_prefix_arg = Vcurrent_prefix_arg;
284f4730 1917
84ee6048
RS
1918 /* Note that the value cell will never directly contain nil
1919 if the symbol is a local variable. */
1920 if (!NILP (Vpost_command_hook) && !NILP (Vrun_hooks))
1921 safe_run_hooks (Qpost_command_hook);
1922
8f12e41d
GM
1923 /* If displaying a message, resize the echo area window to fit
1924 that message's size exactly. */
1925 if (!NILP (echo_area_buffer[0]))
f09c15ed 1926 resize_echo_area_exactly ();
8f12e41d 1927
84ee6048
RS
1928 if (!NILP (Vdeferred_action_list))
1929 safe_run_hooks (Qdeferred_action_function);
1930
284f4730 1931 /* If there is a prefix argument,
6c7178b9
KH
1932 1) We don't want Vlast_command to be ``universal-argument''
1933 (that would be dumb), so don't set Vlast_command,
284f4730
JB
1934 2) we want to leave echoing on so that the prefix will be
1935 echoed as part of this key sequence, so don't call
1936 cancel_echoing, and
1937 3) we want to leave this_command_key_count non-zero, so that
1938 read_char will realize that it is re-reading a character, and
217258d5
KH
1939 not echo it a second time.
1940
1941 If the command didn't actually create a prefix arg,
1942 but is merely a frame event that is transparent to prefix args,
1943 then the above doesn't apply. */
4b09796d 1944 if (NILP (current_kboard->Vprefix_arg) || CONSP (last_command_event))
284f4730 1945 {
d5eecefb
RS
1946 current_kboard->Vlast_command = Vthis_command;
1947 current_kboard->Vreal_last_command = real_this_command;
4b09796d 1948 if (!CONSP (last_command_event))
d0d3a311 1949 current_kboard->Vlast_repeatable_command = real_this_command;
284f4730
JB
1950 cancel_echoing ();
1951 this_command_key_count = 0;
63020c46 1952 this_command_key_count_reset = 0;
6321824f 1953 this_single_command_key_start = 0;
284f4730 1954 }
86e5706b 1955
88ce066e 1956 if (!NILP (current_buffer->mark_active) && !NILP (Vrun_hooks))
86e5706b 1957 {
12679e05
CY
1958 /* In Emacs 22, setting transient-mark-mode to `only' was a
1959 way of turning it on for just one command. This usage is
1960 obsolete, but support it anyway. */
1961 if (EQ (Vtransient_mark_mode, Qidentity))
1962 Vtransient_mark_mode = Qnil;
1963 else if (EQ (Vtransient_mark_mode, Qonly))
1964 Vtransient_mark_mode = Qidentity;
1965
5c4cc82a
SM
1966 if (!NILP (Vdeactivate_mark))
1967 call0 (Qdeactivate_mark);
86e5706b
RS
1968 else if (current_buffer != prev_buffer || MODIFF != prev_modiff)
1969 call1 (Vrun_hooks, intern ("activate-mark-hook"));
1970 }
ff4b06d3
KH
1971
1972 finalize:
adf5cb9c
KH
1973
1974 if (current_buffer == prev_buffer
1975 && last_point_position != PT
1976 && NILP (Vdisable_point_adjustment)
2764bebd
RS
1977 && NILP (Vglobal_disable_point_adjustment)
1978 && !already_adjusted)
2a026b04 1979 adjust_point_for_property (last_point_position, MODIFF != prev_modiff);
adf5cb9c 1980
ff4b06d3
KH
1981 /* Install chars successfully executed in kbd macro. */
1982
d8bcf58e
KH
1983 if (!NILP (current_kboard->defining_kbd_macro)
1984 && NILP (current_kboard->Vprefix_arg))
ff4b06d3 1985 finalize_kbd_macro_chars ();
b3e6f69c 1986#if 0 /* This shouldn't be necessary anymore. --lorentey */
604ccd1d 1987 if (!was_locked)
b3e6f69c 1988 any_kboard_state ();
ff4b06d3 1989#endif
284f4730
JB
1990 }
1991}
1c9784c9 1992
adf5cb9c
KH
1993extern Lisp_Object Qcomposition, Qdisplay;
1994
1995/* Adjust point to a boundary of a region that has such a property
1996 that should be treated intangible. For the moment, we check
7e16ef60
SM
1997 `composition', `display' and `invisible' properties.
1998 LAST_PT is the last position of point. */
adf5cb9c 1999
14e40288
SM
2000extern Lisp_Object Qafter_string, Qbefore_string;
2001extern Lisp_Object get_pos_property P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
2002
adf5cb9c 2003static void
2a026b04 2004adjust_point_for_property (last_pt, modified)
adf5cb9c 2005 int last_pt;
2a026b04 2006 int modified;
adf5cb9c 2007{
2b95772c 2008 EMACS_INT beg, end;
7e16ef60
SM
2009 Lisp_Object val, overlay, tmp;
2010 int check_composition = 1, check_display = 1, check_invisible = 1;
0bbdffbd 2011 int orig_pt = PT;
adf5cb9c 2012
0bbdffbd
SM
2013 /* FIXME: cycling is probably not necessary because these properties
2014 can't be usefully combined anyway. */
7e16ef60 2015 while (check_composition || check_display || check_invisible)
adf5cb9c 2016 {
5c4cc82a 2017 /* FIXME: check `intangible'. */
adf5cb9c
KH
2018 if (check_composition
2019 && PT > BEGV && PT < ZV
db2f2cdc 2020 && (beg = composition_adjust_point (last_pt)) != PT)
adf5cb9c 2021 {
db2f2cdc 2022 SET_PT (beg);
14e40288 2023 check_display = check_invisible = 1;
adf5cb9c
KH
2024 }
2025 check_composition = 0;
2026 if (check_display
2027 && PT > BEGV && PT < ZV
7e16ef60
SM
2028 && !NILP (val = get_char_property_and_overlay
2029 (make_number (PT), Qdisplay, Qnil, &overlay))
3e9ac4b7 2030 && display_prop_intangible_p (val)
7e16ef60
SM
2031 && (!OVERLAYP (overlay)
2032 ? get_property_and_range (PT, Qdisplay, &val, &beg, &end, Qnil)
2033 : (beg = OVERLAY_POSITION (OVERLAY_START (overlay)),
2034 end = OVERLAY_POSITION (OVERLAY_END (overlay))))
4ca39724
KS
2035 && (beg < PT /* && end > PT <- It's always the case. */
2036 || (beg <= PT && STRINGP (val) && SCHARS (val) == 0)))
adf5cb9c 2037 {
14e40288 2038 xassert (end > PT);
4ca39724
KS
2039 SET_PT (PT < last_pt
2040 ? (STRINGP (val) && SCHARS (val) == 0 ? beg - 1 : beg)
2041 : end);
14e40288 2042 check_composition = check_invisible = 1;
adf5cb9c
KH
2043 }
2044 check_display = 0;
14e40288 2045 if (check_invisible && PT > BEGV && PT < ZV)
7e16ef60 2046 {
14e40288
SM
2047 int inv, ellipsis = 0;
2048 beg = end = PT;
2049
2050 /* Find boundaries `beg' and `end' of the invisible area, if any. */
2051 while (end < ZV
0a0e7d49
CY
2052#if 0
2053 /* FIXME: We should stop if we find a spot between
2054 two runs of `invisible' where inserted text would
2055 be visible. This is important when we have two
2056 invisible boundaries that enclose an area: if the
2057 area is empty, we need this test in order to make
2058 it possible to place point in the middle rather
2059 than skip both boundaries. However, this code
2060 also stops anywhere in a non-sticky text-property,
2061 which breaks (e.g.) Org mode. */
51d861de
SM
2062 && (val = get_pos_property (make_number (end),
2063 Qinvisible, Qnil),
2064 TEXT_PROP_MEANS_INVISIBLE (val))
0a0e7d49 2065#endif
14e40288
SM
2066 && !NILP (val = get_char_property_and_overlay
2067 (make_number (end), Qinvisible, Qnil, &overlay))
2068 && (inv = TEXT_PROP_MEANS_INVISIBLE (val)))
2069 {
2070 ellipsis = ellipsis || inv > 1
2071 || (OVERLAYP (overlay)
2072 && (!NILP (Foverlay_get (overlay, Qafter_string))
2073 || !NILP (Foverlay_get (overlay, Qbefore_string))));
2074 tmp = Fnext_single_char_property_change
2075 (make_number (end), Qinvisible, Qnil, Qnil);
2076 end = NATNUMP (tmp) ? XFASTINT (tmp) : ZV;
2077 }
2078 while (beg > BEGV
0a0e7d49 2079#if 0
51d861de
SM
2080 && (val = get_pos_property (make_number (beg),
2081 Qinvisible, Qnil),
2082 TEXT_PROP_MEANS_INVISIBLE (val))
0a0e7d49 2083#endif
14e40288
SM
2084 && !NILP (val = get_char_property_and_overlay
2085 (make_number (beg - 1), Qinvisible, Qnil, &overlay))
2086 && (inv = TEXT_PROP_MEANS_INVISIBLE (val)))
2087 {
2088 ellipsis = ellipsis || inv > 1
2089 || (OVERLAYP (overlay)
2090 && (!NILP (Foverlay_get (overlay, Qafter_string))
2091 || !NILP (Foverlay_get (overlay, Qbefore_string))));
2092 tmp = Fprevious_single_char_property_change
2093 (make_number (beg), Qinvisible, Qnil, Qnil);
2094 beg = NATNUMP (tmp) ? XFASTINT (tmp) : BEGV;
2095 }
c60ee5e7 2096
14e40288
SM
2097 /* Move away from the inside area. */
2098 if (beg < PT && end > PT)
2099 {
0bbdffbd
SM
2100 SET_PT ((orig_pt == PT && (last_pt < beg || last_pt > end))
2101 /* We haven't moved yet (so we don't need to fear
2102 infinite-looping) and we were outside the range
2103 before (so either end of the range still corresponds
2104 to a move in the right direction): pretend we moved
2105 less than we actually did, so that we still have
2106 more freedom below in choosing which end of the range
2107 to go to. */
9465a86c 2108 ? (orig_pt = -1, PT < last_pt ? end : beg)
0bbdffbd
SM
2109 /* We either have moved already or the last point
2110 was already in the range: we don't get to choose
2111 which end of the range we have to go to. */
2112 : (PT < last_pt ? beg : end));
14e40288
SM
2113 check_composition = check_display = 1;
2114 }
6b61353c
KH
2115#if 0 /* This assertion isn't correct, because SET_PT may end up setting
2116 the point to something other than its argument, due to
2117 point-motion hooks, intangibility, etc. */
14e40288 2118 xassert (PT == beg || PT == end);
6b61353c
KH
2119#endif
2120
2a026b04
KH
2121 /* Pretend the area doesn't exist if the buffer is not
2122 modified. */
2123 if (!modified && !ellipsis && beg < end)
14e40288
SM
2124 {
2125 if (last_pt == beg && PT == end && end < ZV)
2126 (check_composition = check_display = 1, SET_PT (end + 1));
2127 else if (last_pt == end && PT == beg && beg > BEGV)
2128 (check_composition = check_display = 1, SET_PT (beg - 1));
2129 else if (PT == ((PT < last_pt) ? beg : end))
2130 /* We've already moved as far as we can. Trying to go
2131 to the other end would mean moving backwards and thus
2132 could lead to an infinite loop. */
2133 ;
2134 else if (val = get_pos_property (make_number (PT),
2135 Qinvisible, Qnil),
2136 TEXT_PROP_MEANS_INVISIBLE (val)
2137 && (val = get_pos_property
2138 (make_number (PT == beg ? end : beg),
2139 Qinvisible, Qnil),
2140 !TEXT_PROP_MEANS_INVISIBLE (val)))
2141 (check_composition = check_display = 1,
2142 SET_PT (PT == beg ? end : beg));
2143 }
7e16ef60
SM
2144 }
2145 check_invisible = 0;
adf5cb9c
KH
2146 }
2147}
2148
0bc3db2b
RS
2149/* Subroutine for safe_run_hooks: run the hook HOOK. */
2150
2151static Lisp_Object
2152safe_run_hooks_1 (hook)
2153 Lisp_Object hook;
2154{
5e093f44
RS
2155 if (NILP (Vrun_hooks))
2156 return Qnil;
0bc3db2b
RS
2157 return call1 (Vrun_hooks, Vinhibit_quit);
2158}
2159
2160/* Subroutine for safe_run_hooks: handle an error by clearing out the hook. */
2161
2162static Lisp_Object
2163safe_run_hooks_error (data)
2164 Lisp_Object data;
2165{
adec392e
SM
2166 Lisp_Object args[3];
2167 args[0] = build_string ("Error in %s: %s");
2168 args[1] = Vinhibit_quit;
2169 args[2] = data;
2170 Fmessage (3, args);
30690496 2171 return Fset (Vinhibit_quit, Qnil);
0bc3db2b
RS
2172}
2173
1c9784c9
KH
2174/* If we get an error while running the hook, cause the hook variable
2175 to be nil. Also inhibit quits, so that C-g won't cause the hook
2176 to mysteriously evaporate. */
0bc3db2b 2177
68f297c5 2178void
1c9784c9 2179safe_run_hooks (hook)
a98ea3f9 2180 Lisp_Object hook;
1c9784c9 2181{
aed13378 2182 int count = SPECPDL_INDEX ();
0bc3db2b
RS
2183 specbind (Qinhibit_quit, hook);
2184
e702932d 2185 internal_condition_case (safe_run_hooks_1, Qt, safe_run_hooks_error);
1c9784c9
KH
2186
2187 unbind_to (count, Qnil);
2188}
8a9f5d3c 2189
284f4730 2190\f
8a9f5d3c
GM
2191/* Number of seconds between polling for input. This is a Lisp
2192 variable that can be bound. */
2193
31ade731 2194EMACS_INT polling_period;
284f4730 2195
eb8c3be9 2196/* Nonzero means polling for input is temporarily suppressed. */
8a9f5d3c 2197
284f4730
JB
2198int poll_suppress_count;
2199
8a9f5d3c
GM
2200/* Asynchronous timer for polling. */
2201
2202struct atimer *poll_timer;
2203
284f4730 2204
36922b18
RS
2205#ifdef POLL_FOR_INPUT
2206
c96169a0 2207/* Poll for input, so that we catch a C-g if it comes in. This
8a9f5d3c
GM
2208 function is called from x_make_frame_visible, see comment
2209 there. */
284f4730 2210
8a9f5d3c
GM
2211void
2212poll_for_input_1 ()
284f4730 2213{
c96169a0
AR
2214/* Tell ns_read_socket() it is being called asynchronously so it can avoid
2215 doing anything dangerous. */
2216#ifdef HAVE_NS
2217 ++handling_signal;
2218#endif
9ac0d9e0
JB
2219 if (interrupt_input_blocked == 0
2220 && !waiting_for_input)
2221 read_avail_input (0);
c96169a0
AR
2222#ifdef HAVE_NS
2223 --handling_signal;
2224#endif
284f4730
JB
2225}
2226
8a9f5d3c
GM
2227/* Timer callback function for poll_timer. TIMER is equal to
2228 poll_timer. */
2229
2230void
2231poll_for_input (timer)
2232 struct atimer *timer;
2233{
2234 if (poll_suppress_count == 0)
ceb18827 2235 {
a42bf890 2236#ifdef SYNC_INPUT
ceb18827
CY
2237 interrupt_input_pending = 1;
2238 pending_signals = 1;
a42bf890 2239#else
ceb18827 2240 poll_for_input_1 ();
a42bf890 2241#endif
ceb18827 2242 }
8a9f5d3c
GM
2243}
2244
2245#endif /* POLL_FOR_INPUT */
284f4730
JB
2246
2247/* Begin signals to poll for input, if they are appropriate.
2248 This function is called unconditionally from various places. */
2249
07a59269 2250void
284f4730
JB
2251start_polling ()
2252{
2253#ifdef POLL_FOR_INPUT
428a555e
KL
2254 /* XXX This condition was (read_socket_hook && !interrupt_input),
2255 but read_socket_hook is not global anymore. Let's pretend that
2256 it's always set. */
2257 if (!interrupt_input)
284f4730 2258 {
8a9f5d3c
GM
2259 /* Turn alarm handling on unconditionally. It might have
2260 been turned off in process.c. */
2261 turn_on_atimers (1);
c60ee5e7 2262
8a9f5d3c
GM
2263 /* If poll timer doesn't exist, are we need one with
2264 a different interval, start a new one. */
2265 if (poll_timer == NULL
2266 || EMACS_SECS (poll_timer->interval) != polling_period)
284f4730 2267 {
8a9f5d3c
GM
2268 EMACS_TIME interval;
2269
2270 if (poll_timer)
2271 cancel_atimer (poll_timer);
c60ee5e7 2272
8a9f5d3c
GM
2273 EMACS_SET_SECS_USECS (interval, polling_period, 0);
2274 poll_timer = start_atimer (ATIMER_CONTINUOUS, interval,
2275 poll_for_input, NULL);
284f4730 2276 }
8a9f5d3c
GM
2277
2278 /* Let the timer's callback function poll for input
2279 if this becomes zero. */
2280 --poll_suppress_count;
284f4730
JB
2281 }
2282#endif
2283}
2284
1d3195db
RS
2285/* Nonzero if we are using polling to handle input asynchronously. */
2286
2287int
2288input_polling_used ()
2289{
2290#ifdef POLL_FOR_INPUT
428a555e
KL
2291 /* XXX This condition was (read_socket_hook && !interrupt_input),
2292 but read_socket_hook is not global anymore. Let's pretend that
2293 it's always set. */
2294 return !interrupt_input;
1d3195db
RS
2295#else
2296 return 0;
2297#endif
2298}
2299
284f4730
JB
2300/* Turn off polling. */
2301
07a59269 2302void
284f4730
JB
2303stop_polling ()
2304{
2305#ifdef POLL_FOR_INPUT
428a555e
KL
2306 /* XXX This condition was (read_socket_hook && !interrupt_input),
2307 but read_socket_hook is not global anymore. Let's pretend that
2308 it's always set. */
2309 if (!interrupt_input)
8a9f5d3c 2310 ++poll_suppress_count;
284f4730
JB
2311#endif
2312}
fe8aeef3
RS
2313
2314/* Set the value of poll_suppress_count to COUNT
2315 and start or stop polling accordingly. */
2316
2317void
2318set_poll_suppress_count (count)
2319 int count;
2320{
2321#ifdef POLL_FOR_INPUT
2322 if (count == 0 && poll_suppress_count != 0)
2323 {
2324 poll_suppress_count = 1;
2325 start_polling ();
2326 }
2327 else if (count != 0 && poll_suppress_count == 0)
2328 {
2329 stop_polling ();
2330 }
2331 poll_suppress_count = count;
2332#endif
2333}
f4eef8b4 2334
d0a57728
RS
2335/* Bind polling_period to a value at least N.
2336 But don't decrease it. */
2337
07a59269 2338void
f4eef8b4
RS
2339bind_polling_period (n)
2340 int n;
2341{
2342#ifdef POLL_FOR_INPUT
d0a57728
RS
2343 int new = polling_period;
2344
2345 if (n > new)
2346 new = n;
2347
6fe007f7 2348 stop_other_atimers (poll_timer);
f4eef8b4 2349 stop_polling ();
d0a57728
RS
2350 specbind (Qpolling_period, make_number (new));
2351 /* Start a new alarm with the new period. */
f4eef8b4
RS
2352 start_polling ();
2353#endif
2354}
284f4730 2355\f
6da3dd3a
RS
2356/* Apply the control modifier to CHARACTER. */
2357
faf5e407
JB
2358int
2359make_ctrl_char (c)
2360 int c;
2361{
d205953b
JB
2362 /* Save the upper bits here. */
2363 int upper = c & ~0177;
2364
a32aad64
KH
2365 if (! ASCII_BYTE_P (c))
2366 return c |= ctrl_modifier;
2367
d205953b
JB
2368 c &= 0177;
2369
2370 /* Everything in the columns containing the upper-case letters
2371 denotes a control character. */
2372 if (c >= 0100 && c < 0140)
2373 {
2374 int oc = c;
2375 c &= ~0140;
2376 /* Set the shift modifier for a control char
2377 made from a shifted letter. But only for letters! */
2378 if (oc >= 'A' && oc <= 'Z')
2379 c |= shift_modifier;
2380 }
2381
2382 /* The lower-case letters denote control characters too. */
2383 else if (c >= 'a' && c <= 'z')
2384 c &= ~0140;
2385
2386 /* Include the bits for control and shift
2387 only if the basic ASCII code can't indicate them. */
2388 else if (c >= ' ')
2389 c |= ctrl_modifier;
2390
2391 /* Replace the high bits. */
2392 c |= (upper & ~ctrl_modifier);
faf5e407
JB
2393
2394 return c;
2395}
2396
bb8c4865
RS
2397/* Display the help-echo property of the character after the mouse pointer.
2398 Either show it in the echo area, or call show-help-function to display
2399 it by other means (maybe in a tooltip).
d4e68eea 2400
bb8c4865 2401 If HELP is nil, that means clear the previous help echo.
d4e68eea 2402
bb8c4865
RS
2403 If HELP is a string, display that string. If HELP is a function,
2404 call it with OBJECT and POS as arguments; the function should
2405 return a help string or nil for none. For all other types of HELP,
2406 evaluate it to obtain a string.
8dfd92c9 2407
2190735a
GM
2408 WINDOW is the window in which the help was generated, if any.
2409 It is nil if not in a window.
2410
5b2ec2d0
GM
2411 If OBJECT is a buffer, POS is the position in the buffer where the
2412 `help-echo' text property was found.
2413
2414 If OBJECT is an overlay, that overlay has a `help-echo' property,
2415 and POS is the position in the overlay's buffer under the mouse.
2416
2417 If OBJECT is a string (an overlay string or a string displayed with
2418 the `display' property). POS is the position in that string under
2419 the mouse.
d4e68eea 2420
27fd22dc 2421 OK_TO_OVERWRITE_KEYSTROKE_ECHO non-zero means it's okay if the help
d4e68eea
GM
2422 echo overwrites a keystroke echo currently displayed in the echo
2423 area.
2424
8dfd92c9
GM
2425 Note: this function may only be called with HELP nil or a string
2426 from X code running asynchronously. */
d4e68eea 2427
31f84d03 2428void
2190735a
GM
2429show_help_echo (help, window, object, pos, ok_to_overwrite_keystroke_echo)
2430 Lisp_Object help, window, object, pos;
adc84f48 2431 int ok_to_overwrite_keystroke_echo;
31f84d03 2432{
8dfd92c9 2433 if (!NILP (help) && !STRINGP (help))
d4e68eea 2434 {
8dfd92c9
GM
2435 if (FUNCTIONP (help))
2436 {
2190735a 2437 Lisp_Object args[4];
8dfd92c9 2438 args[0] = help;
2190735a
GM
2439 args[1] = window;
2440 args[2] = object;
2441 args[3] = pos;
1db0076e 2442 help = safe_call (4, args);
8dfd92c9
GM
2443 }
2444 else
1db0076e 2445 help = safe_eval (help);
c60ee5e7 2446
8dfd92c9 2447 if (!STRINGP (help))
d4e68eea 2448 return;
31f84d03
SM
2449 }
2450
ae372f41 2451#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
c22237f7 2452 if (!noninteractive && STRINGP (help))
c5b76d6c
CY
2453 {
2454 /* The mouse-fixup-help-message Lisp function can call
2455 mouse_position_hook, which resets the mouse_moved flags.
2456 This causes trouble if we are trying to read a mouse motion
2457 event (i.e., if we are inside a `track-mouse' form), so we
2458 restore the mouse_moved flag. */
2459 FRAME_PTR f = NILP (do_mouse_tracking) ? NULL : some_mouse_moved ();
2460 help = call1 (Qmouse_fixup_help_message, help);
2461 if (f)
2462 f->mouse_moved = 1;
2463 }
c22237f7
KS
2464#endif
2465
8dfd92c9 2466 if (STRINGP (help) || NILP (help))
d4e68eea
GM
2467 {
2468 if (!NILP (Vshow_help_function))
8dfd92c9 2469 call1 (Vshow_help_function, help);
5295a500 2470 help_echo_showing_p = STRINGP (help);
d4e68eea 2471 }
31f84d03
SM
2472}
2473
faf5e407
JB
2474
2475\f
284f4730
JB
2476/* Input of single characters from keyboard */
2477
2478Lisp_Object print_help ();
2479static Lisp_Object kbd_buffer_get_event ();
e4fe371d 2480static void record_char ();
284f4730 2481
638d3da0
CY
2482static Lisp_Object help_form_saved_window_configs;
2483static Lisp_Object
63c125ab 2484read_char_help_form_unwind (Lisp_Object arg)
638d3da0
CY
2485{
2486 Lisp_Object window_config = XCAR (help_form_saved_window_configs);
2487 help_form_saved_window_configs = XCDR (help_form_saved_window_configs);
2488 if (!NILP (window_config))
2489 Fset_window_configuration (window_config);
2490 return Qnil;
2491}
2492
184c3d81
RS
2493#define STOP_POLLING \
2494do { if (! polling_stopped_here) stop_polling (); \
2495 polling_stopped_here = 1; } while (0)
2496
2497#define RESUME_POLLING \
2498do { if (polling_stopped_here) start_polling (); \
2499 polling_stopped_here = 0; } while (0)
2500
284f4730
JB
2501/* read a character from the keyboard; call the redisplay if needed */
2502/* commandflag 0 means do not do auto-saving, but do do redisplay.
2503 -1 means do not do redisplay, but do do autosaving.
2504 1 means do both. */
2505
7d6de002
RS
2506/* The arguments MAPS and NMAPS are for menu prompting.
2507 MAPS is an array of keymaps; NMAPS is the length of MAPS.
2508
2509 PREV_EVENT is the previous input event, or nil if we are reading
b638f328
RS
2510 the first event of a key sequence (or not reading a key sequence).
2511 If PREV_EVENT is t, that is a "magic" value that says
2512 not to run input methods, but in other respects to act as if
2513 not reading a key sequence.
7d6de002 2514
83d68044 2515 If USED_MOUSE_MENU is non-null, then we set *USED_MOUSE_MENU to 1
6569cc8d 2516 if we used a mouse menu to read the input, or zero otherwise. If
83d68044 2517 USED_MOUSE_MENU is null, we don't dereference it.
dcc408a0 2518
9688ff53 2519 Value is -2 when we find input on another keyboard. A second call
033b73e2 2520 to read_char will read it.
9688ff53 2521
179f689c
CY
2522 If END_TIME is non-null, it is a pointer to an EMACS_TIME
2523 specifying the maximum time to wait until. If no input arrives by
2524 that time, stop waiting and return nil.
2525
dcc408a0 2526 Value is t if we showed a menu and the user rejected it. */
7d6de002 2527
284f4730 2528Lisp_Object
179f689c 2529read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu, end_time)
284f4730 2530 int commandflag;
7d6de002
RS
2531 int nmaps;
2532 Lisp_Object *maps;
2533 Lisp_Object prev_event;
2534 int *used_mouse_menu;
179f689c 2535 EMACS_TIME *end_time;
284f4730 2536{
8c907a56 2537 volatile Lisp_Object c;
092869b9 2538 int count, jmpcount;
410d4de9 2539 jmp_buf local_getcjmp;
284f4730 2540 jmp_buf save_jump;
8c907a56 2541 volatile int key_already_recorded = 0;
017c7cb6 2542 Lisp_Object tem, save;
8c907a56
GM
2543 volatile Lisp_Object previous_echo_area_message;
2544 volatile Lisp_Object also_record;
2545 volatile int reread;
d5eecefb 2546 struct gcpro gcpro1, gcpro2;
184c3d81 2547 int polling_stopped_here = 0;
b3e6f69c 2548 struct kboard *orig_kboard = current_kboard;
7c3bc944 2549
e4fe371d 2550 also_record = Qnil;
284f4730 2551
22b94eeb 2552#if 0 /* This was commented out as part of fixing echo for C-u left. */
71918b75
RS
2553 before_command_key_count = this_command_key_count;
2554 before_command_echo_length = echo_length ();
22b94eeb 2555#endif
ef6661f7 2556 c = Qnil;
7ee32cda 2557 previous_echo_area_message = Qnil;
71918b75 2558
7ee32cda 2559 GCPRO2 (c, previous_echo_area_message);
7c3bc944 2560
7f07d5ca
RS
2561 retry:
2562
7d18f9ae
RS
2563 reread = 0;
2564 if (CONSP (Vunread_post_input_method_events))
284f4730 2565 {
7539e11f 2566 c = XCAR (Vunread_post_input_method_events);
7d18f9ae 2567 Vunread_post_input_method_events
7539e11f 2568 = XCDR (Vunread_post_input_method_events);
284f4730 2569
2479e91e
RS
2570 /* Undo what read_char_x_menu_prompt did when it unread
2571 additional keys returned by Fx_popup_menu. */
2572 if (CONSP (c)
7539e11f
KR
2573 && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c)))
2574 && NILP (XCDR (c)))
2575 c = XCAR (c);
2479e91e 2576
7d18f9ae
RS
2577 reread = 1;
2578 goto reread_first;
284f4730
JB
2579 }
2580
86e5706b
RS
2581 if (unread_command_char != -1)
2582 {
18cd2eeb 2583 XSETINT (c, unread_command_char);
86e5706b
RS
2584 unread_command_char = -1;
2585
7d18f9ae
RS
2586 reread = 1;
2587 goto reread_first;
2588 }
2589
2590 if (CONSP (Vunread_command_events))
2591 {
a41240a3
MR
2592 int was_disabled = 0;
2593
7539e11f
KR
2594 c = XCAR (Vunread_command_events);
2595 Vunread_command_events = XCDR (Vunread_command_events);
7d18f9ae 2596
96f4f7ec
KS
2597 reread = 1;
2598
2599 /* Undo what sit-for did when it unread additional keys
2600 inside universal-argument. */
2601
2602 if (CONSP (c)
2603 && EQ (XCAR (c), Qt))
2604 {
2605 reread = 0;
2606 c = XCDR (c);
2607 }
2608
7d18f9ae
RS
2609 /* Undo what read_char_x_menu_prompt did when it unread
2610 additional keys returned by Fx_popup_menu. */
2611 if (CONSP (c)
f4e05d97
GM
2612 && EQ (XCDR (c), Qdisabled)
2613 && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c))))
a41240a3
MR
2614 {
2615 was_disabled = 1;
2616 c = XCAR (c);
2617 }
c60ee5e7 2618
d17e49a8
GM
2619 /* If the queued event is something that used the mouse,
2620 set used_mouse_menu accordingly. */
2621 if (used_mouse_menu
a41240a3
MR
2622 /* Also check was_disabled so last-nonmenu-event won't return
2623 a bad value when submenus are involved. (Bug#447) */
2624 && (EQ (c, Qtool_bar) || EQ (c, Qmenu_bar) || was_disabled))
d17e49a8 2625 *used_mouse_menu = 1;
c60ee5e7 2626
7d18f9ae
RS
2627 goto reread_for_input_method;
2628 }
2629
2630 if (CONSP (Vunread_input_method_events))
2631 {
7539e11f
KR
2632 c = XCAR (Vunread_input_method_events);
2633 Vunread_input_method_events = XCDR (Vunread_input_method_events);
7d18f9ae
RS
2634
2635 /* Undo what read_char_x_menu_prompt did when it unread
2636 additional keys returned by Fx_popup_menu. */
2637 if (CONSP (c)
7539e11f
KR
2638 && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c)))
2639 && NILP (XCDR (c)))
2640 c = XCAR (c);
7d18f9ae
RS
2641 reread = 1;
2642 goto reread_for_input_method;
86e5706b
RS
2643 }
2644
63020c46
RS
2645 this_command_key_count_reset = 0;
2646
ce0d2858 2647 if (!NILP (Vexecuting_kbd_macro))
284f4730 2648 {
fce33686
JB
2649 /* We set this to Qmacro; since that's not a frame, nobody will
2650 try to switch frames on us, and the selected window will
2651 remain unchanged.
2652
2653 Since this event came from a macro, it would be misleading to
eb8c3be9 2654 leave internal_last_event_frame set to wherever the last
3c370943
JB
2655 real event came from. Normally, a switch-frame event selects
2656 internal_last_event_frame after each command is read, but
2657 events read from a macro should never cause a new frame to be
2658 selected. */
4c52b668 2659 Vlast_event_frame = internal_last_event_frame = Qmacro;
fce33686 2660
663258f2
JB
2661 /* Exit the macro if we are at the end.
2662 Also, some things replace the macro with t
2663 to force an early exit. */
ce0d2858 2664 if (EQ (Vexecuting_kbd_macro, Qt)
649d952d 2665 || executing_kbd_macro_index >= XFASTINT (Flength (Vexecuting_kbd_macro)))
284f4730 2666 {
18cd2eeb 2667 XSETINT (c, -1);
184c3d81 2668 goto exit;
284f4730 2669 }
df0f2ba1 2670
649d952d 2671 c = Faref (Vexecuting_kbd_macro, make_number (executing_kbd_macro_index));
ce0d2858 2672 if (STRINGP (Vexecuting_kbd_macro)
d5161e8c 2673 && (XINT (c) & 0x80) && (XUINT (c) <= 0xff))
bb9e9bed 2674 XSETFASTINT (c, CHAR_META | (XINT (c) & ~0x80));
86e5706b 2675
649d952d 2676 executing_kbd_macro_index++;
284f4730
JB
2677
2678 goto from_macro;
2679 }
2680
cd21b839
JB
2681 if (!NILP (unread_switch_frame))
2682 {
2683 c = unread_switch_frame;
2684 unread_switch_frame = Qnil;
2685
2686 /* This event should make it into this_command_keys, and get echoed
7d18f9ae 2687 again, so we do not set `reread'. */
f4255cd1 2688 goto reread_first;
cd21b839
JB
2689 }
2690
adc1d5c8 2691 /* if redisplay was requested */
6e4e64a8
RS
2692 if (commandflag >= 0)
2693 {
0975aa24 2694 int echo_current = EQ (echo_message_buffer, echo_area_buffer[0]);
94f9b406 2695
adc1d5c8
RS
2696 /* If there is pending input, process any events which are not
2697 user-visible, such as X selection_request events. */
6e4e64a8
RS
2698 if (input_pending
2699 || detect_input_pending_run_timers (0))
adc1d5c8 2700 swallow_events (0); /* may clear input_pending */
6e4e64a8 2701
adc1d5c8
RS
2702 /* Redisplay if no pending input. */
2703 while (!input_pending)
2704 {
5295a500 2705 if (help_echo_showing_p && !EQ (selected_window, minibuf_window))
3007ebfb 2706 redisplay_preserve_echo_area (5);
5295a500
GM
2707 else
2708 redisplay ();
adc1d5c8
RS
2709
2710 if (!input_pending)
2711 /* Normal case: no input arrived during redisplay. */
2712 break;
2713
2714 /* Input arrived and pre-empted redisplay.
2715 Process any events which are not user-visible. */
2716 swallow_events (0);
2717 /* If that cleared input_pending, try again to redisplay. */
2718 }
94f9b406
RS
2719
2720 /* Prevent the redisplay we just did
2721 from messing up echoing of the input after the prompt. */
2722 if (commandflag == 0 && echo_current)
2723 echo_message_buffer = echo_area_buffer[0];
2724
6e4e64a8 2725 }
e9bf89a0 2726
59a84f8e 2727 /* Message turns off echoing unless more keystrokes turn it on again.
c60ee5e7 2728
59a84f8e
GM
2729 The code in 20.x for the condition was
2730
2731 1. echo_area_glyphs && *echo_area_glyphs
2732 2. && echo_area_glyphs != current_kboard->echobuf
2733 3. && ok_to_echo_at_next_pause != echo_area_glyphs
2734
2735 (1) means there's a current message displayed
c60ee5e7 2736
59a84f8e
GM
2737 (2) means it's not the message from echoing from the current
2738 kboard.
c60ee5e7 2739
59a84f8e
GM
2740 (3) There's only one place in 20.x where ok_to_echo_at_next_pause
2741 is set to a non-null value. This is done in read_char and it is
2742 set to echo_area_glyphs after a call to echo_char. That means
2743 ok_to_echo_at_next_pause is either null or
2744 current_kboard->echobuf with the appropriate current_kboard at
2745 that time.
2746
2747 So, condition (3) means in clear text ok_to_echo_at_next_pause
2748 must be either null, or the current message isn't from echoing at
2749 all, or it's from echoing from a different kboard than the
2750 current one. */
c60ee5e7 2751
27fd22dc 2752 if (/* There currently is something in the echo area. */
985f9f66 2753 !NILP (echo_area_buffer[0])
59a84f8e
GM
2754 && (/* And it's either not from echoing. */
2755 !EQ (echo_area_buffer[0], echo_message_buffer)
2756 /* Or it's an echo from a different kboard. */
2757 || echo_kboard != current_kboard
2758 /* Or we explicitly allow overwriting whatever there is. */
2759 || ok_to_echo_at_next_pause == NULL))
7ee32cda 2760 cancel_echoing ();
410d4de9 2761 else
410d4de9 2762 echo_dash ();
c60ee5e7 2763
410d4de9
RS
2764 /* Try reading a character via menu prompting in the minibuf.
2765 Try this before the sit-for, because the sit-for
2766 would do the wrong thing if we are supposed to do
2767 menu prompting. If EVENT_HAS_PARAMETERS then we are reading
2768 after a mouse event so don't try a minibuf menu. */
2769 c = Qnil;
2770 if (nmaps > 0 && INTERACTIVE
2771 && !NILP (prev_event) && ! EVENT_HAS_PARAMETERS (prev_event)
2772 /* Don't bring up a menu if we already have another event. */
2773 && NILP (Vunread_command_events)
2774 && unread_command_char < 0
4ec4ed6a 2775 && !detect_input_pending_run_timers (0))
410d4de9
RS
2776 {
2777 c = read_char_minibuf_menu_prompt (commandflag, nmaps, maps);
9688ff53
KL
2778
2779 if (INTEGERP (c) && XINT (c) == -2)
2780 return c; /* wrong_kboard_jmpbuf */
2781
410d4de9
RS
2782 if (! NILP (c))
2783 {
2784 key_already_recorded = 1;
2785 goto non_reread_1;
2786 }
2787 }
284f4730 2788
410d4de9
RS
2789 /* Make a longjmp point for quits to use, but don't alter getcjmp just yet.
2790 We will do that below, temporarily for short sections of code,
2791 when appropriate. local_getcjmp must be in effect
2792 around any call to sit_for or kbd_buffer_get_event;
2793 it *must not* be in effect when we call redisplay. */
284f4730 2794
092869b9 2795 jmpcount = SPECPDL_INDEX ();
410d4de9 2796 if (_setjmp (local_getcjmp))
284f4730 2797 {
d6805803 2798 /* Handle quits while reading the keyboard. */
dfbfad25
RS
2799 /* We must have saved the outer value of getcjmp here,
2800 so restore it now. */
2801 restore_getcjmp (save_jump);
092869b9 2802 unbind_to (jmpcount, Qnil);
18cd2eeb 2803 XSETINT (c, quit_char);
788f89eb 2804 internal_last_event_frame = selected_frame;
4c52b668 2805 Vlast_event_frame = internal_last_event_frame;
04904c29
RS
2806 /* If we report the quit char as an event,
2807 don't do so more than once. */
2808 if (!NILP (Vinhibit_quit))
2809 Vquit_flag = Qnil;
284f4730 2810
df0f2ba1 2811 {
788f89eb 2812 KBOARD *kb = FRAME_KBOARD (XFRAME (selected_frame));
c5fdd383 2813 if (kb != current_kboard)
df0f2ba1 2814 {
f3fbd155 2815 Lisp_Object link = kb->kbd_queue;
1e8bd3da
RS
2816 /* We shouldn't get here if we were in single-kboard mode! */
2817 if (single_kboard)
df0f2ba1 2818 abort ();
f3fbd155
KR
2819 if (CONSP (link))
2820 {
2821 while (CONSP (XCDR (link)))
2822 link = XCDR (link);
2823 if (!NILP (XCDR (link)))
2824 abort ();
2825 }
2826 if (!CONSP (link))
2827 kb->kbd_queue = Fcons (c, Qnil);
2828 else
2829 XSETCDR (link, Fcons (c, Qnil));
c5fdd383
KH
2830 kb->kbd_queue_has_data = 1;
2831 current_kboard = kb;
ef6661f7
RS
2832 /* This is going to exit from read_char
2833 so we had better get rid of this frame's stuff. */
2834 UNGCPRO;
9688ff53 2835 return make_number (-2); /* wrong_kboard_jmpbuf */
df0f2ba1
KH
2836 }
2837 }
284f4730
JB
2838 goto non_reread;
2839 }
2840
3236e6b8
CY
2841 /* Start idle timers if no time limit is supplied. We don't do it
2842 if a time limit is supplied to avoid an infinite recursion in the
2843 situation where an idle timer calls `sit-for'. */
70282fce 2844
3236e6b8 2845 if (!end_time)
70282fce 2846 timer_start_idle ();
d9d4c147 2847
284f4730
JB
2848 /* If in middle of key sequence and minibuffer not active,
2849 start echoing if enough time elapses. */
410d4de9 2850
c60ee5e7 2851 if (minibuf_level == 0
179f689c 2852 && !end_time
7ee32cda 2853 && !current_kboard->immediate_echo
6c6083a9 2854 && this_command_key_count > 0
27203ead 2855 && ! noninteractive
f2647d04
DL
2856 && (FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
2857 && NILP (Fzerop (Vecho_keystrokes))
985f9f66
GM
2858 && (/* No message. */
2859 NILP (echo_area_buffer[0])
2860 /* Or empty message. */
2861 || (BUF_BEG (XBUFFER (echo_area_buffer[0]))
2862 == BUF_Z (XBUFFER (echo_area_buffer[0])))
2863 /* Or already echoing from same kboard. */
2864 || (echo_kboard && ok_to_echo_at_next_pause == echo_kboard)
2865 /* Or not echoing before and echoing allowed. */
2866 || (!echo_kboard && ok_to_echo_at_next_pause)))
284f4730 2867 {
7d6de002
RS
2868 /* After a mouse event, start echoing right away.
2869 This is because we are probably about to display a menu,
2870 and we don't want to delay before doing so. */
dbc4e1c1 2871 if (EVENT_HAS_PARAMETERS (prev_event))
3dbd9ee4 2872 echo_now ();
7d6de002
RS
2873 else
2874 {
666dc232
KS
2875 Lisp_Object tem0;
2876
410d4de9
RS
2877 save_getcjmp (save_jump);
2878 restore_getcjmp (local_getcjmp);
666dc232 2879 tem0 = sit_for (Vecho_keystrokes, 1, 1);
410d4de9 2880 restore_getcjmp (save_jump);
303b5b3f
RS
2881 if (EQ (tem0, Qt)
2882 && ! CONSP (Vunread_command_events))
3dbd9ee4 2883 echo_now ();
7d6de002 2884 }
284f4730
JB
2885 }
2886
410d4de9 2887 /* Maybe auto save due to number of keystrokes. */
284f4730
JB
2888
2889 if (commandflag != 0
2890 && auto_save_interval > 0
c43b1734 2891 && num_nonmacro_input_events - last_auto_save > max (auto_save_interval, 20)
4ec4ed6a 2892 && !detect_input_pending_run_timers (0))
284f4730 2893 {
284f4730 2894 Fdo_auto_save (Qnil, Qnil);
ef8fd672
RS
2895 /* Hooks can actually change some buffers in auto save. */
2896 redisplay ();
284f4730
JB
2897 }
2898
8150596a 2899 /* Try reading using an X menu.
24597608
RS
2900 This is never confused with reading using the minibuf
2901 because the recursive call of read_char in read_char_minibuf_menu_prompt
2902 does not pass on any keymaps. */
410d4de9 2903
24597608 2904 if (nmaps > 0 && INTERACTIVE
5a8d99e0
KH
2905 && !NILP (prev_event)
2906 && EVENT_HAS_PARAMETERS (prev_event)
7539e11f
KR
2907 && !EQ (XCAR (prev_event), Qmenu_bar)
2908 && !EQ (XCAR (prev_event), Qtool_bar)
24597608
RS
2909 /* Don't bring up a menu if we already have another event. */
2910 && NILP (Vunread_command_events)
b8556aee 2911 && unread_command_char < 0)
8eb4d8ef
RS
2912 {
2913 c = read_char_x_menu_prompt (nmaps, maps, prev_event, used_mouse_menu);
2914
2915 /* Now that we have read an event, Emacs is not idle. */
3236e6b8
CY
2916 if (!end_time)
2917 timer_stop_idle ();
8eb4d8ef 2918
184c3d81 2919 goto exit;
8eb4d8ef 2920 }
7d6de002 2921
410d4de9
RS
2922 /* Maybe autosave and/or garbage collect due to idleness. */
2923
26c1639e 2924 if (INTERACTIVE && NILP (c))
7d6de002
RS
2925 {
2926 int delay_level, buffer_size;
2927
410d4de9
RS
2928 /* Slow down auto saves logarithmically in size of current buffer,
2929 and garbage collect while we're at it. */
7d6de002
RS
2930 if (! MINI_WINDOW_P (XWINDOW (selected_window)))
2931 last_non_minibuf_size = Z - BEG;
2932 buffer_size = (last_non_minibuf_size >> 8) + 1;
2933 delay_level = 0;
2934 while (buffer_size > 64)
2935 delay_level++, buffer_size -= buffer_size >> 2;
2936 if (delay_level < 4) delay_level = 4;
2937 /* delay_level is 4 for files under around 50k, 7 at 100k,
2938 9 at 200k, 11 at 300k, and 12 at 500k. It is 15 at 1 meg. */
2939
2940 /* Auto save if enough time goes by without input. */
2941 if (commandflag != 0
c43b1734 2942 && num_nonmacro_input_events > last_auto_save
8c18cbfb 2943 && INTEGERP (Vauto_save_timeout)
7d6de002
RS
2944 && XINT (Vauto_save_timeout) > 0)
2945 {
2946 Lisp_Object tem0;
666dc232 2947 int timeout = delay_level * XFASTINT (Vauto_save_timeout) / 4;
410d4de9
RS
2948
2949 save_getcjmp (save_jump);
2950 restore_getcjmp (local_getcjmp);
666dc232 2951 tem0 = sit_for (make_number (timeout), 1, 1);
410d4de9
RS
2952 restore_getcjmp (save_jump);
2953
303b5b3f
RS
2954 if (EQ (tem0, Qt)
2955 && ! CONSP (Vunread_command_events))
7d6de002 2956 {
7d6de002 2957 Fdo_auto_save (Qnil, Qnil);
7d6de002
RS
2958
2959 /* If we have auto-saved and there is still no input
2960 available, garbage collect if there has been enough
2961 consing going on to make it worthwhile. */
4ec4ed6a 2962 if (!detect_input_pending_run_timers (0)
c8e16a02 2963 && consing_since_gc > gc_cons_threshold / 2)
ef8fd672 2964 Fgarbage_collect ();
410d4de9 2965
ef8fd672 2966 redisplay ();
7d6de002
RS
2967 }
2968 }
2969 }
284f4730 2970
67ddbec3
KL
2971 /* Notify the caller if an autosave hook, or a timer, sentinel or
2972 filter in the sit_for calls above have changed the current
2973 kboard. This could happen if they use the minibuffer or start a
2974 recursive edit, like the fancy splash screen in server.el's
2975 filter. If this longjmp wasn't here, read_key_sequence would
2976 interpret the next key sequence using the wrong translation
2977 tables and function keymaps. */
b3e6f69c
KL
2978 if (NILP (c) && current_kboard != orig_kboard)
2979 {
2980 UNGCPRO;
9688ff53 2981 return make_number (-2); /* wrong_kboard_jmpbuf */
b3e6f69c
KL
2982 }
2983
303b5b3f
RS
2984 /* If this has become non-nil here, it has been set by a timer
2985 or sentinel or filter. */
2986 if (CONSP (Vunread_command_events))
2987 {
7539e11f
KR
2988 c = XCAR (Vunread_command_events);
2989 Vunread_command_events = XCDR (Vunread_command_events);
303b5b3f
RS
2990 }
2991
410d4de9
RS
2992 /* Read something from current KBOARD's side queue, if possible. */
2993
beecf6a1 2994 if (NILP (c))
1e12dd87 2995 {
c5fdd383 2996 if (current_kboard->kbd_queue_has_data)
beecf6a1 2997 {
c5fdd383 2998 if (!CONSP (current_kboard->kbd_queue))
4524b161 2999 abort ();
7539e11f 3000 c = XCAR (current_kboard->kbd_queue);
c5fdd383 3001 current_kboard->kbd_queue
7539e11f 3002 = XCDR (current_kboard->kbd_queue);
c5fdd383
KH
3003 if (NILP (current_kboard->kbd_queue))
3004 current_kboard->kbd_queue_has_data = 0;
d9d4c147 3005 input_pending = readable_events (0);
4c52b668
KH
3006 if (EVENT_HAS_PARAMETERS (c)
3007 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qswitch_frame))
7539e11f 3008 internal_last_event_frame = XCAR (XCDR (c));
4c52b668 3009 Vlast_event_frame = internal_last_event_frame;
beecf6a1 3010 }
1e8bd3da
RS
3011 }
3012
1e8bd3da
RS
3013 /* If current_kboard's side queue is empty check the other kboards.
3014 If one of them has data that we have not yet seen here,
3015 switch to it and process the data waiting for it.
3016
3017 Note: if the events queued up for another kboard
3018 have already been seen here, and therefore are not a complete command,
3019 the kbd_queue_has_data field is 0, so we skip that kboard here.
3020 That's to avoid an infinite loop switching between kboards here. */
3021 if (NILP (c) && !single_kboard)
3022 {
3023 KBOARD *kb;
3024 for (kb = all_kboards; kb; kb = kb->next_kboard)
3025 if (kb->kbd_queue_has_data)
3026 {
3027 current_kboard = kb;
ef6661f7
RS
3028 /* This is going to exit from read_char
3029 so we had better get rid of this frame's stuff. */
3030 UNGCPRO;
9688ff53 3031 return make_number (-2); /* wrong_kboard_jmpbuf */
1e8bd3da
RS
3032 }
3033 }
df0f2ba1 3034
410d4de9
RS
3035 wrong_kboard:
3036
184c3d81 3037 STOP_POLLING;
410d4de9 3038
1e8bd3da
RS
3039 /* Finally, we read from the main queue,
3040 and if that gives us something we can't use yet, we put it on the
3041 appropriate side queue and try again. */
410d4de9 3042
1e8bd3da
RS
3043 if (NILP (c))
3044 {
3045 KBOARD *kb;
3046
179f689c
CY
3047 if (end_time)
3048 {
3049 EMACS_TIME now;
3050 EMACS_GET_TIME (now);
3051 if (EMACS_TIME_GE (now, *end_time))
3052 goto exit;
3053 }
3054
1e8bd3da 3055 /* Actually read a character, waiting if necessary. */
410d4de9
RS
3056 save_getcjmp (save_jump);
3057 restore_getcjmp (local_getcjmp);
3236e6b8 3058 if (!end_time)
70282fce 3059 timer_start_idle ();
179f689c 3060 c = kbd_buffer_get_event (&kb, used_mouse_menu, end_time);
410d4de9
RS
3061 restore_getcjmp (save_jump);
3062
410d4de9 3063 if (! NILP (c) && (kb != current_kboard))
1e8bd3da 3064 {
f3fbd155
KR
3065 Lisp_Object link = kb->kbd_queue;
3066 if (CONSP (link))
3067 {
3068 while (CONSP (XCDR (link)))
3069 link = XCDR (link);
3070 if (!NILP (XCDR (link)))
3071 abort ();
3072 }
3073 if (!CONSP (link))
3074 kb->kbd_queue = Fcons (c, Qnil);
3075 else
3076 XSETCDR (link, Fcons (c, Qnil));
1e8bd3da 3077 kb->kbd_queue_has_data = 1;
46b84797 3078 c = Qnil;
1e8bd3da
RS
3079 if (single_kboard)
3080 goto wrong_kboard;
3081 current_kboard = kb;
ef6661f7
RS
3082 /* This is going to exit from read_char
3083 so we had better get rid of this frame's stuff. */
3084 UNGCPRO;
9688ff53 3085 return make_number (-2);
df0f2ba1 3086 }
beecf6a1 3087 }
1e8bd3da 3088
284f4730 3089 /* Terminate Emacs in batch mode if at eof. */
8c18cbfb 3090 if (noninteractive && INTEGERP (c) && XINT (c) < 0)
284f4730
JB
3091 Fkill_emacs (make_number (1));
3092
8c18cbfb 3093 if (INTEGERP (c))
80645119
JB
3094 {
3095 /* Add in any extra modifiers, where appropriate. */
3096 if ((extra_keyboard_modifiers & CHAR_CTL)
3097 || ((extra_keyboard_modifiers & 0177) < ' '
3098 && (extra_keyboard_modifiers & 0177) != 0))
faf5e407 3099 XSETINT (c, make_ctrl_char (XINT (c)));
80645119
JB
3100
3101 /* Transfer any other modifier bits directly from
3102 extra_keyboard_modifiers to c. Ignore the actual character code
3103 in the low 16 bits of extra_keyboard_modifiers. */
b8d9050d 3104 XSETINT (c, XINT (c) | (extra_keyboard_modifiers & ~0xff7f & ~CHAR_CTL));
80645119 3105 }
9fa4395d 3106
284f4730
JB
3107 non_reread:
3108
3236e6b8
CY
3109 if (!end_time)
3110 timer_stop_idle ();
184c3d81 3111 RESUME_POLLING;
284f4730 3112
410d4de9
RS
3113 if (NILP (c))
3114 {
3115 if (commandflag >= 0
4ec4ed6a 3116 && !input_pending && !detect_input_pending_run_timers (0))
410d4de9
RS
3117 redisplay ();
3118
3119 goto wrong_kboard;
3120 }
3121
3122 non_reread_1:
3123
dfd11da7 3124 /* Buffer switch events are only for internal wakeups
7c3bc944
RS
3125 so don't show them to the user.
3126 Also, don't record a key if we already did. */
3127 if (BUFFERP (c) || key_already_recorded)
184c3d81 3128 goto exit;
a1341f75 3129
7f07d5ca
RS
3130 /* Process special events within read_char
3131 and loop around to read another event. */
017c7cb6
RS
3132 save = Vquit_flag;
3133 Vquit_flag = Qnil;
02067692 3134 tem = access_keymap (get_keymap (Vspecial_event_map, 0, 1), c, 0, 0, 1);
017c7cb6 3135 Vquit_flag = save;
7f07d5ca
RS
3136
3137 if (!NILP (tem))
3138 {
b3e6f69c 3139#if 0 /* This shouldn't be necessary anymore. --lorentey */
ba8dfba8 3140 int was_locked = single_kboard;
b3e6f69c
KL
3141 int count = SPECPDL_INDEX ();
3142 record_single_kboard_state ();
3143#endif
033b73e2 3144
4b09796d
GM
3145 last_input_event = c;
3146 Fcommand_execute (tem, Qnil, Fvector (1, &last_input_event), Qt);
ba8dfba8 3147
3236e6b8 3148 if (CONSP (c) && EQ (XCAR (c), Qselect_window) && !end_time)
5d12f14d
EZ
3149 /* We stopped being idle for this event; undo that. This
3150 prevents automatic window selection (under
0b9a1d3d 3151 mouse_autoselect_window from acting as a real input event, for
5d12f14d 3152 example banishing the mouse under mouse-avoidance-mode. */
5c12e63f 3153 timer_resume_idle ();
5d12f14d 3154
b3e6f69c 3155#if 0 /* This shouldn't be necessary anymore. --lorentey */
ba8dfba8
RS
3156 /* Resume allowing input from any kboard, if that was true before. */
3157 if (!was_locked)
3158 any_kboard_state ();
b3e6f69c
KL
3159 unbind_to (count, Qnil);
3160#endif
ba8dfba8 3161
7f07d5ca
RS
3162 goto retry;
3163 }
3164
284f4730 3165 /* Handle things that only apply to characters. */
8c18cbfb 3166 if (INTEGERP (c))
284f4730
JB
3167 {
3168 /* If kbd_buffer_get_event gave us an EOF, return that. */
86e5706b 3169 if (XINT (c) == -1)
184c3d81 3170 goto exit;
284f4730 3171
2e478293
KL
3172 if ((STRINGP (current_kboard->Vkeyboard_translate_table)
3173 && SCHARS (current_kboard->Vkeyboard_translate_table) > (unsigned) XFASTINT (c))
3174 || (VECTORP (current_kboard->Vkeyboard_translate_table)
3175 && XVECTOR (current_kboard->Vkeyboard_translate_table)->size > (unsigned) XFASTINT (c))
3176 || (CHAR_TABLE_P (current_kboard->Vkeyboard_translate_table)
dbcf4347 3177 && CHARACTERP (c)))
f9414d62
RS
3178 {
3179 Lisp_Object d;
2e478293 3180 d = Faref (current_kboard->Vkeyboard_translate_table, c);
f9414d62
RS
3181 /* nil in keyboard-translate-table means no translation. */
3182 if (!NILP (d))
3183 c = d;
3184 }
284f4730
JB
3185 }
3186
e4fe371d
RS
3187 /* If this event is a mouse click in the menu bar,
3188 return just menu-bar for now. Modify the mouse click event
3189 so we won't do this twice, then queue it up. */
3190 if (EVENT_HAS_PARAMETERS (c)
7539e11f 3191 && CONSP (XCDR (c))
e4fe371d 3192 && CONSP (EVENT_START (c))
7539e11f 3193 && CONSP (XCDR (EVENT_START (c))))
284f4730 3194 {
e4fe371d 3195 Lisp_Object posn;
284f4730 3196
6b61353c 3197 posn = POSN_POSN (EVENT_START (c));
e4fe371d
RS
3198 /* Handle menu-bar events:
3199 insert the dummy prefix event `menu-bar'. */
9ea173e8 3200 if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
e4fe371d
RS
3201 {
3202 /* Change menu-bar to (menu-bar) as the event "position". */
6b61353c 3203 POSN_SET_POSN (EVENT_START (c), Fcons (posn, Qnil));
284f4730 3204
e4fe371d
RS
3205 also_record = c;
3206 Vunread_command_events = Fcons (c, Vunread_command_events);
3207 c = posn;
284f4730 3208 }
284f4730
JB
3209 }
3210
7d18f9ae
RS
3211 /* Store these characters into recent_keys, the dribble file if any,
3212 and the keyboard macro being defined, if any. */
e4fe371d
RS
3213 record_char (c);
3214 if (! NILP (also_record))
3215 record_char (also_record);
51172b6d 3216
d5eecefb
RS
3217 /* Wipe the echo area.
3218 But first, if we are about to use an input method,
3219 save the echo area contents for it to refer to. */
3220 if (INTEGERP (c)
3221 && ! NILP (Vinput_method_function)
3222 && (unsigned) XINT (c) >= ' '
8d769115
KH
3223 && (unsigned) XINT (c) != 127
3224 && (unsigned) XINT (c) < 256)
7ee32cda
GM
3225 {
3226 previous_echo_area_message = Fcurrent_message ();
3227 Vinput_method_previous_message = previous_echo_area_message;
3228 }
d5eecefb 3229
1172eb8d
GM
3230 /* Now wipe the echo area, except for help events which do their
3231 own stuff with the echo area. */
4d2e9f95
GM
3232 if (!CONSP (c)
3233 || (!(EQ (Qhelp_echo, XCAR (c)))
3234 && !(EQ (Qswitch_frame, XCAR (c)))))
1172eb8d
GM
3235 {
3236 if (!NILP (echo_area_buffer[0]))
3237 safe_run_hooks (Qecho_area_clear_hook);
3238 clear_message (1, 0);
3239 }
d5eecefb 3240
7d18f9ae 3241 reread_for_input_method:
284f4730 3242 from_macro:
7d18f9ae 3243 /* Pass this to the input method, if appropriate. */
d5eecefb
RS
3244 if (INTEGERP (c)
3245 && ! NILP (Vinput_method_function)
b638f328
RS
3246 /* Don't run the input method within a key sequence,
3247 after the first event of the key sequence. */
3248 && NILP (prev_event)
d5eecefb 3249 && (unsigned) XINT (c) >= ' '
8d769115
KH
3250 && (unsigned) XINT (c) != 127
3251 && (unsigned) XINT (c) < 256)
d5eecefb 3252 {
c60ee5e7 3253 Lisp_Object keys;
63020c46 3254 int key_count, key_count_reset;
d5eecefb 3255 struct gcpro gcpro1;
aed13378 3256 int count = SPECPDL_INDEX ();
d5eecefb 3257
6e5742a0
RS
3258 /* Save the echo status. */
3259 int saved_immediate_echo = current_kboard->immediate_echo;
985f9f66 3260 struct kboard *saved_ok_to_echo = ok_to_echo_at_next_pause;
dc29116a 3261 Lisp_Object saved_echo_string = current_kboard->echo_string;
6e5742a0
RS
3262 int saved_echo_after_prompt = current_kboard->echo_after_prompt;
3263
22b94eeb 3264#if 0
6e5742a0
RS
3265 if (before_command_restore_flag)
3266 {
3267 this_command_key_count = before_command_key_count_1;
3268 if (this_command_key_count < this_single_command_key_start)
3269 this_single_command_key_start = this_command_key_count;
3270 echo_truncate (before_command_echo_length_1);
3271 before_command_restore_flag = 0;
3272 }
22b94eeb 3273#endif
6e5742a0
RS
3274
3275 /* Save the this_command_keys status. */
3276 key_count = this_command_key_count;
63020c46 3277 key_count_reset = this_command_key_count_reset;
6e5742a0
RS
3278
3279 if (key_count > 0)
3280 keys = Fcopy_sequence (this_command_keys);
3281 else
3282 keys = Qnil;
d5eecefb 3283 GCPRO1 (keys);
6e5742a0
RS
3284
3285 /* Clear out this_command_keys. */
3286 this_command_key_count = 0;
63020c46 3287 this_command_key_count_reset = 0;
6e5742a0
RS
3288
3289 /* Now wipe the echo area. */
985f9f66 3290 if (!NILP (echo_area_buffer[0]))
6e5742a0 3291 safe_run_hooks (Qecho_area_clear_hook);
985f9f66 3292 clear_message (1, 0);
6e5742a0
RS
3293 echo_truncate (0);
3294
b638f328
RS
3295 /* If we are not reading a key sequence,
3296 never use the echo area. */
3297 if (maps == 0)
3298 {
b638f328
RS
3299 specbind (Qinput_method_use_echo_area, Qt);
3300 }
3301
6e5742a0 3302 /* Call the input method. */
d5eecefb 3303 tem = call1 (Vinput_method_function, c);
b638f328
RS
3304
3305 tem = unbind_to (count, tem);
3306
6e5742a0
RS
3307 /* Restore the saved echoing state
3308 and this_command_keys state. */
3309 this_command_key_count = key_count;
63020c46 3310 this_command_key_count_reset = key_count_reset;
6e5742a0
RS
3311 if (key_count > 0)
3312 this_command_keys = keys;
3313
3314 cancel_echoing ();
3315 ok_to_echo_at_next_pause = saved_ok_to_echo;
dc29116a 3316 current_kboard->echo_string = saved_echo_string;
6e5742a0
RS
3317 current_kboard->echo_after_prompt = saved_echo_after_prompt;
3318 if (saved_immediate_echo)
3319 echo_now ();
3320
d5eecefb 3321 UNGCPRO;
6e5742a0 3322
d5eecefb
RS
3323 /* The input method can return no events. */
3324 if (! CONSP (tem))
7d18f9ae 3325 {
d5eecefb 3326 /* Bring back the previous message, if any. */
7ee32cda
GM
3327 if (! NILP (previous_echo_area_message))
3328 message_with_string ("%s", previous_echo_area_message, 0);
d5eecefb 3329 goto retry;
7d18f9ae 3330 }
d5eecefb 3331 /* It returned one event or more. */
7539e11f 3332 c = XCAR (tem);
d5eecefb 3333 Vunread_post_input_method_events
7539e11f 3334 = nconc2 (XCDR (tem), Vunread_post_input_method_events);
7d18f9ae 3335 }
7c3bc944 3336
7d18f9ae 3337 reread_first:
284f4730 3338
7ee32cda 3339 /* Display help if not echoing. */
1172eb8d 3340 if (CONSP (c) && EQ (XCAR (c), Qhelp_echo))
7ee32cda 3341 {
2190735a 3342 /* (help-echo FRAME HELP WINDOW OBJECT POS). */
d31053f9
RS
3343 Lisp_Object help, object, position, window, tem;
3344
3345 tem = Fcdr (XCDR (c));
3346 help = Fcar (tem);
3347 tem = Fcdr (tem);
3348 window = Fcar (tem);
3349 tem = Fcdr (tem);
3350 object = Fcar (tem);
3351 tem = Fcdr (tem);
3352 position = Fcar (tem);
3353
2190735a 3354 show_help_echo (help, window, object, position, 0);
fdbb67fe
GM
3355
3356 /* We stopped being idle for this event; undo that. */
3236e6b8
CY
3357 if (!end_time)
3358 timer_resume_idle ();
7ee32cda
GM
3359 goto retry;
3360 }
c60ee5e7 3361
4c0240d2
RS
3362 if ((! reread || this_command_key_count == 0
3363 || this_command_key_count_reset)
3364 && !end_time)
e4fe371d 3365 {
7d18f9ae
RS
3366
3367 /* Don't echo mouse motion events. */
f2647d04
DL
3368 if ((FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
3369 && NILP (Fzerop (Vecho_keystrokes))
7d18f9ae
RS
3370 && ! (EVENT_HAS_PARAMETERS (c)
3371 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_movement)))
3372 {
3373 echo_char (c);
3374 if (! NILP (also_record))
3375 echo_char (also_record);
3376 /* Once we reread a character, echoing can happen
3377 the next time we pause to read a new one. */
985f9f66 3378 ok_to_echo_at_next_pause = current_kboard;
7d18f9ae
RS
3379 }
3380
3381 /* Record this character as part of the current key. */
3382 add_command_key (c);
e4fe371d 3383 if (! NILP (also_record))
7d18f9ae 3384 add_command_key (also_record);
e4fe371d 3385 }
b8556aee 3386
4b09796d 3387 last_input_event = c;
c43b1734 3388 num_input_events++;
284f4730
JB
3389
3390 /* Process the help character specially if enabled */
ecb7cb34 3391 if (!NILP (Vhelp_form) && help_char_p (c))
284f4730
JB
3392 {
3393 Lisp_Object tem0;
aed13378 3394 count = SPECPDL_INDEX ();
284f4730 3395
638d3da0
CY
3396 help_form_saved_window_configs
3397 = Fcons (Fcurrent_window_configuration (Qnil),
3398 help_form_saved_window_configs);
3399 record_unwind_protect (read_char_help_form_unwind, Qnil);
284f4730
JB
3400
3401 tem0 = Feval (Vhelp_form);
8c18cbfb 3402 if (STRINGP (tem0))
284f4730
JB
3403 internal_with_output_to_temp_buffer ("*Help*", print_help, tem0);
3404
3405 cancel_echoing ();
3cb81011 3406 do
638d3da0
CY
3407 {
3408 c = read_char (0, 0, 0, Qnil, 0, NULL);
3409 if (EVENT_HAS_PARAMETERS (c)
3410 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_click))
3411 XSETCAR (help_form_saved_window_configs, Qnil);
3412 }
8c18cbfb 3413 while (BUFFERP (c));
ff11dfa1 3414 /* Remove the help from the frame */
284f4730 3415 unbind_to (count, Qnil);
410d4de9 3416
284f4730
JB
3417 redisplay ();
3418 if (EQ (c, make_number (040)))
3419 {
3420 cancel_echoing ();
3cb81011 3421 do
179f689c 3422 c = read_char (0, 0, 0, Qnil, 0, NULL);
8c18cbfb 3423 while (BUFFERP (c));
284f4730
JB
3424 }
3425 }
3426
184c3d81
RS
3427 exit:
3428 RESUME_POLLING;
7c3bc944 3429 RETURN_UNGCPRO (c);
284f4730
JB
3430}
3431
8eb4d8ef
RS
3432/* Record a key that came from a mouse menu.
3433 Record it for echoing, for this-command-keys, and so on. */
3434
3435static void
3436record_menu_key (c)
3437 Lisp_Object c;
3438{
3439 /* Wipe the echo area. */
985f9f66 3440 clear_message (1, 0);
8eb4d8ef
RS
3441
3442 record_char (c);
3443
22b94eeb 3444#if 0
8eb4d8ef
RS
3445 before_command_key_count = this_command_key_count;
3446 before_command_echo_length = echo_length ();
22b94eeb 3447#endif
8eb4d8ef
RS
3448
3449 /* Don't echo mouse motion events. */
f2647d04
DL
3450 if ((FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
3451 && NILP (Fzerop (Vecho_keystrokes)))
8eb4d8ef
RS
3452 {
3453 echo_char (c);
3454
3455 /* Once we reread a character, echoing can happen
3456 the next time we pause to read a new one. */
3457 ok_to_echo_at_next_pause = 0;
3458 }
3459
3460 /* Record this character as part of the current key. */
3461 add_command_key (c);
3462
3463 /* Re-reading in the middle of a command */
4b09796d 3464 last_input_event = c;
c43b1734 3465 num_input_events++;
8eb4d8ef
RS
3466}
3467
ecb7cb34
KH
3468/* Return 1 if should recognize C as "the help character". */
3469
3470int
3471help_char_p (c)
3472 Lisp_Object c;
3473{
3474 Lisp_Object tail;
3475
3476 if (EQ (c, Vhelp_char))
3477 return 1;
7539e11f
KR
3478 for (tail = Vhelp_event_list; CONSP (tail); tail = XCDR (tail))
3479 if (EQ (c, XCAR (tail)))
ecb7cb34
KH
3480 return 1;
3481 return 0;
3482}
3483
e4fe371d
RS
3484/* Record the input event C in various ways. */
3485
3486static void
3487record_char (c)
3488 Lisp_Object c;
3489{
090c68b9 3490 int recorded = 0;
52be17cc 3491
090c68b9
KS
3492 if (CONSP (c) && (EQ (XCAR (c), Qhelp_echo) || EQ (XCAR (c), Qmouse_movement)))
3493 {
3494 /* To avoid filling recent_keys with help-echo and mouse-movement
3495 events, we filter out repeated help-echo events, only store the
3496 first and last in a series of mouse-movement events, and don't
3497 store repeated help-echo events which are only separated by
3498 mouse-movement events. */
3499
3500 Lisp_Object ev1, ev2, ev3;
3501 int ix1, ix2, ix3;
c60ee5e7 3502
090c68b9
KS
3503 if ((ix1 = recent_keys_index - 1) < 0)
3504 ix1 = NUM_RECENT_KEYS - 1;
3505 ev1 = AREF (recent_keys, ix1);
c60ee5e7 3506
090c68b9
KS
3507 if ((ix2 = ix1 - 1) < 0)
3508 ix2 = NUM_RECENT_KEYS - 1;
3509 ev2 = AREF (recent_keys, ix2);
c60ee5e7 3510
090c68b9
KS
3511 if ((ix3 = ix2 - 1) < 0)
3512 ix3 = NUM_RECENT_KEYS - 1;
3513 ev3 = AREF (recent_keys, ix3);
c60ee5e7 3514
090c68b9
KS
3515 if (EQ (XCAR (c), Qhelp_echo))
3516 {
3517 /* Don't record `help-echo' in recent_keys unless it shows some help
a978004d 3518 message, and a different help than the previously recorded
090c68b9
KS
3519 event. */
3520 Lisp_Object help, last_help;
3521
3522 help = Fcar_safe (Fcdr_safe (XCDR (c)));
3523 if (!STRINGP (help))
3524 recorded = 1;
3525 else if (CONSP (ev1) && EQ (XCAR (ev1), Qhelp_echo)
3526 && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev1))), EQ (last_help, help)))
3527 recorded = 1;
3528 else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
3529 && CONSP (ev2) && EQ (XCAR (ev2), Qhelp_echo)
3530 && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev2))), EQ (last_help, help)))
3531 recorded = -1;
3532 else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
3533 && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
3534 && CONSP (ev3) && EQ (XCAR (ev3), Qhelp_echo)
3535 && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev3))), EQ (last_help, help)))
3536 recorded = -2;
3537 }
3538 else if (EQ (XCAR (c), Qmouse_movement))
52be17cc 3539 {
090c68b9
KS
3540 /* Only record one pair of `mouse-movement' on a window in recent_keys.
3541 So additional mouse movement events replace the last element. */
3542 Lisp_Object last_window, window;
3543
3544 window = Fcar_safe (Fcar_safe (XCDR (c)));
3545 if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
3546 && (last_window = Fcar_safe (Fcar_safe (XCDR (ev1))), EQ (last_window, window))
3547 && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
3548 && (last_window = Fcar_safe (Fcar_safe (XCDR (ev2))), EQ (last_window, window)))
52be17cc 3549 {
090c68b9
KS
3550 ASET (recent_keys, ix1, c);
3551 recorded = 1;
52be17cc
GM
3552 }
3553 }
3554 }
3555 else
090c68b9
KS
3556 store_kbd_macro_char (c);
3557
3558 if (!recorded)
e8a50785
GM
3559 {
3560 total_keys++;
3561 ASET (recent_keys, recent_keys_index, c);
3562 if (++recent_keys_index >= NUM_RECENT_KEYS)
3563 recent_keys_index = 0;
3564 }
090c68b9
KS
3565 else if (recorded < 0)
3566 {
3567 /* We need to remove one or two events from recent_keys.
3568 To do this, we simply put nil at those events and move the
3569 recent_keys_index backwards over those events. Usually,
3570 users will never see those nil events, as they will be
3571 overwritten by the command keys entered to see recent_keys
3572 (e.g. C-h l). */
3573
3574 while (recorded++ < 0 && total_keys > 0)
3575 {
3576 if (total_keys < NUM_RECENT_KEYS)
3577 total_keys--;
3578 if (--recent_keys_index < 0)
3579 recent_keys_index = NUM_RECENT_KEYS - 1;
3580 ASET (recent_keys, recent_keys_index, Qnil);
3581 }
3582 }
3583
3584 num_nonmacro_input_events++;
c60ee5e7 3585
e4fe371d
RS
3586 /* Write c to the dribble file. If c is a lispy event, write
3587 the event's symbol to the dribble file, in <brackets>. Bleaugh.
3588 If you, dear reader, have a better idea, you've got the source. :-) */
3589 if (dribble)
3590 {
34f5c10f 3591 BLOCK_INPUT;
e4fe371d
RS
3592 if (INTEGERP (c))
3593 {
3594 if (XUINT (c) < 0x100)
3595 putc (XINT (c), dribble);
3596 else
6de34814 3597 fprintf (dribble, " 0x%x", (int) XUINT (c));
e4fe371d
RS
3598 }
3599 else
3600 {
3601 Lisp_Object dribblee;
3602
3603 /* If it's a structured event, take the event header. */
3604 dribblee = EVENT_HEAD (c);
3605
3606 if (SYMBOLP (dribblee))
3607 {
3608 putc ('<', dribble);
d5db4077
KR
3609 fwrite (SDATA (SYMBOL_NAME (dribblee)), sizeof (char),
3610 SBYTES (SYMBOL_NAME (dribblee)),
e4fe371d
RS
3611 dribble);
3612 putc ('>', dribble);
3613 }
3614 }
3615
3616 fflush (dribble);
34f5c10f 3617 UNBLOCK_INPUT;
e4fe371d 3618 }
e4fe371d
RS
3619}
3620
284f4730
JB
3621Lisp_Object
3622print_help (object)
3623 Lisp_Object object;
3624{
622de3e9 3625 struct buffer *old = current_buffer;
284f4730 3626 Fprinc (object, Qnil);
622de3e9
KH
3627 set_buffer_internal (XBUFFER (Vstandard_output));
3628 call0 (intern ("help-mode"));
3629 set_buffer_internal (old);
284f4730
JB
3630 return Qnil;
3631}
3632
3633/* Copy out or in the info on where C-g should throw to.
3634 This is used when running Lisp code from within get_char,
3635 in case get_char is called recursively.
3636 See read_process_output. */
3637
dfcf069d 3638static void
284f4730
JB
3639save_getcjmp (temp)
3640 jmp_buf temp;
3641{
3642 bcopy (getcjmp, temp, sizeof getcjmp);
3643}
3644
dfcf069d 3645static void
284f4730
JB
3646restore_getcjmp (temp)
3647 jmp_buf temp;
3648{
3649 bcopy (temp, getcjmp, sizeof getcjmp);
3650}
284f4730 3651\f
a612e298
RS
3652/* Low level keyboard/mouse input.
3653 kbd_buffer_store_event places events in kbd_buffer, and
0646c0dd 3654 kbd_buffer_get_event retrieves them. */
a612e298 3655
e0f24100 3656/* Return true if there are any events in the queue that read-char
a612e298
RS
3657 would return. If this returns false, a read-char would block. */
3658static int
a2d5fca0
JD
3659readable_events (flags)
3660 int flags;
a612e298 3661{
485db0ba
MA
3662#ifdef HAVE_DBUS
3663 /* Check whether a D-Bus message has arrived. */
3664 if (xd_pending_messages () > 0)
3665 return 1;
3666#endif /* HAVE_DBUS */
3667
a2d5fca0
JD
3668 if (flags & READABLE_EVENTS_DO_TIMERS_NOW)
3669 timer_check (1);
4ec4ed6a 3670
a2d5fca0
JD
3671 /* If the buffer contains only FOCUS_IN_EVENT events, and
3672 READABLE_EVENTS_FILTER_EVENTS is set, report it as empty. */
beecf6a1 3673 if (kbd_fetch_ptr != kbd_store_ptr)
a0ba8995 3674 {
354344a2
YM
3675 if (flags & (READABLE_EVENTS_FILTER_EVENTS
3676#ifdef USE_TOOLKIT_SCROLL_BARS
3677 | READABLE_EVENTS_IGNORE_SQUEEZABLES
3678#endif
3679 ))
20057d52
JD
3680 {
3681 struct input_event *event;
3682
3683 event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
3684 ? kbd_fetch_ptr
3685 : kbd_buffer);
3686
354344a2
YM
3687 do
3688 {
3689 if (!(
3690#ifdef USE_TOOLKIT_SCROLL_BARS
3691 (flags & READABLE_EVENTS_FILTER_EVENTS) &&
3692#endif
3693 event->kind == FOCUS_IN_EVENT)
3694#ifdef USE_TOOLKIT_SCROLL_BARS
3695 && !((flags & READABLE_EVENTS_IGNORE_SQUEEZABLES)
3696 && event->kind == SCROLL_BAR_CLICK_EVENT
3697 && event->part == scroll_bar_handle
3698 && event->modifiers == 0)
3699#endif
3700 )
3701 return 1;
3702 event++;
20057d52
JD
3703 if (event == kbd_buffer + KBD_BUFFER_SIZE)
3704 event = kbd_buffer;
354344a2
YM
3705 }
3706 while (event != kbd_store_ptr);
20057d52 3707 }
354344a2
YM
3708 else
3709 return 1;
a0ba8995
RS
3710 }
3711
ae372f41 3712#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
a2d5fca0
JD
3713 if (!(flags & READABLE_EVENTS_IGNORE_SQUEEZABLES)
3714 && !NILP (do_mouse_tracking) && some_mouse_moved ())
beecf6a1
KH
3715 return 1;
3716#endif
1e8bd3da 3717 if (single_kboard)
4c52b668 3718 {
c5fdd383 3719 if (current_kboard->kbd_queue_has_data)
4c52b668
KH
3720 return 1;
3721 }
3722 else
3723 {
c5fdd383
KH
3724 KBOARD *kb;
3725 for (kb = all_kboards; kb; kb = kb->next_kboard)
3726 if (kb->kbd_queue_has_data)
4c52b668
KH
3727 return 1;
3728 }
beecf6a1 3729 return 0;
a612e298
RS
3730}
3731
3732/* Set this for debugging, to have a way to get out */
3733int stop_character;
284f4730 3734
c5fdd383
KH
3735static KBOARD *
3736event_to_kboard (event)
5798cf15
KH
3737 struct input_event *event;
3738{
3739 Lisp_Object frame;
3740 frame = event->frame_or_window;
3741 if (CONSP (frame))
7539e11f 3742 frame = XCAR (frame);
5798cf15
KH
3743 else if (WINDOWP (frame))
3744 frame = WINDOW_FRAME (XWINDOW (frame));
3745
3746 /* There are still some events that don't set this field.
f5b56972
KH
3747 For now, just ignore the problem.
3748 Also ignore dead frames here. */
3749 if (!FRAMEP (frame) || !FRAME_LIVE_P (XFRAME (frame)))
5798cf15
KH
3750 return 0;
3751 else
c5fdd383 3752 return FRAME_KBOARD (XFRAME (frame));
5798cf15 3753}
5798cf15 3754
2a84c6da
KS
3755
3756Lisp_Object Vthrow_on_input;
3757
284f4730
JB
3758/* Store an event obtained at interrupt level into kbd_buffer, fifo */
3759
3760void
3761kbd_buffer_store_event (event)
3762 register struct input_event *event;
6b61353c
KH
3763{
3764 kbd_buffer_store_event_hold (event, 0);
3765}
3766
3767/* Store EVENT obtained at interrupt level into kbd_buffer, fifo.
3768
3769 If HOLD_QUIT is 0, just stuff EVENT into the fifo.
3770 Else, if HOLD_QUIT.kind != NO_EVENT, discard EVENT.
3771 Else, if EVENT is a quit event, store the quit event
3772 in HOLD_QUIT, and return (thus ignoring further events).
3773
3774 This is used in read_avail_input to postpone the processing
3775 of the quit event until all subsequent input events have been
3776 parsed (and discarded).
3777 */
3778
3779void
3780kbd_buffer_store_event_hold (event, hold_quit)
3781 register struct input_event *event;
3782 struct input_event *hold_quit;
284f4730 3783{
3b8f9651 3784 if (event->kind == NO_EVENT)
284f4730
JB
3785 abort ();
3786
6b61353c
KH
3787 if (hold_quit && hold_quit->kind != NO_EVENT)
3788 return;
3789
3b8f9651 3790 if (event->kind == ASCII_KEYSTROKE_EVENT)
284f4730 3791 {
e9bf89a0 3792 register int c = event->code & 0377;
284f4730 3793
faf5e407
JB
3794 if (event->modifiers & ctrl_modifier)
3795 c = make_ctrl_char (c);
3796
9fd7d808
RS
3797 c |= (event->modifiers
3798 & (meta_modifier | alt_modifier
3799 | hyper_modifier | super_modifier));
3800
86e5706b 3801 if (c == quit_char)
284f4730 3802 {
d6805803 3803 KBOARD *kb = FRAME_KBOARD (XFRAME (event->frame_or_window));
5798cf15
KH
3804 struct input_event *sp;
3805
d6805803 3806 if (single_kboard && kb != current_kboard)
5798cf15 3807 {
c5fdd383 3808 kb->kbd_queue
5798cf15
KH
3809 = Fcons (make_lispy_switch_frame (event->frame_or_window),
3810 Fcons (make_number (c), Qnil));
c5fdd383 3811 kb->kbd_queue_has_data = 1;
5798cf15
KH
3812 for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++)
3813 {
3814 if (sp == kbd_buffer + KBD_BUFFER_SIZE)
3815 sp = kbd_buffer;
3816
c5fdd383 3817 if (event_to_kboard (sp) == kb)
5798cf15 3818 {
3b8f9651 3819 sp->kind = NO_EVENT;
5798cf15 3820 sp->frame_or_window = Qnil;
da8f7368 3821 sp->arg = Qnil;
5798cf15
KH
3822 }
3823 }
3824 return;
3825 }
3e51c7b7 3826
6b61353c
KH
3827 if (hold_quit)
3828 {
3829 bcopy (event, (char *) hold_quit, sizeof (*event));
3830 return;
3831 }
3832
284f4730 3833 /* If this results in a quit_char being returned to Emacs as
3c370943 3834 input, set Vlast_event_frame properly. If this doesn't
284f4730 3835 get returned to Emacs as an event, the next event read
ff11dfa1 3836 will set Vlast_event_frame again, so this is safe to do. */
4bb994d1 3837 {
9b8eb840 3838 Lisp_Object focus;
4bb994d1 3839
9b8eb840 3840 focus = FRAME_FOCUS_FRAME (XFRAME (event->frame_or_window));
4bb994d1 3841 if (NILP (focus))
beecf6a1 3842 focus = event->frame_or_window;
4c52b668
KH
3843 internal_last_event_frame = focus;
3844 Vlast_event_frame = focus;
4bb994d1 3845 }
3e51c7b7 3846
ffd56f97 3847 last_event_timestamp = event->timestamp;
114a8b8c 3848 handle_interrupt ();
284f4730
JB
3849 return;
3850 }
3851
3852 if (c && c == stop_character)
3853 {
3854 sys_suspend ();
3855 return;
3856 }
284f4730 3857 }
3b8f9651 3858 /* Don't insert two BUFFER_SWITCH_EVENT's in a row.
3fe8e9a2 3859 Just ignore the second one. */
3b8f9651 3860 else if (event->kind == BUFFER_SWITCH_EVENT
3fe8e9a2 3861 && kbd_fetch_ptr != kbd_store_ptr
6b61353c
KH
3862 && ((kbd_store_ptr == kbd_buffer
3863 ? kbd_buffer + KBD_BUFFER_SIZE - 1
3864 : kbd_store_ptr - 1)->kind) == BUFFER_SWITCH_EVENT)
3fe8e9a2 3865 return;
284f4730 3866
beecf6a1
KH
3867 if (kbd_store_ptr - kbd_buffer == KBD_BUFFER_SIZE)
3868 kbd_store_ptr = kbd_buffer;
284f4730
JB
3869
3870 /* Don't let the very last slot in the buffer become full,
3871 since that would make the two pointers equal,
3872 and that is indistinguishable from an empty buffer.
3873 Discard the event if it would fill the last slot. */
beecf6a1 3874 if (kbd_fetch_ptr - 1 != kbd_store_ptr)
284f4730 3875 {
e3f6e7c7
KS
3876 *kbd_store_ptr = *event;
3877 ++kbd_store_ptr;
3878 }
2a84c6da 3879
85e7f477
RS
3880 /* If we're inside while-no-input, and this event qualifies
3881 as input, set quit-flag to cause an interrupt. */
2a84c6da
KS
3882 if (!NILP (Vthrow_on_input)
3883 && event->kind != FOCUS_IN_EVENT
3884 && event->kind != HELP_EVENT
b809d9e7 3885 && event->kind != DEICONIFY_EVENT)
85e7f477
RS
3886 {
3887 Vquit_flag = Vthrow_on_input;
3888 /* If we're inside a function that wants immediate quits,
3889 do it now. */
3890 if (immediate_quit && NILP (Vinhibit_quit))
3891 {
3892 immediate_quit = 0;
3893 sigfree ();
3894 QUIT;
3895 }
3896 }
e3f6e7c7 3897}
c60ee5e7 3898
da8f7368 3899
e3f6e7c7 3900/* Put an input event back in the head of the event queue. */
284f4730 3901
e3f6e7c7
KS
3902void
3903kbd_buffer_unget_event (event)
3904 register struct input_event *event;
3905{
3906 if (kbd_fetch_ptr == kbd_buffer)
3907 kbd_fetch_ptr = kbd_buffer + KBD_BUFFER_SIZE;
3908
3909 /* Don't let the very last slot in the buffer become full, */
3910 if (kbd_fetch_ptr - 1 != kbd_store_ptr)
3911 {
3912 --kbd_fetch_ptr;
3913 *kbd_fetch_ptr = *event;
284f4730
JB
3914 }
3915}
8dfd92c9
GM
3916
3917
f139e559 3918/* Generate HELP_EVENT input_events in BUFP which has room for
0bbfdc25
GM
3919 SIZE events. If there's not enough room in BUFP, ignore this
3920 event.
8dfd92c9
GM
3921
3922 HELP is the help form.
3923
3924 FRAME is the frame on which the help is generated. OBJECT is the
5b2ec2d0
GM
3925 Lisp object where the help was found (a buffer, a string, an
3926 overlay, or nil if neither from a string nor from a buffer. POS is
3927 the position within OBJECT where the help was found.
8dfd92c9
GM
3928
3929 Value is the number of input_events generated. */
3930
6b61353c
KH
3931void
3932gen_help_event (help, frame, window, object, pos)
2190735a 3933 Lisp_Object help, frame, object, window;
8dfd92c9
GM
3934 int pos;
3935{
6b61353c
KH
3936 struct input_event event;
3937
3938 EVENT_INIT (event);
3939
3940 event.kind = HELP_EVENT;
3941 event.frame_or_window = frame;
3942 event.arg = object;
3943 event.x = WINDOWP (window) ? window : frame;
3944 event.y = help;
3945 event.code = pos;
3946 kbd_buffer_store_event (&event);
8dfd92c9
GM
3947}
3948
3949
3950/* Store HELP_EVENTs for HELP on FRAME in the input queue. */
3951
3952void
3953kbd_buffer_store_help_event (frame, help)
3954 Lisp_Object frame, help;
3955{
3956 struct input_event event;
3957
3958 event.kind = HELP_EVENT;
3959 event.frame_or_window = frame;
3960 event.arg = Qnil;
2e1a49ad
SM
3961 event.x = Qnil;
3962 event.y = help;
8dfd92c9
GM
3963 event.code = 0;
3964 kbd_buffer_store_event (&event);
8dfd92c9
GM
3965}
3966
a612e298 3967\f
07de30b9 3968/* Discard any mouse events in the event buffer by setting them to
3b8f9651 3969 NO_EVENT. */
07de30b9
GV
3970void
3971discard_mouse_events ()
3972{
3973 struct input_event *sp;
3974 for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++)
3975 {
3976 if (sp == kbd_buffer + KBD_BUFFER_SIZE)
3977 sp = kbd_buffer;
3978
3b8f9651 3979 if (sp->kind == MOUSE_CLICK_EVENT
8006e4bb 3980 || sp->kind == WHEEL_EVENT
13899bc1 3981 || sp->kind == HORIZ_WHEEL_EVENT
e416374c
NR
3982#ifdef HAVE_GPM
3983 || sp->kind == GPM_CLICK_EVENT
07de30b9 3984#endif
3b8f9651 3985 || sp->kind == SCROLL_BAR_CLICK_EVENT)
07de30b9 3986 {
3b8f9651 3987 sp->kind = NO_EVENT;
07de30b9
GV
3988 }
3989 }
3990}
eeabfe76 3991
0bbfdc25
GM
3992
3993/* Return non-zero if there are any real events waiting in the event
3b8f9651 3994 buffer, not counting `NO_EVENT's.
0bbfdc25 3995
3b8f9651 3996 If DISCARD is non-zero, discard NO_EVENT events at the front of
0bbfdc25
GM
3997 the input queue, possibly leaving the input queue empty if there
3998 are no real input events. */
3999
eeabfe76
EZ
4000int
4001kbd_buffer_events_waiting (discard)
4002 int discard;
4003{
4004 struct input_event *sp;
c60ee5e7 4005
0bbfdc25 4006 for (sp = kbd_fetch_ptr;
3b8f9651 4007 sp != kbd_store_ptr && sp->kind == NO_EVENT;
0bbfdc25 4008 ++sp)
eeabfe76
EZ
4009 {
4010 if (sp == kbd_buffer + KBD_BUFFER_SIZE)
4011 sp = kbd_buffer;
eeabfe76 4012 }
0bbfdc25 4013
eeabfe76
EZ
4014 if (discard)
4015 kbd_fetch_ptr = sp;
0bbfdc25 4016
3b8f9651 4017 return sp != kbd_store_ptr && sp->kind != NO_EVENT;
eeabfe76 4018}
0bbfdc25 4019
07de30b9 4020\f
0bbfdc25
GM
4021/* Clear input event EVENT. */
4022
4023static INLINE void
4024clear_event (event)
4025 struct input_event *event;
4026{
3b8f9651 4027 event->kind = NO_EVENT;
0bbfdc25
GM
4028}
4029
4030
a612e298
RS
4031/* Read one event from the event buffer, waiting if necessary.
4032 The value is a Lisp object representing the event.
4033 The value is nil for an event that should be ignored,
4034 or that was handled here.
4035 We always read and discard one event. */
284f4730
JB
4036
4037static Lisp_Object
179f689c 4038kbd_buffer_get_event (kbp, used_mouse_menu, end_time)
410d4de9 4039 KBOARD **kbp;
83d68044 4040 int *used_mouse_menu;
179f689c 4041 EMACS_TIME *end_time;
284f4730
JB
4042{
4043 register int c;
4044 Lisp_Object obj;
4045
a3b1a468
DN
4046 if (noninteractive
4047 /* In case we are running as a daemon, only do this before
4048 detaching from the terminal. */
4049 || (IS_DAEMON && daemon_pipe[1] >= 0))
284f4730
JB
4050 {
4051 c = getchar ();
18cd2eeb 4052 XSETINT (obj, c);
f5b56972 4053 *kbp = current_kboard;
284f4730
JB
4054 return obj;
4055 }
4056
4057 /* Wait until there is input available. */
4058 for (;;)
4059 {
15d81484
MR
4060 /* Break loop if there's an unread command event. Needed in
4061 moused window autoselection which uses a timer to insert such
4062 events. */
4063 if (CONSP (Vunread_command_events))
4064 break;
033b73e2 4065
beecf6a1
KH
4066 if (kbd_fetch_ptr != kbd_store_ptr)
4067 break;
ae372f41 4068#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
f3253854 4069 if (!NILP (do_mouse_tracking) && some_mouse_moved ())
284f4730 4070 break;
beecf6a1 4071#endif
284f4730
JB
4072
4073 /* If the quit flag is set, then read_char will return
4074 quit_char, so that counts as "available input." */
4075 if (!NILP (Vquit_flag))
4076 quit_throw_to_read_char ();
4077
4078 /* One way or another, wait until input is available; then, if
4079 interrupt handlers have not read it, read it now. */
4080
284f4730
JB
4081/* Note SIGIO has been undef'd if FIONREAD is missing. */
4082#ifdef SIGIO
4083 gobble_input (0);
4084#endif /* SIGIO */
beecf6a1
KH
4085 if (kbd_fetch_ptr != kbd_store_ptr)
4086 break;
ae372f41 4087#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
f3253854 4088 if (!NILP (do_mouse_tracking) && some_mouse_moved ())
beecf6a1
KH
4089 break;
4090#endif
179f689c
CY
4091 if (end_time)
4092 {
4093 EMACS_TIME duration;
4094 EMACS_GET_TIME (duration);
6b657e42
EZ
4095 if (EMACS_TIME_GE (duration, *end_time))
4096 return Qnil; /* finished waiting */
179f689c 4097 else
6b657e42
EZ
4098 {
4099 EMACS_SUB_TIME (duration, *end_time, duration);
4100 wait_reading_process_output (EMACS_SECS (duration),
4101 EMACS_USECS (duration),
4102 -1, 1, Qnil, NULL, 0);
4103 }
179f689c
CY
4104 }
4105 else
d64b707c 4106 wait_reading_process_output (0, 0, -1, 1, Qnil, NULL, 0);
284f4730 4107
179f689c
CY
4108 if (!interrupt_input && kbd_fetch_ptr == kbd_store_ptr)
4109 /* Pass 1 for EXPECT since we just waited to have input. */
4110 read_avail_input (1);
284f4730
JB
4111 }
4112
303b5b3f
RS
4113 if (CONSP (Vunread_command_events))
4114 {
4115 Lisp_Object first;
7539e11f
KR
4116 first = XCAR (Vunread_command_events);
4117 Vunread_command_events = XCDR (Vunread_command_events);
303b5b3f
RS
4118 *kbp = current_kboard;
4119 return first;
4120 }
4121
284f4730
JB
4122 /* At this point, we know that there is a readable event available
4123 somewhere. If the event queue is empty, then there must be a
4124 mouse movement enabled and available. */
beecf6a1 4125 if (kbd_fetch_ptr != kbd_store_ptr)
284f4730 4126 {
cd21b839 4127 struct input_event *event;
3e51c7b7 4128
beecf6a1
KH
4129 event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
4130 ? kbd_fetch_ptr
4131 : kbd_buffer);
3e51c7b7 4132
cd21b839 4133 last_event_timestamp = event->timestamp;
cd21b839 4134
c5fdd383
KH
4135 *kbp = event_to_kboard (event);
4136 if (*kbp == 0)
4137 *kbp = current_kboard; /* Better than returning null ptr? */
beecf6a1 4138
4bb994d1
JB
4139 obj = Qnil;
4140
48e416d4 4141 /* These two kinds of events get special handling
a612e298
RS
4142 and don't actually appear to the command loop.
4143 We return nil for them. */
e3f6e7c7
KS
4144 if (event->kind == SELECTION_REQUEST_EVENT
4145 || event->kind == SELECTION_CLEAR_EVENT)
48e416d4 4146 {
598a9fa7 4147#ifdef HAVE_X11
1e8bd3da
RS
4148 struct input_event copy;
4149
4581e928
RS
4150 /* Remove it from the buffer before processing it,
4151 since otherwise swallow_events will see it
4152 and process it again. */
1e8bd3da 4153 copy = *event;
beecf6a1 4154 kbd_fetch_ptr = event + 1;
d9d4c147 4155 input_pending = readable_events (0);
e3f6e7c7 4156 x_handle_selection_event (&copy);
598a9fa7
JB
4157#else
4158 /* We're getting selection request events, but we don't have
4159 a window system. */
4160 abort ();
4161#endif
48e416d4
RS
4162 }
4163
8612b71a
AR
4164#if defined (HAVE_NS)
4165 else if (event->kind == NS_TEXT_EVENT)
4166 {
4167 if (event->code == KEY_NS_PUT_WORKING_TEXT)
4168 obj = Fcons (intern ("ns-put-working-text"), Qnil);
4169 else
4170 obj = Fcons (intern ("ns-unput-working-text"), Qnil);
4171 kbd_fetch_ptr = event + 1;
5acf9d90
AR
4172 if (used_mouse_menu)
4173 *used_mouse_menu = 1;
8612b71a
AR
4174 }
4175#endif
4176
9e2a2647 4177#if defined (HAVE_X11) || defined (HAVE_NTGUI) \
edfda783 4178 || defined (HAVE_NS)
3b8f9651 4179 else if (event->kind == DELETE_WINDOW_EVENT)
990acea3 4180 {
bbdc2092
RS
4181 /* Make an event (delete-frame (FRAME)). */
4182 obj = Fcons (event->frame_or_window, Qnil);
af17bd2b 4183 obj = Fcons (Qdelete_frame, Fcons (obj, Qnil));
beecf6a1 4184 kbd_fetch_ptr = event + 1;
af17bd2b 4185 }
1a578e9b 4186#endif
9e2a2647 4187#if defined (HAVE_X11) || defined (HAVE_NTGUI) \
edfda783 4188 || defined (HAVE_NS)
3b8f9651 4189 else if (event->kind == ICONIFY_EVENT)
af17bd2b
KH
4190 {
4191 /* Make an event (iconify-frame (FRAME)). */
4192 obj = Fcons (event->frame_or_window, Qnil);
4193 obj = Fcons (Qiconify_frame, Fcons (obj, Qnil));
beecf6a1 4194 kbd_fetch_ptr = event + 1;
af17bd2b 4195 }
3b8f9651 4196 else if (event->kind == DEICONIFY_EVENT)
af17bd2b
KH
4197 {
4198 /* Make an event (make-frame-visible (FRAME)). */
4199 obj = Fcons (event->frame_or_window, Qnil);
4200 obj = Fcons (Qmake_frame_visible, Fcons (obj, Qnil));
beecf6a1 4201 kbd_fetch_ptr = event + 1;
990acea3
RS
4202 }
4203#endif
3b8f9651 4204 else if (event->kind == BUFFER_SWITCH_EVENT)
a8015ab5
KH
4205 {
4206 /* The value doesn't matter here; only the type is tested. */
18cd2eeb 4207 XSETBUFFER (obj, current_buffer);
beecf6a1 4208 kbd_fetch_ptr = event + 1;
a8015ab5 4209 }
9e2a2647 4210#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
edfda783 4211 || defined(HAVE_NS) || defined (USE_GTK)
3b8f9651 4212 else if (event->kind == MENU_BAR_ACTIVATE_EVENT)
099787c1
RS
4213 {
4214 kbd_fetch_ptr = event + 1;
d9d4c147 4215 input_pending = readable_events (0);
e649d076
RS
4216 if (FRAME_LIVE_P (XFRAME (event->frame_or_window)))
4217 x_activate_menubar (XFRAME (event->frame_or_window));
099787c1 4218 }
1161d367 4219#endif
9e2a2647 4220#if defined (WINDOWSNT)
3b8f9651 4221 else if (event->kind == LANGUAGE_CHANGE_EVENT)
1161d367
GV
4222 {
4223 /* Make an event (language-change (FRAME CHARSET LCID)). */
d352abdf 4224 obj = Fcons (event->frame_or_window, Qnil);
1161d367
GV
4225 obj = Fcons (Qlanguage_change, Fcons (obj, Qnil));
4226 kbd_fetch_ptr = event + 1;
4227 }
099787c1 4228#endif
3b8f9651 4229 else if (event->kind == SAVE_SESSION_EVENT)
4ebc27a5
JD
4230 {
4231 obj = Fcons (Qsave_session, Qnil);
4232 kbd_fetch_ptr = event + 1;
4233 }
a612e298 4234 /* Just discard these, by returning nil.
c5fdd383 4235 With MULTI_KBOARD, these events are used as placeholders
5798cf15
KH
4236 when we need to randomly delete events from the queue.
4237 (They shouldn't otherwise be found in the buffer,
4238 but on some machines it appears they do show up
c5fdd383 4239 even without MULTI_KBOARD.) */
3b8f9651 4240 /* On Windows NT/9X, NO_EVENT is used to delete extraneous
07de30b9 4241 mouse events during a popup-menu call. */
3b8f9651 4242 else if (event->kind == NO_EVENT)
beecf6a1 4243 kbd_fetch_ptr = event + 1;
7ee32cda
GM
4244 else if (event->kind == HELP_EVENT)
4245 {
2190735a 4246 Lisp_Object object, position, help, frame, window;
e4457b09 4247
8dfd92c9
GM
4248 frame = event->frame_or_window;
4249 object = event->arg;
2e1a49ad
SM
4250 position = make_number (event->code);
4251 window = event->x;
4252 help = event->y;
0bbfdc25 4253 clear_event (event);
e4457b09
GM
4254
4255 kbd_fetch_ptr = event + 1;
2190735a
GM
4256 if (!WINDOWP (window))
4257 window = Qnil;
4258 obj = Fcons (Qhelp_echo,
4259 list5 (frame, help, window, object, position));
7ee32cda 4260 }
c51c7093
GM
4261 else if (event->kind == FOCUS_IN_EVENT)
4262 {
4263 /* Notification of a FocusIn event. The frame receiving the
4264 focus is in event->frame_or_window. Generate a
4265 switch-frame event if necessary. */
4266 Lisp_Object frame, focus;
4267
4268 frame = event->frame_or_window;
4269 focus = FRAME_FOCUS_FRAME (XFRAME (frame));
4270 if (FRAMEP (focus))
4271 frame = focus;
4272
4273 if (!EQ (frame, internal_last_event_frame)
4274 && !EQ (frame, selected_frame))
4275 obj = make_lispy_switch_frame (frame);
4276 internal_last_event_frame = frame;
4277 kbd_fetch_ptr = event + 1;
4278 }
033b73e2
MA
4279#ifdef HAVE_DBUS
4280 else if (event->kind == DBUS_EVENT)
4281 {
4282 obj = make_lispy_event (event);
4283 kbd_fetch_ptr = event + 1;
4284 }
4285#endif
1e12dd87
RS
4286 else
4287 {
c51c7093
GM
4288 /* If this event is on a different frame, return a switch-frame this
4289 time, and leave the event in the queue for next time. */
9b8eb840 4290 Lisp_Object frame;
1e12dd87 4291 Lisp_Object focus;
7b4aedb9 4292
9b8eb840 4293 frame = event->frame_or_window;
2470a66f 4294 if (CONSP (frame))
7539e11f 4295 frame = XCAR (frame);
2470a66f 4296 else if (WINDOWP (frame))
1e12dd87 4297 frame = WINDOW_FRAME (XWINDOW (frame));
4bb994d1 4298
1e12dd87
RS
4299 focus = FRAME_FOCUS_FRAME (XFRAME (frame));
4300 if (! NILP (focus))
4301 frame = focus;
07d2b8de 4302
4c52b668 4303 if (! EQ (frame, internal_last_event_frame)
788f89eb 4304 && !EQ (frame, selected_frame))
1e12dd87 4305 obj = make_lispy_switch_frame (frame);
4c52b668 4306 internal_last_event_frame = frame;
4bb994d1 4307
1e12dd87
RS
4308 /* If we didn't decide to make a switch-frame event, go ahead
4309 and build a real event from the queue entry. */
cd21b839 4310
1e12dd87
RS
4311 if (NILP (obj))
4312 {
4313 obj = make_lispy_event (event);
c60ee5e7 4314
9e2a2647 4315#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
edfda783 4316 || defined(HAVE_NS) || defined (USE_GTK)
83d68044
KH
4317 /* If this was a menu selection, then set the flag to inhibit
4318 writing to last_nonmenu_event. Don't do this if the event
4319 we're returning is (menu-bar), though; that indicates the
4320 beginning of the menu sequence, and we might as well leave
4321 that as the `event with parameters' for this selection. */
da8f7368
GM
4322 if (used_mouse_menu
4323 && !EQ (event->frame_or_window, event->arg)
4324 && (event->kind == MENU_BAR_EVENT
4325 || event->kind == TOOL_BAR_EVENT))
83d68044
KH
4326 *used_mouse_menu = 1;
4327#endif
83d92ee0
DR
4328#ifdef HAVE_NS
4329 /* certain system events are non-key events */
5acf9d90
AR
4330 if (used_mouse_menu
4331 && event->kind == NS_NONKEY_EVENT)
83d92ee0
DR
4332 *used_mouse_menu = 1;
4333#endif
1e12dd87
RS
4334
4335 /* Wipe out this event, to catch bugs. */
0bbfdc25 4336 clear_event (event);
beecf6a1 4337 kbd_fetch_ptr = event + 1;
1e12dd87 4338 }
4bb994d1 4339 }
284f4730 4340 }
ae372f41 4341#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
a612e298 4342 /* Try generating a mouse motion event. */
f3253854 4343 else if (!NILP (do_mouse_tracking) && some_mouse_moved ())
284f4730 4344 {
f3253854 4345 FRAME_PTR f = some_mouse_moved ();
7b4aedb9 4346 Lisp_Object bar_window;
3c370943 4347 enum scroll_bar_part part;
e5d77022
JB
4348 Lisp_Object x, y;
4349 unsigned long time;
284f4730 4350
c5fdd383 4351 *kbp = current_kboard;
6ed8eeff 4352 /* Note that this uses F to determine which terminal to look at.
e177ac3a
RS
4353 If there is no valid info, it does not store anything
4354 so x remains nil. */
4355 x = Qnil;
3b7fbceb 4356
c3b4957f 4357 /* XXX Can f or mouse_position_hook be NULL here? */
6ed8eeff
KL
4358 if (f && FRAME_TERMINAL (f)->mouse_position_hook)
4359 (*FRAME_TERMINAL (f)->mouse_position_hook) (&f, 0, &bar_window,
4360 &part, &x, &y, &time);
4bb994d1
JB
4361
4362 obj = Qnil;
284f4730 4363
4bb994d1
JB
4364 /* Decide if we should generate a switch-frame event. Don't
4365 generate switch-frame events for motion outside of all Emacs
4366 frames. */
e177ac3a 4367 if (!NILP (x) && f)
cd21b839 4368 {
9b8eb840 4369 Lisp_Object frame;
4bb994d1 4370
9b8eb840 4371 frame = FRAME_FOCUS_FRAME (f);
4bb994d1 4372 if (NILP (frame))
18cd2eeb 4373 XSETFRAME (frame, f);
4bb994d1 4374
4c52b668 4375 if (! EQ (frame, internal_last_event_frame)
788f89eb 4376 && !EQ (frame, selected_frame))
764cb3f9 4377 obj = make_lispy_switch_frame (frame);
4c52b668 4378 internal_last_event_frame = frame;
cd21b839 4379 }
4bb994d1 4380
df0f2ba1 4381 /* If we didn't decide to make a switch-frame event, go ahead and
4bb994d1 4382 return a mouse-motion event. */
e177ac3a 4383 if (!NILP (x) && NILP (obj))
7b4aedb9 4384 obj = make_lispy_movement (f, bar_window, part, x, y, time);
6cbff1cb 4385 }
ae372f41 4386#endif /* HAVE_MOUSE || HAVE GPM */
284f4730
JB
4387 else
4388 /* We were promised by the above while loop that there was
4389 something for us to read! */
4390 abort ();
4391
d9d4c147 4392 input_pending = readable_events (0);
284f4730 4393
4c52b668 4394 Vlast_event_frame = internal_last_event_frame;
3c370943 4395
284f4730
JB
4396 return (obj);
4397}
a612e298
RS
4398\f
4399/* Process any events that are not user-visible,
4400 then return, without reading any user-visible events. */
3a3b9632
RS
4401
4402void
d9d4c147
KH
4403swallow_events (do_display)
4404 int do_display;
3a3b9632 4405{
87dd9b9b
RS
4406 int old_timers_run;
4407
beecf6a1 4408 while (kbd_fetch_ptr != kbd_store_ptr)
3a3b9632
RS
4409 {
4410 struct input_event *event;
4411
beecf6a1
KH
4412 event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
4413 ? kbd_fetch_ptr
4414 : kbd_buffer);
3a3b9632
RS
4415
4416 last_event_timestamp = event->timestamp;
4417
4418 /* These two kinds of events get special handling
4419 and don't actually appear to the command loop. */
e3f6e7c7
KS
4420 if (event->kind == SELECTION_REQUEST_EVENT
4421 || event->kind == SELECTION_CLEAR_EVENT)
3a3b9632
RS
4422 {
4423#ifdef HAVE_X11
4581e928 4424 struct input_event copy;
e0301c07
RS
4425
4426 /* Remove it from the buffer before processing it,
4427 since otherwise swallow_events called recursively could see it
4428 and process it again. */
4581e928 4429 copy = *event;
beecf6a1 4430 kbd_fetch_ptr = event + 1;
d9d4c147 4431 input_pending = readable_events (0);
e3f6e7c7 4432 x_handle_selection_event (&copy);
3a3b9632
RS
4433#else
4434 /* We're getting selection request events, but we don't have
4435 a window system. */
4436 abort ();
4437#endif
4438 }
4439 else
4440 break;
4441 }
4442
87dd9b9b 4443 old_timers_run = timers_run;
a2d5fca0 4444 get_input_pending (&input_pending, READABLE_EVENTS_DO_TIMERS_NOW);
87dd9b9b
RS
4445
4446 if (timers_run != old_timers_run && do_display)
3007ebfb 4447 redisplay_preserve_echo_area (7);
3a3b9632 4448}
a612e298 4449\f
d9d4c147
KH
4450/* Record the start of when Emacs is idle,
4451 for the sake of running idle-time timers. */
4452
5c12e63f 4453static void
d9d4c147
KH
4454timer_start_idle ()
4455{
4456 Lisp_Object timers;
4457
4458 /* If we are already in the idle state, do nothing. */
4459 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4460 return;
4461
4462 EMACS_GET_TIME (timer_idleness_start_time);
4463
3021d3a9
RS
4464 timer_last_idleness_start_time = timer_idleness_start_time;
4465
d9d4c147 4466 /* Mark all idle-time timers as once again candidates for running. */
7539e11f 4467 for (timers = Vtimer_idle_list; CONSP (timers); timers = XCDR (timers))
d9d4c147
KH
4468 {
4469 Lisp_Object timer;
4470
7539e11f 4471 timer = XCAR (timers);
d9d4c147
KH
4472
4473 if (!VECTORP (timer) || XVECTOR (timer)->size != 8)
4474 continue;
4475 XVECTOR (timer)->contents[0] = Qnil;
4476 }
4477}
4478
4479/* Record that Emacs is no longer idle, so stop running idle-time timers. */
4480
5c12e63f 4481static void
d9d4c147
KH
4482timer_stop_idle ()
4483{
4484 EMACS_SET_SECS_USECS (timer_idleness_start_time, -1, -1);
4485}
4486
5c12e63f
KS
4487/* Resume idle timer from last idle start time. */
4488
4489static void
4490timer_resume_idle ()
4491{
4492 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4493 return;
4494
4495 timer_idleness_start_time = timer_last_idleness_start_time;
4496}
4497
e044e87c
RS
4498/* This is only for debugging. */
4499struct input_event last_timer_event;
4500
58555d81
SM
4501/* List of elisp functions to call, delayed because they were generated in
4502 a context where Elisp could not be safely run (e.g. redisplay, signal,
864660a2 4503 ...). Each element has the form (FUN . ARGS). */
58555d81
SM
4504Lisp_Object pending_funcalls;
4505
4506extern Lisp_Object Qapply;
4507
c04cbc3b
RS
4508/* Check whether a timer has fired. To prevent larger problems we simply
4509 disregard elements that are not proper timers. Do not make a circular
4510 timer list for the time being.
4511
e90292a9
JD
4512 Returns the time to wait until the next timer fires. If a
4513 timer is triggering now, return zero.
4514 If no timer is active, return -1.
c04cbc3b 4515
4ec4ed6a 4516 If a timer is ripe, we run it, with quitting turned off.
e90292a9
JD
4517 In that case we return 0 to indicate that a new timer_check_2 call
4518 should be done. */
4ec4ed6a 4519
e90292a9
JD
4520static EMACS_TIME
4521timer_check_2 ()
c04cbc3b
RS
4522{
4523 EMACS_TIME nexttime;
9291c072
RS
4524 EMACS_TIME now, idleness_now;
4525 Lisp_Object timers, idle_timers, chosen_timer;
9291c072 4526 struct gcpro gcpro1, gcpro2, gcpro3;
c04cbc3b 4527
c04cbc3b
RS
4528 EMACS_SET_SECS (nexttime, -1);
4529 EMACS_SET_USECS (nexttime, -1);
4530
9291c072 4531 /* Always consider the ordinary timers. */
7ea13e12 4532 timers = Vtimer_list;
9291c072
RS
4533 /* Consider the idle timers only if Emacs is idle. */
4534 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4535 idle_timers = Vtimer_idle_list;
4536 else
4537 idle_timers = Qnil;
4538 chosen_timer = Qnil;
4539 GCPRO3 (timers, idle_timers, chosen_timer);
7ea13e12 4540
58555d81
SM
4541 /* First run the code that was delayed. */
4542 while (CONSP (pending_funcalls))
4543 {
4544 Lisp_Object funcall = XCAR (pending_funcalls);
4545 pending_funcalls = XCDR (pending_funcalls);
4546 safe_call2 (Qapply, XCAR (funcall), XCDR (funcall));
4547 }
4548
9291c072 4549 if (CONSP (timers) || CONSP (idle_timers))
c04cbc3b 4550 {
9291c072
RS
4551 EMACS_GET_TIME (now);
4552 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4553 EMACS_SUB_TIME (idleness_now, now, timer_idleness_start_time);
4554 }
c04cbc3b 4555
9291c072
RS
4556 while (CONSP (timers) || CONSP (idle_timers))
4557 {
9291c072 4558 Lisp_Object *vector;
8c907a56 4559 Lisp_Object timer = Qnil, idle_timer = Qnil;
9291c072
RS
4560 EMACS_TIME timer_time, idle_timer_time;
4561 EMACS_TIME difference, timer_difference, idle_timer_difference;
4562
4563 /* Skip past invalid timers and timers already handled. */
4564 if (!NILP (timers))
c04cbc3b 4565 {
7539e11f 4566 timer = XCAR (timers);
9291c072
RS
4567 if (!VECTORP (timer) || XVECTOR (timer)->size != 8)
4568 {
7539e11f 4569 timers = XCDR (timers);
9291c072
RS
4570 continue;
4571 }
4572 vector = XVECTOR (timer)->contents;
d9d4c147 4573
9291c072
RS
4574 if (!INTEGERP (vector[1]) || !INTEGERP (vector[2])
4575 || !INTEGERP (vector[3])
4576 || ! NILP (vector[0]))
4577 {
7539e11f 4578 timers = XCDR (timers);
9291c072
RS
4579 continue;
4580 }
4581 }
4582 if (!NILP (idle_timers))
4583 {
7539e11f 4584 timer = XCAR (idle_timers);
d9d4c147 4585 if (!VECTORP (timer) || XVECTOR (timer)->size != 8)
9291c072 4586 {
7539e11f 4587 idle_timers = XCDR (idle_timers);
9291c072
RS
4588 continue;
4589 }
d9d4c147
KH
4590 vector = XVECTOR (timer)->contents;
4591
4592 if (!INTEGERP (vector[1]) || !INTEGERP (vector[2])
9291c072
RS
4593 || !INTEGERP (vector[3])
4594 || ! NILP (vector[0]))
4595 {
7539e11f 4596 idle_timers = XCDR (idle_timers);
9291c072
RS
4597 continue;
4598 }
4599 }
d9d4c147 4600
9291c072
RS
4601 /* Set TIMER, TIMER_TIME and TIMER_DIFFERENCE
4602 based on the next ordinary timer.
4603 TIMER_DIFFERENCE is the distance in time from NOW to when
4604 this timer becomes ripe (negative if it's already ripe). */
4605 if (!NILP (timers))
4606 {
7539e11f 4607 timer = XCAR (timers);
9291c072 4608 vector = XVECTOR (timer)->contents;
d9d4c147
KH
4609 EMACS_SET_SECS (timer_time,
4610 (XINT (vector[1]) << 16) | (XINT (vector[2])));
4611 EMACS_SET_USECS (timer_time, XINT (vector[3]));
9291c072
RS
4612 EMACS_SUB_TIME (timer_difference, timer_time, now);
4613 }
ba8dfba8 4614
9291c072
RS
4615 /* Set IDLE_TIMER, IDLE_TIMER_TIME and IDLE_TIMER_DIFFERENCE
4616 based on the next idle timer. */
4617 if (!NILP (idle_timers))
4618 {
7539e11f 4619 idle_timer = XCAR (idle_timers);
9291c072
RS
4620 vector = XVECTOR (idle_timer)->contents;
4621 EMACS_SET_SECS (idle_timer_time,
4622 (XINT (vector[1]) << 16) | (XINT (vector[2])));
4623 EMACS_SET_USECS (idle_timer_time, XINT (vector[3]));
4624 EMACS_SUB_TIME (idle_timer_difference, idle_timer_time, idleness_now);
4625 }
ba8dfba8 4626
9291c072
RS
4627 /* Decide which timer is the next timer,
4628 and set CHOSEN_TIMER, VECTOR and DIFFERENCE accordingly.
4629 Also step down the list where we found that timer. */
d9d4c147 4630
9291c072
RS
4631 if (! NILP (timers) && ! NILP (idle_timers))
4632 {
4633 EMACS_TIME temp;
4634 EMACS_SUB_TIME (temp, timer_difference, idle_timer_difference);
4635 if (EMACS_TIME_NEG_P (temp))
4636 {
4637 chosen_timer = timer;
7539e11f 4638 timers = XCDR (timers);
9291c072 4639 difference = timer_difference;
c04cbc3b 4640 }
d9d4c147 4641 else
d9d4c147 4642 {
9291c072 4643 chosen_timer = idle_timer;
7539e11f 4644 idle_timers = XCDR (idle_timers);
9291c072 4645 difference = idle_timer_difference;
d9d4c147 4646 }
7ea13e12 4647 }
9291c072
RS
4648 else if (! NILP (timers))
4649 {
4650 chosen_timer = timer;
7539e11f 4651 timers = XCDR (timers);
9291c072
RS
4652 difference = timer_difference;
4653 }
4654 else
4655 {
4656 chosen_timer = idle_timer;
7539e11f 4657 idle_timers = XCDR (idle_timers);
9291c072
RS
4658 difference = idle_timer_difference;
4659 }
4660 vector = XVECTOR (chosen_timer)->contents;
c60ee5e7 4661
bd55b860 4662 /* If timer is ripe, run it if it hasn't been run. */
9291c072
RS
4663 if (EMACS_TIME_NEG_P (difference)
4664 || (EMACS_SECS (difference) == 0
4665 && EMACS_USECS (difference) == 0))
4666 {
4667 if (NILP (vector[0]))
4668 {
331379bf 4669 int count = SPECPDL_INDEX ();
d0bbfc99 4670 Lisp_Object old_deactivate_mark = Vdeactivate_mark;
d925fb39 4671
9291c072
RS
4672 /* Mark the timer as triggered to prevent problems if the lisp
4673 code fails to reschedule it right. */
4674 vector[0] = Qt;
4675
d925fb39 4676 specbind (Qinhibit_quit, Qt);
c60ee5e7 4677
d925fb39 4678 call1 (Qtimer_event_handler, chosen_timer);
d0bbfc99 4679 Vdeactivate_mark = old_deactivate_mark;
d925fb39 4680 timers_run++;
d925fb39 4681 unbind_to (count, Qnil);
4ec4ed6a 4682
d925fb39
RS
4683 /* Since we have handled the event,
4684 we don't need to tell the caller to wake up and do it. */
e90292a9
JD
4685 /* But the caller must still wait for the next timer, so
4686 return 0 to indicate that. */
9291c072 4687 }
e90292a9
JD
4688
4689 EMACS_SET_SECS (nexttime, 0);
4690 EMACS_SET_USECS (nexttime, 0);
9291c072
RS
4691 }
4692 else
4693 /* When we encounter a timer that is still waiting,
4694 return the amount of time to wait before it is ripe. */
4695 {
4696 UNGCPRO;
9291c072
RS
4697 return difference;
4698 }
c04cbc3b 4699 }
9291c072 4700
7ea13e12
RS
4701 /* No timers are pending in the future. */
4702 /* Return 0 if we generated an event, and -1 if not. */
4703 UNGCPRO;
c04cbc3b
RS
4704 return nexttime;
4705}
ff458d81 4706
e90292a9
JD
4707
4708/* Check whether a timer has fired. To prevent larger problems we simply
4709 disregard elements that are not proper timers. Do not make a circular
4710 timer list for the time being.
4711
4712 Returns the time to wait until the next timer fires.
4713 If no timer is active, return -1.
4714
4715 As long as any timer is ripe, we run it.
4716
4717 DO_IT_NOW is now ignored. It used to mean that we should
4718 run the timer directly instead of queueing a timer-event.
4719 Now we always run timers directly. */
4720
4721EMACS_TIME
4722timer_check (do_it_now)
4723 int do_it_now;
4724{
4725 EMACS_TIME nexttime;
4726
4727 do
4728 {
4729 nexttime = timer_check_2 ();
4730 }
4731 while (EMACS_SECS (nexttime) == 0 && EMACS_USECS (nexttime) == 0);
4732
4733 return nexttime;
4734}
4735
ff458d81 4736DEFUN ("current-idle-time", Fcurrent_idle_time, Scurrent_idle_time, 0, 0, 0,
3a704bd7 4737 doc: /* Return the current length of Emacs idleness, or nil.
f761d6b6
JB
4738The value when Emacs is idle is a list of three integers. The first has
4739the most significant 16 bits of the seconds, while the second has the least
4740significant 16 bits. The third integer gives the microsecond count.
ff458d81 4741
3a704bd7
RS
4742The value when Emacs is not idle is nil.
4743
ff458d81
RS
4744The microsecond count is zero on systems that do not provide
4745resolution finer than a second. */)
4746 ()
4747{
ff458d81
RS
4748 if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
4749 {
966949b0 4750 EMACS_TIME now, idleness_now;
ff458d81 4751
966949b0
KS
4752 EMACS_GET_TIME (now);
4753 EMACS_SUB_TIME (idleness_now, now, timer_idleness_start_time);
ff458d81 4754
966949b0
KS
4755 return list3 (make_number ((EMACS_SECS (idleness_now) >> 16) & 0xffff),
4756 make_number ((EMACS_SECS (idleness_now) >> 0) & 0xffff),
4757 make_number (EMACS_USECS (idleness_now)));
ff458d81
RS
4758 }
4759
4760 return Qnil;
4761}
c04cbc3b 4762\f
284f4730 4763/* Caches for modify_event_symbol. */
e9bf89a0 4764static Lisp_Object accent_key_syms;
284f4730
JB
4765static Lisp_Object func_key_syms;
4766static Lisp_Object mouse_syms;
8006e4bb 4767static Lisp_Object wheel_syms;
a24dc617 4768static Lisp_Object drag_n_drop_syms;
284f4730 4769
e9bf89a0
RS
4770/* This is a list of keysym codes for special "accent" characters.
4771 It parallels lispy_accent_keys. */
4772
4773static int lispy_accent_codes[] =
4774{
79a7046c 4775#ifdef XK_dead_circumflex
e9bf89a0 4776 XK_dead_circumflex,
79a7046c
RS
4777#else
4778 0,
4779#endif
4780#ifdef XK_dead_grave
e9bf89a0 4781 XK_dead_grave,
79a7046c
RS
4782#else
4783 0,
4784#endif
4785#ifdef XK_dead_tilde
e9bf89a0 4786 XK_dead_tilde,
79a7046c
RS
4787#else
4788 0,
4789#endif
4790#ifdef XK_dead_diaeresis
e9bf89a0 4791 XK_dead_diaeresis,
79a7046c
RS
4792#else
4793 0,
4794#endif
4795#ifdef XK_dead_macron
e9bf89a0 4796 XK_dead_macron,
79a7046c
RS
4797#else
4798 0,
4799#endif
4800#ifdef XK_dead_degree
e9bf89a0 4801 XK_dead_degree,
79a7046c
RS
4802#else
4803 0,
4804#endif
4805#ifdef XK_dead_acute
e9bf89a0 4806 XK_dead_acute,
79a7046c
RS
4807#else
4808 0,
4809#endif
4810#ifdef XK_dead_cedilla
e9bf89a0 4811 XK_dead_cedilla,
79a7046c
RS
4812#else
4813 0,
4814#endif
4815#ifdef XK_dead_breve
e9bf89a0 4816 XK_dead_breve,
79a7046c
RS
4817#else
4818 0,
4819#endif
4820#ifdef XK_dead_ogonek
e9bf89a0 4821 XK_dead_ogonek,
79a7046c
RS
4822#else
4823 0,
4824#endif
4825#ifdef XK_dead_caron
e9bf89a0 4826 XK_dead_caron,
79a7046c
RS
4827#else
4828 0,
4829#endif
4830#ifdef XK_dead_doubleacute
e9bf89a0 4831 XK_dead_doubleacute,
79a7046c
RS
4832#else
4833 0,
4834#endif
4835#ifdef XK_dead_abovedot
e9bf89a0 4836 XK_dead_abovedot,
79a7046c
RS
4837#else
4838 0,
4839#endif
ed3230db
DL
4840#ifdef XK_dead_abovering
4841 XK_dead_abovering,
4842#else
4843 0,
4844#endif
4845#ifdef XK_dead_iota
4846 XK_dead_iota,
4847#else
4848 0,
4849#endif
4850#ifdef XK_dead_belowdot
4851 XK_dead_belowdot,
4852#else
4853 0,
4854#endif
4855#ifdef XK_dead_voiced_sound
4856 XK_dead_voiced_sound,
4857#else
4858 0,
4859#endif
4860#ifdef XK_dead_semivoiced_sound
4861 XK_dead_semivoiced_sound,
4862#else
4863 0,
4864#endif
4865#ifdef XK_dead_hook
4866 XK_dead_hook,
4867#else
4868 0,
4869#endif
4870#ifdef XK_dead_horn
4871 XK_dead_horn,
4872#else
4873 0,
4874#endif
e9bf89a0
RS
4875};
4876
4877/* This is a list of Lisp names for special "accent" characters.
4878 It parallels lispy_accent_codes. */
4879
4880static char *lispy_accent_keys[] =
4881{
4882 "dead-circumflex",
4883 "dead-grave",
4884 "dead-tilde",
4885 "dead-diaeresis",
4886 "dead-macron",
4887 "dead-degree",
4888 "dead-acute",
4889 "dead-cedilla",
4890 "dead-breve",
4891 "dead-ogonek",
4892 "dead-caron",
4893 "dead-doubleacute",
4894 "dead-abovedot",
ed3230db
DL
4895 "dead-abovering",
4896 "dead-iota",
4897 "dead-belowdot",
4898 "dead-voiced-sound",
4899 "dead-semivoiced-sound",
4900 "dead-hook",
4901 "dead-horn",
e9bf89a0
RS
4902};
4903
e98a93eb
GV
4904#ifdef HAVE_NTGUI
4905#define FUNCTION_KEY_OFFSET 0x0
4906
4907char *lispy_function_keys[] =
4908 {
4909 0, /* 0 */
c60ee5e7 4910
e98a93eb
GV
4911 0, /* VK_LBUTTON 0x01 */
4912 0, /* VK_RBUTTON 0x02 */
4913 "cancel", /* VK_CANCEL 0x03 */
4914 0, /* VK_MBUTTON 0x04 */
c60ee5e7 4915
e98a93eb 4916 0, 0, 0, /* 0x05 .. 0x07 */
c60ee5e7 4917
e98a93eb
GV
4918 "backspace", /* VK_BACK 0x08 */
4919 "tab", /* VK_TAB 0x09 */
c60ee5e7 4920
e98a93eb 4921 0, 0, /* 0x0A .. 0x0B */
c60ee5e7 4922
e98a93eb
GV
4923 "clear", /* VK_CLEAR 0x0C */
4924 "return", /* VK_RETURN 0x0D */
c60ee5e7 4925
e98a93eb 4926 0, 0, /* 0x0E .. 0x0F */
c60ee5e7 4927
1161d367
GV
4928 0, /* VK_SHIFT 0x10 */
4929 0, /* VK_CONTROL 0x11 */
4930 0, /* VK_MENU 0x12 */
e98a93eb 4931 "pause", /* VK_PAUSE 0x13 */
1161d367 4932 "capslock", /* VK_CAPITAL 0x14 */
ba991a0e
JR
4933 "kana", /* VK_KANA/VK_HANGUL 0x15 */
4934 0, /* 0x16 */
4935 "junja", /* VK_JUNJA 0x17 */
4936 "final", /* VK_FINAL 0x18 */
4937 "kanji", /* VK_KANJI/VK_HANJA 0x19 */
4938 0, /* 0x1A */
1161d367 4939 "escape", /* VK_ESCAPE 0x1B */
ba991a0e
JR
4940 "convert", /* VK_CONVERT 0x1C */
4941 "non-convert", /* VK_NONCONVERT 0x1D */
4942 "accept", /* VK_ACCEPT 0x1E */
4943 "mode-change", /* VK_MODECHANGE 0x1F */
e98a93eb
GV
4944 0, /* VK_SPACE 0x20 */
4945 "prior", /* VK_PRIOR 0x21 */
4946 "next", /* VK_NEXT 0x22 */
4947 "end", /* VK_END 0x23 */
4948 "home", /* VK_HOME 0x24 */
4949 "left", /* VK_LEFT 0x25 */
4950 "up", /* VK_UP 0x26 */
4951 "right", /* VK_RIGHT 0x27 */
4952 "down", /* VK_DOWN 0x28 */
4953 "select", /* VK_SELECT 0x29 */
4954 "print", /* VK_PRINT 0x2A */
4955 "execute", /* VK_EXECUTE 0x2B */
4956 "snapshot", /* VK_SNAPSHOT 0x2C */
4957 "insert", /* VK_INSERT 0x2D */
4958 "delete", /* VK_DELETE 0x2E */
4959 "help", /* VK_HELP 0x2F */
c60ee5e7 4960
e98a93eb 4961 /* VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
c60ee5e7 4962
e98a93eb 4963 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
c60ee5e7 4964
e98a93eb 4965 0, 0, 0, 0, 0, 0, 0, /* 0x3A .. 0x40 */
c60ee5e7 4966
e98a93eb 4967 /* VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
c60ee5e7
JB
4968
4969 0, 0, 0, 0, 0, 0, 0, 0, 0,
4970 0, 0, 0, 0, 0, 0, 0, 0, 0,
e98a93eb 4971 0, 0, 0, 0, 0, 0, 0, 0,
c60ee5e7 4972
e376f90d
RS
4973 "lwindow", /* VK_LWIN 0x5B */
4974 "rwindow", /* VK_RWIN 0x5C */
4975 "apps", /* VK_APPS 0x5D */
ba991a0e
JR
4976 0, /* 0x5E */
4977 "sleep",
e98a93eb
GV
4978 "kp-0", /* VK_NUMPAD0 0x60 */
4979 "kp-1", /* VK_NUMPAD1 0x61 */
4980 "kp-2", /* VK_NUMPAD2 0x62 */
4981 "kp-3", /* VK_NUMPAD3 0x63 */
4982 "kp-4", /* VK_NUMPAD4 0x64 */
4983 "kp-5", /* VK_NUMPAD5 0x65 */
4984 "kp-6", /* VK_NUMPAD6 0x66 */
4985 "kp-7", /* VK_NUMPAD7 0x67 */
4986 "kp-8", /* VK_NUMPAD8 0x68 */
4987 "kp-9", /* VK_NUMPAD9 0x69 */
4988 "kp-multiply", /* VK_MULTIPLY 0x6A */
4989 "kp-add", /* VK_ADD 0x6B */
4990 "kp-separator", /* VK_SEPARATOR 0x6C */
4991 "kp-subtract", /* VK_SUBTRACT 0x6D */
4992 "kp-decimal", /* VK_DECIMAL 0x6E */
4993 "kp-divide", /* VK_DIVIDE 0x6F */
4994 "f1", /* VK_F1 0x70 */
4995 "f2", /* VK_F2 0x71 */
4996 "f3", /* VK_F3 0x72 */
4997 "f4", /* VK_F4 0x73 */
4998 "f5", /* VK_F5 0x74 */
4999 "f6", /* VK_F6 0x75 */
5000 "f7", /* VK_F7 0x76 */
5001 "f8", /* VK_F8 0x77 */
5002 "f9", /* VK_F9 0x78 */
5003 "f10", /* VK_F10 0x79 */
5004 "f11", /* VK_F11 0x7A */
5005 "f12", /* VK_F12 0x7B */
5006 "f13", /* VK_F13 0x7C */
5007 "f14", /* VK_F14 0x7D */
5008 "f15", /* VK_F15 0x7E */
5009 "f16", /* VK_F16 0x7F */
5010 "f17", /* VK_F17 0x80 */
5011 "f18", /* VK_F18 0x81 */
5012 "f19", /* VK_F19 0x82 */
5013 "f20", /* VK_F20 0x83 */
5014 "f21", /* VK_F21 0x84 */
5015 "f22", /* VK_F22 0x85 */
5016 "f23", /* VK_F23 0x86 */
5017 "f24", /* VK_F24 0x87 */
c60ee5e7 5018
e98a93eb
GV
5019 0, 0, 0, 0, /* 0x88 .. 0x8B */
5020 0, 0, 0, 0, /* 0x8C .. 0x8F */
c60ee5e7 5021
e98a93eb
GV
5022 "kp-numlock", /* VK_NUMLOCK 0x90 */
5023 "scroll", /* VK_SCROLL 0x91 */
ba991a0e
JR
5024 /* Not sure where the following block comes from.
5025 Windows headers have NEC and Fujitsu specific keys in
5026 this block, but nothing generic. */
e376f90d
RS
5027 "kp-space", /* VK_NUMPAD_CLEAR 0x92 */
5028 "kp-enter", /* VK_NUMPAD_ENTER 0x93 */
5029 "kp-prior", /* VK_NUMPAD_PRIOR 0x94 */
5030 "kp-next", /* VK_NUMPAD_NEXT 0x95 */
5031 "kp-end", /* VK_NUMPAD_END 0x96 */
5032 "kp-home", /* VK_NUMPAD_HOME 0x97 */
5033 "kp-left", /* VK_NUMPAD_LEFT 0x98 */
5034 "kp-up", /* VK_NUMPAD_UP 0x99 */
5035 "kp-right", /* VK_NUMPAD_RIGHT 0x9A */
5036 "kp-down", /* VK_NUMPAD_DOWN 0x9B */
5037 "kp-insert", /* VK_NUMPAD_INSERT 0x9C */
5038 "kp-delete", /* VK_NUMPAD_DELETE 0x9D */
5039
5040 0, 0, /* 0x9E .. 0x9F */
5041
e98a93eb
GV
5042 /*
5043 * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
e8886a1d 5044 * Used only as parameters to GetAsyncKeyState and GetKeyState.
e98a93eb 5045 * No other API or message will distinguish left and right keys this way.
ba991a0e 5046 * 0xA0 .. 0xA5
e98a93eb 5047 */
ba991a0e 5048 0, 0, 0, 0, 0, 0,
c60ee5e7 5049
ba991a0e
JR
5050 /* Multimedia keys. These are handled as WM_APPCOMMAND, which allows us
5051 to enable them selectively, and gives access to a few more functions.
5052 See lispy_multimedia_keys below. */
5053 0, 0, 0, 0, 0, 0, 0, /* 0xA6 .. 0xAC Browser */
5054 0, 0, 0, /* 0xAD .. 0xAF Volume */
5055 0, 0, 0, 0, /* 0xB0 .. 0xB3 Media */
5056 0, 0, 0, 0, /* 0xB4 .. 0xB7 Apps */
c60ee5e7 5057
ba991a0e
JR
5058 /* 0xB8 .. 0xC0 "OEM" keys - all seem to be punctuation. */
5059 0, 0, 0, 0, 0, 0, 0, 0, 0,
c60ee5e7 5060
ba991a0e
JR
5061 /* 0xC1 - 0xDA unallocated, 0xDB-0xDF more OEM keys */
5062 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5063 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
c60ee5e7 5064
ba991a0e
JR
5065 0, /* 0xE0 */
5066 "ax", /* VK_OEM_AX 0xE1 */
5067 0, /* VK_OEM_102 0xE2 */
5068 "ico-help", /* VK_ICO_HELP 0xE3 */
5069 "ico-00", /* VK_ICO_00 0xE4 */
5070 0, /* VK_PROCESSKEY 0xE5 */
5071 "ico-clear", /* VK_ICO_CLEAR 0xE6 */
5072 "packet", /* VK_PACKET 0xE7 */
5073 0, /* 0xE8 */
5074 "reset", /* VK_OEM_RESET 0xE9 */
5075 "jump", /* VK_OEM_JUMP 0xEA */
5076 "oem-pa1", /* VK_OEM_PA1 0xEB */
5077 "oem-pa2", /* VK_OEM_PA2 0xEC */
5078 "oem-pa3", /* VK_OEM_PA3 0xED */
5079 "wsctrl", /* VK_OEM_WSCTRL 0xEE */
5080 "cusel", /* VK_OEM_CUSEL 0xEF */
5081 "oem-attn", /* VK_OEM_ATTN 0xF0 */
5082 "finish", /* VK_OEM_FINISH 0xF1 */
5083 "copy", /* VK_OEM_COPY 0xF2 */
5084 "auto", /* VK_OEM_AUTO 0xF3 */
5085 "enlw", /* VK_OEM_ENLW 0xF4 */
5086 "backtab", /* VK_OEM_BACKTAB 0xF5 */
e98a93eb
GV
5087 "attn", /* VK_ATTN 0xF6 */
5088 "crsel", /* VK_CRSEL 0xF7 */
5089 "exsel", /* VK_EXSEL 0xF8 */
5090 "ereof", /* VK_EREOF 0xF9 */
5091 "play", /* VK_PLAY 0xFA */
5092 "zoom", /* VK_ZOOM 0xFB */
5093 "noname", /* VK_NONAME 0xFC */
5094 "pa1", /* VK_PA1 0xFD */
5095 "oem_clear", /* VK_OEM_CLEAR 0xFE */
1161d367 5096 0 /* 0xFF */
e98a93eb
GV
5097 };
5098
ba991a0e
JR
5099/* Some of these duplicate the "Media keys" on newer keyboards,
5100 but they are delivered to the application in a different way. */
5101static char *lispy_multimedia_keys[] =
5102 {
5103 0,
5104 "browser-back",
5105 "browser-forward",
5106 "browser-refresh",
5107 "browser-stop",
5108 "browser-search",
5109 "browser-favorites",
5110 "browser-home",
5111 "volume-mute",
5112 "volume-down",
5113 "volume-up",
5114 "media-next",
5115 "media-previous",
5116 "media-stop",
5117 "media-play-pause",
5118 "mail",
5119 "media-select",
5120 "app-1",
5121 "app-2",
5122 "bass-down",
5123 "bass-boost",
5124 "bass-up",
5125 "treble-down",
5126 "treble-up",
5127 "mic-volume-mute",
5128 "mic-volume-down",
5129 "mic-volume-up",
5130 "help",
5131 "find",
5132 "new",
5133 "open",
5134 "close",
5135 "save",
5136 "print",
5137 "undo",
5138 "redo",
5139 "copy",
5140 "cut",
5141 "paste",
5142 "mail-reply",
5143 "mail-forward",
5144 "mail-send",
5145 "spell-check",
5146 "toggle-dictate-command",
5147 "mic-toggle",
5148 "correction-list",
5149 "media-play",
5150 "media-pause",
5151 "media-record",
5152 "media-fast-forward",
5153 "media-rewind",
5154 "media-channel-up",
5155 "media-channel-down"
5156 };
5157
04f215f0 5158#else /* not HAVE_NTGUI */
e98a93eb 5159
ed3230db
DL
5160/* This should be dealt with in XTread_socket now, and that doesn't
5161 depend on the client system having the Kana syms defined. See also
5162 the XK_kana_A case below. */
5163#if 0
37cd9f30
KH
5164#ifdef XK_kana_A
5165static char *lispy_kana_keys[] =
5166 {
5167 /* X Keysym value */
5168 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x400 .. 0x40f */
5169 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x410 .. 0x41f */
5170 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x420 .. 0x42f */
5171 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x430 .. 0x43f */
5172 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x440 .. 0x44f */
5173 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x450 .. 0x45f */
5174 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x460 .. 0x46f */
5175 0,0,0,0,0,0,0,0,0,0,0,0,0,0,"overline",0,
5176 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x480 .. 0x48f */
5177 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x490 .. 0x49f */
c60ee5e7 5178 0, "kana-fullstop", "kana-openingbracket", "kana-closingbracket",
37cd9f30
KH
5179 "kana-comma", "kana-conjunctive", "kana-WO", "kana-a",
5180 "kana-i", "kana-u", "kana-e", "kana-o",
5181 "kana-ya", "kana-yu", "kana-yo", "kana-tsu",
5182 "prolongedsound", "kana-A", "kana-I", "kana-U",
5183 "kana-E", "kana-O", "kana-KA", "kana-KI",
5184 "kana-KU", "kana-KE", "kana-KO", "kana-SA",
5185 "kana-SHI", "kana-SU", "kana-SE", "kana-SO",
5186 "kana-TA", "kana-CHI", "kana-TSU", "kana-TE",
5187 "kana-TO", "kana-NA", "kana-NI", "kana-NU",
5188 "kana-NE", "kana-NO", "kana-HA", "kana-HI",
5189 "kana-FU", "kana-HE", "kana-HO", "kana-MA",
5190 "kana-MI", "kana-MU", "kana-ME", "kana-MO",
5191 "kana-YA", "kana-YU", "kana-YO", "kana-RA",
5192 "kana-RI", "kana-RU", "kana-RE", "kana-RO",
5193 "kana-WA", "kana-N", "voicedsound", "semivoicedsound",
5194 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x4e0 .. 0x4ef */
5195 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x4f0 .. 0x4ff */
5196 };
5197#endif /* XK_kana_A */
ed3230db 5198#endif /* 0 */
37cd9f30 5199
04f215f0
RS
5200#define FUNCTION_KEY_OFFSET 0xff00
5201
284f4730
JB
5202/* You'll notice that this table is arranged to be conveniently
5203 indexed by X Windows keysym values. */
5204static char *lispy_function_keys[] =
5205 {
5206 /* X Keysym value */
5207
75045dcb
RS
5208 0, 0, 0, 0, 0, 0, 0, 0, /* 0xff00...0f */
5209 "backspace", "tab", "linefeed", "clear",
5210 0, "return", 0, 0,
5211 0, 0, 0, "pause", /* 0xff10...1f */
5212 0, 0, 0, 0, 0, 0, 0, "escape",
86e5706b 5213 0, 0, 0, 0,
75045dcb
RS
5214 0, "kanji", "muhenkan", "henkan", /* 0xff20...2f */
5215 "romaji", "hiragana", "katakana", "hiragana-katakana",
5216 "zenkaku", "hankaku", "zenkaku-hankaku", "touroku",
5217 "massyo", "kana-lock", "kana-shift", "eisu-shift",
5218 "eisu-toggle", /* 0xff30...3f */
5219 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86e5706b
RS
5220 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xff40...4f */
5221
75045dcb
RS
5222 "home", "left", "up", "right", /* 0xff50 */ /* IsCursorKey */
5223 "down", "prior", "next", "end",
5224 "begin", 0, 0, 0, 0, 0, 0, 0,
284f4730
JB
5225 "select", /* 0xff60 */ /* IsMiscFunctionKey */
5226 "print",
5227 "execute",
5228 "insert",
5229 0, /* 0xff64 */
5230 "undo",
5231 "redo",
5232 "menu",
5233 "find",
5234 "cancel",
5235 "help",
5236 "break", /* 0xff6b */
5237
75045dcb
RS
5238 0, 0, 0, 0,
5239 0, 0, 0, 0, "backtab", 0, 0, 0, /* 0xff70... */
5240 0, 0, 0, 0, 0, 0, 0, "kp-numlock", /* 0xff78... */
284f4730
JB
5241 "kp-space", /* 0xff80 */ /* IsKeypadKey */
5242 0, 0, 0, 0, 0, 0, 0, 0,
5243 "kp-tab", /* 0xff89 */
5244 0, 0, 0,
5245 "kp-enter", /* 0xff8d */
5246 0, 0, 0,
5247 "kp-f1", /* 0xff91 */
5248 "kp-f2",
5249 "kp-f3",
5250 "kp-f4",
872157e7
RS
5251 "kp-home", /* 0xff95 */
5252 "kp-left",
5253 "kp-up",
5254 "kp-right",
5255 "kp-down",
5256 "kp-prior", /* kp-page-up */
5257 "kp-next", /* kp-page-down */
5258 "kp-end",
5259 "kp-begin",
5260 "kp-insert",
5261 "kp-delete",
5262 0, /* 0xffa0 */
5263 0, 0, 0, 0, 0, 0, 0, 0, 0,
284f4730
JB
5264 "kp-multiply", /* 0xffaa */
5265 "kp-add",
5266 "kp-separator",
5267 "kp-subtract",
5268 "kp-decimal",
5269 "kp-divide", /* 0xffaf */
5270 "kp-0", /* 0xffb0 */
5271 "kp-1", "kp-2", "kp-3", "kp-4", "kp-5", "kp-6", "kp-7", "kp-8", "kp-9",
5272 0, /* 0xffba */
5273 0, 0,
5274 "kp-equal", /* 0xffbd */
5275 "f1", /* 0xffbe */ /* IsFunctionKey */
86e5706b
RS
5276 "f2",
5277 "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", /* 0xffc0 */
5278 "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18",
5279 "f19", "f20", "f21", "f22", "f23", "f24", "f25", "f26", /* 0xffd0 */
5280 "f27", "f28", "f29", "f30", "f31", "f32", "f33", "f34",
5281 "f35", 0, 0, 0, 0, 0, 0, 0, /* 0xffe0 */
5282 0, 0, 0, 0, 0, 0, 0, 0,
5283 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfff0 */
5284 0, 0, 0, 0, 0, 0, 0, "delete"
04f215f0 5285 };
284f4730 5286
04f215f0
RS
5287/* ISO 9995 Function and Modifier Keys; the first byte is 0xFE. */
5288#define ISO_FUNCTION_KEY_OFFSET 0xfe00
5289
5290static char *iso_lispy_function_keys[] =
5291 {
5292 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe00 */
5293 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe08 */
5294 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe10 */
5295 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe18 */
5296 "iso-lefttab", /* 0xfe20 */
c60ee5e7
JB
5297 "iso-move-line-up", "iso-move-line-down",
5298 "iso-partial-line-up", "iso-partial-line-down",
5299 "iso-partial-space-left", "iso-partial-space-right",
04f215f0
RS
5300 "iso-set-margin-left", "iso-set-margin-right", /* 0xffe27, 28 */
5301 "iso-release-margin-left", "iso-release-margin-right",
5302 "iso-release-both-margins",
5303 "iso-fast-cursor-left", "iso-fast-cursor-right",
5304 "iso-fast-cursor-up", "iso-fast-cursor-down",
5305 "iso-continuous-underline", "iso-discontinuous-underline", /* 0xfe30, 31 */
5306 "iso-emphasize", "iso-center-object", "iso-enter", /* ... 0xfe34 */
5307 };
5308
5309#endif /* not HAVE_NTGUI */
e98a93eb 5310
8e1e4240 5311Lisp_Object Vlispy_mouse_stem;
284f4730 5312
8006e4bb
JR
5313static char *lispy_wheel_names[] =
5314{
13899bc1 5315 "wheel-up", "wheel-down", "wheel-left", "wheel-right"
8006e4bb
JR
5316};
5317
a24dc617
RS
5318/* drag-n-drop events are generated when a set of selected files are
5319 dragged from another application and dropped onto an Emacs window. */
5320static char *lispy_drag_n_drop_names[] =
5321{
5322 "drag-n-drop"
5323};
5324
3c370943 5325/* Scroll bar parts. */
4bb994d1 5326Lisp_Object Qabove_handle, Qhandle, Qbelow_handle;
7ee32cda 5327Lisp_Object Qup, Qdown, Qbottom, Qend_scroll;
eef28553 5328Lisp_Object Qtop, Qratio;
4bb994d1 5329
3c370943
JB
5330/* An array of scroll bar parts, indexed by an enum scroll_bar_part value. */
5331Lisp_Object *scroll_bar_parts[] = {
db08707d 5332 &Qabove_handle, &Qhandle, &Qbelow_handle,
eef28553 5333 &Qup, &Qdown, &Qtop, &Qbottom, &Qend_scroll, &Qratio
4bb994d1
JB
5334};
5335
7b4aedb9 5336/* A vector, indexed by button number, giving the down-going location
3c370943 5337 of currently depressed buttons, both scroll bar and non-scroll bar.
7b4aedb9
JB
5338
5339 The elements have the form
5340 (BUTTON-NUMBER MODIFIER-MASK . REST)
5341 where REST is the cdr of a position as it would be reported in the event.
5342
5343 The make_lispy_event function stores positions here to tell the
5344 difference between click and drag events, and to store the starting
5345 location to be included in drag events. */
5346
5347static Lisp_Object button_down_location;
88cb0656 5348
fbcd35bd
JB
5349/* Information about the most recent up-going button event: Which
5350 button, what location, and what time. */
5351
559f9d04
RS
5352static int last_mouse_button;
5353static int last_mouse_x;
5354static int last_mouse_y;
5355static unsigned long button_down_time;
fbcd35bd 5356
222d557c
GM
5357/* The maximum time between clicks to make a double-click, or Qnil to
5358 disable double-click detection, or Qt for no time limit. */
5359
564dc952 5360Lisp_Object Vdouble_click_time;
fbcd35bd 5361
222d557c
GM
5362/* Maximum number of pixels the mouse may be moved between clicks
5363 to make a double-click. */
5364
31ade731 5365EMACS_INT double_click_fuzz;
222d557c 5366
fbcd35bd
JB
5367/* The number of clicks in this multiple-click. */
5368
5369int double_click_count;
5370
6b61353c
KH
5371/* Return position of a mouse click or wheel event */
5372
5373static Lisp_Object
5374make_lispy_position (f, x, y, time)
5375 struct frame *f;
5376 Lisp_Object *x, *y;
5377 unsigned long time;
5378{
5379 Lisp_Object window;
5380 enum window_part part;
5381 Lisp_Object posn = Qnil;
5382 Lisp_Object extra_info = Qnil;
5383 int wx, wy;
5384
5385 /* Set `window' to the window under frame pixel coordinates (x,y) */
5386 if (f)
5387 window = window_from_coordinates (f, XINT (*x), XINT (*y),
5388 &part, &wx, &wy, 0);
5389 else
5390 window = Qnil;
5391
5392 if (WINDOWP (window))
5393 {
5394 /* It's a click in window window at frame coordinates (x,y) */
5395 struct window *w = XWINDOW (window);
5396 Lisp_Object string_info = Qnil;
5397 int textpos = -1, rx = -1, ry = -1;
5398 int dx = -1, dy = -1;
5399 int width = -1, height = -1;
5400 Lisp_Object object = Qnil;
5401
5402 /* Set event coordinates to window-relative coordinates
5403 for constructing the Lisp event below. */
5404 XSETINT (*x, wx);
5405 XSETINT (*y, wy);
5406
6507c4c7
KS
5407 if (part == ON_TEXT)
5408 {
5409 wx += WINDOW_LEFT_MARGIN_WIDTH (w);
5410 }
5411 else if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
6b61353c
KH
5412 {
5413 /* Mode line or header line. Look for a string under
5414 the mouse that may have a `local-map' property. */
5415 Lisp_Object string;
5416 int charpos;
5417
5418 posn = part == ON_MODE_LINE ? Qmode_line : Qheader_line;
5419 rx = wx, ry = wy;
5420 string = mode_line_string (w, part, &rx, &ry, &charpos,
5421 &object, &dx, &dy, &width, &height);
5422 if (STRINGP (string))
5423 string_info = Fcons (string, make_number (charpos));
93730342
CY
5424 if (w == XWINDOW (selected_window)
5425 && current_buffer == XBUFFER (w->buffer))
6b61353c
KH
5426 textpos = PT;
5427 else
5428 textpos = XMARKER (w->pointm)->charpos;
5429 }
5430 else if (part == ON_VERTICAL_BORDER)
5431 {
5432 posn = Qvertical_line;
5433 wx = -1;
5434 dx = 0;
5435 width = 1;
5436 }
5437 else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
5438 {
5439 Lisp_Object string;
5440 int charpos;
5441
5442 posn = (part == ON_LEFT_MARGIN) ? Qleft_margin : Qright_margin;
5443 rx = wx, ry = wy;
5444 string = marginal_area_string (w, part, &rx, &ry, &charpos,
5445 &object, &dx, &dy, &width, &height);
5446 if (STRINGP (string))
5447 string_info = Fcons (string, make_number (charpos));
a65fc2c3
KS
5448 if (part == ON_LEFT_MARGIN)
5449 wx = 0;
5450 else
5451 wx = window_box_right_offset (w, TEXT_AREA) - 1;
6b61353c 5452 }
a65fc2c3 5453 else if (part == ON_LEFT_FRINGE)
6b61353c 5454 {
a65fc2c3 5455 posn = Qleft_fringe;
6b61353c
KH
5456 rx = 0;
5457 dx = wx;
a65fc2c3
KS
5458 wx = (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
5459 ? 0
5460 : window_box_width (w, LEFT_MARGIN_AREA));
5461 dx -= wx;
3d566707 5462 }
a65fc2c3 5463 else if (part == ON_RIGHT_FRINGE)
3d566707 5464 {
a65fc2c3 5465 posn = Qright_fringe;
3d566707 5466 rx = 0;
45de137a 5467 dx = wx;
a65fc2c3
KS
5468 wx = (window_box_width (w, LEFT_MARGIN_AREA)
5469 + window_box_width (w, TEXT_AREA)
5470 + (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
5471 ? window_box_width (w, RIGHT_MARGIN_AREA)
5472 : 0));
5473 dx -= wx;
5474 }
5475 else
5476 {
5477 /* Note: We have no special posn for part == ON_SCROLL_BAR. */
5478 wx = max (WINDOW_LEFT_MARGIN_WIDTH (w), wx);
6b61353c
KH
5479 }
5480
5481 if (textpos < 0)
5482 {
5483 Lisp_Object string2, object2 = Qnil;
5484 struct display_pos p;
5485 int dx2, dy2;
5486 int width2, height2;
6b61353c
KH
5487 string2 = buffer_posn_from_coords (w, &wx, &wy, &p,
5488 &object2, &dx2, &dy2,
5489 &width2, &height2);
5490 textpos = CHARPOS (p.pos);
5491 if (rx < 0) rx = wx;
5492 if (ry < 0) ry = wy;
5493 if (dx < 0) dx = dx2;
5494 if (dy < 0) dy = dy2;
5495 if (width < 0) width = width2;
5496 if (height < 0) height = height2;
5497
5498 if (NILP (posn))
5499 {
5500 posn = make_number (textpos);
5501 if (STRINGP (string2))
5502 string_info = Fcons (string2,
5503 make_number (CHARPOS (p.string_pos)));
5504 }
5505 if (NILP (object))
5506 object = object2;
5507 }
5508
5509#ifdef HAVE_WINDOW_SYSTEM
5510 if (IMAGEP (object))
5511 {
5512 Lisp_Object image_map, hotspot;
5513 if ((image_map = Fplist_get (XCDR (object), QCmap),
5514 !NILP (image_map))
5515 && (hotspot = find_hot_spot (image_map, dx, dy),
5516 CONSP (hotspot))
5517 && (hotspot = XCDR (hotspot), CONSP (hotspot)))
5518 posn = XCAR (hotspot);
5519 }
5520#endif
5521
5522 /* Object info */
5523 extra_info = Fcons (object,
5524 Fcons (Fcons (make_number (dx),
5525 make_number (dy)),
5526 Fcons (Fcons (make_number (width),
5527 make_number (height)),
5528 Qnil)));
5529
5530 /* String info */
5531 extra_info = Fcons (string_info,
5532 Fcons (make_number (textpos),
5533 Fcons (Fcons (make_number (rx),
5534 make_number (ry)),
5535 extra_info)));
5536 }
5537 else if (f != 0)
5538 {
5539 XSETFRAME (window, f);
5540 }
5541 else
5542 {
5543 window = Qnil;
5544 XSETFASTINT (*x, 0);
5545 XSETFASTINT (*y, 0);
5546 }
5547
5548 return Fcons (window,
5549 Fcons (posn,
5550 Fcons (Fcons (*x, *y),
5551 Fcons (make_number (time),
5552 extra_info))));
5553}
5554
284f4730
JB
5555/* Given a struct input_event, build the lisp event which represents
5556 it. If EVENT is 0, build a mouse movement event from the mouse
88cb0656
JB
5557 movement buffer, which should have a movement event in it.
5558
5559 Note that events must be passed to this function in the order they
5560 are received; this function stores the location of button presses
5561 in order to build drag events when the button is released. */
284f4730
JB
5562
5563static Lisp_Object
5564make_lispy_event (event)
5565 struct input_event *event;
5566{
79a7046c
RS
5567 int i;
5568
0220c518 5569 switch (SWITCH_ENUM_CAST (event->kind))
284f4730 5570 {
284f4730 5571 /* A simple keystroke. */
3b8f9651 5572 case ASCII_KEYSTROKE_EVENT:
3b8f9651 5573 case MULTIBYTE_CHAR_KEYSTROKE_EVENT:
a50e723f
KH
5574 {
5575 Lisp_Object lispy_c;
24d80a06 5576 int c = event->code;
6d0867e5
SM
5577 if (event->kind == ASCII_KEYSTROKE_EVENT)
5578 {
5579 c &= 0377;
5580 eassert (c == event->code);
5581 /* Turn ASCII characters into control characters
5582 when proper. */
5583 if (event->modifiers & ctrl_modifier)
5584 {
5585 c = make_ctrl_char (c);
5586 event->modifiers &= ~ctrl_modifier;
5587 }
5588 }
a50e723f 5589
6d0867e5
SM
5590 /* Add in the other modifier bits. The shift key was taken care
5591 of by the X code. */
24d80a06
SM
5592 c |= (event->modifiers
5593 & (meta_modifier | alt_modifier
5594 | hyper_modifier | super_modifier | ctrl_modifier));
6d0867e5
SM
5595 /* Distinguish Shift-SPC from SPC. */
5596 if ((event->code) == 040
5597 && event->modifiers & shift_modifier)
5598 c |= shift_modifier;
24d80a06
SM
5599 button_down_time = 0;
5600 XSETFASTINT (lispy_c, c);
a50e723f
KH
5601 return lispy_c;
5602 }
5603
83d92ee0
DR
5604#ifdef HAVE_NS
5605 /* NS_NONKEY_EVENTs are just like NON_ASCII_KEYSTROKE_EVENTs,
5606 except that they are non-key events (last-nonmenu-event is nil). */
5607 case NS_NONKEY_EVENT:
5608#endif
5609
284f4730
JB
5610 /* A function key. The symbol may need to have modifier prefixes
5611 tacked onto it. */
3b8f9651 5612 case NON_ASCII_KEYSTROKE_EVENT:
559f9d04 5613 button_down_time = 0;
e9bf89a0
RS
5614
5615 for (i = 0; i < sizeof (lispy_accent_codes) / sizeof (int); i++)
5616 if (event->code == lispy_accent_codes[i])
5617 return modify_event_symbol (i,
5618 event->modifiers,
80e4aa30 5619 Qfunction_key, Qnil,
e9bf89a0
RS
5620 lispy_accent_keys, &accent_key_syms,
5621 (sizeof (lispy_accent_keys)
5622 / sizeof (lispy_accent_keys[0])));
5623
ed3230db 5624#if 0
37cd9f30
KH
5625#ifdef XK_kana_A
5626 if (event->code >= 0x400 && event->code < 0x500)
5627 return modify_event_symbol (event->code - 0x400,
5628 event->modifiers & ~shift_modifier,
5629 Qfunction_key, Qnil,
5630 lispy_kana_keys, &func_key_syms,
5631 (sizeof (lispy_kana_keys)
5632 / sizeof (lispy_kana_keys[0])));
5633#endif /* XK_kana_A */
ed3230db 5634#endif /* 0 */
37cd9f30 5635
111c4138 5636#ifdef ISO_FUNCTION_KEY_OFFSET
04f215f0
RS
5637 if (event->code < FUNCTION_KEY_OFFSET
5638 && event->code >= ISO_FUNCTION_KEY_OFFSET)
5639 return modify_event_symbol (event->code - ISO_FUNCTION_KEY_OFFSET,
5640 event->modifiers,
5641 Qfunction_key, Qnil,
5642 iso_lispy_function_keys, &func_key_syms,
5643 (sizeof (iso_lispy_function_keys)
5644 / sizeof (iso_lispy_function_keys[0])));
111c4138 5645#endif
656280a6 5646
4c8bc894
SM
5647 /* Handle system-specific or unknown keysyms. */
5648 if (event->code & (1 << 28)
5649 || event->code - FUNCTION_KEY_OFFSET < 0
656280a6 5650 || (event->code - FUNCTION_KEY_OFFSET
4c8bc894
SM
5651 >= sizeof lispy_function_keys / sizeof *lispy_function_keys)
5652 || !lispy_function_keys[event->code - FUNCTION_KEY_OFFSET])
656280a6 5653 {
4c8bc894
SM
5654 /* We need to use an alist rather than a vector as the cache
5655 since we can't make a vector long enuf. */
5656 if (NILP (current_kboard->system_key_syms))
5657 current_kboard->system_key_syms = Fcons (Qnil, Qnil);
5658 return modify_event_symbol (event->code,
5659 event->modifiers,
5660 Qfunction_key,
5661 current_kboard->Vsystem_key_alist,
5662 0, &current_kboard->system_key_syms,
5663 (unsigned) -1);
656280a6 5664 }
656280a6
GM
5665
5666 return modify_event_symbol (event->code - FUNCTION_KEY_OFFSET,
5667 event->modifiers,
5668 Qfunction_key, Qnil,
5669 lispy_function_keys, &func_key_syms,
5670 (sizeof (lispy_function_keys)
5671 / sizeof (lispy_function_keys[0])));
284f4730 5672
ba991a0e
JR
5673#ifdef WINDOWSNT
5674 case MULTIMEDIA_KEY_EVENT:
5675 if (event->code < (sizeof (lispy_multimedia_keys)
5676 / sizeof (lispy_multimedia_keys[0]))
5677 && event->code > 0 && lispy_multimedia_keys[event->code])
5678 {
5679 return modify_event_symbol (event->code, event->modifiers,
5680 Qfunction_key, Qnil,
5681 lispy_multimedia_keys, &func_key_syms,
5682 (sizeof (lispy_multimedia_keys)
5683 / sizeof (lispy_multimedia_keys[0])));
5684 }
5685 return Qnil;
5686#endif
5687
514354e9 5688#ifdef HAVE_MOUSE
df0f2ba1 5689 /* A mouse click. Figure out where it is, decide whether it's
88cb0656 5690 a press, click or drag, and build the appropriate structure. */
3b8f9651 5691 case MOUSE_CLICK_EVENT:
7ee32cda 5692#ifndef USE_TOOLKIT_SCROLL_BARS
3b8f9651 5693 case SCROLL_BAR_CLICK_EVENT:
7ee32cda 5694#endif
284f4730 5695 {
e9bf89a0 5696 int button = event->code;
559f9d04 5697 int is_double;
7b4aedb9 5698 Lisp_Object position;
dbc4e1c1
JB
5699 Lisp_Object *start_pos_ptr;
5700 Lisp_Object start_pos;
284f4730 5701
8c907a56
GM
5702 position = Qnil;
5703
7b4aedb9 5704 /* Build the position as appropriate for this mouse click. */
3b8f9651 5705 if (event->kind == MOUSE_CLICK_EVENT)
284f4730 5706 {
c5cf2109 5707 struct frame *f = XFRAME (event->frame_or_window);
edfda783 5708#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) && ! defined (HAVE_NS)
9e20143a 5709 int row, column;
6b61353c 5710#endif
9e20143a 5711
5da3133a
RS
5712 /* Ignore mouse events that were made on frame that
5713 have been deleted. */
5714 if (! FRAME_LIVE_P (f))
5715 return Qnil;
5716
edfda783 5717#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) && ! defined (HAVE_NS)
7ee32cda
GM
5718 /* EVENT->x and EVENT->y are frame-relative pixel
5719 coordinates at this place. Under old redisplay, COLUMN
5720 and ROW are set to frame relative glyph coordinates
5721 which are then used to determine whether this click is
5722 in a menu (non-toolkit version). */
5723 pixel_to_glyph_coords (f, XINT (event->x), XINT (event->y),
5724 &column, &row, NULL, 1);
7b4aedb9 5725
eef045bf
RS
5726 /* In the non-toolkit version, clicks on the menu bar
5727 are ordinary button events in the event buffer.
5728 Distinguish them, and invoke the menu.
5729
5730 (In the toolkit version, the toolkit handles the menu bar
5731 and Emacs doesn't know about it until after the user
5732 makes a selection.) */
2ee250ec
RS
5733 if (row >= 0 && row < FRAME_MENU_BAR_LINES (f)
5734 && (event->modifiers & down_modifier))
bb936752 5735 {
b7c49376 5736 Lisp_Object items, item;
0a0e8fe6
RS
5737 int hpos;
5738 int i;
5739
2ee250ec 5740#if 0
0a0e8fe6
RS
5741 /* Activate the menu bar on the down event. If the
5742 up event comes in before the menu code can deal with it,
5743 just ignore it. */
5744 if (! (event->modifiers & down_modifier))
5745 return Qnil;
2ee250ec 5746#endif
0aafc975 5747
7ee32cda 5748 /* Find the menu bar item under `column'. */
f2ae6b3f 5749 item = Qnil;
5ec75a55 5750 items = FRAME_MENU_BAR_ITEMS (f);
35b3402f 5751 for (i = 0; i < XVECTOR (items)->size; i += 4)
5ec75a55
RS
5752 {
5753 Lisp_Object pos, string;
129004d3
GM
5754 string = AREF (items, i + 1);
5755 pos = AREF (items, i + 3);
b7c49376
RS
5756 if (NILP (string))
5757 break;
9e20143a 5758 if (column >= XINT (pos)
d5db4077 5759 && column < XINT (pos) + SCHARS (string))
b7c49376 5760 {
129004d3 5761 item = AREF (items, i);
b7c49376
RS
5762 break;
5763 }
5ec75a55 5764 }
9e20143a 5765
7ee32cda
GM
5766 /* ELisp manual 2.4b says (x y) are window relative but
5767 code says they are frame-relative. */
5ec75a55
RS
5768 position
5769 = Fcons (event->frame_or_window,
5770 Fcons (Qmenu_bar,
5771 Fcons (Fcons (event->x, event->y),
5772 Fcons (make_number (event->timestamp),
5773 Qnil))));
5774
b7c49376 5775 return Fcons (item, Fcons (position, Qnil));
5ec75a55 5776 }
edfda783 5777#endif /* not USE_X_TOOLKIT && not USE_GTK && not HAVE_NS */
0aafc975 5778
6b61353c
KH
5779 position = make_lispy_position (f, &event->x, &event->y,
5780 event->timestamp);
284f4730 5781 }
7ee32cda 5782#ifndef USE_TOOLKIT_SCROLL_BARS
7b4aedb9 5783 else
88cb0656 5784 {
7ee32cda 5785 /* It's a scrollbar click. */
6b61353c 5786 Lisp_Object window;
9e20143a
RS
5787 Lisp_Object portion_whole;
5788 Lisp_Object part;
5789
5790 window = event->frame_or_window;
5791 portion_whole = Fcons (event->x, event->y);
5792 part = *scroll_bar_parts[(int) event->part];
7b4aedb9 5793
db08707d
RS
5794 position
5795 = Fcons (window,
5796 Fcons (Qvertical_scroll_bar,
5797 Fcons (portion_whole,
5798 Fcons (make_number (event->timestamp),
5799 Fcons (part, Qnil)))));
88cb0656 5800 }
7ee32cda 5801#endif /* not USE_TOOLKIT_SCROLL_BARS */
88cb0656 5802
129004d3 5803 if (button >= ASIZE (button_down_location))
8e1e4240
GM
5804 {
5805 button_down_location = larger_vector (button_down_location,
5806 button + 1, Qnil);
5807 mouse_syms = larger_vector (mouse_syms, button + 1, Qnil);
5808 }
c60ee5e7 5809
129004d3 5810 start_pos_ptr = &AREF (button_down_location, button);
dbc4e1c1
JB
5811 start_pos = *start_pos_ptr;
5812 *start_pos_ptr = Qnil;
7b4aedb9 5813
c5cf2109
GM
5814 {
5815 /* On window-system frames, use the value of
5816 double-click-fuzz as is. On other frames, interpret it
5817 as a multiple of 1/8 characters. */
5818 struct frame *f;
5819 int fuzz;
5820
5821 if (WINDOWP (event->frame_or_window))
5822 f = XFRAME (XWINDOW (event->frame_or_window)->frame);
5823 else if (FRAMEP (event->frame_or_window))
5824 f = XFRAME (event->frame_or_window);
5825 else
5826 abort ();
5827
5828 if (FRAME_WINDOW_P (f))
5829 fuzz = double_click_fuzz;
5830 else
5831 fuzz = double_click_fuzz / 8;
5832
5833 is_double = (button == last_mouse_button
1ea40aa2
EZ
5834 && (eabs (XINT (event->x) - last_mouse_x) <= fuzz)
5835 && (eabs (XINT (event->y) - last_mouse_y) <= fuzz)
c5cf2109
GM
5836 && button_down_time != 0
5837 && (EQ (Vdouble_click_time, Qt)
5838 || (INTEGERP (Vdouble_click_time)
5839 && ((int)(event->timestamp - button_down_time)
5840 < XINT (Vdouble_click_time)))));
5841 }
c60ee5e7 5842
559f9d04
RS
5843 last_mouse_button = button;
5844 last_mouse_x = XINT (event->x);
5845 last_mouse_y = XINT (event->y);
5846
7b4aedb9
JB
5847 /* If this is a button press, squirrel away the location, so
5848 we can decide later whether it was a click or a drag. */
5849 if (event->modifiers & down_modifier)
559f9d04
RS
5850 {
5851 if (is_double)
5852 {
5853 double_click_count++;
5854 event->modifiers |= ((double_click_count > 2)
5855 ? triple_modifier
5856 : double_modifier);
5857 }
5858 else
5859 double_click_count = 1;
5860 button_down_time = event->timestamp;
5861 *start_pos_ptr = Fcopy_alist (position);
3b0cdcef 5862 ignore_mouse_drag_p = 0;
559f9d04 5863 }
7b4aedb9 5864
88cb0656 5865 /* Now we're releasing a button - check the co-ordinates to
7b4aedb9 5866 see if this was a click or a drag. */
88cb0656
JB
5867 else if (event->modifiers & up_modifier)
5868 {
129004d3
GM
5869 /* If we did not see a down before this up, ignore the up.
5870 Probably this happened because the down event chose a
5871 menu item. It would be an annoyance to treat the
5872 release of the button that chose the menu item as a
5873 separate event. */
48e416d4 5874
8c18cbfb 5875 if (!CONSP (start_pos))
48e416d4
RS
5876 return Qnil;
5877
88cb0656 5878 event->modifiers &= ~up_modifier;
48e416d4 5879#if 0 /* Formerly we treated an up with no down as a click event. */
8c18cbfb 5880 if (!CONSP (start_pos))
dbc4e1c1
JB
5881 event->modifiers |= click_modifier;
5882 else
48e416d4 5883#endif
dbc4e1c1 5884 {
9b8eb840 5885 Lisp_Object down;
d31053f9 5886 EMACS_INT xdiff = double_click_fuzz, ydiff = double_click_fuzz;
dbc4e1c1 5887
d31053f9
RS
5888 /* The third element of every position
5889 should be the (x,y) pair. */
5890 down = Fcar (Fcdr (Fcdr (start_pos)));
7a6a97d7
SM
5891 if (CONSP (down)
5892 && INTEGERP (XCAR (down)) && INTEGERP (XCDR (down)))
d31053f9 5893 {
4156359e
SM
5894 xdiff = XINT (event->x) - XINT (XCAR (down));
5895 ydiff = XINT (event->y) - XINT (XCDR (down));
d31053f9
RS
5896 }
5897
3b0cdcef
KS
5898 if (ignore_mouse_drag_p)
5899 {
5900 event->modifiers |= click_modifier;
5901 ignore_mouse_drag_p = 0;
5902 }
5903 else if (xdiff < double_click_fuzz && xdiff > - double_click_fuzz
5904 && ydiff < double_click_fuzz && ydiff > - double_click_fuzz
4156359e
SM
5905 /* Maybe the mouse has moved a lot, caused scrolling, and
5906 eventually ended up at the same screen position (but
5907 not buffer position) in which case it is a drag, not
5908 a click. */
5909 /* FIXME: OTOH if the buffer position has changed
5910 because of a timer or process filter rather than
5911 because of mouse movement, it should be considered as
5912 a click. But mouse-drag-region completely ignores
5913 this case and it hasn't caused any real problem, so
5914 it's probably OK to ignore it as well. */
5915 && EQ (Fcar (Fcdr (start_pos)), Fcar (Fcdr (position))))
d31053f9 5916 /* Mouse hasn't moved (much). */
129004d3 5917 event->modifiers |= click_modifier;
fbcd35bd
JB
5918 else
5919 {
d31053f9
RS
5920 button_down_time = 0;
5921 event->modifiers |= drag_modifier;
fbcd35bd 5922 }
c60ee5e7 5923
bc536d84
RS
5924 /* Don't check is_double; treat this as multiple
5925 if the down-event was multiple. */
5926 if (double_click_count > 1)
5927 event->modifiers |= ((double_click_count > 2)
5928 ? triple_modifier
5929 : double_modifier);
dbc4e1c1 5930 }
88cb0656
JB
5931 }
5932 else
5933 /* Every mouse event should either have the down_modifier or
7b4aedb9 5934 the up_modifier set. */
88cb0656
JB
5935 abort ();
5936
88cb0656 5937 {
7b4aedb9 5938 /* Get the symbol we should use for the mouse click. */
9b8eb840
KH
5939 Lisp_Object head;
5940
5941 head = modify_event_symbol (button,
5942 event->modifiers,
8e1e4240
GM
5943 Qmouse_click, Vlispy_mouse_stem,
5944 NULL,
5945 &mouse_syms,
5946 XVECTOR (mouse_syms)->size);
88cb0656 5947 if (event->modifiers & drag_modifier)
dbc4e1c1
JB
5948 return Fcons (head,
5949 Fcons (start_pos,
5950 Fcons (position,
5951 Qnil)));
fbcd35bd
JB
5952 else if (event->modifiers & (double_modifier | triple_modifier))
5953 return Fcons (head,
5954 Fcons (position,
5955 Fcons (make_number (double_click_count),
5956 Qnil)));
88cb0656
JB
5957 else
5958 return Fcons (head,
7b4aedb9 5959 Fcons (position,
88cb0656
JB
5960 Qnil));
5961 }
284f4730 5962 }
db08707d 5963
8006e4bb 5964 case WHEEL_EVENT:
13899bc1 5965 case HORIZ_WHEEL_EVENT:
8006e4bb
JR
5966 {
5967 Lisp_Object position;
8006e4bb 5968 Lisp_Object head;
6b61353c 5969
87d386ff 5970 /* Build the position as appropriate for this mouse click. */
87d386ff 5971 struct frame *f = XFRAME (event->frame_or_window);
87d386ff
JR
5972
5973 /* Ignore wheel events that were made on frame that have been
5974 deleted. */
5975 if (! FRAME_LIVE_P (f))
5976 return Qnil;
5977
6b61353c
KH
5978 position = make_lispy_position (f, &event->x, &event->y,
5979 event->timestamp);
87d386ff 5980
db9cd97a 5981 /* Set double or triple modifiers to indicate the wheel speed. */
87d386ff
JR
5982 {
5983 /* On window-system frames, use the value of
5984 double-click-fuzz as is. On other frames, interpret it
5985 as a multiple of 1/8 characters. */
5986 struct frame *f;
5987 int fuzz;
3208cb35 5988 int symbol_num;
87d386ff
JR
5989 int is_double;
5990
5991 if (WINDOWP (event->frame_or_window))
5992 f = XFRAME (XWINDOW (event->frame_or_window)->frame);
5993 else if (FRAMEP (event->frame_or_window))
5994 f = XFRAME (event->frame_or_window);
5995 else
5996 abort ();
5997
5998 if (FRAME_WINDOW_P (f))
5999 fuzz = double_click_fuzz;
6000 else
6001 fuzz = double_click_fuzz / 8;
6002
3208cb35
YM
6003 if (event->modifiers & up_modifier)
6004 {
6005 /* Emit a wheel-up event. */
6006 event->modifiers &= ~up_modifier;
6007 symbol_num = 0;
6008 }
6009 else if (event->modifiers & down_modifier)
6010 {
6011 /* Emit a wheel-down event. */
6012 event->modifiers &= ~down_modifier;
6013 symbol_num = 1;
6014 }
6015 else
6016 /* Every wheel event should either have the down_modifier or
6017 the up_modifier set. */
6018 abort ();
6019
6020 if (event->kind == HORIZ_WHEEL_EVENT)
6021 symbol_num += 2;
6022
6023 is_double = (last_mouse_button == - (1 + symbol_num)
1ea40aa2
EZ
6024 && (eabs (XINT (event->x) - last_mouse_x) <= fuzz)
6025 && (eabs (XINT (event->y) - last_mouse_y) <= fuzz)
87d386ff
JR
6026 && button_down_time != 0
6027 && (EQ (Vdouble_click_time, Qt)
6028 || (INTEGERP (Vdouble_click_time)
6029 && ((int)(event->timestamp - button_down_time)
6030 < XINT (Vdouble_click_time)))));
6031 if (is_double)
6032 {
6033 double_click_count++;
6034 event->modifiers |= ((double_click_count > 2)
6035 ? triple_modifier
6036 : double_modifier);
6037 }
6038 else
6039 {
6040 double_click_count = 1;
6041 event->modifiers |= click_modifier;
6042 }
6043
6044 button_down_time = event->timestamp;
6045 /* Use a negative value to distinguish wheel from mouse button. */
3208cb35 6046 last_mouse_button = - (1 + symbol_num);
87d386ff
JR
6047 last_mouse_x = XINT (event->x);
6048 last_mouse_y = XINT (event->y);
13899bc1 6049
db9cd97a 6050 /* Get the symbol we should use for the wheel event. */
87d386ff
JR
6051 head = modify_event_symbol (symbol_num,
6052 event->modifiers,
6053 Qmouse_click,
6054 Qnil,
6055 lispy_wheel_names,
6056 &wheel_syms,
6057 ASIZE (wheel_syms));
6058 }
6059
6060 if (event->modifiers & (double_modifier | triple_modifier))
6061 return Fcons (head,
6062 Fcons (position,
6063 Fcons (make_number (double_click_count),
6064 Qnil)));
6065 else
6066 return Fcons (head,
6067 Fcons (position,
6068 Qnil));
8006e4bb
JR
6069 }
6070
6071
05be3964 6072#ifdef USE_TOOLKIT_SCROLL_BARS
7ee32cda
GM
6073
6074 /* We don't have down and up events if using toolkit scroll bars,
6075 so make this always a click event. Store in the `part' of
6076 the Lisp event a symbol which maps to the following actions:
6077
6078 `above_handle' page up
6079 `below_handle' page down
6080 `up' line up
6081 `down' line down
6082 `top' top of buffer
6083 `bottom' bottom of buffer
6084 `handle' thumb has been dragged.
6085 `end-scroll' end of interaction with scroll bar
6086
6087 The incoming input_event contains in its `part' member an
6088 index of type `enum scroll_bar_part' which we can use as an
6089 index in scroll_bar_parts to get the appropriate symbol. */
c60ee5e7 6090
3b8f9651 6091 case SCROLL_BAR_CLICK_EVENT:
7ee32cda
GM
6092 {
6093 Lisp_Object position, head, window, portion_whole, part;
6094
6095 window = event->frame_or_window;
6096 portion_whole = Fcons (event->x, event->y);
6097 part = *scroll_bar_parts[(int) event->part];
6098
6099 position
6100 = Fcons (window,
6101 Fcons (Qvertical_scroll_bar,
6102 Fcons (portion_whole,
6103 Fcons (make_number (event->timestamp),
6104 Fcons (part, Qnil)))));
6105
6106 /* Always treat scroll bar events as clicks. */
6107 event->modifiers |= click_modifier;
05be3964 6108 event->modifiers &= ~up_modifier;
7ee32cda 6109
257f40f2
JD
6110 if (event->code >= ASIZE (mouse_syms))
6111 mouse_syms = larger_vector (mouse_syms, event->code + 1, Qnil);
6112
7ee32cda
GM
6113 /* Get the symbol we should use for the mouse click. */
6114 head = modify_event_symbol (event->code,
6115 event->modifiers,
14e40288 6116 Qmouse_click,
8e1e4240
GM
6117 Vlispy_mouse_stem,
6118 NULL, &mouse_syms,
6119 XVECTOR (mouse_syms)->size);
7ee32cda
GM
6120 return Fcons (head, Fcons (position, Qnil));
6121 }
c60ee5e7 6122
7ee32cda
GM
6123#endif /* USE_TOOLKIT_SCROLL_BARS */
6124
3b8f9651 6125 case DRAG_N_DROP_EVENT:
a24dc617 6126 {
a24dc617 6127 FRAME_PTR f;
6b61353c 6128 Lisp_Object head, position;
a24dc617 6129 Lisp_Object files;
a24dc617 6130
82de1de9
YM
6131 f = XFRAME (event->frame_or_window);
6132 files = event->arg;
a24dc617
RS
6133
6134 /* Ignore mouse events that were made on frames that
6135 have been deleted. */
6136 if (! FRAME_LIVE_P (f))
6137 return Qnil;
afabdbe5 6138
6b61353c
KH
6139 position = make_lispy_position (f, &event->x, &event->y,
6140 event->timestamp);
6141
6142 head = modify_event_symbol (0, event->modifiers,
6143 Qdrag_n_drop, Qnil,
6144 lispy_drag_n_drop_names,
6145 &drag_n_drop_syms, 1);
6146 return Fcons (head,
6147 Fcons (position,
6148 Fcons (files,
6149 Qnil)));
a24dc617 6150 }
514354e9 6151#endif /* HAVE_MOUSE */
284f4730 6152
9e2a2647 6153#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
edfda783 6154 || defined(HAVE_NS) || defined (USE_GTK)
da8f7368
GM
6155 case MENU_BAR_EVENT:
6156 if (EQ (event->arg, event->frame_or_window))
6157 /* This is the prefix key. We translate this to
6158 `(menu_bar)' because the code in keyboard.c for menu
6159 events, which we use, relies on this. */
6160 return Fcons (Qmenu_bar, Qnil);
6161 return event->arg;
2470a66f
KH
6162#endif
6163
a4e19f6e
SM
6164 case SELECT_WINDOW_EVENT:
6165 /* Make an event (select-window (WINDOW)). */
6166 return Fcons (Qselect_window,
6167 Fcons (Fcons (event->frame_or_window, Qnil),
6168 Qnil));
6169
9ea173e8 6170 case TOOL_BAR_EVENT:
da8f7368
GM
6171 if (EQ (event->arg, event->frame_or_window))
6172 /* This is the prefix key. We translate this to
27fd22dc 6173 `(tool_bar)' because the code in keyboard.c for tool bar
da8f7368
GM
6174 events, which we use, relies on this. */
6175 return Fcons (Qtool_bar, Qnil);
6176 else if (SYMBOLP (event->arg))
6177 return apply_modifiers (event->modifiers, event->arg);
6178 return event->arg;
6179
6180 case USER_SIGNAL_EVENT:
5bf68f6e 6181 /* A user signal. */
b809d9e7
KS
6182 {
6183 char *name = find_user_signal_name (event->code);
6184 if (!name)
6185 abort ();
6186 return intern (name);
6187 }
c60ee5e7 6188
3b8f9651 6189 case SAVE_SESSION_EVENT:
4ebc27a5 6190 return Qsave_session;
c60ee5e7 6191
033b73e2
MA
6192#ifdef HAVE_DBUS
6193 case DBUS_EVENT:
6194 {
6195 return Fcons (Qdbus_event, event->arg);
6196 }
6197#endif /* HAVE_DBUS */
6198
7e5a23bd 6199#ifdef HAVE_GPM
ae372f41
NR
6200 case GPM_CLICK_EVENT:
6201 {
6202 FRAME_PTR f = XFRAME (event->frame_or_window);
6203 Lisp_Object head, position;
6204 Lisp_Object *start_pos_ptr;
6205 Lisp_Object start_pos;
6206 int button = event->code;
6207
6208 if (button >= ASIZE (button_down_location))
6209 {
6210 button_down_location = larger_vector (button_down_location,
6211 button + 1, Qnil);
6212 mouse_syms = larger_vector (mouse_syms, button + 1, Qnil);
6213 }
6214
6215 start_pos_ptr = &AREF (button_down_location, button);
6216 start_pos = *start_pos_ptr;
6217
6218 position = make_lispy_position (f, &event->x, &event->y,
6219 event->timestamp);
6220
6221 if (event->modifiers & down_modifier)
6222 *start_pos_ptr = Fcopy_alist (position);
6223 else if (event->modifiers & (up_modifier | drag_modifier))
6224 {
6225 if (!CONSP (start_pos))
6226 return Qnil;
6227 event->modifiers &= ~up_modifier;
6228 }
6229
6230 head = modify_event_symbol (button,
6231 event->modifiers,
6232 Qmouse_click, Vlispy_mouse_stem,
6233 NULL,
6234 &mouse_syms,
6235 XVECTOR (mouse_syms)->size);
6236
6237 if (event->modifiers & drag_modifier)
6238 return Fcons (head,
6239 Fcons (start_pos,
6240 Fcons (position,
6241 Qnil)));
6242 else if (event->modifiers & double_modifier)
6243 return Fcons (head,
6244 Fcons (position,
6245 Fcons (make_number (2),
6246 Qnil)));
6247 else if (event->modifiers & triple_modifier)
6248 return Fcons (head,
6249 Fcons (position,
6250 Fcons (make_number (3),
6251 Qnil)));
6252 else
6253 return Fcons (head,
6254 Fcons (position,
6255 Qnil));
6256 }
7e5a23bd 6257#endif /* HAVE_GPM */
ae372f41 6258
284f4730
JB
6259 /* The 'kind' field of the event is something we don't recognize. */
6260 default:
48e416d4 6261 abort ();
284f4730
JB
6262 }
6263}
6264
bdb1e01d 6265#if defined(HAVE_MOUSE) || defined(HAVE_GPM)
6cbff1cb 6266
284f4730 6267static Lisp_Object
7b4aedb9 6268make_lispy_movement (frame, bar_window, part, x, y, time)
ff11dfa1 6269 FRAME_PTR frame;
7b4aedb9 6270 Lisp_Object bar_window;
3c370943 6271 enum scroll_bar_part part;
284f4730 6272 Lisp_Object x, y;
e5d77022 6273 unsigned long time;
284f4730 6274{
3c370943 6275 /* Is it a scroll bar movement? */
7b4aedb9 6276 if (frame && ! NILP (bar_window))
4bb994d1 6277 {
9b8eb840 6278 Lisp_Object part_sym;
4bb994d1 6279
9b8eb840 6280 part_sym = *scroll_bar_parts[(int) part];
3c370943 6281 return Fcons (Qscroll_bar_movement,
7b4aedb9 6282 (Fcons (Fcons (bar_window,
3c370943 6283 Fcons (Qvertical_scroll_bar,
4bb994d1
JB
6284 Fcons (Fcons (x, y),
6285 Fcons (make_number (time),
cb5df6ae 6286 Fcons (part_sym,
4bb994d1
JB
6287 Qnil))))),
6288 Qnil)));
6289 }
6290
6291 /* Or is it an ordinary mouse movement? */
284f4730
JB
6292 else
6293 {
6b61353c 6294 Lisp_Object position;
9e20143a 6295
6b61353c 6296 position = make_lispy_position (frame, &x, &y, time);
284f4730 6297
4bb994d1 6298 return Fcons (Qmouse_movement,
6b61353c 6299 Fcons (position,
4bb994d1
JB
6300 Qnil));
6301 }
284f4730
JB
6302}
6303
bdb1e01d 6304#endif /* HAVE_MOUSE || HAVE GPM */
6cbff1cb 6305
cd21b839
JB
6306/* Construct a switch frame event. */
6307static Lisp_Object
6308make_lispy_switch_frame (frame)
6309 Lisp_Object frame;
6310{
6311 return Fcons (Qswitch_frame, Fcons (frame, Qnil));
6312}
0a7f1fc0
JB
6313\f
6314/* Manipulating modifiers. */
284f4730 6315
0a7f1fc0 6316/* Parse the name of SYMBOL, and return the set of modifiers it contains.
284f4730 6317
0a7f1fc0
JB
6318 If MODIFIER_END is non-zero, set *MODIFIER_END to the position in
6319 SYMBOL's name of the end of the modifiers; the string from this
6320 position is the unmodified symbol name.
284f4730 6321
0a7f1fc0 6322 This doesn't use any caches. */
6da3dd3a 6323
0a7f1fc0
JB
6324static int
6325parse_modifiers_uncached (symbol, modifier_end)
284f4730 6326 Lisp_Object symbol;
0a7f1fc0 6327 int *modifier_end;
284f4730 6328{
1b049b51 6329 Lisp_Object name;
284f4730
JB
6330 int i;
6331 int modifiers;
284f4730 6332
b7826503 6333 CHECK_SYMBOL (symbol);
df0f2ba1 6334
284f4730 6335 modifiers = 0;
1b049b51 6336 name = SYMBOL_NAME (symbol);
284f4730 6337
1b049b51 6338 for (i = 0; i+2 <= SBYTES (name); )
6da3dd3a
RS
6339 {
6340 int this_mod_end = 0;
6341 int this_mod = 0;
284f4730 6342
6da3dd3a
RS
6343 /* See if the name continues with a modifier word.
6344 Check that the word appears, but don't check what follows it.
6345 Set this_mod and this_mod_end to record what we find. */
fce33686 6346
1b049b51 6347 switch (SREF (name, i))
6da3dd3a
RS
6348 {
6349#define SINGLE_LETTER_MOD(BIT) \
6350 (this_mod_end = i + 1, this_mod = BIT)
6351
6da3dd3a
RS
6352 case 'A':
6353 SINGLE_LETTER_MOD (alt_modifier);
6354 break;
284f4730 6355
6da3dd3a
RS
6356 case 'C':
6357 SINGLE_LETTER_MOD (ctrl_modifier);
6358 break;
284f4730 6359
6da3dd3a
RS
6360 case 'H':
6361 SINGLE_LETTER_MOD (hyper_modifier);
6362 break;
6363
6da3dd3a
RS
6364 case 'M':
6365 SINGLE_LETTER_MOD (meta_modifier);
6366 break;
6367
6da3dd3a
RS
6368 case 'S':
6369 SINGLE_LETTER_MOD (shift_modifier);
6370 break;
6371
6372 case 's':
6da3dd3a
RS
6373 SINGLE_LETTER_MOD (super_modifier);
6374 break;
6375
0a7f1fc0 6376#undef SINGLE_LETTER_MOD
65470b52
SM
6377
6378#define MULTI_LETTER_MOD(BIT, NAME, LEN) \
6379 if (i + LEN + 1 <= SBYTES (name) \
6380 && ! strncmp (SDATA (name) + i, NAME, LEN)) \
6381 { \
6382 this_mod_end = i + LEN; \
6383 this_mod = BIT; \
6384 }
6385
6386 case 'd':
6387 MULTI_LETTER_MOD (drag_modifier, "drag", 4);
6388 MULTI_LETTER_MOD (down_modifier, "down", 4);
6389 MULTI_LETTER_MOD (double_modifier, "double", 6);
6390 break;
6391
6392 case 't':
6393 MULTI_LETTER_MOD (triple_modifier, "triple", 6);
6394 break;
6395#undef MULTI_LETTER_MOD
6396
6da3dd3a
RS
6397 }
6398
6399 /* If we found no modifier, stop looking for them. */
6400 if (this_mod_end == 0)
6401 break;
6402
6403 /* Check there is a dash after the modifier, so that it
6404 really is a modifier. */
1b049b51
KR
6405 if (this_mod_end >= SBYTES (name)
6406 || SREF (name, this_mod_end) != '-')
6da3dd3a
RS
6407 break;
6408
6409 /* This modifier is real; look for another. */
6410 modifiers |= this_mod;
6411 i = this_mod_end + 1;
6412 }
284f4730 6413
0a7f1fc0 6414 /* Should we include the `click' modifier? */
fbcd35bd
JB
6415 if (! (modifiers & (down_modifier | drag_modifier
6416 | double_modifier | triple_modifier))
1b049b51
KR
6417 && i + 7 == SBYTES (name)
6418 && strncmp (SDATA (name) + i, "mouse-", 6) == 0
6419 && ('0' <= SREF (name, i + 6) && SREF (name, i + 6) <= '9'))
0a7f1fc0
JB
6420 modifiers |= click_modifier;
6421
a6d46bc1
JR
6422 if (! (modifiers & (double_modifier | triple_modifier))
6423 && i + 6 < SBYTES (name)
6424 && strncmp (SDATA (name) + i, "wheel-", 6) == 0)
6425 modifiers |= click_modifier;
6426
0a7f1fc0
JB
6427 if (modifier_end)
6428 *modifier_end = i;
6429
6430 return modifiers;
6431}
6432
0a7f1fc0
JB
6433/* Return a symbol whose name is the modifier prefixes for MODIFIERS
6434 prepended to the string BASE[0..BASE_LEN-1].
6435 This doesn't use any caches. */
6436static Lisp_Object
301738ed 6437apply_modifiers_uncached (modifiers, base, base_len, base_len_byte)
0a7f1fc0
JB
6438 int modifiers;
6439 char *base;
301738ed 6440 int base_len, base_len_byte;
0a7f1fc0
JB
6441{
6442 /* Since BASE could contain nulls, we can't use intern here; we have
6443 to use Fintern, which expects a genuine Lisp_String, and keeps a
6444 reference to it. */
301738ed
RS
6445 char *new_mods
6446 = (char *) alloca (sizeof ("A-C-H-M-S-s-down-drag-double-triple-"));
0a7f1fc0 6447 int mod_len;
284f4730 6448
284f4730 6449 {
0a7f1fc0
JB
6450 char *p = new_mods;
6451
6452 /* Only the event queue may use the `up' modifier; it should always
6453 be turned into a click or drag event before presented to lisp code. */
6454 if (modifiers & up_modifier)
6455 abort ();
6456
6457 if (modifiers & alt_modifier) { *p++ = 'A'; *p++ = '-'; }
6458 if (modifiers & ctrl_modifier) { *p++ = 'C'; *p++ = '-'; }
6459 if (modifiers & hyper_modifier) { *p++ = 'H'; *p++ = '-'; }
6460 if (modifiers & meta_modifier) { *p++ = 'M'; *p++ = '-'; }
6461 if (modifiers & shift_modifier) { *p++ = 'S'; *p++ = '-'; }
86e5706b 6462 if (modifiers & super_modifier) { *p++ = 's'; *p++ = '-'; }
fbcd35bd
JB
6463 if (modifiers & double_modifier) { strcpy (p, "double-"); p += 7; }
6464 if (modifiers & triple_modifier) { strcpy (p, "triple-"); p += 7; }
559f9d04
RS
6465 if (modifiers & down_modifier) { strcpy (p, "down-"); p += 5; }
6466 if (modifiers & drag_modifier) { strcpy (p, "drag-"); p += 5; }
0a7f1fc0
JB
6467 /* The click modifier is denoted by the absence of other modifiers. */
6468
6469 *p = '\0';
6470
6471 mod_len = p - new_mods;
6472 }
284f4730 6473
0a7f1fc0 6474 {
9b8eb840 6475 Lisp_Object new_name;
df0f2ba1 6476
301738ed
RS
6477 new_name = make_uninit_multibyte_string (mod_len + base_len,
6478 mod_len + base_len_byte);
d5db4077
KR
6479 bcopy (new_mods, SDATA (new_name), mod_len);
6480 bcopy (base, SDATA (new_name) + mod_len, base_len_byte);
284f4730
JB
6481
6482 return Fintern (new_name, Qnil);
6483 }
6484}
6485
6486
0a7f1fc0
JB
6487static char *modifier_names[] =
6488{
fbcd35bd 6489 "up", "down", "drag", "click", "double", "triple", 0, 0,
f335fabe 6490 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86e5706b 6491 0, 0, "alt", "super", "hyper", "shift", "control", "meta"
0a7f1fc0 6492};
80645119 6493#define NUM_MOD_NAMES (sizeof (modifier_names) / sizeof (modifier_names[0]))
0a7f1fc0
JB
6494
6495static Lisp_Object modifier_symbols;
6496
6497/* Return the list of modifier symbols corresponding to the mask MODIFIERS. */
6498static Lisp_Object
6499lispy_modifier_list (modifiers)
6500 int modifiers;
6501{
6502 Lisp_Object modifier_list;
6503 int i;
6504
6505 modifier_list = Qnil;
80645119 6506 for (i = 0; (1<<i) <= modifiers && i < NUM_MOD_NAMES; i++)
0a7f1fc0 6507 if (modifiers & (1<<i))
80645119
JB
6508 modifier_list = Fcons (XVECTOR (modifier_symbols)->contents[i],
6509 modifier_list);
0a7f1fc0
JB
6510
6511 return modifier_list;
6512}
6513
6514
6515/* Parse the modifiers on SYMBOL, and return a list like (UNMODIFIED MASK),
6516 where UNMODIFIED is the unmodified form of SYMBOL,
6517 MASK is the set of modifiers present in SYMBOL's name.
6518 This is similar to parse_modifiers_uncached, but uses the cache in
6519 SYMBOL's Qevent_symbol_element_mask property, and maintains the
6520 Qevent_symbol_elements property. */
3d31316f 6521
21ec2c43
SM
6522#define KEY_TO_CHAR(k) (XINT (k) & ((1 << CHARACTERBITS) - 1))
6523
1161d367 6524Lisp_Object
0a7f1fc0
JB
6525parse_modifiers (symbol)
6526 Lisp_Object symbol;
6527{
9b8eb840 6528 Lisp_Object elements;
0a7f1fc0 6529
21ec2c43
SM
6530 if (INTEGERP (symbol))
6531 return (Fcons (make_number (KEY_TO_CHAR (symbol)),
6532 Fcons (make_number (XINT (symbol) & CHAR_MODIFIER_MASK),
6533 Qnil)));
6534 else if (!SYMBOLP (symbol))
6535 return Qnil;
6536
9b8eb840 6537 elements = Fget (symbol, Qevent_symbol_element_mask);
0a7f1fc0
JB
6538 if (CONSP (elements))
6539 return elements;
6540 else
6541 {
6542 int end;
ec0faad2 6543 int modifiers = parse_modifiers_uncached (symbol, &end);
9b8eb840 6544 Lisp_Object unmodified;
0a7f1fc0
JB
6545 Lisp_Object mask;
6546
d5db4077
KR
6547 unmodified = Fintern (make_string (SDATA (SYMBOL_NAME (symbol)) + end,
6548 SBYTES (SYMBOL_NAME (symbol)) - end),
9b8eb840
KH
6549 Qnil);
6550
6b61353c 6551 if (modifiers & ~INTMASK)
734fef94 6552 abort ();
bb9e9bed 6553 XSETFASTINT (mask, modifiers);
0a7f1fc0
JB
6554 elements = Fcons (unmodified, Fcons (mask, Qnil));
6555
6556 /* Cache the parsing results on SYMBOL. */
6557 Fput (symbol, Qevent_symbol_element_mask,
6558 elements);
6559 Fput (symbol, Qevent_symbol_elements,
6560 Fcons (unmodified, lispy_modifier_list (modifiers)));
6561
6562 /* Since we know that SYMBOL is modifiers applied to unmodified,
6563 it would be nice to put that in unmodified's cache.
6564 But we can't, since we're not sure that parse_modifiers is
6565 canonical. */
6566
6567 return elements;
6568 }
6569}
6570
58da34c7
SM
6571DEFUN ("internal-event-symbol-parse-modifiers", Fevent_symbol_parse_modifiers,
6572 Sevent_symbol_parse_modifiers, 1, 1, 0,
6573 doc: /* Parse the event symbol. For internal use. */)
9b6112e8
AS
6574 (symbol)
6575 Lisp_Object symbol;
58da34c7
SM
6576{
6577 /* Fill the cache if needed. */
6578 parse_modifiers (symbol);
6579 /* Ignore the result (which is stored on Qevent_symbol_element_mask)
6580 and use the Lispier representation stored on Qevent_symbol_elements
6581 instead. */
6582 return Fget (symbol, Qevent_symbol_elements);
6583}
6584
0a7f1fc0
JB
6585/* Apply the modifiers MODIFIERS to the symbol BASE.
6586 BASE must be unmodified.
6587
6588 This is like apply_modifiers_uncached, but uses BASE's
6589 Qmodifier_cache property, if present. It also builds
cd21b839
JB
6590 Qevent_symbol_elements properties, since it has that info anyway.
6591
6592 apply_modifiers copies the value of BASE's Qevent_kind property to
6593 the modified symbol. */
0a7f1fc0
JB
6594static Lisp_Object
6595apply_modifiers (modifiers, base)
6596 int modifiers;
6597 Lisp_Object base;
6598{
7b4aedb9 6599 Lisp_Object cache, index, entry, new_symbol;
0a7f1fc0 6600
80645119 6601 /* Mask out upper bits. We don't know where this value's been. */
6b61353c 6602 modifiers &= INTMASK;
80645119 6603
21ec2c43 6604 if (INTEGERP (base))
4b7ab1c4 6605 return make_number (XINT (base) | modifiers);
21ec2c43 6606
0a7f1fc0 6607 /* The click modifier never figures into cache indices. */
0a7f1fc0 6608 cache = Fget (base, Qmodifier_cache);
bb9e9bed 6609 XSETFASTINT (index, (modifiers & ~click_modifier));
697e4895 6610 entry = assq_no_quit (index, cache);
0a7f1fc0
JB
6611
6612 if (CONSP (entry))
7539e11f 6613 new_symbol = XCDR (entry);
7b4aedb9
JB
6614 else
6615 {
df0f2ba1 6616 /* We have to create the symbol ourselves. */
7b4aedb9 6617 new_symbol = apply_modifiers_uncached (modifiers,
d5db4077
KR
6618 SDATA (SYMBOL_NAME (base)),
6619 SCHARS (SYMBOL_NAME (base)),
6620 SBYTES (SYMBOL_NAME (base)));
7b4aedb9
JB
6621
6622 /* Add the new symbol to the base's cache. */
6623 entry = Fcons (index, new_symbol);
6624 Fput (base, Qmodifier_cache, Fcons (entry, cache));
6625
35fb885d
SM
6626 /* We have the parsing info now for free, so we could add it to
6627 the caches:
6628 XSETFASTINT (index, modifiers);
6629 Fput (new_symbol, Qevent_symbol_element_mask,
6630 Fcons (base, Fcons (index, Qnil)));
6631 Fput (new_symbol, Qevent_symbol_elements,
6632 Fcons (base, lispy_modifier_list (modifiers)));
6633 Sadly, this is only correct if `base' is indeed a base event,
6634 which is not necessarily the case. -stef */
7b4aedb9 6635 }
0a7f1fc0 6636
df0f2ba1 6637 /* Make sure this symbol is of the same kind as BASE.
7b4aedb9
JB
6638
6639 You'd think we could just set this once and for all when we
6640 intern the symbol above, but reorder_modifiers may call us when
6641 BASE's property isn't set right; we can't assume that just
80645119
JB
6642 because it has a Qmodifier_cache property it must have its
6643 Qevent_kind set right as well. */
7b4aedb9
JB
6644 if (NILP (Fget (new_symbol, Qevent_kind)))
6645 {
9b8eb840 6646 Lisp_Object kind;
7b4aedb9 6647
9b8eb840 6648 kind = Fget (base, Qevent_kind);
7b4aedb9
JB
6649 if (! NILP (kind))
6650 Fput (new_symbol, Qevent_kind, kind);
6651 }
6652
6653 return new_symbol;
0a7f1fc0
JB
6654}
6655
6656
6657/* Given a symbol whose name begins with modifiers ("C-", "M-", etc),
6658 return a symbol with the modifiers placed in the canonical order.
6659 Canonical order is alphabetical, except for down and drag, which
6660 always come last. The 'click' modifier is never written out.
6661
6662 Fdefine_key calls this to make sure that (for example) C-M-foo
6663 and M-C-foo end up being equivalent in the keymap. */
6664
6665Lisp_Object
6666reorder_modifiers (symbol)
6667 Lisp_Object symbol;
6668{
6669 /* It's hopefully okay to write the code this way, since everything
6670 will soon be in caches, and no consing will be done at all. */
9b8eb840 6671 Lisp_Object parsed;
0a7f1fc0 6672
9b8eb840 6673 parsed = parse_modifiers (symbol);
7539e11f
KR
6674 return apply_modifiers ((int) XINT (XCAR (XCDR (parsed))),
6675 XCAR (parsed));
0a7f1fc0
JB
6676}
6677
6678
284f4730
JB
6679/* For handling events, we often want to produce a symbol whose name
6680 is a series of modifier key prefixes ("M-", "C-", etcetera) attached
6681 to some base, like the name of a function key or mouse button.
6682 modify_event_symbol produces symbols of this sort.
6683
6684 NAME_TABLE should point to an array of strings, such that NAME_TABLE[i]
6685 is the name of the i'th symbol. TABLE_SIZE is the number of elements
6686 in the table.
6687
8e1e4240
GM
6688 Alternatively, NAME_ALIST_OR_STEM is either an alist mapping codes
6689 into symbol names, or a string specifying a name stem used to
a50e723f 6690 construct a symbol name or the form `STEM-N', where N is the decimal
8e1e4240
GM
6691 representation of SYMBOL_NUM. NAME_ALIST_OR_STEM is used if it is
6692 non-nil; otherwise NAME_TABLE is used.
80e4aa30 6693
284f4730
JB
6694 SYMBOL_TABLE should be a pointer to a Lisp_Object whose value will
6695 persist between calls to modify_event_symbol that it can use to
6696 store a cache of the symbols it's generated for this NAME_TABLE
80e4aa30 6697 before. The object stored there may be a vector or an alist.
284f4730
JB
6698
6699 SYMBOL_NUM is the number of the base name we want from NAME_TABLE.
df0f2ba1 6700
284f4730
JB
6701 MODIFIERS is a set of modifier bits (as given in struct input_events)
6702 whose prefixes should be applied to the symbol name.
6703
6704 SYMBOL_KIND is the value to be placed in the event_kind property of
df0f2ba1 6705 the returned symbol.
88cb0656
JB
6706
6707 The symbols we create are supposed to have an
eb8c3be9 6708 `event-symbol-elements' property, which lists the modifiers present
88cb0656
JB
6709 in the symbol's name. */
6710
284f4730 6711static Lisp_Object
8e1e4240 6712modify_event_symbol (symbol_num, modifiers, symbol_kind, name_alist_or_stem,
80e4aa30 6713 name_table, symbol_table, table_size)
284f4730
JB
6714 int symbol_num;
6715 unsigned modifiers;
6716 Lisp_Object symbol_kind;
8e1e4240 6717 Lisp_Object name_alist_or_stem;
284f4730
JB
6718 char **name_table;
6719 Lisp_Object *symbol_table;
2c834fb3 6720 unsigned int table_size;
284f4730 6721{
80e4aa30
RS
6722 Lisp_Object value;
6723 Lisp_Object symbol_int;
6724
2c834fb3
KH
6725 /* Get rid of the "vendor-specific" bit here. */
6726 XSETINT (symbol_int, symbol_num & 0xffffff);
284f4730
JB
6727
6728 /* Is this a request for a valid symbol? */
88cb0656 6729 if (symbol_num < 0 || symbol_num >= table_size)
0c2611c5 6730 return Qnil;
284f4730 6731
80e4aa30
RS
6732 if (CONSP (*symbol_table))
6733 value = Fcdr (assq_no_quit (symbol_int, *symbol_table));
6734
0a7f1fc0 6735 /* If *symbol_table doesn't seem to be initialized properly, fix that.
88cb0656 6736 *symbol_table should be a lisp vector TABLE_SIZE elements long,
4bb994d1
JB
6737 where the Nth element is the symbol for NAME_TABLE[N], or nil if
6738 we've never used that symbol before. */
80e4aa30 6739 else
88cb0656 6740 {
80e4aa30
RS
6741 if (! VECTORP (*symbol_table)
6742 || XVECTOR (*symbol_table)->size != table_size)
6743 {
6744 Lisp_Object size;
0a7f1fc0 6745
bb9e9bed 6746 XSETFASTINT (size, table_size);
80e4aa30
RS
6747 *symbol_table = Fmake_vector (size, Qnil);
6748 }
284f4730 6749
80e4aa30
RS
6750 value = XVECTOR (*symbol_table)->contents[symbol_num];
6751 }
284f4730 6752
0a7f1fc0 6753 /* Have we already used this symbol before? */
80e4aa30 6754 if (NILP (value))
284f4730 6755 {
0a7f1fc0 6756 /* No; let's create it. */
8e1e4240
GM
6757 if (CONSP (name_alist_or_stem))
6758 value = Fcdr_safe (Fassq (symbol_int, name_alist_or_stem));
6759 else if (STRINGP (name_alist_or_stem))
6760 {
d5db4077 6761 int len = SBYTES (name_alist_or_stem);
8e1e4240 6762 char *buf = (char *) alloca (len + 50);
987a3489
KL
6763 sprintf (buf, "%s-%ld", SDATA (name_alist_or_stem),
6764 (long) XINT (symbol_int) + 1);
8e1e4240
GM
6765 value = intern (buf);
6766 }
2ff6714d 6767 else if (name_table != 0 && name_table[symbol_num])
80e4aa30 6768 value = intern (name_table[symbol_num]);
b64b4075 6769
e98a93eb 6770#ifdef HAVE_WINDOW_SYSTEM
2c834fb3
KH
6771 if (NILP (value))
6772 {
6773 char *name = x_get_keysym_name (symbol_num);
6774 if (name)
6775 value = intern (name);
6776 }
6777#endif
6778
b64b4075 6779 if (NILP (value))
d1f50460
RS
6780 {
6781 char buf[20];
6782 sprintf (buf, "key-%d", symbol_num);
80e4aa30 6783 value = intern (buf);
d1f50460 6784 }
0a7f1fc0 6785
80e4aa30 6786 if (CONSP (*symbol_table))
4205cb08 6787 *symbol_table = Fcons (Fcons (symbol_int, value), *symbol_table);
80e4aa30
RS
6788 else
6789 XVECTOR (*symbol_table)->contents[symbol_num] = value;
6790
df0f2ba1 6791 /* Fill in the cache entries for this symbol; this also
0a7f1fc0
JB
6792 builds the Qevent_symbol_elements property, which the user
6793 cares about. */
80e4aa30
RS
6794 apply_modifiers (modifiers & click_modifier, value);
6795 Fput (value, Qevent_kind, symbol_kind);
284f4730 6796 }
88cb0656 6797
0a7f1fc0 6798 /* Apply modifiers to that symbol. */
80e4aa30 6799 return apply_modifiers (modifiers, value);
284f4730 6800}
6da3dd3a
RS
6801\f
6802/* Convert a list that represents an event type,
6803 such as (ctrl meta backspace), into the usual representation of that
6804 event type as a number or a symbol. */
6805
a1706c30 6806DEFUN ("event-convert-list", Fevent_convert_list, Sevent_convert_list, 1, 1, 0,
4707d2d0
PJ
6807 doc: /* Convert the event description list EVENT-DESC to an event type.
6808EVENT-DESC should contain one base event type (a character or symbol)
6809and zero or more modifier names (control, meta, hyper, super, shift, alt,
6810drag, down, double or triple). The base must be last.
6811The return value is an event type (a character or symbol) which
6812has the same base event type and all the specified modifiers. */)
6813 (event_desc)
e57d8fd8 6814 Lisp_Object event_desc;
6da3dd3a
RS
6815{
6816 Lisp_Object base;
6817 int modifiers = 0;
6818 Lisp_Object rest;
6819
6820 base = Qnil;
e57d8fd8 6821 rest = event_desc;
6da3dd3a
RS
6822 while (CONSP (rest))
6823 {
6824 Lisp_Object elt;
6825 int this = 0;
6826
7539e11f
KR
6827 elt = XCAR (rest);
6828 rest = XCDR (rest);
6da3dd3a 6829
3d31316f 6830 /* Given a symbol, see if it is a modifier name. */
377f24f5 6831 if (SYMBOLP (elt) && CONSP (rest))
3d31316f 6832 this = parse_solitary_modifier (elt);
6da3dd3a
RS
6833
6834 if (this != 0)
6835 modifiers |= this;
6836 else if (!NILP (base))
6837 error ("Two bases given in one event");
6838 else
6839 base = elt;
6840
6da3dd3a
RS
6841 }
6842
3d31316f 6843 /* Let the symbol A refer to the character A. */
d5db4077 6844 if (SYMBOLP (base) && SCHARS (SYMBOL_NAME (base)) == 1)
4069e0f8 6845 XSETINT (base, SREF (SYMBOL_NAME (base), 0));
3d31316f 6846
6da3dd3a
RS
6847 if (INTEGERP (base))
6848 {
3d31316f
RS
6849 /* Turn (shift a) into A. */
6850 if ((modifiers & shift_modifier) != 0
6851 && (XINT (base) >= 'a' && XINT (base) <= 'z'))
6852 {
6853 XSETINT (base, XINT (base) - ('a' - 'A'));
6854 modifiers &= ~shift_modifier;
6855 }
6856
6857 /* Turn (control a) into C-a. */
6da3dd3a 6858 if (modifiers & ctrl_modifier)
3d31316f 6859 return make_number ((modifiers & ~ctrl_modifier)
6da3dd3a
RS
6860 | make_ctrl_char (XINT (base)));
6861 else
6862 return make_number (modifiers | XINT (base));
6863 }
6864 else if (SYMBOLP (base))
6865 return apply_modifiers (modifiers, base);
6866 else
8c907a56
GM
6867 {
6868 error ("Invalid base event");
6869 return Qnil;
6870 }
6da3dd3a
RS
6871}
6872
3d31316f
RS
6873/* Try to recognize SYMBOL as a modifier name.
6874 Return the modifier flag bit, or 0 if not recognized. */
6875
0bcfd7d7
SM
6876int
6877parse_solitary_modifier (Lisp_Object symbol)
3d31316f 6878{
1b049b51 6879 Lisp_Object name = SYMBOL_NAME (symbol);
3d31316f 6880
1b049b51 6881 switch (SREF (name, 0))
3d31316f
RS
6882 {
6883#define SINGLE_LETTER_MOD(BIT) \
1b049b51 6884 if (SBYTES (name) == 1) \
3d31316f
RS
6885 return BIT;
6886
6887#define MULTI_LETTER_MOD(BIT, NAME, LEN) \
1b049b51
KR
6888 if (LEN == SBYTES (name) \
6889 && ! strncmp (SDATA (name), NAME, LEN)) \
3d31316f
RS
6890 return BIT;
6891
6892 case 'A':
6893 SINGLE_LETTER_MOD (alt_modifier);
6894 break;
6895
6896 case 'a':
6897 MULTI_LETTER_MOD (alt_modifier, "alt", 3);
6898 break;
6899
6900 case 'C':
6901 SINGLE_LETTER_MOD (ctrl_modifier);
6902 break;
6903
6904 case 'c':
6905 MULTI_LETTER_MOD (ctrl_modifier, "ctrl", 4);
6906 MULTI_LETTER_MOD (ctrl_modifier, "control", 7);
6907 break;
6908
6909 case 'H':
6910 SINGLE_LETTER_MOD (hyper_modifier);
6911 break;
6912
6913 case 'h':
6914 MULTI_LETTER_MOD (hyper_modifier, "hyper", 5);
6915 break;
6916
6917 case 'M':
6918 SINGLE_LETTER_MOD (meta_modifier);
6919 break;
6920
6921 case 'm':
6922 MULTI_LETTER_MOD (meta_modifier, "meta", 4);
6923 break;
6924
6925 case 'S':
6926 SINGLE_LETTER_MOD (shift_modifier);
6927 break;
6928
6929 case 's':
6930 MULTI_LETTER_MOD (shift_modifier, "shift", 5);
6931 MULTI_LETTER_MOD (super_modifier, "super", 5);
6932 SINGLE_LETTER_MOD (super_modifier);
6933 break;
6934
6935 case 'd':
6936 MULTI_LETTER_MOD (drag_modifier, "drag", 4);
6937 MULTI_LETTER_MOD (down_modifier, "down", 4);
6938 MULTI_LETTER_MOD (double_modifier, "double", 6);
6939 break;
6940
6941 case 't':
6942 MULTI_LETTER_MOD (triple_modifier, "triple", 6);
6943 break;
6944
6945#undef SINGLE_LETTER_MOD
6946#undef MULTI_LETTER_MOD
6947 }
6948
6949 return 0;
6950}
6951
6da3dd3a
RS
6952/* Return 1 if EVENT is a list whose elements are all integers or symbols.
6953 Such a list is not valid as an event,
6954 but it can be a Lucid-style event type list. */
6955
6956int
6957lucid_event_type_list_p (object)
6958 Lisp_Object object;
6959{
6960 Lisp_Object tail;
6961
6962 if (! CONSP (object))
6963 return 0;
902ae620
GM
6964
6965 if (EQ (XCAR (object), Qhelp_echo)
6966 || EQ (XCAR (object), Qvertical_line)
6967 || EQ (XCAR (object), Qmode_line)
6968 || EQ (XCAR (object), Qheader_line))
6969 return 0;
6da3dd3a 6970
7539e11f 6971 for (tail = object; CONSP (tail); tail = XCDR (tail))
6da3dd3a
RS
6972 {
6973 Lisp_Object elt;
7539e11f 6974 elt = XCAR (tail);
6da3dd3a
RS
6975 if (! (INTEGERP (elt) || SYMBOLP (elt)))
6976 return 0;
6977 }
6978
6979 return NILP (tail);
6980}
284f4730 6981\f
284f4730
JB
6982/* Store into *addr a value nonzero if terminal input chars are available.
6983 Serves the purpose of ioctl (0, FIONREAD, addr)
6984 but works even if FIONREAD does not exist.
d9d4c147
KH
6985 (In fact, this may actually read some input.)
6986
a2d5fca0
JD
6987 If READABLE_EVENTS_DO_TIMERS_NOW is set in FLAGS, actually run
6988 timer events that are ripe.
6989 If READABLE_EVENTS_FILTER_EVENTS is set in FLAGS, ignore internal
6990 events (FOCUS_IN_EVENT).
6991 If READABLE_EVENTS_IGNORE_SQUEEZABLES is set in FLAGS, ignore mouse
354344a2 6992 movements and toolkit scroll bar thumb drags. */
284f4730
JB
6993
6994static void
a2d5fca0 6995get_input_pending (addr, flags)
284f4730 6996 int *addr;
a2d5fca0 6997 int flags;
284f4730
JB
6998{
6999 /* First of all, have we already counted some input? */
a2d5fca0 7000 *addr = (!NILP (Vquit_flag) || readable_events (flags));
284f4730
JB
7001
7002 /* If input is being read as it arrives, and we have none, there is none. */
7003 if (*addr > 0 || (interrupt_input && ! interrupts_deferred))
7004 return;
7005
7006 /* Try to read some input and see how much we get. */
7007 gobble_input (0);
a2d5fca0 7008 *addr = (!NILP (Vquit_flag) || readable_events (flags));
284f4730
JB
7009}
7010
81931ba1 7011/* Interface to read_avail_input, blocking SIGIO or SIGALRM if necessary. */
284f4730 7012
07a59269 7013void
284f4730
JB
7014gobble_input (expected)
7015 int expected;
7016{
033b73e2 7017#ifdef HAVE_DBUS
485db0ba 7018 /* Read D-Bus messages. */
033b73e2
MA
7019 xd_read_queued_messages ();
7020#endif /* HAVE_DBUS */
7021
284f4730
JB
7022#ifdef SIGIO
7023 if (interrupt_input)
7024 {
32676c08 7025 SIGMASKTYPE mask;
4f8aaa74 7026 mask = sigblock (sigmask (SIGIO));
284f4730 7027 read_avail_input (expected);
e065a56e 7028 sigsetmask (mask);
284f4730
JB
7029 }
7030 else
81931ba1 7031#ifdef POLL_FOR_INPUT
428a555e
KL
7032 /* XXX This condition was (read_socket_hook && !interrupt_input),
7033 but read_socket_hook is not global anymore. Let's pretend that
7034 it's always set. */
7035 if (!interrupt_input && poll_suppress_count == 0)
81931ba1
RS
7036 {
7037 SIGMASKTYPE mask;
4f8aaa74 7038 mask = sigblock (sigmask (SIGALRM));
81931ba1
RS
7039 read_avail_input (expected);
7040 sigsetmask (mask);
7041 }
7042 else
284f4730 7043#endif
284f4730 7044#endif
12063bc5 7045 read_avail_input (expected);
284f4730 7046}
a8015ab5 7047
3b8f9651 7048/* Put a BUFFER_SWITCH_EVENT in the buffer
241ceaf7
RS
7049 so that read_key_sequence will notice the new current buffer. */
7050
07a59269 7051void
a8015ab5
KH
7052record_asynch_buffer_change ()
7053{
7054 struct input_event event;
a30f0615 7055 Lisp_Object tem;
1269a761 7056 EVENT_INIT (event);
a30f0615 7057
3b8f9651 7058 event.kind = BUFFER_SWITCH_EVENT;
a8015ab5 7059 event.frame_or_window = Qnil;
da8f7368 7060 event.arg = Qnil;
241ceaf7 7061
f65e6f7d 7062#ifdef subprocesses
a30f0615
RS
7063 /* We don't need a buffer-switch event unless Emacs is waiting for input.
7064 The purpose of the event is to make read_key_sequence look up the
7065 keymaps again. If we aren't in read_key_sequence, we don't need one,
7066 and the event could cause trouble by messing up (input-pending-p). */
7067 tem = Fwaiting_for_user_input_p ();
7068 if (NILP (tem))
7069 return;
f65e6f7d
RS
7070#else
7071 /* We never need these events if we have no asynchronous subprocesses. */
7072 return;
7073#endif
a30f0615 7074
241ceaf7
RS
7075 /* Make sure no interrupt happens while storing the event. */
7076#ifdef SIGIO
7077 if (interrupt_input)
7078 {
7079 SIGMASKTYPE mask;
4f8aaa74 7080 mask = sigblock (sigmask (SIGIO));
241ceaf7
RS
7081 kbd_buffer_store_event (&event);
7082 sigsetmask (mask);
7083 }
7084 else
7085#endif
7086 {
7087 stop_polling ();
7088 kbd_buffer_store_event (&event);
7089 start_polling ();
7090 }
a8015ab5 7091}
284f4730 7092\f
284f4730
JB
7093/* Read any terminal input already buffered up by the system
7094 into the kbd_buffer, but do not wait.
7095
7096 EXPECTED should be nonzero if the caller knows there is some input.
7097
284f4730
JB
7098 Returns the number of keyboard chars read, or -1 meaning
7099 this is a bad time to try to read input. */
7100
7101static int
7102read_avail_input (expected)
7103 int expected;
7104{
6b61353c 7105 int nread = 0;
80d4c824 7106 int err = 0;
6ed8eeff 7107 struct terminal *t;
1269a761 7108
23479b40
YM
7109 /* Store pending user signal events, if any. */
7110 if (store_user_signal_events ())
7111 expected = 0;
7112
6ed8eeff
KL
7113 /* Loop through the available terminals, and call their input hooks. */
7114 t = terminal_list;
7115 while (t)
6b61353c 7116 {
6ed8eeff 7117 struct terminal *next = t->next_terminal;
6b61353c 7118
6ed8eeff 7119 if (t->read_socket_hook)
d448e982 7120 {
3b7fbceb 7121 int nr;
057a9ab4 7122 struct input_event hold_quit;
d448e982 7123
057a9ab4
KL
7124 EVENT_INIT (hold_quit);
7125 hold_quit.kind = NO_EVENT;
351d2e14 7126
057a9ab4 7127 /* No need for FIONREAD or fcntl; just say don't wait. */
6ed8eeff 7128 while (nr = (*t->read_socket_hook) (t, expected, &hold_quit), nr > 0)
057a9ab4
KL
7129 {
7130 nread += nr;
7131 expected = 0;
7132 }
033b73e2 7133
057a9ab4
KL
7134 if (nr == -1) /* Not OK to read input now. */
7135 {
7136 err = 1;
7137 }
7138 else if (nr == -2) /* Non-transient error. */
7139 {
6ed8eeff 7140 /* The terminal device terminated; it should be closed. */
033b73e2 7141
6ed8eeff
KL
7142 /* Kill Emacs if this was our last terminal. */
7143 if (!terminal_list->next_terminal)
057a9ab4
KL
7144 /* Formerly simply reported no input, but that
7145 sometimes led to a failure of Emacs to terminate.
7146 SIGHUP seems appropriate if we can't reach the
7147 terminal. */
7148 /* ??? Is it really right to send the signal just to
7149 this process rather than to the whole process
7150 group? Perhaps on systems with FIONREAD Emacs is
7151 alone in its group. */
7152 kill (getpid (), SIGHUP);
033b73e2 7153
e2749141 7154 /* XXX Is calling delete_terminal safe here? It calls delete_frame. */
adf6a429
SM
7155 {
7156 Lisp_Object tmp;
7157 XSETTERMINAL (tmp, t);
7158 Fdelete_terminal (tmp, Qnoelisp);
7159 }
057a9ab4 7160 }
351d2e14 7161
057a9ab4
KL
7162 if (hold_quit.kind != NO_EVENT)
7163 kbd_buffer_store_event (&hold_quit);
d448e982 7164 }
6b61353c 7165
6ed8eeff 7166 t = next;
6b61353c 7167 }
284f4730 7168
1cbfd764
KL
7169 if (err && !nread)
7170 nread = -1;
7171
e044e4fc
JD
7172 frame_make_pointer_visible ();
7173
8f1ce423
KL
7174 return nread;
7175}
7176
fd503d99
KH
7177static void
7178decode_keyboard_code (struct tty_display_info *tty,
7179 struct coding_system *coding,
7180 unsigned char *buf, int nbytes)
7181{
7182 unsigned char *src = buf;
7183 const unsigned char *p;
7184 int i;
7185
7186 if (nbytes == 0)
7187 return;
7188 if (tty->meta_key != 2)
7189 for (i = 0; i < nbytes; i++)
7190 buf[i] &= ~0x80;
7191 if (coding->carryover_bytes > 0)
7192 {
7193 src = alloca (coding->carryover_bytes + nbytes);
7194 memcpy (src, coding->carryover, coding->carryover_bytes);
7195 memcpy (src + coding->carryover_bytes, buf, nbytes);
7196 nbytes += coding->carryover_bytes;
7197 }
7198 coding->destination = alloca (nbytes * 4);
7199 coding->dst_bytes = nbytes * 4;
7200 decode_coding_c_string (coding, src, nbytes, Qnil);
7201 if (coding->produced_char == 0)
7202 return;
7203 for (i = 0, p = coding->destination; i < coding->produced_char; i++)
7204 {
7205 struct input_event buf;
7206
7207 EVENT_INIT (buf);
7208 buf.code = STRING_CHAR_ADVANCE (p);
7209 buf.kind = (ASCII_CHAR_P (buf.code)
7210 ? ASCII_KEYSTROKE_EVENT : MULTIBYTE_CHAR_KEYSTROKE_EVENT);
7211 /* See the comment in tty_read_avail_input. */
7212 buf.frame_or_window = tty->top_frame;
7213 buf.arg = Qnil;
7214 kbd_buffer_store_event (&buf);
7215 }
7216}
7217
8f1ce423
KL
7218/* This is the tty way of reading available input.
7219
6ed8eeff 7220 Note that each terminal device has its own `struct terminal' object,
8f1ce423 7221 and so this function is called once for each individual termcap
6ed8eeff 7222 terminal. The first parameter indicates which terminal to read from. */
d448e982 7223
8f1ce423 7224int
6ed8eeff 7225tty_read_avail_input (struct terminal *terminal,
057a9ab4
KL
7226 int expected,
7227 struct input_event *hold_quit)
8f1ce423 7228{
057a9ab4
KL
7229 /* Using KBD_BUFFER_SIZE - 1 here avoids reading more than
7230 the kbd_buffer can really hold. That may prevent loss
7231 of characters on some systems when input is stuffed at us. */
7232 unsigned char cbuf[KBD_BUFFER_SIZE - 1];
8f1ce423 7233 int n_to_read, i;
6ed8eeff 7234 struct tty_display_info *tty = terminal->display_info.tty;
8f1ce423 7235 int nread = 0;
3b7fbceb 7236
bcc3646e 7237 if (!terminal->name) /* Don't read from a dead terminal. */
1bc973c2 7238 return 0;
ab797f65 7239
cb22456d
EZ
7240 if (terminal->type != output_termcap
7241 && terminal->type != output_msdos_raw)
8f1ce423 7242 abort ();
3b7fbceb 7243
ac3d2625 7244 /* XXX I think the following code should be moved to separate hook
8f1ce423 7245 functions in system-dependent files. */
bc536d84 7246#ifdef WINDOWSNT
8f1ce423 7247 return 0;
bc536d84 7248#else /* not WINDOWSNT */
cb22456d
EZ
7249 if (! tty->term_initted) /* In case we get called during bootstrap. */
7250 return 0;
7251
7252 if (! tty->input)
7253 return 0; /* The terminal is suspended. */
7254
80e4aa30 7255#ifdef MSDOS
8f1ce423
KL
7256 n_to_read = dos_keysns ();
7257 if (n_to_read == 0)
7258 return 0;
3b7fbceb 7259
8f1ce423
KL
7260 cbuf[0] = dos_keyread ();
7261 nread = 1;
3b7fbceb 7262
c3a2738c 7263#else /* not MSDOS */
7e5a23bd 7264#ifdef HAVE_GPM
71f44e7a 7265 if (gpm_tty == tty)
7be1c21a
MB
7266 {
7267 Gpm_Event event;
7268 struct input_event hold_quit;
d347e494 7269 int gpm, fd = gpm_fd;
ae372f41 7270
7be1c21a
MB
7271 EVENT_INIT (hold_quit);
7272 hold_quit.kind = NO_EVENT;
ae372f41 7273
d347e494
SM
7274 /* gpm==1 if event received.
7275 gpm==0 if the GPM daemon has closed the connection, in which case
7276 Gpm_GetEvent closes gpm_fd and clears it to -1, which is why
7277 we save it in `fd' so close_gpm can remove it from the
7278 select masks.
7279 gpm==-1 if a protocol error or EWOULDBLOCK; the latter is normal. */
7be1c21a
MB
7280 while (gpm = Gpm_GetEvent (&event), gpm == 1) {
7281 nread += handle_one_term_event (tty, &event, &hold_quit);
7282 }
d347e494 7283 if (gpm == 0)
ed5ff21d 7284 /* Presumably the GPM daemon has closed the connection. */
d347e494 7285 close_gpm (fd);
7be1c21a
MB
7286 if (hold_quit.kind != NO_EVENT)
7287 kbd_buffer_store_event (&hold_quit);
7288 if (nread)
7289 return nread;
7290 }
7e5a23bd 7291#endif /* HAVE_GPM */
ae372f41 7292
7be1c21a 7293/* Determine how many characters we should *try* to read. */
284f4730 7294#ifdef FIONREAD
8f1ce423 7295 /* Find out how much input is available. */
0b0d3e0b 7296 if (ioctl (fileno (tty->input), FIONREAD, &n_to_read) < 0)
8f1ce423
KL
7297 {
7298 if (! noninteractive)
6ed8eeff 7299 return -2; /* Close this terminal. */
8f1ce423 7300 else
d448e982 7301 n_to_read = 0;
8f1ce423
KL
7302 }
7303 if (n_to_read == 0)
7304 return 0;
7305 if (n_to_read > sizeof cbuf)
7306 n_to_read = sizeof cbuf;
284f4730 7307#else /* no FIONREAD */
e39a993c 7308#if defined (USG) || defined(CYGWIN)
8f1ce423
KL
7309 /* Read some input if available, but don't wait. */
7310 n_to_read = sizeof cbuf;
0b0d3e0b 7311 fcntl (fileno (tty->input), F_SETFL, O_NDELAY);
284f4730 7312#else
8f1ce423 7313 you lose;
284f4730
JB
7314#endif
7315#endif
7316
8f1ce423
KL
7317 /* Now read; for one reason or another, this will not block.
7318 NREAD is set to the number of chars read. */
7319 do
7320 {
0b0d3e0b 7321 nread = emacs_read (fileno (tty->input), cbuf, n_to_read);
8f1ce423
KL
7322 /* POSIX infers that processes which are not in the session leader's
7323 process group won't get SIGHUP's at logout time. BSDI adheres to
7324 this part standard and returns -1 from read (0) with errno==EIO
7325 when the control tty is taken away.
ac3d2625 7326 Jeffrey Honig <jch@bsdi.com> says this is generally safe. */
8f1ce423 7327 if (nread == -1 && errno == EIO)
6ed8eeff 7328 return -2; /* Close this terminal. */
4624371d 7329#if defined (AIX) && defined (_BSD)
8f1ce423
KL
7330 /* The kernel sometimes fails to deliver SIGHUP for ptys.
7331 This looks incorrect, but it isn't, because _BSD causes
7332 O_NDELAY to be defined in fcntl.h as O_NONBLOCK,
7333 and that causes a value other than 0 when there is no input. */
7334 if (nread == 0)
6ed8eeff 7335 return -2; /* Close this terminal. */
284f4730 7336#endif
8f1ce423
KL
7337 }
7338 while (
7339 /* We used to retry the read if it was interrupted.
7340 But this does the wrong thing when O_NDELAY causes
7341 an EAGAIN error. Does anybody know of a situation
7342 where a retry is actually needed? */
791587ee 7343#if 0
8f1ce423 7344 nread < 0 && (errno == EAGAIN
6aec06f5 7345#ifdef EFAULT
8f1ce423 7346 || errno == EFAULT
80e4aa30 7347#endif
284f4730 7348#ifdef EBADSLT
8f1ce423 7349 || errno == EBADSLT
284f4730 7350#endif
8f1ce423 7351 )
791587ee 7352#else
8f1ce423 7353 0
791587ee 7354#endif
8f1ce423 7355 );
284f4730
JB
7356
7357#ifndef FIONREAD
e39a993c 7358#if defined (USG) || defined (CYGWIN)
0b0d3e0b 7359 fcntl (fileno (tty->input), F_SETFL, 0);
e39a993c 7360#endif /* USG or CYGWIN */
284f4730 7361#endif /* no FIONREAD */
3b7fbceb 7362
8f1ce423
KL
7363 if (nread <= 0)
7364 return nread;
3b7fbceb 7365
9628b887
KL
7366#endif /* not MSDOS */
7367#endif /* not WINDOWSNT */
3b7fbceb 7368
fd503d99
KH
7369 if (TERMINAL_KEYBOARD_CODING (terminal)->common_flags
7370 & CODING_REQUIRE_DECODING_MASK)
7371 {
7372 struct coding_system *coding = TERMINAL_KEYBOARD_CODING (terminal);
7373 int from;
485db0ba 7374
fd503d99
KH
7375 /* Decode the key sequence except for those with meta
7376 modifiers. */
7377 for (i = from = 0; ; i++)
7378 if (i == nread || (tty->meta_key == 1 && (cbuf[i] & 0x80)))
7379 {
7380 struct input_event buf;
7381
7382 decode_keyboard_code (tty, coding, cbuf + from, i - from);
7383 if (i == nread)
7384 break;
7385
7386 EVENT_INIT (buf);
7387 buf.kind = ASCII_KEYSTROKE_EVENT;
7388 buf.modifiers = meta_modifier;
7389 buf.code = cbuf[i] & ~0x80;
7390 /* See the comment below. */
7391 buf.frame_or_window = tty->top_frame;
7392 buf.arg = Qnil;
7393 kbd_buffer_store_event (&buf);
7394 from = i + 1;
7395 }
7396 return nread;
7397 }
7398
284f4730
JB
7399 for (i = 0; i < nread; i++)
7400 {
057a9ab4
KL
7401 struct input_event buf;
7402 EVENT_INIT (buf);
7403 buf.kind = ASCII_KEYSTROKE_EVENT;
7404 buf.modifiers = 0;
8f1ce423 7405 if (tty->meta_key == 1 && (cbuf[i] & 0x80))
057a9ab4 7406 buf.modifiers = meta_modifier;
8f1ce423
KL
7407 if (tty->meta_key != 2)
7408 cbuf[i] &= ~0x80;
033b73e2 7409
057a9ab4 7410 buf.code = cbuf[i];
ac3d2625
KL
7411 /* Set the frame corresponding to the active tty. Note that the
7412 value of selected_frame is not reliable here, redisplay tends
7413 to temporarily change it. */
057a9ab4
KL
7414 buf.frame_or_window = tty->top_frame;
7415 buf.arg = Qnil;
033b73e2 7416
057a9ab4
KL
7417 kbd_buffer_store_event (&buf);
7418 /* Don't look at input that follows a C-g too closely.
7419 This reduces lossage due to autorepeat on C-g. */
7420 if (buf.kind == ASCII_KEYSTROKE_EVENT
7421 && buf.code == quit_char)
7422 break;
284f4730
JB
7423 }
7424
7425 return nread;
7426}
284f4730 7427\f
6b61353c
KH
7428void
7429handle_async_input ()
7430{
6b61353c 7431 interrupt_input_pending = 0;
07a1e794 7432#ifdef SYNC_INPUT
ceb18827 7433 pending_signals = pending_atimers;
07a1e794 7434#endif
c96169a0
AR
7435/* Tell ns_read_socket() it is being called asynchronously so it can avoid
7436 doing anything dangerous. */
7437#ifdef HAVE_NS
7438 ++handling_signal;
7439#endif
6b61353c
KH
7440 while (1)
7441 {
7442 int nread;
7443 nread = read_avail_input (1);
7444 /* -1 means it's not ok to read the input now.
7445 UNBLOCK_INPUT will read it later; now, avoid infinite loop.
7446 0 means there was no keyboard input available. */
7447 if (nread <= 0)
7448 break;
6b61353c 7449 }
c96169a0
AR
7450#ifdef HAVE_NS
7451 --handling_signal;
7452#endif
6b61353c
KH
7453}
7454
ceb18827
CY
7455void
7456process_pending_signals ()
7457{
7458 if (interrupt_input_pending)
7459 handle_async_input ();
7460 do_pending_atimers ();
7461}
7462
284f4730
JB
7463#ifdef SIGIO /* for entire page */
7464/* Note SIGIO has been undef'd if FIONREAD is missing. */
7465
4216b545 7466static SIGTYPE
284f4730
JB
7467input_available_signal (signo)
7468 int signo;
7469{
7470 /* Must preserve main program's value of errno. */
7471 int old_errno = errno;
5970a8cb 7472#if defined (USG) && !defined (POSIX_SIGNALS)
284f4730
JB
7473 /* USG systems forget handlers when they are used;
7474 must reestablish each time */
7475 signal (signo, input_available_signal);
7476#endif /* USG */
7477
6b61353c
KH
7478#ifdef SYNC_INPUT
7479 interrupt_input_pending = 1;
ceb18827 7480 pending_signals = 1;
6b61353c 7481#else
333f1b6f 7482 SIGNAL_THREAD_CHECK (signo);
bd55c35c 7483#endif
a25f766a 7484
bd55c35c
JD
7485 if (input_available_clear_time)
7486 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
d7031edc 7487
bd55c35c 7488#ifndef SYNC_INPUT
6b61353c 7489 handle_async_input ();
284f4730 7490#endif
284f4730 7491
284f4730
JB
7492 errno = old_errno;
7493}
7494#endif /* SIGIO */
ad163903
JB
7495
7496/* Send ourselves a SIGIO.
7497
7498 This function exists so that the UNBLOCK_INPUT macro in
7499 blockinput.h can have some way to take care of input we put off
7500 dealing with, without assuming that every file which uses
7501 UNBLOCK_INPUT also has #included the files necessary to get SIGIO. */
7502void
7503reinvoke_input_signal ()
7504{
df0f2ba1 7505#ifdef SIGIO
6b61353c 7506 handle_async_input ();
ad163903
JB
7507#endif
7508}
7509
7510
284f4730 7511\f
23479b40
YM
7512/* User signal events. */
7513
7514struct user_signal_info
7515{
7516 /* Signal number. */
7517 int sig;
7518
7519 /* Name of the signal. */
7520 char *name;
7521
7522 /* Number of pending signals. */
7523 int npending;
7524
7525 struct user_signal_info *next;
7526};
7527
7528/* List of user signals. */
7529static struct user_signal_info *user_signals = NULL;
7530
7531void
7532add_user_signal (sig, name)
7533 int sig;
7534 const char *name;
7535{
7536 struct user_signal_info *p;
7537
7538 for (p = user_signals; p; p = p->next)
7539 if (p->sig == sig)
7540 /* Already added. */
7541 return;
7542
7543 p = xmalloc (sizeof (struct user_signal_info));
7544 p->sig = sig;
7545 p->name = xstrdup (name);
7546 p->npending = 0;
7547 p->next = user_signals;
7548 user_signals = p;
7549
7550 signal (sig, handle_user_signal);
7551}
7552
7553static SIGTYPE
7554handle_user_signal (sig)
7555 int sig;
7556{
7557 int old_errno = errno;
7558 struct user_signal_info *p;
7559
7560#if defined (USG) && !defined (POSIX_SIGNALS)
7561 /* USG systems forget handlers when they are used;
7562 must reestablish each time */
7563 signal (sig, handle_user_signal);
7564#endif
7565
7566 SIGNAL_THREAD_CHECK (sig);
7567
7568 for (p = user_signals; p; p = p->next)
7569 if (p->sig == sig)
7570 {
7571 p->npending++;
7572#ifdef SIGIO
7573 if (interrupt_input)
7574 kill (getpid (), SIGIO);
7575 else
7576#endif
7577 {
7578 /* Tell wait_reading_process_output that it needs to wake
7579 up and look around. */
7580 if (input_available_clear_time)
7581 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
7582 }
7583 break;
7584 }
7585
7586 errno = old_errno;
7587}
7588
7589static char *
7590find_user_signal_name (sig)
7591 int sig;
7592{
7593 struct user_signal_info *p;
7594
7595 for (p = user_signals; p; p = p->next)
7596 if (p->sig == sig)
7597 return p->name;
7598
7599 return NULL;
7600}
7601
7602static int
7603store_user_signal_events ()
7604{
7605 struct user_signal_info *p;
7606 struct input_event buf;
7607 int nstored = 0;
7608
7609 for (p = user_signals; p; p = p->next)
7610 if (p->npending > 0)
7611 {
7612 SIGMASKTYPE mask;
7613
7614 if (nstored == 0)
7615 {
7616 bzero (&buf, sizeof buf);
7617 buf.kind = USER_SIGNAL_EVENT;
7618 buf.frame_or_window = selected_frame;
7619 }
7620 nstored += p->npending;
7621
7622 mask = sigblock (sigmask (p->sig));
7623 do
7624 {
23479b40
YM
7625 buf.code = p->sig;
7626 kbd_buffer_store_event (&buf);
7627 p->npending--;
7628 }
7629 while (p->npending > 0);
7630 sigsetmask (mask);
7631 }
7632
7633 return nstored;
7634}
7635
7636\f
318ab85c
SM
7637static void menu_bar_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, void*));
7638static Lisp_Object menu_bar_one_keymap_changed_items;
b7c49376
RS
7639
7640/* These variables hold the vector under construction within
7641 menu_bar_items and its subroutines, and the current index
7642 for storing into that vector. */
7643static Lisp_Object menu_bar_items_vector;
9343ab07 7644static int menu_bar_items_index;
5ec75a55 7645
b7c49376
RS
7646/* Return a vector of menu items for a menu bar, appropriate
7647 to the current buffer. Each item has three elements in the vector:
f5e09c8b 7648 KEY STRING MAPLIST.
b7c49376
RS
7649
7650 OLD is an old vector we can optionally reuse, or nil. */
5ec75a55
RS
7651
7652Lisp_Object
b7c49376
RS
7653menu_bar_items (old)
7654 Lisp_Object old;
5ec75a55
RS
7655{
7656 /* The number of keymaps we're scanning right now, and the number of
7657 keymaps we have allocated space for. */
7658 int nmaps;
7659
7660 /* maps[0..nmaps-1] are the prefix definitions of KEYBUF[0..t-1]
7661 in the current keymaps, or nil where it is not a prefix. */
7662 Lisp_Object *maps;
7663
aebfea68 7664 Lisp_Object def, tail;
5ec75a55
RS
7665
7666 Lisp_Object result;
7667
7668 int mapno;
47d319aa 7669 Lisp_Object oquit;
5ec75a55 7670
b7c49376
RS
7671 int i;
7672
db60d856
JB
7673 /* In order to build the menus, we need to call the keymap
7674 accessors. They all call QUIT. But this function is called
7675 during redisplay, during which a quit is fatal. So inhibit
47d319aa
RS
7676 quitting while building the menus.
7677 We do this instead of specbind because (1) errors will clear it anyway
7678 and (2) this avoids risk of specpdl overflow. */
7679 oquit = Vinhibit_quit;
df0f2ba1 7680 Vinhibit_quit = Qt;
db60d856 7681
b7c49376
RS
7682 if (!NILP (old))
7683 menu_bar_items_vector = old;
7684 else
7685 menu_bar_items_vector = Fmake_vector (make_number (24), Qnil);
7686 menu_bar_items_index = 0;
7687
5ec75a55
RS
7688 /* Build our list of keymaps.
7689 If we recognize a function key and replace its escape sequence in
7690 keybuf with its symbol, or if the sequence starts with a mouse
7691 click and we need to switch buffers, we jump back here to rebuild
7692 the initial keymaps from the current buffer. */
df0f2ba1 7693 {
5ec75a55
RS
7694 Lisp_Object *tmaps;
7695
217258d5 7696 /* Should overriding-terminal-local-map and overriding-local-map apply? */
d0a49716 7697 if (!NILP (Voverriding_local_map_menu_flag))
9dd3131c 7698 {
217258d5
KH
7699 /* Yes, use them (if non-nil) as well as the global map. */
7700 maps = (Lisp_Object *) alloca (3 * sizeof (maps[0]));
7701 nmaps = 0;
7702 if (!NILP (current_kboard->Voverriding_terminal_local_map))
7703 maps[nmaps++] = current_kboard->Voverriding_terminal_local_map;
7704 if (!NILP (Voverriding_local_map))
7705 maps[nmaps++] = Voverriding_local_map;
9dd3131c
RS
7706 }
7707 else
7708 {
fd646341
KS
7709 /* No, so use major and minor mode keymaps and keymap property.
7710 Note that menu-bar bindings in the local-map and keymap
7711 properties may not work reliable, as they are only
7712 recognized when the menu-bar (or mode-line) is updated,
7713 which does not normally happen after every command. */
7714 Lisp_Object tem;
7715 int nminor;
7716 nminor = current_minor_maps (NULL, &tmaps);
7717 maps = (Lisp_Object *) alloca ((nminor + 3) * sizeof (maps[0]));
7718 nmaps = 0;
7719 if (tem = get_local_map (PT, current_buffer, Qkeymap), !NILP (tem))
7720 maps[nmaps++] = tem;
7721 bcopy (tmaps, (void *) (maps + nmaps), nminor * sizeof (maps[0]));
7722 nmaps += nminor;
7723 maps[nmaps++] = get_local_map (PT, current_buffer, Qlocal_map);
9dd3131c 7724 }
217258d5 7725 maps[nmaps++] = current_global_map;
5ec75a55
RS
7726 }
7727
7728 /* Look up in each map the dummy prefix key `menu-bar'. */
7729
7730 result = Qnil;
7731
e58aa385 7732 for (mapno = nmaps - 1; mapno >= 0; mapno--)
25126faa
GM
7733 if (!NILP (maps[mapno]))
7734 {
341a09cf
SM
7735 def = get_keymap (access_keymap (maps[mapno], Qmenu_bar, 1, 0, 1),
7736 0, 1);
02067692 7737 if (CONSP (def))
4216b545
SM
7738 {
7739 menu_bar_one_keymap_changed_items = Qnil;
7740 map_keymap (def, menu_bar_item, Qnil, NULL, 1);
7741 }
25126faa 7742 }
5ec75a55 7743
b7c49376
RS
7744 /* Move to the end those items that should be at the end. */
7745
7539e11f 7746 for (tail = Vmenu_bar_final_items; CONSP (tail); tail = XCDR (tail))
9f9c0e27 7747 {
b7c49376
RS
7748 int i;
7749 int end = menu_bar_items_index;
7750
35b3402f 7751 for (i = 0; i < end; i += 4)
7539e11f 7752 if (EQ (XCAR (tail), XVECTOR (menu_bar_items_vector)->contents[i]))
b7c49376 7753 {
35b3402f 7754 Lisp_Object tem0, tem1, tem2, tem3;
0301268e
RS
7755 /* Move the item at index I to the end,
7756 shifting all the others forward. */
7757 tem0 = XVECTOR (menu_bar_items_vector)->contents[i + 0];
7758 tem1 = XVECTOR (menu_bar_items_vector)->contents[i + 1];
7759 tem2 = XVECTOR (menu_bar_items_vector)->contents[i + 2];
35b3402f
RS
7760 tem3 = XVECTOR (menu_bar_items_vector)->contents[i + 3];
7761 if (end > i + 4)
7762 bcopy (&XVECTOR (menu_bar_items_vector)->contents[i + 4],
0301268e 7763 &XVECTOR (menu_bar_items_vector)->contents[i],
35b3402f
RS
7764 (end - i - 4) * sizeof (Lisp_Object));
7765 XVECTOR (menu_bar_items_vector)->contents[end - 4] = tem0;
7766 XVECTOR (menu_bar_items_vector)->contents[end - 3] = tem1;
7767 XVECTOR (menu_bar_items_vector)->contents[end - 2] = tem2;
7768 XVECTOR (menu_bar_items_vector)->contents[end - 1] = tem3;
0301268e 7769 break;
b7c49376
RS
7770 }
7771 }
9f9c0e27 7772
0c9071cd 7773 /* Add nil, nil, nil, nil at the end. */
b7c49376 7774 i = menu_bar_items_index;
35b3402f 7775 if (i + 4 > XVECTOR (menu_bar_items_vector)->size)
6bf377e2 7776 menu_bar_items_vector = larger_vector (menu_bar_items_vector, 2 * i, Qnil);
b7c49376
RS
7777 /* Add this item. */
7778 XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
7779 XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
7780 XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
35b3402f 7781 XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
b7c49376 7782 menu_bar_items_index = i;
a73c5e29 7783
47d319aa 7784 Vinhibit_quit = oquit;
b7c49376 7785 return menu_bar_items_vector;
5ec75a55
RS
7786}
7787\f
f5e09c8b
RS
7788/* Add one item to menu_bar_items_vector, for KEY, ITEM_STRING and DEF.
7789 If there's already an item for KEY, add this DEF to it. */
7790
e8886a1d
RS
7791Lisp_Object item_properties;
7792
b7c49376 7793static void
4216b545
SM
7794menu_bar_item (key, item, dummy1, dummy2)
7795 Lisp_Object key, item, dummy1;
7796 void *dummy2;
5ec75a55 7797{
e8886a1d 7798 struct gcpro gcpro1;
b7c49376 7799 int i;
759860a6 7800 Lisp_Object tem;
5ec75a55 7801
e8886a1d 7802 if (EQ (item, Qundefined))
e58aa385 7803 {
f5e09c8b 7804 /* If a map has an explicit `undefined' as definition,
e58aa385 7805 discard any previously made menu bar item. */
b7c49376 7806
35b3402f 7807 for (i = 0; i < menu_bar_items_index; i += 4)
b7c49376
RS
7808 if (EQ (key, XVECTOR (menu_bar_items_vector)->contents[i]))
7809 {
35b3402f
RS
7810 if (menu_bar_items_index > i + 4)
7811 bcopy (&XVECTOR (menu_bar_items_vector)->contents[i + 4],
b7c49376 7812 &XVECTOR (menu_bar_items_vector)->contents[i],
35b3402f
RS
7813 (menu_bar_items_index - i - 4) * sizeof (Lisp_Object));
7814 menu_bar_items_index -= 4;
b7c49376 7815 }
e58aa385
RS
7816 }
7817
759860a6
RS
7818 /* If this keymap has already contributed to this KEY,
7819 don't contribute to it a second time. */
7820 tem = Fmemq (key, menu_bar_one_keymap_changed_items);
9cd2ced7 7821 if (!NILP (tem) || NILP (item))
759860a6
RS
7822 return;
7823
7824 menu_bar_one_keymap_changed_items
7825 = Fcons (key, menu_bar_one_keymap_changed_items);
7826
9cd2ced7
SM
7827 /* We add to menu_bar_one_keymap_changed_items before doing the
7828 parse_menu_item, so that if it turns out it wasn't a menu item,
7829 it still correctly hides any further menu item. */
7830 GCPRO1 (key);
ef7417fd 7831 i = parse_menu_item (item, 1);
9cd2ced7
SM
7832 UNGCPRO;
7833 if (!i)
7834 return;
7835
e8886a1d
RS
7836 item = XVECTOR (item_properties)->contents[ITEM_PROPERTY_DEF];
7837
f5e09c8b 7838 /* Find any existing item for this KEY. */
35b3402f 7839 for (i = 0; i < menu_bar_items_index; i += 4)
b7c49376
RS
7840 if (EQ (key, XVECTOR (menu_bar_items_vector)->contents[i]))
7841 break;
7842
f5e09c8b 7843 /* If we did not find this KEY, add it at the end. */
b7c49376
RS
7844 if (i == menu_bar_items_index)
7845 {
7846 /* If vector is too small, get a bigger one. */
35b3402f 7847 if (i + 4 > XVECTOR (menu_bar_items_vector)->size)
6bf377e2 7848 menu_bar_items_vector = larger_vector (menu_bar_items_vector, 2 * i, Qnil);
b7c49376
RS
7849 /* Add this item. */
7850 XVECTOR (menu_bar_items_vector)->contents[i++] = key;
e8886a1d
RS
7851 XVECTOR (menu_bar_items_vector)->contents[i++]
7852 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME];
7853 XVECTOR (menu_bar_items_vector)->contents[i++] = Fcons (item, Qnil);
35b3402f 7854 XVECTOR (menu_bar_items_vector)->contents[i++] = make_number (0);
b7c49376
RS
7855 menu_bar_items_index = i;
7856 }
e8886a1d 7857 /* We did find an item for this KEY. Add ITEM to its list of maps. */
f5e09c8b
RS
7858 else
7859 {
7860 Lisp_Object old;
7861 old = XVECTOR (menu_bar_items_vector)->contents[i + 2];
4216b545
SM
7862 /* If the new and the old items are not both keymaps,
7863 the lookup will only find `item'. */
7864 item = Fcons (item, KEYMAPP (item) && KEYMAPP (XCAR (old)) ? old : Qnil);
7865 XVECTOR (menu_bar_items_vector)->contents[i + 2] = item;
f5e09c8b 7866 }
5ec75a55
RS
7867}
7868\f
e8886a1d
RS
7869 /* This is used as the handler when calling menu_item_eval_property. */
7870static Lisp_Object
7871menu_item_eval_property_1 (arg)
7872 Lisp_Object arg;
7873{
7874 /* If we got a quit from within the menu computation,
7875 quit all the way out of it. This takes care of C-] in the debugger. */
7539e11f 7876 if (CONSP (arg) && EQ (XCAR (arg), Qquit))
e8886a1d
RS
7877 Fsignal (Qquit, Qnil);
7878
7879 return Qnil;
7880}
7881
c60ee5e7 7882/* Evaluate an expression and return the result (or nil if something
e8886a1d 7883 went wrong). Used to evaluate dynamic parts of menu items. */
7ee32cda 7884Lisp_Object
e8886a1d
RS
7885menu_item_eval_property (sexpr)
7886 Lisp_Object sexpr;
7887{
aed13378 7888 int count = SPECPDL_INDEX ();
e8886a1d 7889 Lisp_Object val;
44e553a3 7890 specbind (Qinhibit_redisplay, Qt);
e8886a1d
RS
7891 val = internal_condition_case_1 (Feval, sexpr, Qerror,
7892 menu_item_eval_property_1);
44e553a3 7893 return unbind_to (count, val);
e8886a1d
RS
7894}
7895
7896/* This function parses a menu item and leaves the result in the
7897 vector item_properties.
7898 ITEM is a key binding, a possible menu item.
fd3613d7 7899 INMENUBAR is > 0 when this is considered for an entry in a menu bar
e8886a1d 7900 top level.
fd3613d7 7901 INMENUBAR is < 0 when this is considered for an entry in a keyboard menu.
e8886a1d
RS
7902 parse_menu_item returns true if the item is a menu item and false
7903 otherwise. */
7904
7905int
ef7417fd 7906parse_menu_item (item, inmenubar)
e8886a1d 7907 Lisp_Object item;
ef7417fd 7908 int inmenubar;
e8886a1d 7909{
adc1d5c8 7910 Lisp_Object def, tem, item_string, start;
07ba902e
RS
7911 Lisp_Object filter;
7912 Lisp_Object keyhint;
e8886a1d 7913 int i;
74c1de23 7914
07ba902e
RS
7915 filter = Qnil;
7916 keyhint = Qnil;
7917
e8886a1d
RS
7918 if (!CONSP (item))
7919 return 0;
7920
e8886a1d
RS
7921 /* Create item_properties vector if necessary. */
7922 if (NILP (item_properties))
7923 item_properties
7924 = Fmake_vector (make_number (ITEM_PROPERTY_ENABLE + 1), Qnil);
7925
7926 /* Initialize optional entries. */
7927 for (i = ITEM_PROPERTY_DEF; i < ITEM_PROPERTY_ENABLE; i++)
b1ebcadb
SM
7928 ASET (item_properties, i, Qnil);
7929 ASET (item_properties, ITEM_PROPERTY_ENABLE, Qt);
c60ee5e7 7930
e8886a1d 7931 /* Save the item here to protect it from GC. */
b1ebcadb 7932 ASET (item_properties, ITEM_PROPERTY_ITEM, item);
e8886a1d 7933
7539e11f 7934 item_string = XCAR (item);
e8886a1d
RS
7935
7936 start = item;
7539e11f 7937 item = XCDR (item);
e8886a1d
RS
7938 if (STRINGP (item_string))
7939 {
7940 /* Old format menu item. */
b1ebcadb 7941 ASET (item_properties, ITEM_PROPERTY_NAME, item_string);
e8886a1d
RS
7942
7943 /* Maybe help string. */
7539e11f 7944 if (CONSP (item) && STRINGP (XCAR (item)))
e8886a1d 7945 {
b1ebcadb 7946 ASET (item_properties, ITEM_PROPERTY_HELP, XCAR (item));
e8886a1d 7947 start = item;
7539e11f 7948 item = XCDR (item);
e8886a1d 7949 }
c60ee5e7 7950
50d4ba39 7951 /* Maybe an obsolete key binding cache. */
7539e11f
KR
7952 if (CONSP (item) && CONSP (XCAR (item))
7953 && (NILP (XCAR (XCAR (item)))
7954 || VECTORP (XCAR (XCAR (item)))))
50d4ba39 7955 item = XCDR (item);
c60ee5e7 7956
e8886a1d 7957 /* This is the real definition--the function to run. */
b1ebcadb 7958 ASET (item_properties, ITEM_PROPERTY_DEF, item);
e8886a1d
RS
7959
7960 /* Get enable property, if any. */
7961 if (SYMBOLP (item))
7962 {
7963 tem = Fget (item, Qmenu_enable);
9d56e0da 7964 if (!NILP (Venable_disabled_menus_and_buttons))
b1ebcadb 7965 ASET (item_properties, ITEM_PROPERTY_ENABLE, Qt);
9d56e0da 7966 else if (!NILP (tem))
b1ebcadb 7967 ASET (item_properties, ITEM_PROPERTY_ENABLE, tem);
e8886a1d
RS
7968 }
7969 }
7970 else if (EQ (item_string, Qmenu_item) && CONSP (item))
7971 {
7972 /* New format menu item. */
b1ebcadb 7973 ASET (item_properties, ITEM_PROPERTY_NAME, XCAR (item));
7539e11f 7974 start = XCDR (item);
e8886a1d
RS
7975 if (CONSP (start))
7976 {
7977 /* We have a real binding. */
b1ebcadb 7978 ASET (item_properties, ITEM_PROPERTY_DEF, XCAR (start));
e8886a1d 7979
7539e11f 7980 item = XCDR (start);
50d4ba39 7981 /* Is there an obsolete cache list with key equivalences. */
7539e11f 7982 if (CONSP (item) && CONSP (XCAR (item)))
50d4ba39 7983 item = XCDR (item);
e8886a1d
RS
7984
7985 /* Parse properties. */
7539e11f 7986 while (CONSP (item) && CONSP (XCDR (item)))
e8886a1d 7987 {
7539e11f
KR
7988 tem = XCAR (item);
7989 item = XCDR (item);
e8886a1d
RS
7990
7991 if (EQ (tem, QCenable))
9d56e0da
EZ
7992 {
7993 if (!NILP (Venable_disabled_menus_and_buttons))
b1ebcadb 7994 ASET (item_properties, ITEM_PROPERTY_ENABLE, Qt);
9d56e0da 7995 else
b1ebcadb 7996 ASET (item_properties, ITEM_PROPERTY_ENABLE, XCAR (item));
9d56e0da 7997 }
ef7417fd 7998 else if (EQ (tem, QCvisible))
e8886a1d
RS
7999 {
8000 /* If got a visible property and that evaluates to nil
8001 then ignore this item. */
7539e11f 8002 tem = menu_item_eval_property (XCAR (item));
e8886a1d 8003 if (NILP (tem))
adc1d5c8 8004 return 0;
e8886a1d
RS
8005 }
8006 else if (EQ (tem, QChelp))
b1ebcadb 8007 ASET (item_properties, ITEM_PROPERTY_HELP, XCAR (item));
e8886a1d 8008 else if (EQ (tem, QCfilter))
74c1de23
RS
8009 filter = item;
8010 else if (EQ (tem, QCkey_sequence))
8011 {
7539e11f 8012 tem = XCAR (item);
50d4ba39 8013 if (SYMBOLP (tem) || STRINGP (tem) || VECTORP (tem))
74c1de23
RS
8014 /* Be GC protected. Set keyhint to item instead of tem. */
8015 keyhint = item;
8016 }
8017 else if (EQ (tem, QCkeys))
8018 {
7539e11f 8019 tem = XCAR (item);
50d4ba39 8020 if (CONSP (tem) || STRINGP (tem))
b1ebcadb 8021 ASET (item_properties, ITEM_PROPERTY_KEYEQ, tem);
74c1de23 8022 }
7539e11f 8023 else if (EQ (tem, QCbutton) && CONSP (XCAR (item)))
e8886a1d 8024 {
74c1de23 8025 Lisp_Object type;
7539e11f
KR
8026 tem = XCAR (item);
8027 type = XCAR (tem);
e8886a1d
RS
8028 if (EQ (type, QCtoggle) || EQ (type, QCradio))
8029 {
b1ebcadb
SM
8030 ASET (item_properties, ITEM_PROPERTY_SELECTED,
8031 XCDR (tem));
8032 ASET (item_properties, ITEM_PROPERTY_TYPE, type);
e8886a1d
RS
8033 }
8034 }
7539e11f 8035 item = XCDR (item);
e8886a1d
RS
8036 }
8037 }
8038 else if (inmenubar || !NILP (start))
adc1d5c8 8039 return 0;
e8886a1d
RS
8040 }
8041 else
adc1d5c8 8042 return 0; /* not a menu item */
e8886a1d
RS
8043
8044 /* If item string is not a string, evaluate it to get string.
8045 If we don't get a string, skip this item. */
3626fb1a 8046 item_string = AREF (item_properties, ITEM_PROPERTY_NAME);
ef7417fd 8047 if (!(STRINGP (item_string)))
e8886a1d
RS
8048 {
8049 item_string = menu_item_eval_property (item_string);
8050 if (!STRINGP (item_string))
adc1d5c8 8051 return 0;
b1ebcadb 8052 ASET (item_properties, ITEM_PROPERTY_NAME, item_string);
e8886a1d 8053 }
c60ee5e7 8054
e8886a1d 8055 /* If got a filter apply it on definition. */
3626fb1a 8056 def = AREF (item_properties, ITEM_PROPERTY_DEF);
e8886a1d
RS
8057 if (!NILP (filter))
8058 {
7539e11f 8059 def = menu_item_eval_property (list2 (XCAR (filter),
c5c5a6f8
RS
8060 list2 (Qquote, def)));
8061
b1ebcadb 8062 ASET (item_properties, ITEM_PROPERTY_DEF, def);
e8886a1d
RS
8063 }
8064
e8886a1d 8065 /* Enable or disable selection of item. */
3626fb1a 8066 tem = AREF (item_properties, ITEM_PROPERTY_ENABLE);
e8886a1d
RS
8067 if (!EQ (tem, Qt))
8068 {
ef7417fd 8069 tem = menu_item_eval_property (tem);
e8886a1d 8070 if (inmenubar && NILP (tem))
adc1d5c8 8071 return 0; /* Ignore disabled items in menu bar. */
b1ebcadb 8072 ASET (item_properties, ITEM_PROPERTY_ENABLE, tem);
e8886a1d
RS
8073 }
8074
7189cad8
SM
8075 /* If we got no definition, this item is just unselectable text which
8076 is OK in a submenu but not in the menubar. */
8077 if (NILP (def))
8078 return (inmenubar ? 0 : 1);
c60ee5e7 8079
e8886a1d 8080 /* See if this is a separate pane or a submenu. */
3626fb1a 8081 def = AREF (item_properties, ITEM_PROPERTY_DEF);
02067692 8082 tem = get_keymap (def, 0, 1);
9ac425d1 8083 /* For a subkeymap, just record its details and exit. */
02067692 8084 if (CONSP (tem))
e8886a1d 8085 {
b1ebcadb
SM
8086 ASET (item_properties, ITEM_PROPERTY_MAP, tem);
8087 ASET (item_properties, ITEM_PROPERTY_DEF, tem);
e8886a1d
RS
8088 return 1;
8089 }
c60ee5e7 8090
9ac425d1
RS
8091 /* At the top level in the menu bar, do likewise for commands also.
8092 The menu bar does not display equivalent key bindings anyway.
8093 ITEM_PROPERTY_DEF is already set up properly. */
8094 if (inmenubar > 0)
8095 return 1;
e8886a1d 8096
424d6179
SM
8097 { /* This is a command. See if there is an equivalent key binding. */
8098 Lisp_Object keyeq = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
74c1de23 8099
424d6179
SM
8100 /* The previous code preferred :key-sequence to :keys, so we
8101 preserve this behavior. */
8102 if (STRINGP (keyeq) && !CONSP (keyhint))
8103 keyeq = Fsubstitute_command_keys (keyeq);
8104 else
8105 {
8106 Lisp_Object prefix = keyeq;
8107 Lisp_Object keys = Qnil;
8108
8109 if (CONSP (prefix))
8110 {
8111 def = XCAR (prefix);
8112 prefix = XCDR (prefix);
8113 }
8114 else
8115 def = AREF (item_properties, ITEM_PROPERTY_DEF);
8116
8117 if (CONSP (keyhint) && !NILP (XCAR (keyhint)))
8118 {
8119 keys = XCAR (keyhint);
8120 tem = Fkey_binding (keys, Qnil, Qnil, Qnil);
8121
8122 /* We have a suggested key. Is it bound to the command? */
8123 if (NILP (tem)
8124 || (!EQ (tem, def)
8125 /* If the command is an alias for another
8126 (such as lmenu.el set it up), check if the
8127 original command matches the cached command. */
8128 && !(SYMBOLP (def) && EQ (tem, XSYMBOL (def)->function))))
8129 keys = Qnil;
8130 }
b25399ac 8131
424d6179
SM
8132 if (NILP (keys))
8133 keys = Fwhere_is_internal (def, Qnil, Qt, Qnil, Qnil);
b25399ac 8134
424d6179
SM
8135 if (!NILP (keys))
8136 {
8137 tem = Fkey_description (keys, Qnil);
8138 if (CONSP (prefix))
8139 {
8140 if (STRINGP (XCAR (prefix)))
8141 tem = concat2 (XCAR (prefix), tem);
8142 if (STRINGP (XCDR (prefix)))
8143 tem = concat2 (tem, XCDR (prefix));
8144 }
8145 keyeq = concat2 (build_string (" "), tem);
8146 /* keyeq = concat3(build_string(" ("),tem,build_string(")")); */
8147 }
8148 else
8149 keyeq = Qnil;
8150 }
e8886a1d 8151
424d6179
SM
8152 /* If we have an equivalent key binding, use that. */
8153 ASET (item_properties, ITEM_PROPERTY_KEYEQ, keyeq);
b25399ac 8154 }
adc1d5c8
RS
8155
8156 /* Include this when menu help is implemented.
8157 tem = XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP];
8158 if (!(NILP (tem) || STRINGP (tem)))
8159 {
8160 tem = menu_item_eval_property (tem);
8161 if (!STRINGP (tem))
8162 tem = Qnil;
8163 XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP] = tem;
8164 }
e8886a1d
RS
8165 */
8166
c60ee5e7 8167 /* Handle radio buttons or toggle boxes. */
3626fb1a 8168 tem = AREF (item_properties, ITEM_PROPERTY_SELECTED);
e8886a1d 8169 if (!NILP (tem))
b1ebcadb
SM
8170 ASET (item_properties, ITEM_PROPERTY_SELECTED,
8171 menu_item_eval_property (tem));
e8886a1d 8172
e8886a1d
RS
8173 return 1;
8174}
7ee32cda
GM
8175
8176
8177\f
8178/***********************************************************************
8179 Tool-bars
8180 ***********************************************************************/
8181
9ea173e8 8182/* A vector holding tool bar items while they are parsed in function
27fd22dc 8183 tool_bar_items. Each item occupies TOOL_BAR_ITEM_NSCLOTS elements
9ea173e8 8184 in the vector. */
7ee32cda 8185
9ea173e8 8186static Lisp_Object tool_bar_items_vector;
7ee32cda 8187
9ea173e8
GM
8188/* A vector holding the result of parse_tool_bar_item. Layout is like
8189 the one for a single item in tool_bar_items_vector. */
7ee32cda 8190
9ea173e8 8191static Lisp_Object tool_bar_item_properties;
7ee32cda 8192
9ea173e8 8193/* Next free index in tool_bar_items_vector. */
7ee32cda 8194
9ea173e8 8195static int ntool_bar_items;
7ee32cda 8196
cf0590c4 8197/* The symbols `tool-bar', `:image' and `:rtl'. */
7ee32cda 8198
9ea173e8 8199extern Lisp_Object Qtool_bar;
7ee32cda 8200Lisp_Object QCimage;
cf0590c4 8201Lisp_Object Qrtl;
7ee32cda
GM
8202
8203/* Function prototypes. */
8204
9ea173e8 8205static void init_tool_bar_items P_ ((Lisp_Object));
9c8c4d5b 8206static void process_tool_bar_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, void*));
9ea173e8
GM
8207static int parse_tool_bar_item P_ ((Lisp_Object, Lisp_Object));
8208static void append_tool_bar_item P_ ((void));
7ee32cda
GM
8209
8210
9ea173e8 8211/* Return a vector of tool bar items for keymaps currently in effect.
7ee32cda 8212 Reuse vector REUSE if non-nil. Return in *NITEMS the number of
9ea173e8 8213 tool bar items found. */
7ee32cda
GM
8214
8215Lisp_Object
9ea173e8 8216tool_bar_items (reuse, nitems)
7ee32cda
GM
8217 Lisp_Object reuse;
8218 int *nitems;
8219{
8220 Lisp_Object *maps;
8221 int nmaps, i;
8222 Lisp_Object oquit;
8223 Lisp_Object *tmaps;
7ee32cda
GM
8224
8225 *nitems = 0;
8226
8227 /* In order to build the menus, we need to call the keymap
8228 accessors. They all call QUIT. But this function is called
8229 during redisplay, during which a quit is fatal. So inhibit
8230 quitting while building the menus. We do this instead of
8231 specbind because (1) errors will clear it anyway and (2) this
8232 avoids risk of specpdl overflow. */
8233 oquit = Vinhibit_quit;
8234 Vinhibit_quit = Qt;
c60ee5e7 8235
9ea173e8
GM
8236 /* Initialize tool_bar_items_vector and protect it from GC. */
8237 init_tool_bar_items (reuse);
7ee32cda
GM
8238
8239 /* Build list of keymaps in maps. Set nmaps to the number of maps
8240 to process. */
c60ee5e7 8241
7ee32cda
GM
8242 /* Should overriding-terminal-local-map and overriding-local-map apply? */
8243 if (!NILP (Voverriding_local_map_menu_flag))
8244 {
8245 /* Yes, use them (if non-nil) as well as the global map. */
8246 maps = (Lisp_Object *) alloca (3 * sizeof (maps[0]));
8247 nmaps = 0;
8248 if (!NILP (current_kboard->Voverriding_terminal_local_map))
8249 maps[nmaps++] = current_kboard->Voverriding_terminal_local_map;
8250 if (!NILP (Voverriding_local_map))
8251 maps[nmaps++] = Voverriding_local_map;
8252 }
8253 else
8254 {
fd646341
KS
8255 /* No, so use major and minor mode keymaps and keymap property.
8256 Note that tool-bar bindings in the local-map and keymap
8257 properties may not work reliable, as they are only
8258 recognized when the tool-bar (or mode-line) is updated,
8259 which does not normally happen after every command. */
8260 Lisp_Object tem;
8261 int nminor;
8262 nminor = current_minor_maps (NULL, &tmaps);
8263 maps = (Lisp_Object *) alloca ((nminor + 3) * sizeof (maps[0]));
8264 nmaps = 0;
8265 if (tem = get_local_map (PT, current_buffer, Qkeymap), !NILP (tem))
8266 maps[nmaps++] = tem;
8267 bcopy (tmaps, (void *) (maps + nmaps), nminor * sizeof (maps[0]));
8268 nmaps += nminor;
8269 maps[nmaps++] = get_local_map (PT, current_buffer, Qlocal_map);
7ee32cda
GM
8270 }
8271
8272 /* Add global keymap at the end. */
8273 maps[nmaps++] = current_global_map;
8274
8275 /* Process maps in reverse order and look up in each map the prefix
9ea173e8 8276 key `tool-bar'. */
7ee32cda
GM
8277 for (i = nmaps - 1; i >= 0; --i)
8278 if (!NILP (maps[i]))
8279 {
8280 Lisp_Object keymap;
db785038 8281
341a09cf 8282 keymap = get_keymap (access_keymap (maps[i], Qtool_bar, 1, 0, 1), 0, 1);
02067692 8283 if (CONSP (keymap))
293bd733 8284 map_keymap (keymap, process_tool_bar_item, Qnil, NULL, 1);
7ee32cda
GM
8285 }
8286
8287 Vinhibit_quit = oquit;
9ea173e8
GM
8288 *nitems = ntool_bar_items / TOOL_BAR_ITEM_NSLOTS;
8289 return tool_bar_items_vector;
7ee32cda
GM
8290}
8291
8292
8293/* Process the definition of KEY which is DEF. */
8294
8295static void
9c8c4d5b 8296process_tool_bar_item (key, def, data, args)
293bd733
SM
8297 Lisp_Object key, def, data;
8298 void *args;
7ee32cda
GM
8299{
8300 int i;
8301 extern Lisp_Object Qundefined;
8302 struct gcpro gcpro1, gcpro2;
8303
9ea173e8 8304 /* Protect KEY and DEF from GC because parse_tool_bar_item may call
7ee32cda
GM
8305 eval. */
8306 GCPRO2 (key, def);
8307
8308 if (EQ (def, Qundefined))
8309 {
8310 /* If a map has an explicit `undefined' as definition,
8311 discard any previously made item. */
9ea173e8 8312 for (i = 0; i < ntool_bar_items; i += TOOL_BAR_ITEM_NSLOTS)
7ee32cda 8313 {
9ea173e8 8314 Lisp_Object *v = XVECTOR (tool_bar_items_vector)->contents + i;
c60ee5e7 8315
9ea173e8 8316 if (EQ (key, v[TOOL_BAR_ITEM_KEY]))
7ee32cda 8317 {
9ea173e8
GM
8318 if (ntool_bar_items > i + TOOL_BAR_ITEM_NSLOTS)
8319 bcopy (v + TOOL_BAR_ITEM_NSLOTS, v,
8320 ((ntool_bar_items - i - TOOL_BAR_ITEM_NSLOTS)
7ee32cda 8321 * sizeof (Lisp_Object)));
9ea173e8 8322 ntool_bar_items -= TOOL_BAR_ITEM_NSLOTS;
7ee32cda
GM
8323 break;
8324 }
8325 }
8326 }
9ea173e8
GM
8327 else if (parse_tool_bar_item (key, def))
8328 /* Append a new tool bar item to tool_bar_items_vector. Accept
7ee32cda 8329 more than one definition for the same key. */
9ea173e8 8330 append_tool_bar_item ();
7ee32cda
GM
8331
8332 UNGCPRO;
8333}
8334
8335
9ea173e8
GM
8336/* Parse a tool bar item specification ITEM for key KEY and return the
8337 result in tool_bar_item_properties. Value is zero if ITEM is
7ee32cda
GM
8338 invalid.
8339
8340 ITEM is a list `(menu-item CAPTION BINDING PROPS...)'.
c60ee5e7 8341
7ee32cda
GM
8342 CAPTION is the caption of the item, If it's not a string, it is
8343 evaluated to get a string.
c60ee5e7 8344
9ea173e8 8345 BINDING is the tool bar item's binding. Tool-bar items with keymaps
7ee32cda
GM
8346 as binding are currently ignored.
8347
8348 The following properties are recognized:
8349
8350 - `:enable FORM'.
c60ee5e7 8351
9ea173e8
GM
8352 FORM is evaluated and specifies whether the tool bar item is
8353 enabled or disabled.
c60ee5e7 8354
7ee32cda 8355 - `:visible FORM'
c60ee5e7 8356
9ea173e8 8357 FORM is evaluated and specifies whether the tool bar item is visible.
c60ee5e7 8358
7ee32cda
GM
8359 - `:filter FUNCTION'
8360
8361 FUNCTION is invoked with one parameter `(quote BINDING)'. Its
8362 result is stored as the new binding.
c60ee5e7 8363
7ee32cda
GM
8364 - `:button (TYPE SELECTED)'
8365
8366 TYPE must be one of `:radio' or `:toggle'. SELECTED is evaluated
8367 and specifies whether the button is selected (pressed) or not.
c60ee5e7 8368
7ee32cda
GM
8369 - `:image IMAGES'
8370
8371 IMAGES is either a single image specification or a vector of four
9ea173e8 8372 image specifications. See enum tool_bar_item_images.
c60ee5e7 8373
7ee32cda 8374 - `:help HELP-STRING'.
c60ee5e7 8375
9ea173e8 8376 Gives a help string to display for the tool bar item. */
7ee32cda
GM
8377
8378static int
9ea173e8 8379parse_tool_bar_item (key, item)
7ee32cda
GM
8380 Lisp_Object key, item;
8381{
9ea173e8
GM
8382 /* Access slot with index IDX of vector tool_bar_item_properties. */
8383#define PROP(IDX) XVECTOR (tool_bar_item_properties)->contents[IDX]
7ee32cda
GM
8384
8385 Lisp_Object filter = Qnil;
8386 Lisp_Object caption;
7ee32cda 8387 int i;
7ee32cda 8388
8c907a56
GM
8389 /* Defininition looks like `(menu-item CAPTION BINDING PROPS...)'.
8390 Rule out items that aren't lists, don't start with
8391 `menu-item' or whose rest following `tool-bar-item' is not a
7ee32cda
GM
8392 list. */
8393 if (!CONSP (item)
8394 || !EQ (XCAR (item), Qmenu_item)
8395 || (item = XCDR (item),
8396 !CONSP (item)))
8397 return 0;
8398
9ea173e8 8399 /* Create tool_bar_item_properties vector if necessary. Reset it to
7ee32cda 8400 defaults. */
9ea173e8 8401 if (VECTORP (tool_bar_item_properties))
7ee32cda 8402 {
9ea173e8 8403 for (i = 0; i < TOOL_BAR_ITEM_NSLOTS; ++i)
7ee32cda
GM
8404 PROP (i) = Qnil;
8405 }
8406 else
9ea173e8
GM
8407 tool_bar_item_properties
8408 = Fmake_vector (make_number (TOOL_BAR_ITEM_NSLOTS), Qnil);
c60ee5e7 8409
7ee32cda 8410 /* Set defaults. */
9ea173e8
GM
8411 PROP (TOOL_BAR_ITEM_KEY) = key;
8412 PROP (TOOL_BAR_ITEM_ENABLED_P) = Qt;
c60ee5e7 8413
7ee32cda
GM
8414 /* Get the caption of the item. If the caption is not a string,
8415 evaluate it to get a string. If we don't get a string, skip this
8416 item. */
8417 caption = XCAR (item);
8418 if (!STRINGP (caption))
8419 {
8420 caption = menu_item_eval_property (caption);
8421 if (!STRINGP (caption))
8422 return 0;
8423 }
9ea173e8 8424 PROP (TOOL_BAR_ITEM_CAPTION) = caption;
7ee32cda
GM
8425
8426 /* Give up if rest following the caption is not a list. */
8427 item = XCDR (item);
8428 if (!CONSP (item))
8429 return 0;
8430
8431 /* Store the binding. */
9ea173e8 8432 PROP (TOOL_BAR_ITEM_BINDING) = XCAR (item);
7ee32cda
GM
8433 item = XCDR (item);
8434
8c907a56
GM
8435 /* Ignore cached key binding, if any. */
8436 if (CONSP (item) && CONSP (XCAR (item)))
8437 item = XCDR (item);
8438
7ee32cda
GM
8439 /* Process the rest of the properties. */
8440 for (; CONSP (item) && CONSP (XCDR (item)); item = XCDR (XCDR (item)))
8441 {
8442 Lisp_Object key, value;
8443
8444 key = XCAR (item);
8445 value = XCAR (XCDR (item));
8446
8447 if (EQ (key, QCenable))
9d56e0da
EZ
8448 {
8449 /* `:enable FORM'. */
8450 if (!NILP (Venable_disabled_menus_and_buttons))
8451 PROP (TOOL_BAR_ITEM_ENABLED_P) = Qt;
8452 else
8453 PROP (TOOL_BAR_ITEM_ENABLED_P) = value;
8454 }
7ee32cda
GM
8455 else if (EQ (key, QCvisible))
8456 {
8457 /* `:visible FORM'. If got a visible property and that
8458 evaluates to nil then ignore this item. */
8459 if (NILP (menu_item_eval_property (value)))
8460 return 0;
8461 }
8462 else if (EQ (key, QChelp))
8463 /* `:help HELP-STRING'. */
9ea173e8 8464 PROP (TOOL_BAR_ITEM_HELP) = value;
7ee32cda
GM
8465 else if (EQ (key, QCfilter))
8466 /* ':filter FORM'. */
8467 filter = value;
8468 else if (EQ (key, QCbutton) && CONSP (value))
8469 {
8470 /* `:button (TYPE . SELECTED)'. */
8471 Lisp_Object type, selected;
8472
8473 type = XCAR (value);
8474 selected = XCDR (value);
8475 if (EQ (type, QCtoggle) || EQ (type, QCradio))
8476 {
9ea173e8
GM
8477 PROP (TOOL_BAR_ITEM_SELECTED_P) = selected;
8478 PROP (TOOL_BAR_ITEM_TYPE) = type;
7ee32cda
GM
8479 }
8480 }
8481 else if (EQ (key, QCimage)
8482 && (CONSP (value)
8483 || (VECTORP (value) && XVECTOR (value)->size == 4)))
8484 /* Value is either a single image specification or a vector
27fd22dc 8485 of 4 such specifications for the different button states. */
9ea173e8 8486 PROP (TOOL_BAR_ITEM_IMAGES) = value;
cf0590c4
JD
8487 else if (EQ (key, Qrtl))
8488 /* ':rtl STRING' */
8489 PROP (TOOL_BAR_ITEM_RTL_IMAGE) = value;
7ee32cda
GM
8490 }
8491
8492 /* If got a filter apply it on binding. */
8493 if (!NILP (filter))
9ea173e8 8494 PROP (TOOL_BAR_ITEM_BINDING)
7ee32cda
GM
8495 = menu_item_eval_property (list2 (filter,
8496 list2 (Qquote,
9ea173e8 8497 PROP (TOOL_BAR_ITEM_BINDING))));
7ee32cda
GM
8498
8499 /* See if the binding is a keymap. Give up if it is. */
02067692 8500 if (CONSP (get_keymap (PROP (TOOL_BAR_ITEM_BINDING), 0, 1)))
7ee32cda
GM
8501 return 0;
8502
8503 /* Enable or disable selection of item. */
9ea173e8
GM
8504 if (!EQ (PROP (TOOL_BAR_ITEM_ENABLED_P), Qt))
8505 PROP (TOOL_BAR_ITEM_ENABLED_P)
8506 = menu_item_eval_property (PROP (TOOL_BAR_ITEM_ENABLED_P));
7ee32cda 8507
c60ee5e7 8508 /* Handle radio buttons or toggle boxes. */
9ea173e8
GM
8509 if (!NILP (PROP (TOOL_BAR_ITEM_SELECTED_P)))
8510 PROP (TOOL_BAR_ITEM_SELECTED_P)
8511 = menu_item_eval_property (PROP (TOOL_BAR_ITEM_SELECTED_P));
7ee32cda
GM
8512
8513 return 1;
c60ee5e7 8514
7ee32cda
GM
8515#undef PROP
8516}
8517
8518
9ea173e8
GM
8519/* Initialize tool_bar_items_vector. REUSE, if non-nil, is a vector
8520 that can be reused. */
7ee32cda
GM
8521
8522static void
9ea173e8 8523init_tool_bar_items (reuse)
7ee32cda
GM
8524 Lisp_Object reuse;
8525{
8526 if (VECTORP (reuse))
9ea173e8 8527 tool_bar_items_vector = reuse;
7ee32cda 8528 else
9ea173e8
GM
8529 tool_bar_items_vector = Fmake_vector (make_number (64), Qnil);
8530 ntool_bar_items = 0;
7ee32cda
GM
8531}
8532
8533
9ea173e8
GM
8534/* Append parsed tool bar item properties from
8535 tool_bar_item_properties */
7ee32cda
GM
8536
8537static void
9ea173e8 8538append_tool_bar_item ()
7ee32cda
GM
8539{
8540 Lisp_Object *to, *from;
c60ee5e7 8541
9ea173e8
GM
8542 /* Enlarge tool_bar_items_vector if necessary. */
8543 if (ntool_bar_items + TOOL_BAR_ITEM_NSLOTS
8544 >= XVECTOR (tool_bar_items_vector)->size)
219ccf1b
RS
8545 tool_bar_items_vector
8546 = larger_vector (tool_bar_items_vector,
8547 2 * XVECTOR (tool_bar_items_vector)->size, Qnil);
7ee32cda 8548
9ea173e8
GM
8549 /* Append entries from tool_bar_item_properties to the end of
8550 tool_bar_items_vector. */
8551 to = XVECTOR (tool_bar_items_vector)->contents + ntool_bar_items;
8552 from = XVECTOR (tool_bar_item_properties)->contents;
8553 bcopy (from, to, TOOL_BAR_ITEM_NSLOTS * sizeof *to);
8554 ntool_bar_items += TOOL_BAR_ITEM_NSLOTS;
7ee32cda
GM
8555}
8556
8557
8558
8559
e8886a1d 8560\f
dcc408a0
RS
8561/* Read a character using menus based on maps in the array MAPS.
8562 NMAPS is the length of MAPS. Return nil if there are no menus in the maps.
8563 Return t if we displayed a menu but the user rejected it.
7d6de002
RS
8564
8565 PREV_EVENT is the previous input event, or nil if we are reading
8566 the first event of a key sequence.
8567
83d68044 8568 If USED_MOUSE_MENU is non-null, then we set *USED_MOUSE_MENU to 1
6569cc8d 8569 if we used a mouse menu to read the input, or zero otherwise. If
83d68044 8570 USED_MOUSE_MENU is null, we don't dereference it.
284f4730
JB
8571
8572 The prompting is done based on the prompt-string of the map
df0f2ba1 8573 and the strings associated with various map elements.
8150596a
RS
8574
8575 This can be done with X menus or with menus put in the minibuf.
8576 These are done in different ways, depending on how the input will be read.
8577 Menus using X are done after auto-saving in read-char, getting the input
8578 event from Fx_popup_menu; menus using the minibuf use read_char recursively
8579 and do auto-saving in the inner call of read_char. */
284f4730 8580
7617111f 8581static Lisp_Object
8150596a 8582read_char_x_menu_prompt (nmaps, maps, prev_event, used_mouse_menu)
7d6de002
RS
8583 int nmaps;
8584 Lisp_Object *maps;
8585 Lisp_Object prev_event;
8586 int *used_mouse_menu;
284f4730 8587{
7d6de002 8588 int mapno;
7d6de002 8589
6569cc8d
JB
8590 if (used_mouse_menu)
8591 *used_mouse_menu = 0;
284f4730
JB
8592
8593 /* Use local over global Menu maps */
8594
7d6de002
RS
8595 if (! menu_prompting)
8596 return Qnil;
8597
03361bcc
RS
8598 /* Optionally disregard all but the global map. */
8599 if (inhibit_local_menu_bar_menus)
8600 {
8601 maps += (nmaps - 1);
8602 nmaps = 1;
8603 }
8604
1f5b1641 8605#ifdef HAVE_MENUS
7d6de002
RS
8606 /* If we got to this point via a mouse click,
8607 use a real menu for mouse selection. */
5a8d99e0 8608 if (EVENT_HAS_PARAMETERS (prev_event)
7539e11f
KR
8609 && !EQ (XCAR (prev_event), Qmenu_bar)
8610 && !EQ (XCAR (prev_event), Qtool_bar))
7d6de002
RS
8611 {
8612 /* Display the menu and get the selection. */
8613 Lisp_Object *realmaps
8614 = (Lisp_Object *) alloca (nmaps * sizeof (Lisp_Object));
8615 Lisp_Object value;
8616 int nmaps1 = 0;
8617
8618 /* Use the maps that are not nil. */
8619 for (mapno = 0; mapno < nmaps; mapno++)
8620 if (!NILP (maps[mapno]))
8621 realmaps[nmaps1++] = maps[mapno];
8622
8623 value = Fx_popup_menu (prev_event, Flist (nmaps1, realmaps));
663258f2
JB
8624 if (CONSP (value))
8625 {
68f297c5
RS
8626 Lisp_Object tem;
8627
7539e11f 8628 record_menu_key (XCAR (value));
8eb4d8ef 8629
68f297c5
RS
8630 /* If we got multiple events, unread all but
8631 the first.
8632 There is no way to prevent those unread events
8633 from showing up later in last_nonmenu_event.
8634 So turn symbol and integer events into lists,
8635 to indicate that they came from a mouse menu,
8636 so that when present in last_nonmenu_event
8637 they won't confuse things. */
9beb8baa 8638 for (tem = XCDR (value); CONSP (tem); tem = XCDR (tem))
8eb4d8ef 8639 {
7539e11f
KR
8640 record_menu_key (XCAR (tem));
8641 if (SYMBOLP (XCAR (tem))
8642 || INTEGERP (XCAR (tem)))
f3fbd155 8643 XSETCAR (tem, Fcons (XCAR (tem), Qdisabled));
8eb4d8ef 8644 }
68f297c5 8645
663258f2
JB
8646 /* If we got more than one event, put all but the first
8647 onto this list to be read later.
8648 Return just the first event now. */
24597608 8649 Vunread_command_events
7539e11f
KR
8650 = nconc2 (XCDR (value), Vunread_command_events);
8651 value = XCAR (value);
663258f2 8652 }
1c90c381 8653 else if (NILP (value))
dcc408a0 8654 value = Qt;
6569cc8d
JB
8655 if (used_mouse_menu)
8656 *used_mouse_menu = 1;
7d6de002
RS
8657 return value;
8658 }
1f5b1641 8659#endif /* HAVE_MENUS */
8150596a
RS
8660 return Qnil ;
8661}
8662
af2b7cc9
KS
8663/* Buffer in use so far for the minibuf prompts for menu keymaps.
8664 We make this bigger when necessary, and never free it. */
8665static char *read_char_minibuf_menu_text;
8666/* Size of that buffer. */
8667static int read_char_minibuf_menu_width;
8668
8150596a 8669static Lisp_Object
24597608 8670read_char_minibuf_menu_prompt (commandflag, nmaps, maps)
8150596a
RS
8671 int commandflag ;
8672 int nmaps;
8673 Lisp_Object *maps;
8674{
8675 int mapno;
8676 register Lisp_Object name;
af2b7cc9 8677 int nlength;
14e40288 8678 /* FIXME: Use the minibuffer's frame width. */
2cdbe73e 8679 int width = FRAME_COLS (SELECTED_FRAME ()) - 4;
8150596a 8680 int idx = -1;
af2b7cc9 8681 int nobindings = 1;
8150596a 8682 Lisp_Object rest, vector;
af2b7cc9 8683 char *menu;
8150596a 8684
8c907a56 8685 vector = Qnil;
7189cad8 8686 name = Qnil;
8c907a56 8687
8150596a
RS
8688 if (! menu_prompting)
8689 return Qnil;
8690
f6bb4883
CY
8691 /* Get the menu name from the first map that has one (a prompt string). */
8692 for (mapno = 0; mapno < nmaps; mapno++)
8693 {
8694 name = Fkeymap_prompt (maps[mapno]);
8695 if (!NILP (name))
8696 break;
8697 }
8698
8699 /* If we don't have any menus, just read a character normally. */
8700 if (!STRINGP (name))
8701 return Qnil;
8702
af2b7cc9 8703 /* Make sure we have a big enough buffer for the menu text. */
f6bb4883 8704 width = max (width, SBYTES (name));
af2b7cc9
KS
8705 if (read_char_minibuf_menu_text == 0)
8706 {
8707 read_char_minibuf_menu_width = width + 4;
8708 read_char_minibuf_menu_text = (char *) xmalloc (width + 4);
8709 }
8710 else if (width + 4 > read_char_minibuf_menu_width)
8711 {
8712 read_char_minibuf_menu_width = width + 4;
8713 read_char_minibuf_menu_text
8714 = (char *) xrealloc (read_char_minibuf_menu_text, width + 4);
8715 }
8716 menu = read_char_minibuf_menu_text;
8717
af2b7cc9 8718 /* Prompt string always starts with map's prompt, and a space. */
d5db4077
KR
8719 strcpy (menu, SDATA (name));
8720 nlength = SBYTES (name);
af2b7cc9
KS
8721 menu[nlength++] = ':';
8722 menu[nlength++] = ' ';
8723 menu[nlength] = 0;
8724
7d6de002
RS
8725 /* Start prompting at start of first map. */
8726 mapno = 0;
8727 rest = maps[mapno];
284f4730 8728
af2b7cc9
KS
8729 /* Present the documented bindings, a line at a time. */
8730 while (1)
284f4730 8731 {
af2b7cc9
KS
8732 int notfirst = 0;
8733 int i = nlength;
8734 Lisp_Object obj;
8735 int ch;
8736 Lisp_Object orig_defn_macro;
284f4730 8737
af2b7cc9
KS
8738 /* Loop over elements of map. */
8739 while (i < width)
284f4730 8740 {
af2b7cc9 8741 Lisp_Object elt;
284f4730 8742
af2b7cc9
KS
8743 /* If reached end of map, start at beginning of next map. */
8744 if (NILP (rest))
8745 {
8746 mapno++;
8747 /* At end of last map, wrap around to first map if just starting,
8748 or end this line if already have something on it. */
8749 if (mapno == nmaps)
8750 {
8751 mapno = 0;
8752 if (notfirst || nobindings) break;
8753 }
8754 rest = maps[mapno];
8755 }
7d6de002 8756
af2b7cc9
KS
8757 /* Look at the next element of the map. */
8758 if (idx >= 0)
8759 elt = XVECTOR (vector)->contents[idx];
8760 else
8761 elt = Fcar_safe (rest);
7d6de002 8762
af2b7cc9 8763 if (idx < 0 && VECTORP (elt))
284f4730 8764 {
af2b7cc9
KS
8765 /* If we found a dense table in the keymap,
8766 advanced past it, but start scanning its contents. */
8767 rest = Fcdr_safe (rest);
8768 vector = elt;
8769 idx = 0;
284f4730 8770 }
7d6de002
RS
8771 else
8772 {
af2b7cc9
KS
8773 /* An ordinary element. */
8774 Lisp_Object event, tem;
7d6de002 8775
af2b7cc9
KS
8776 if (idx < 0)
8777 {
8778 event = Fcar_safe (elt); /* alist */
8779 elt = Fcdr_safe (elt);
8780 }
8781 else
8782 {
8783 XSETINT (event, idx); /* vector */
8784 }
284f4730 8785
af2b7cc9 8786 /* Ignore the element if it has no prompt string. */
ef7417fd 8787 if (INTEGERP (event) && parse_menu_item (elt, -1))
af2b7cc9
KS
8788 {
8789 /* 1 if the char to type matches the string. */
8790 int char_matches;
8791 Lisp_Object upcased_event, downcased_event;
8792 Lisp_Object desc = Qnil;
8793 Lisp_Object s
8794 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME];
8795
8796 upcased_event = Fupcase (event);
8797 downcased_event = Fdowncase (event);
d5db4077
KR
8798 char_matches = (XINT (upcased_event) == SREF (s, 0)
8799 || XINT (downcased_event) == SREF (s, 0));
af2b7cc9
KS
8800 if (! char_matches)
8801 desc = Fsingle_key_description (event, Qnil);
8802
8803#if 0 /* It is redundant to list the equivalent key bindings because
8804 the prefix is what the user has already typed. */
8805 tem
8806 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_KEYEQ];
8807 if (!NILP (tem))
8808 /* Insert equivalent keybinding. */
8809 s = concat2 (s, tem);
8810#endif
8811 tem
8812 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE];
8813 if (EQ (tem, QCradio) || EQ (tem, QCtoggle))
8814 {
8815 /* Insert button prefix. */
8816 Lisp_Object selected
8817 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED];
8818 if (EQ (tem, QCradio))
8819 tem = build_string (NILP (selected) ? "(*) " : "( ) ");
8820 else
8821 tem = build_string (NILP (selected) ? "[X] " : "[ ] ");
8822 s = concat2 (tem, s);
8823 }
c60ee5e7 8824
af2b7cc9
KS
8825
8826 /* If we have room for the prompt string, add it to this line.
8827 If this is the first on the line, always add it. */
d5db4077
KR
8828 if ((SCHARS (s) + i + 2
8829 + (char_matches ? 0 : SCHARS (desc) + 3))
af2b7cc9
KS
8830 < width
8831 || !notfirst)
8832 {
8833 int thiswidth;
8834
8835 /* Punctuate between strings. */
8836 if (notfirst)
8837 {
8838 strcpy (menu + i, ", ");
8839 i += 2;
8840 }
8841 notfirst = 1;
8842 nobindings = 0 ;
8843
8844 /* If the char to type doesn't match the string's
8845 first char, explicitly show what char to type. */
8846 if (! char_matches)
8847 {
8848 /* Add as much of string as fits. */
d5db4077 8849 thiswidth = SCHARS (desc);
af2b7cc9
KS
8850 if (thiswidth + i > width)
8851 thiswidth = width - i;
d5db4077 8852 bcopy (SDATA (desc), menu + i, thiswidth);
af2b7cc9
KS
8853 i += thiswidth;
8854 strcpy (menu + i, " = ");
8855 i += 3;
8856 }
8857
8858 /* Add as much of string as fits. */
d5db4077 8859 thiswidth = SCHARS (s);
af2b7cc9
KS
8860 if (thiswidth + i > width)
8861 thiswidth = width - i;
d5db4077 8862 bcopy (SDATA (s), menu + i, thiswidth);
af2b7cc9
KS
8863 i += thiswidth;
8864 menu[i] = 0;
8865 }
8866 else
8867 {
8868 /* If this element does not fit, end the line now,
8869 and save the element for the next line. */
8870 strcpy (menu + i, "...");
8871 break;
8872 }
8873 }
8874
8875 /* Move past this element. */
8876 if (idx >= 0 && idx + 1 >= XVECTOR (vector)->size)
8877 /* Handle reaching end of dense table. */
8878 idx = -1;
8879 if (idx >= 0)
8880 idx++;
8881 else
8882 rest = Fcdr_safe (rest);
8883 }
325309f5 8884 }
8150596a 8885
af2b7cc9 8886 /* Prompt with that and read response. */
c60ee5e7 8887 message2_nolog (menu, strlen (menu),
af2b7cc9 8888 ! NILP (current_buffer->enable_multibyte_characters));
284f4730 8889
af2b7cc9
KS
8890 /* Make believe its not a keyboard macro in case the help char
8891 is pressed. Help characters are not recorded because menu prompting
8892 is not used on replay.
8893 */
8894 orig_defn_macro = current_kboard->defining_kbd_macro;
8895 current_kboard->defining_kbd_macro = Qnil;
8896 do
179f689c 8897 obj = read_char (commandflag, 0, 0, Qt, 0, NULL);
af2b7cc9
KS
8898 while (BUFFERP (obj));
8899 current_kboard->defining_kbd_macro = orig_defn_macro;
284f4730 8900
af2b7cc9
KS
8901 if (!INTEGERP (obj))
8902 return obj;
9688ff53
KL
8903 else if (XINT (obj) == -2)
8904 return obj;
af2b7cc9
KS
8905 else
8906 ch = XINT (obj);
8907
8908 if (! EQ (obj, menu_prompt_more_char)
8909 && (!INTEGERP (menu_prompt_more_char)
8910 || ! EQ (obj, make_number (Ctl (XINT (menu_prompt_more_char))))))
8911 {
8912 if (!NILP (current_kboard->defining_kbd_macro))
8913 store_kbd_macro_char (obj);
8914 return obj;
8915 }
8916 /* Help char - go round again */
8917 }
284f4730 8918}
284f4730
JB
8919\f
8920/* Reading key sequences. */
8921
8922/* Follow KEY in the maps in CURRENT[0..NMAPS-1], placing its bindings
8923 in DEFS[0..NMAPS-1]. Set NEXT[i] to DEFS[i] if DEFS[i] is a
8924 keymap, or nil otherwise. Return the index of the first keymap in
8925 which KEY has any binding, or NMAPS if no map has a binding.
8926
8927 If KEY is a meta ASCII character, treat it like meta-prefix-char
8928 followed by the corresponding non-meta character. Keymaps in
8929 CURRENT with non-prefix bindings for meta-prefix-char become nil in
8930 NEXT.
8931
88cb0656
JB
8932 If KEY has no bindings in any of the CURRENT maps, NEXT is left
8933 unmodified.
8934
569871d2 8935 NEXT may be the same array as CURRENT. */
284f4730
JB
8936
8937static int
4e50f26a 8938follow_key (key, nmaps, current, defs, next)
284f4730
JB
8939 Lisp_Object key;
8940 Lisp_Object *current, *defs, *next;
8941 int nmaps;
8942{
8943 int i, first_binding;
8944
284f4730
JB
8945 first_binding = nmaps;
8946 for (i = nmaps - 1; i >= 0; i--)
8947 {
8948 if (! NILP (current[i]))
8949 {
fe5b94c5 8950 defs[i] = access_keymap (current[i], key, 1, 0, 1);
284f4730
JB
8951 if (! NILP (defs[i]))
8952 first_binding = i;
8953 }
8954 else
8955 defs[i] = Qnil;
8956 }
8957
284f4730 8958 /* Given the set of bindings we've found, produce the next set of maps. */
0a7f1fc0
JB
8959 if (first_binding < nmaps)
8960 for (i = 0; i < nmaps; i++)
02067692 8961 next[i] = NILP (defs[i]) ? Qnil : get_keymap (defs[i], 0, 1);
284f4730
JB
8962
8963 return first_binding;
8964}
8965
a7f26f28
SM
8966/* Structure used to keep track of partial application of key remapping
8967 such as Vfunction_key_map and Vkey_translation_map. */
8968typedef struct keyremap
8969{
c2028ac6
RS
8970 /* This is the map originally specified for this use. */
8971 Lisp_Object parent;
8972 /* This is a submap reached by looking up, in PARENT,
8973 the events from START to END. */
8974 Lisp_Object map;
8975 /* Positions [START, END) in the key sequence buffer
8976 are the key that we have scanned so far.
8977 Those events are the ones that we will replace
8978 if PAREHT maps them into a key sequence. */
a7f26f28
SM
8979 int start, end;
8980} keyremap;
8981
fe5b94c5
SM
8982/* Lookup KEY in MAP.
8983 MAP is a keymap mapping keys to key vectors or functions.
8984 If the mapping is a function and DO_FUNCTION is non-zero, then
8985 the function is called with PROMPT as parameter and its return
8986 value is used as the return value of this function (after checking
8987 that it is indeed a vector). */
8988
8989static Lisp_Object
8990access_keymap_keyremap (map, key, prompt, do_funcall)
8991 Lisp_Object map, key, prompt;
8992 int do_funcall;
8993{
8994 Lisp_Object next;
6b61353c 8995
fe5b94c5
SM
8996 next = access_keymap (map, key, 1, 0, 1);
8997
8998 /* Handle symbol with autoload definition. */
8999 if (SYMBOLP (next) && !NILP (Ffboundp (next))
9000 && CONSP (XSYMBOL (next)->function)
9001 && EQ (XCAR (XSYMBOL (next)->function), Qautoload))
9002 do_autoload (XSYMBOL (next)->function, next);
9003
9004 /* Handle a symbol whose function definition is a keymap
9005 or an array. */
9006 if (SYMBOLP (next) && !NILP (Ffboundp (next))
592c0e80 9007 && (ARRAYP (XSYMBOL (next)->function)
fe5b94c5
SM
9008 || KEYMAPP (XSYMBOL (next)->function)))
9009 next = XSYMBOL (next)->function;
6b61353c 9010
fe5b94c5
SM
9011 /* If the keymap gives a function, not an
9012 array, then call the function with one arg and use
9013 its value instead. */
9014 if (SYMBOLP (next) && !NILP (Ffboundp (next)) && do_funcall)
9015 {
9016 Lisp_Object tem;
9017 tem = next;
9018
9019 next = call1 (next, prompt);
9020 /* If the function returned something invalid,
9021 barf--don't ignore it.
9022 (To ignore it safely, we would need to gcpro a bunch of
9023 other variables.) */
9024 if (! (VECTORP (next) || STRINGP (next)))
9025 error ("Function %s returns invalid key sequence", tem);
9026 }
9027 return next;
9028}
9029
9030/* Do one step of the key remapping used for function-key-map and
9031 key-translation-map:
9032 KEYBUF is the buffer holding the input events.
9033 BUFSIZE is its maximum size.
9034 FKEY is a pointer to the keyremap structure to use.
9035 INPUT is the index of the last element in KEYBUF.
9036 DOIT if non-zero says that the remapping can actually take place.
9037 DIFF is used to return the number of keys added/removed by the remapping.
9038 PARENT is the root of the keymap.
9039 PROMPT is the prompt to use if the remapping happens through a function.
9040 The return value is non-zero if the remapping actually took place. */
9041
9042static int
24d80a06
SM
9043keyremap_step (keybuf, bufsize, fkey, input, doit, diff, prompt)
9044 Lisp_Object *keybuf, prompt;
fe5b94c5
SM
9045 keyremap *fkey;
9046 int input, doit, *diff, bufsize;
9047{
9048 Lisp_Object next, key;
9049
9050 key = keybuf[fkey->end++];
c2028ac6
RS
9051
9052 if (KEYMAPP (fkey->parent))
9053 next = access_keymap_keyremap (fkey->map, key, prompt, doit);
9054 else
9055 next = Qnil;
fe5b94c5
SM
9056
9057 /* If keybuf[fkey->start..fkey->end] is bound in the
9058 map and we're in a position to do the key remapping, replace it with
9059 the binding and restart with fkey->start at the end. */
9060 if ((VECTORP (next) || STRINGP (next)) && doit)
9061 {
9062 int len = XFASTINT (Flength (next));
9063 int i;
9064
9065 *diff = len - (fkey->end - fkey->start);
9066
9067 if (input + *diff >= bufsize)
9068 error ("Key sequence too long");
9069
9070 /* Shift the keys that follow fkey->end. */
9071 if (*diff < 0)
9072 for (i = fkey->end; i < input; i++)
9073 keybuf[i + *diff] = keybuf[i];
9074 else if (*diff > 0)
9075 for (i = input - 1; i >= fkey->end; i--)
9076 keybuf[i + *diff] = keybuf[i];
9077 /* Overwrite the old keys with the new ones. */
9078 for (i = 0; i < len; i++)
9079 keybuf[fkey->start + i]
9080 = Faref (next, make_number (i));
9081
9082 fkey->start = fkey->end += *diff;
24d80a06 9083 fkey->map = fkey->parent;
fe5b94c5
SM
9084
9085 return 1;
9086 }
9087
9088 fkey->map = get_keymap (next, 0, 1);
9089
9090 /* If we no longer have a bound suffix, try a new position for
9091 fkey->start. */
9092 if (!CONSP (fkey->map))
9093 {
9094 fkey->end = ++fkey->start;
24d80a06 9095 fkey->map = fkey->parent;
fe5b94c5
SM
9096 }
9097 return 0;
9098}
a7f26f28 9099
df0f2ba1 9100/* Read a sequence of keys that ends with a non prefix character,
f4255cd1
JB
9101 storing it in KEYBUF, a buffer of size BUFSIZE.
9102 Prompt with PROMPT.
284f4730 9103 Return the length of the key sequence stored.
dcc408a0 9104 Return -1 if the user rejected a command menu.
284f4730 9105
f4255cd1
JB
9106 Echo starting immediately unless `prompt' is 0.
9107
9108 Where a key sequence ends depends on the currently active keymaps.
9109 These include any minor mode keymaps active in the current buffer,
9110 the current buffer's local map, and the global map.
9111
9112 If a key sequence has no other bindings, we check Vfunction_key_map
9113 to see if some trailing subsequence might be the beginning of a
9114 function key's sequence. If so, we try to read the whole function
9115 key, and substitute its symbolic name into the key sequence.
9116
fbcd35bd
JB
9117 We ignore unbound `down-' mouse clicks. We turn unbound `drag-' and
9118 `double-' events into similar click events, if that would make them
9119 bound. We try to turn `triple-' events first into `double-' events,
9120 then into clicks.
f4255cd1
JB
9121
9122 If we get a mouse click in a mode line, vertical divider, or other
9123 non-text area, we treat the click as if it were prefixed by the
9124 symbol denoting that area - `mode-line', `vertical-line', or
9125 whatever.
9126
9127 If the sequence starts with a mouse click, we read the key sequence
9128 with respect to the buffer clicked on, not the current buffer.
284f4730 9129
f4255cd1
JB
9130 If the user switches frames in the midst of a key sequence, we put
9131 off the switch-frame event until later; the next call to
f571ae0d
RS
9132 read_char will return it.
9133
9134 If FIX_CURRENT_BUFFER is nonzero, we restore current_buffer
9135 from the selected window's buffer. */
48e416d4 9136
284f4730 9137static int
ce98e608 9138read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
f571ae0d 9139 can_return_switch_frame, fix_current_buffer)
284f4730
JB
9140 Lisp_Object *keybuf;
9141 int bufsize;
84d91fda 9142 Lisp_Object prompt;
309b0fc8 9143 int dont_downcase_last;
ce98e608 9144 int can_return_switch_frame;
f571ae0d 9145 int fix_current_buffer;
284f4730 9146{
db14cfc5 9147 volatile Lisp_Object from_string;
aed13378 9148 volatile int count = SPECPDL_INDEX ();
f4255cd1 9149
284f4730 9150 /* How many keys there are in the current key sequence. */
8c907a56 9151 volatile int t;
284f4730 9152
284f4730
JB
9153 /* The length of the echo buffer when we started reading, and
9154 the length of this_command_keys when we started reading. */
8c907a56
GM
9155 volatile int echo_start;
9156 volatile int keys_start;
284f4730
JB
9157
9158 /* The number of keymaps we're scanning right now, and the number of
9159 keymaps we have allocated space for. */
8c907a56
GM
9160 volatile int nmaps;
9161 volatile int nmaps_allocated = 0;
284f4730 9162
284f4730
JB
9163 /* defs[0..nmaps-1] are the definitions of KEYBUF[0..t-1] in
9164 the current keymaps. */
8c907a56 9165 Lisp_Object *volatile defs = NULL;
284f4730 9166
f4255cd1
JB
9167 /* submaps[0..nmaps-1] are the prefix definitions of KEYBUF[0..t-1]
9168 in the current keymaps, or nil where it is not a prefix. */
8c907a56 9169 Lisp_Object *volatile submaps = NULL;
f4255cd1 9170
e0dff5f6 9171 /* The local map to start out with at start of key sequence. */
8c907a56 9172 volatile Lisp_Object orig_local_map;
e0dff5f6 9173
30690496
DL
9174 /* The map from the `keymap' property to start out with at start of
9175 key sequence. */
8c907a56 9176 volatile Lisp_Object orig_keymap;
30690496 9177
e0dff5f6
RS
9178 /* 1 if we have already considered switching to the local-map property
9179 of the place where a mouse click occurred. */
8c907a56 9180 volatile int localized_local_map = 0;
e0dff5f6 9181
9de5eb68 9182 /* The index in submaps[] of the first keymap that has a binding for
f4255cd1 9183 this key sequence. In other words, the lowest i such that
9de5eb68 9184 submaps[i] is non-nil. */
8c907a56 9185 volatile int first_binding;
7189cad8 9186 /* Index of the first key that has no binding.
a7f26f28 9187 It is useless to try fkey.start larger than that. */
7189cad8 9188 volatile int first_unbound;
284f4730 9189
f4255cd1 9190 /* If t < mock_input, then KEYBUF[t] should be read as the next
253598e4
JB
9191 input key.
9192
9193 We use this to recover after recognizing a function key. Once we
9194 realize that a suffix of the current key sequence is actually a
9195 function key's escape sequence, we replace the suffix with the
9196 function key's binding from Vfunction_key_map. Now keybuf
f4255cd1
JB
9197 contains a new and different key sequence, so the echo area,
9198 this_command_keys, and the submaps and defs arrays are wrong. In
9199 this situation, we set mock_input to t, set t to 0, and jump to
9200 restart_sequence; the loop will read keys from keybuf up until
9201 mock_input, thus rebuilding the state; and then it will resume
9202 reading characters from the keyboard. */
8c907a56 9203 volatile int mock_input = 0;
284f4730 9204
253598e4 9205 /* If the sequence is unbound in submaps[], then
a7f26f28
SM
9206 keybuf[fkey.start..fkey.end-1] is a prefix in Vfunction_key_map,
9207 and fkey.map is its binding.
253598e4 9208
f4255cd1
JB
9209 These might be > t, indicating that all function key scanning
9210 should hold off until t reaches them. We do this when we've just
9211 recognized a function key, to avoid searching for the function
9212 key's again in Vfunction_key_map. */
a7f26f28 9213 volatile keyremap fkey;
284f4730 9214
4f4a84ec
SM
9215 /* Likewise, for key_translation_map and input-decode-map. */
9216 volatile keyremap keytran, indec;
a612e298 9217
025ae953
CY
9218 /* Non-zero if we are trying to map a key by changing an upper-case
9219 letter to lower case, or a shifted function key to an unshifted
9220 one. */
9221 volatile int shift_translated = 0;
9222
fe5b94c5
SM
9223 /* If we receive a `switch-frame' or `select-window' event in the middle of
9224 a key sequence, we put it off for later.
9225 While we're reading, we keep the event here. */
8c907a56 9226 volatile Lisp_Object delayed_switch_frame;
cd21b839 9227
51763820
BF
9228 /* See the comment below... */
9229#if defined (GOBBLE_FIRST_EVENT)
4efda7dd 9230 Lisp_Object first_event;
51763820 9231#endif
4efda7dd 9232
8c907a56
GM
9233 volatile Lisp_Object original_uppercase;
9234 volatile int original_uppercase_position = -1;
309b0fc8 9235
bc536d84 9236 /* Gets around Microsoft compiler limitations. */
309b0fc8 9237 int dummyflag = 0;
bc536d84 9238
3b9189f8
RS
9239 struct buffer *starting_buffer;
9240
2dc00208
GM
9241 /* List of events for which a fake prefix key has been generated. */
9242 volatile Lisp_Object fake_prefixed_keys = Qnil;
9243
03cee6ae 9244#if defined (GOBBLE_FIRST_EVENT)
4efda7dd 9245 int junk;
03cee6ae 9246#endif
4efda7dd 9247
2dc00208
GM
9248 struct gcpro gcpro1;
9249
9250 GCPRO1 (fake_prefixed_keys);
7d18f9ae
RS
9251 raw_keybuf_count = 0;
9252
4efda7dd
RS
9253 last_nonmenu_event = Qnil;
9254
9255 delayed_switch_frame = Qnil;
033b73e2 9256
284f4730
JB
9257 if (INTERACTIVE)
9258 {
84d91fda 9259 if (!NILP (prompt))
a4ef85ee 9260 echo_prompt (prompt);
f2647d04
DL
9261 else if (cursor_in_echo_area
9262 && (FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
9263 && NILP (Fzerop (Vecho_keystrokes)))
284f4730
JB
9264 /* This doesn't put in a dash if the echo buffer is empty, so
9265 you don't always see a dash hanging out in the minibuffer. */
9266 echo_dash ();
284f4730
JB
9267 }
9268
f4255cd1
JB
9269 /* Record the initial state of the echo area and this_command_keys;
9270 we will need to restore them if we replay a key sequence. */
0a7f1fc0 9271 if (INTERACTIVE)
df0f2ba1 9272 echo_start = echo_length ();
f4255cd1 9273 keys_start = this_command_key_count;
6321824f 9274 this_single_command_key_start = keys_start;
0a7f1fc0 9275
51763820
BF
9276#if defined (GOBBLE_FIRST_EVENT)
9277 /* This doesn't quite work, because some of the things that read_char
9278 does cannot safely be bypassed. It seems too risky to try to make
df0f2ba1 9279 this work right. */
51763820 9280
4efda7dd
RS
9281 /* Read the first char of the sequence specially, before setting
9282 up any keymaps, in case a filter runs and switches buffers on us. */
84d91fda 9283 first_event = read_char (NILP (prompt), 0, submaps, last_nonmenu_event,
179f689c 9284 &junk, NULL);
51763820 9285#endif /* GOBBLE_FIRST_EVENT */
4efda7dd 9286
24a40fbb
GM
9287 orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
9288 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
db14cfc5 9289 from_string = Qnil;
e0dff5f6 9290
f1ba6ccd
CY
9291 /* We jump here when we need to reinitialize fkey and keytran; this
9292 happens if we switch keyboards between rescans. */
9293 replay_entire_sequence:
9294
4f4a84ec 9295 indec.map = indec.parent = current_kboard->Vinput_decode_map;
d6805803 9296 fkey.map = fkey.parent = current_kboard->Vlocal_function_key_map;
4f4a84ec
SM
9297 keytran.map = keytran.parent = Vkey_translation_map;
9298 indec.start = indec.end = 0;
3f87f67e
KL
9299 fkey.start = fkey.end = 0;
9300 keytran.start = keytran.end = 0;
d6805803 9301
3278f20e
SM
9302 /* We jump here when the key sequence has been thoroughly changed, and
9303 we need to rescan it starting from the beginning. When we jump here,
9304 keybuf[0..mock_input] holds the sequence we should reread. */
9305 replay_sequence:
9306
3b9189f8 9307 starting_buffer = current_buffer;
7189cad8 9308 first_unbound = bufsize + 1;
3b9189f8 9309
f4255cd1 9310 /* Build our list of keymaps.
07d2b8de
JB
9311 If we recognize a function key and replace its escape sequence in
9312 keybuf with its symbol, or if the sequence starts with a mouse
9313 click and we need to switch buffers, we jump back here to rebuild
9314 the initial keymaps from the current buffer. */
4cbedc16 9315 nmaps = 0;
284f4730 9316
4c0240d2 9317 if (!NILP (current_kboard->Voverriding_terminal_local_map))
4cbedc16 9318 {
4c0240d2 9319 if (2 > nmaps_allocated)
4cbedc16 9320 {
4c0240d2
RS
9321 submaps = (Lisp_Object *) alloca (2 * sizeof (submaps[0]));
9322 defs = (Lisp_Object *) alloca (2 * sizeof (defs[0]));
9323 nmaps_allocated = 2;
4cbedc16 9324 }
07024c43 9325 submaps[nmaps++] = current_kboard->Voverriding_terminal_local_map;
4c0240d2
RS
9326 }
9327 else if (!NILP (Voverriding_local_map))
9328 {
9329 if (2 > nmaps_allocated)
9330 {
9331 submaps = (Lisp_Object *) alloca (2 * sizeof (submaps[0]));
9332 defs = (Lisp_Object *) alloca (2 * sizeof (defs[0]));
9333 nmaps_allocated = 2;
9334 }
07024c43 9335 submaps[nmaps++] = Voverriding_local_map;
4cbedc16
RS
9336 }
9337 else
9338 {
4cbedc16
RS
9339 int nminor;
9340 int total;
9341 Lisp_Object *maps;
9342
9343 nminor = current_minor_maps (0, &maps);
9344 total = nminor + (!NILP (orig_keymap) ? 3 : 2);
9345
9346 if (total > nmaps_allocated)
9347 {
9348 submaps = (Lisp_Object *) alloca (total * sizeof (submaps[0]));
9349 defs = (Lisp_Object *) alloca (total * sizeof (defs[0]));
9350 nmaps_allocated = total;
9351 }
9352
9353 if (!NILP (orig_keymap))
9354 submaps[nmaps++] = orig_keymap;
9355
7d1c4866 9356 bcopy (maps, (void *) (submaps + nmaps),
4cbedc16
RS
9357 nminor * sizeof (submaps[0]));
9358
9359 nmaps += nminor;
9360
9361 submaps[nmaps++] = orig_local_map;
9362 }
9363 submaps[nmaps++] = current_global_map;
284f4730
JB
9364
9365 /* Find an accurate initial value for first_binding. */
9366 for (first_binding = 0; first_binding < nmaps; first_binding++)
253598e4 9367 if (! NILP (submaps[first_binding]))
284f4730
JB
9368 break;
9369
3b9189f8 9370 /* Start from the beginning in keybuf. */
f4255cd1
JB
9371 t = 0;
9372
9373 /* These are no-ops the first time through, but if we restart, they
9374 revert the echo area and this_command_keys to their original state. */
9375 this_command_key_count = keys_start;
df0f2ba1 9376 if (INTERACTIVE && t < mock_input)
f4255cd1
JB
9377 echo_truncate (echo_start);
9378
cca310da
JB
9379 /* If the best binding for the current key sequence is a keymap, or
9380 we may be looking at a function key's escape sequence, keep on
9381 reading. */
a7f26f28
SM
9382 while (first_binding < nmaps
9383 /* Keep reading as long as there's a prefix binding. */
9384 ? !NILP (submaps[first_binding])
e9bf89a0
RS
9385 /* Don't return in the middle of a possible function key sequence,
9386 if the only bindings we found were via case conversion.
9387 Thus, if ESC O a has a function-key-map translation
9388 and ESC o has a binding, don't return after ESC O,
9389 so that we can translate ESC O plus the next character. */
4f4a84ec 9390 : (/* indec.start < t || fkey.start < t || */ keytran.start < t))
284f4730
JB
9391 {
9392 Lisp_Object key;
7d6de002 9393 int used_mouse_menu = 0;
284f4730 9394
7b4aedb9
JB
9395 /* Where the last real key started. If we need to throw away a
9396 key that has expanded into more than one element of keybuf
9397 (say, a mouse click on the mode line which is being treated
9398 as [mode-line (mouse-...)], then we backtrack to this point
9399 of keybuf. */
8c907a56 9400 volatile int last_real_key_start;
7b4aedb9 9401
0a7f1fc0
JB
9402 /* These variables are analogous to echo_start and keys_start;
9403 while those allow us to restart the entire key sequence,
9404 echo_local_start and keys_local_start allow us to throw away
9405 just one key. */
8c907a56 9406 volatile int echo_local_start, keys_local_start, local_first_binding;
f4255cd1 9407
4f4a84ec
SM
9408 eassert (indec.end == t || (indec.end > t && indec.end <= mock_input));
9409 eassert (indec.start <= indec.end);
fe5b94c5
SM
9410 eassert (fkey.start <= fkey.end);
9411 eassert (keytran.start <= keytran.end);
4f4a84ec
SM
9412 /* key-translation-map is applied *after* function-key-map
9413 which is itself applied *after* input-decode-map. */
9414 eassert (fkey.end <= indec.start);
a7f26f28 9415 eassert (keytran.end <= fkey.start);
7189cad8 9416
4f4a84ec
SM
9417 if (/* first_unbound < indec.start && first_unbound < fkey.start && */
9418 first_unbound < keytran.start)
7189cad8
SM
9419 { /* The prefix upto first_unbound has no binding and has
9420 no translation left to do either, so we know it's unbound.
9421 If we don't stop now, we risk staying here indefinitely
9422 (if the user keeps entering fkey or keytran prefixes
9423 like C-c ESC ESC ESC ESC ...) */
9424 int i;
9425 for (i = first_unbound + 1; i < t; i++)
9426 keybuf[i - first_unbound - 1] = keybuf[i];
9427 mock_input = t - first_unbound - 1;
4f4a84ec
SM
9428 indec.end = indec.start -= first_unbound + 1;
9429 indec.map = indec.parent;
a7f26f28 9430 fkey.end = fkey.start -= first_unbound + 1;
24d80a06 9431 fkey.map = fkey.parent;
a7f26f28 9432 keytran.end = keytran.start -= first_unbound + 1;
24d80a06 9433 keytran.map = keytran.parent;
7189cad8
SM
9434 goto replay_sequence;
9435 }
9436
284f4730 9437 if (t >= bufsize)
3fe8e9a2 9438 error ("Key sequence too long");
284f4730 9439
f4255cd1
JB
9440 if (INTERACTIVE)
9441 echo_local_start = echo_length ();
9442 keys_local_start = this_command_key_count;
9443 local_first_binding = first_binding;
df0f2ba1 9444
f4255cd1 9445 replay_key:
0a7f1fc0 9446 /* These are no-ops, unless we throw away a keystroke below and
f4255cd1
JB
9447 jumped back up to replay_key; in that case, these restore the
9448 variables to their original state, allowing us to replay the
0a7f1fc0 9449 loop. */
40932d1a 9450 if (INTERACTIVE && t < mock_input)
f4255cd1 9451 echo_truncate (echo_local_start);
0a7f1fc0
JB
9452 this_command_key_count = keys_local_start;
9453 first_binding = local_first_binding;
9454
7e85b935
RS
9455 /* By default, assume each event is "real". */
9456 last_real_key_start = t;
9457
f4255cd1 9458 /* Does mock_input indicate that we are re-reading a key sequence? */
284f4730
JB
9459 if (t < mock_input)
9460 {
9461 key = keybuf[t];
9462 add_command_key (key);
f2647d04
DL
9463 if ((FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
9464 && NILP (Fzerop (Vecho_keystrokes)))
a98ea3f9 9465 echo_char (key);
284f4730 9466 }
253598e4
JB
9467
9468 /* If not, we should actually read a character. */
284f4730
JB
9469 else
9470 {
beecf6a1 9471 {
c5fdd383 9472 KBOARD *interrupted_kboard = current_kboard;
788f89eb 9473 struct frame *interrupted_frame = SELECTED_FRAME ();
9688ff53
KL
9474 key = read_char (NILP (prompt), nmaps,
9475 (Lisp_Object *) submaps, last_nonmenu_event,
251bc578 9476 &used_mouse_menu, NULL);
9688ff53 9477 if (INTEGERP (key) && XINT (key) == -2) /* wrong_kboard_jmpbuf */
beecf6a1 9478 {
e079ecf4
KL
9479 int found = 0;
9480 struct kboard *k;
b3e6f69c 9481
e079ecf4
KL
9482 for (k = all_kboards; k; k = k->next_kboard)
9483 if (k == interrupted_kboard)
9484 found = 1;
9485
9486 if (!found)
9487 {
9488 /* Don't touch interrupted_kboard when it's been
9489 deleted. */
9490 delayed_switch_frame = Qnil;
f1ba6ccd 9491 goto replay_entire_sequence;
e079ecf4 9492 }
b3e6f69c 9493
5798cf15
KH
9494 if (!NILP (delayed_switch_frame))
9495 {
c5fdd383 9496 interrupted_kboard->kbd_queue
5798cf15 9497 = Fcons (delayed_switch_frame,
c5fdd383 9498 interrupted_kboard->kbd_queue);
5798cf15
KH
9499 delayed_switch_frame = Qnil;
9500 }
e079ecf4 9501
beecf6a1 9502 while (t > 0)
c5fdd383
KH
9503 interrupted_kboard->kbd_queue
9504 = Fcons (keybuf[--t], interrupted_kboard->kbd_queue);
5798cf15
KH
9505
9506 /* If the side queue is non-empty, ensure it begins with a
9507 switch-frame, so we'll replay it in the right context. */
c5fdd383 9508 if (CONSP (interrupted_kboard->kbd_queue)
7539e11f 9509 && (key = XCAR (interrupted_kboard->kbd_queue),
5798cf15
KH
9510 !(EVENT_HAS_PARAMETERS (key)
9511 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (key)),
9512 Qswitch_frame))))
df0f2ba1
KH
9513 {
9514 Lisp_Object frame;
9515 XSETFRAME (frame, interrupted_frame);
c5fdd383 9516 interrupted_kboard->kbd_queue
df0f2ba1 9517 = Fcons (make_lispy_switch_frame (frame),
c5fdd383 9518 interrupted_kboard->kbd_queue);
df0f2ba1 9519 }
beecf6a1 9520 mock_input = 0;
24a40fbb
GM
9521 orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
9522 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
f1ba6ccd 9523 goto replay_entire_sequence;
beecf6a1 9524 }
beecf6a1 9525 }
284f4730 9526
dcc408a0
RS
9527 /* read_char returns t when it shows a menu and the user rejects it.
9528 Just return -1. */
9529 if (EQ (key, Qt))
7d18f9ae
RS
9530 {
9531 unbind_to (count, Qnil);
2dc00208 9532 UNGCPRO;
7d18f9ae
RS
9533 return -1;
9534 }
dcc408a0 9535
f4255cd1 9536 /* read_char returns -1 at the end of a macro.
284f4730
JB
9537 Emacs 18 handles this by returning immediately with a
9538 zero, so that's what we'll do. */
8c18cbfb 9539 if (INTEGERP (key) && XINT (key) == -1)
cd21b839 9540 {
f4255cd1 9541 t = 0;
bc536d84
RS
9542 /* The Microsoft C compiler can't handle the goto that
9543 would go here. */
309b0fc8 9544 dummyflag = 1;
bc536d84 9545 break;
cd21b839 9546 }
df0f2ba1 9547
3cb81011
KH
9548 /* If the current buffer has been changed from under us, the
9549 keymap may have changed, so replay the sequence. */
8c18cbfb 9550 if (BUFFERP (key))
3cb81011 9551 {
5c12e63f 9552 timer_resume_idle ();
3021d3a9 9553
3cb81011 9554 mock_input = t;
f571ae0d
RS
9555 /* Reset the current buffer from the selected window
9556 in case something changed the former and not the latter.
9557 This is to be more consistent with the behavior
9558 of the command_loop_1. */
9559 if (fix_current_buffer)
a94a4335 9560 {
788f89eb 9561 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
a94a4335
KH
9562 Fkill_emacs (Qnil);
9563 if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
9564 Fset_buffer (XWINDOW (selected_window)->buffer);
9565 }
f571ae0d 9566
24a40fbb
GM
9567 orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
9568 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
3cb81011
KH
9569 goto replay_sequence;
9570 }
9571
3b9189f8
RS
9572 /* If we have a quit that was typed in another frame, and
9573 quit_throw_to_read_char switched buffers,
9574 replay to get the right keymap. */
f4e05d97
GM
9575 if (INTEGERP (key)
9576 && XINT (key) == quit_char
9577 && current_buffer != starting_buffer)
3b9189f8 9578 {
7d18f9ae
RS
9579 GROW_RAW_KEYBUF;
9580 XVECTOR (raw_keybuf)->contents[raw_keybuf_count++] = key;
3b9189f8
RS
9581 keybuf[t++] = key;
9582 mock_input = t;
9583 Vquit_flag = Qnil;
24a40fbb
GM
9584 orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
9585 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
3b9189f8
RS
9586 goto replay_sequence;
9587 }
3cb81011 9588
284f4730 9589 Vquit_flag = Qnil;
7d18f9ae
RS
9590
9591 if (EVENT_HAS_PARAMETERS (key)
fe5b94c5 9592 /* Either a `switch-frame' or a `select-window' event. */
7d18f9ae
RS
9593 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (key)), Qswitch_frame))
9594 {
9595 /* If we're at the beginning of a key sequence, and the caller
9596 says it's okay, go ahead and return this event. If we're
9597 in the midst of a key sequence, delay it until the end. */
9598 if (t > 0 || !can_return_switch_frame)
9599 {
9600 delayed_switch_frame = key;
9601 goto replay_key;
9602 }
9603 }
9604
9605 GROW_RAW_KEYBUF;
4ed4b975
JB
9606 ASET (raw_keybuf, raw_keybuf_count, key);
9607 raw_keybuf_count++;
7e85b935 9608 }
284f4730 9609
df0f2ba1 9610 /* Clicks in non-text areas get prefixed by the symbol
7e85b935
RS
9611 in their CHAR-ADDRESS field. For example, a click on
9612 the mode line is prefixed by the symbol `mode-line'.
9613
9614 Furthermore, key sequences beginning with mouse clicks
9615 are read using the keymaps of the buffer clicked on, not
9616 the current buffer. So we may have to switch the buffer
9617 here.
9618
9619 When we turn one event into two events, we must make sure
9620 that neither of the two looks like the original--so that,
9621 if we replay the events, they won't be expanded again.
9622 If not for this, such reexpansion could happen either here
9623 or when user programs play with this-command-keys. */
9624 if (EVENT_HAS_PARAMETERS (key))
9625 {
9b8eb840 9626 Lisp_Object kind;
6b61353c 9627 Lisp_Object string;
cca310da 9628
9b8eb840 9629 kind = EVENT_HEAD_KIND (EVENT_HEAD (key));
7e85b935 9630 if (EQ (kind, Qmouse_click))
0a7f1fc0 9631 {
9b8eb840 9632 Lisp_Object window, posn;
f4255cd1 9633
4ed4b975 9634 window = POSN_WINDOW (EVENT_START (key));
6b61353c 9635 posn = POSN_POSN (EVENT_START (key));
7ee32cda 9636
2cf066c3
GM
9637 if (CONSP (posn)
9638 || (!NILP (fake_prefixed_keys)
9639 && !NILP (Fmemq (key, fake_prefixed_keys))))
0a7f1fc0 9640 {
2cf066c3
GM
9641 /* We're looking a second time at an event for which
9642 we generated a fake prefix key. Set
7e85b935
RS
9643 last_real_key_start appropriately. */
9644 if (t > 0)
9645 last_real_key_start = t - 1;
cd21b839 9646 }
7e85b935
RS
9647
9648 /* Key sequences beginning with mouse clicks are
9649 read using the keymaps in the buffer clicked on,
9650 not the current buffer. If we're at the
9651 beginning of a key sequence, switch buffers. */
9652 if (last_real_key_start == 0
8c18cbfb
KH
9653 && WINDOWP (window)
9654 && BUFFERP (XWINDOW (window)->buffer)
7e85b935 9655 && XBUFFER (XWINDOW (window)->buffer) != current_buffer)
cd21b839 9656 {
7d18f9ae 9657 XVECTOR (raw_keybuf)->contents[raw_keybuf_count++] = key;
7e85b935
RS
9658 keybuf[t] = key;
9659 mock_input = t + 1;
9660
9661 /* Arrange to go back to the original buffer once we're
9662 done reading the key sequence. Note that we can't
9663 use save_excursion_{save,restore} here, because they
9664 save point as well as the current buffer; we don't
9665 want to save point, because redisplay may change it,
9666 to accommodate a Fset_window_start or something. We
9667 don't want to do this at the top of the function,
9668 because we may get input from a subprocess which
9669 wants to change the selected window and stuff (say,
9670 emacsclient). */
9671 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
9672
788f89eb 9673 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
a94a4335 9674 Fkill_emacs (Qnil);
24a40fbb 9675 set_buffer_internal (XBUFFER (XWINDOW (window)->buffer));
30690496 9676 orig_local_map = get_local_map (PT, current_buffer,
24a40fbb
GM
9677 Qlocal_map);
9678 orig_keymap = get_local_map (PT, current_buffer, Qkeymap);
7e85b935 9679 goto replay_sequence;
0a7f1fc0 9680 }
c60ee5e7 9681
e0dff5f6
RS
9682 /* For a mouse click, get the local text-property keymap
9683 of the place clicked on, rather than point. */
7ee32cda 9684 if (last_real_key_start == 0
7539e11f 9685 && CONSP (XCDR (key))
e0dff5f6 9686 && ! localized_local_map)
5ec75a55 9687 {
e0dff5f6
RS
9688 Lisp_Object map_here, start, pos;
9689
9690 localized_local_map = 1;
9691 start = EVENT_START (key);
c60ee5e7 9692
6b61353c 9693 if (CONSP (start) && POSN_INBUFFER_P (start))
e0dff5f6
RS
9694 {
9695 pos = POSN_BUFFER_POSN (start);
b78ce8fb 9696 if (INTEGERP (pos)
602ae44c
CY
9697 && XINT (pos) >= BEGV
9698 && XINT (pos) <= ZV)
e0dff5f6 9699 {
30690496 9700 map_here = get_local_map (XINT (pos),
24a40fbb 9701 current_buffer, Qlocal_map);
e0dff5f6
RS
9702 if (!EQ (map_here, orig_local_map))
9703 {
9704 orig_local_map = map_here;
b74e16a3 9705 ++localized_local_map;
30690496 9706 }
b74e16a3 9707
30690496 9708 map_here = get_local_map (XINT (pos),
24a40fbb 9709 current_buffer, Qkeymap);
30690496
DL
9710 if (!EQ (map_here, orig_keymap))
9711 {
9712 orig_keymap = map_here;
b74e16a3
DK
9713 ++localized_local_map;
9714 }
9715
9716 if (localized_local_map > 1)
9717 {
30690496
DL
9718 keybuf[t] = key;
9719 mock_input = t + 1;
9720
e0dff5f6
RS
9721 goto replay_sequence;
9722 }
9723 }
9724 }
9725 }
9726
9727 /* Expand mode-line and scroll-bar events into two events:
9728 use posn as a fake prefix key. */
2dc00208
GM
9729 if (SYMBOLP (posn)
9730 && (NILP (fake_prefixed_keys)
9731 || NILP (Fmemq (key, fake_prefixed_keys))))
e0dff5f6 9732 {
7e85b935 9733 if (t + 1 >= bufsize)
3fe8e9a2 9734 error ("Key sequence too long");
c60ee5e7 9735
2dc00208
GM
9736 keybuf[t] = posn;
9737 keybuf[t + 1] = key;
9738 mock_input = t + 2;
9739
9740 /* Record that a fake prefix key has been generated
9741 for KEY. Don't modify the event; this would
9742 prevent proper action when the event is pushed
c7f4f573 9743 back into unread-command-events. */
2dc00208 9744 fake_prefixed_keys = Fcons (key, fake_prefixed_keys);
7ee32cda
GM
9745
9746 /* If on a mode line string with a local keymap,
9747 reconsider the key sequence with that keymap. */
6b61353c
KH
9748 if (string = POSN_STRING (EVENT_START (key)),
9749 (CONSP (string) && STRINGP (XCAR (string))))
7ee32cda 9750 {
6b61353c 9751 Lisp_Object pos, map, map2;
7ee32cda 9752
7ee32cda
GM
9753 pos = XCDR (string);
9754 string = XCAR (string);
52e386c2 9755 if (XINT (pos) >= 0
d5db4077 9756 && XINT (pos) < SCHARS (string))
30690496
DL
9757 {
9758 map = Fget_text_property (pos, Qlocal_map, string);
9759 if (!NILP (map))
9760 orig_local_map = map;
9761 map2 = Fget_text_property (pos, Qkeymap, string);
9762 if (!NILP (map2))
9763 orig_keymap = map2;
9764 if (!NILP (map) || !NILP (map2))
9765 goto replay_sequence;
9766 }
7ee32cda
GM
9767 }
9768
7e85b935 9769 goto replay_key;
5ec75a55 9770 }
6b61353c
KH
9771 else if (NILP (from_string)
9772 && (string = POSN_STRING (EVENT_START (key)),
9773 (CONSP (string) && STRINGP (XCAR (string)))))
db14cfc5
GM
9774 {
9775 /* For a click on a string, i.e. overlay string or a
9776 string displayed via the `display' property,
9777 consider `local-map' and `keymap' properties of
9778 that string. */
6b61353c 9779 Lisp_Object pos, map, map2;
db14cfc5 9780
db14cfc5
GM
9781 pos = XCDR (string);
9782 string = XCAR (string);
9783 if (XINT (pos) >= 0
d5db4077 9784 && XINT (pos) < SCHARS (string))
db14cfc5
GM
9785 {
9786 map = Fget_text_property (pos, Qlocal_map, string);
9787 if (!NILP (map))
9788 orig_local_map = map;
9789 map2 = Fget_text_property (pos, Qkeymap, string);
9790 if (!NILP (map2))
9791 orig_keymap = map2;
9792
9793 if (!NILP (map) || !NILP (map2))
9794 {
9795 from_string = string;
32949266
CY
9796 keybuf[t++] = key;
9797 mock_input = t;
db14cfc5
GM
9798 goto replay_sequence;
9799 }
9800 }
9801 }
0a7f1fc0 9802 }
7539e11f 9803 else if (CONSP (XCDR (key))
7a80a6f6 9804 && CONSP (EVENT_START (key))
7539e11f 9805 && CONSP (XCDR (EVENT_START (key))))
7e85b935 9806 {
9b8eb840 9807 Lisp_Object posn;
7e85b935 9808
6b61353c 9809 posn = POSN_POSN (EVENT_START (key));
7e85b935
RS
9810 /* Handle menu-bar events:
9811 insert the dummy prefix event `menu-bar'. */
9ea173e8 9812 if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
7e85b935
RS
9813 {
9814 if (t + 1 >= bufsize)
3fe8e9a2 9815 error ("Key sequence too long");
7e85b935
RS
9816 keybuf[t] = posn;
9817 keybuf[t+1] = key;
9818
9819 /* Zap the position in key, so we know that we've
9820 expanded it, and don't try to do so again. */
6b61353c
KH
9821 POSN_SET_POSN (EVENT_START (key),
9822 Fcons (posn, Qnil));
7e85b935
RS
9823
9824 mock_input = t + 2;
9825 goto replay_sequence;
9826 }
8c18cbfb 9827 else if (CONSP (posn))
7e85b935
RS
9828 {
9829 /* We're looking at the second event of a
9830 sequence which we expanded before. Set
9831 last_real_key_start appropriately. */
9832 if (last_real_key_start == t && t > 0)
9833 last_real_key_start = t - 1;
9834 }
a6d53864 9835 }
284f4730 9836 }
f4255cd1
JB
9837
9838 /* We have finally decided that KEY is something we might want
9839 to look up. */
284f4730
JB
9840 first_binding = (follow_key (key,
9841 nmaps - first_binding,
253598e4 9842 submaps + first_binding,
284f4730 9843 defs + first_binding,
4e50f26a 9844 submaps + first_binding)
284f4730 9845 + first_binding);
0a7f1fc0 9846
f4255cd1 9847 /* If KEY wasn't bound, we'll try some fallbacks. */
65e0fbbf
SM
9848 if (first_binding < nmaps)
9849 /* This is needed for the following scenario:
9850 event 0: a down-event that gets dropped by calling replay_key.
9851 event 1: some normal prefix like C-h.
4f4a84ec
SM
9852 After event 0, first_unbound is 0, after event 1 indec.start,
9853 fkey.start, and keytran.start are all 1, so when we see that
9854 C-h is bound, we need to update first_unbound. */
65e0fbbf
SM
9855 first_unbound = max (t + 1, first_unbound);
9856 else
0a7f1fc0 9857 {
9b8eb840 9858 Lisp_Object head;
c60ee5e7 9859
4f4a84ec 9860 /* Remember the position to put an upper bound on indec.start. */
7189cad8 9861 first_unbound = min (t, first_unbound);
0a7f1fc0 9862
9b8eb840 9863 head = EVENT_HEAD (key);
24736fbc 9864 if (help_char_p (head) && t > 0)
7e85b935
RS
9865 {
9866 read_key_sequence_cmd = Vprefix_help_command;
9867 keybuf[t++] = key;
9868 last_nonmenu_event = key;
bc536d84
RS
9869 /* The Microsoft C compiler can't handle the goto that
9870 would go here. */
309b0fc8 9871 dummyflag = 1;
0d882d52 9872 break;
7e85b935
RS
9873 }
9874
8c18cbfb 9875 if (SYMBOLP (head))
0a7f1fc0 9876 {
9b8eb840
KH
9877 Lisp_Object breakdown;
9878 int modifiers;
0a7f1fc0 9879
9b8eb840 9880 breakdown = parse_modifiers (head);
7539e11f 9881 modifiers = XINT (XCAR (XCDR (breakdown)));
559f9d04
RS
9882 /* Attempt to reduce an unbound mouse event to a simpler
9883 event that is bound:
9884 Drags reduce to clicks.
9885 Double-clicks reduce to clicks.
9886 Triple-clicks reduce to double-clicks, then to clicks.
9887 Down-clicks are eliminated.
9888 Double-downs reduce to downs, then are eliminated.
9889 Triple-downs reduce to double-downs, then to downs,
9890 then are eliminated. */
9891 if (modifiers & (down_modifier | drag_modifier
9892 | double_modifier | triple_modifier))
0a7f1fc0 9893 {
559f9d04
RS
9894 while (modifiers & (down_modifier | drag_modifier
9895 | double_modifier | triple_modifier))
fbcd35bd
JB
9896 {
9897 Lisp_Object new_head, new_click;
9898 if (modifiers & triple_modifier)
9899 modifiers ^= (double_modifier | triple_modifier);
bc536d84
RS
9900 else if (modifiers & double_modifier)
9901 modifiers &= ~double_modifier;
9902 else if (modifiers & drag_modifier)
9903 modifiers &= ~drag_modifier;
559f9d04
RS
9904 else
9905 {
9906 /* Dispose of this `down' event by simply jumping
9907 back to replay_key, to get another event.
9908
9909 Note that if this event came from mock input,
9910 then just jumping back to replay_key will just
9911 hand it to us again. So we have to wipe out any
9912 mock input.
9913
9914 We could delete keybuf[t] and shift everything
9915 after that to the left by one spot, but we'd also
9916 have to fix up any variable that points into
9917 keybuf, and shifting isn't really necessary
9918 anyway.
9919
9920 Adding prefixes for non-textual mouse clicks
9921 creates two characters of mock input, and both
9922 must be thrown away. If we're only looking at
9923 the prefix now, we can just jump back to
9924 replay_key. On the other hand, if we've already
9925 processed the prefix, and now the actual click
9926 itself is giving us trouble, then we've lost the
9927 state of the keymaps we want to backtrack to, and
9928 we need to replay the whole sequence to rebuild
9929 it.
9930
9931 Beyond that, only function key expansion could
9932 create more than two keys, but that should never
9933 generate mouse events, so it's okay to zero
9934 mock_input in that case too.
9935
65e0fbbf
SM
9936 FIXME: The above paragraph seems just plain
9937 wrong, if you consider things like
9938 xterm-mouse-mode. -stef
9939
559f9d04 9940 Isn't this just the most wonderful code ever? */
017be6c7
SM
9941
9942 /* If mock_input > t + 1, the above simplification
9943 will actually end up dropping keys on the floor.
9944 This is probably OK for now, but even
4f4a84ec
SM
9945 if mock_input <= t + 1, we need to adjust indec,
9946 fkey, and keytran.
017be6c7
SM
9947 Typical case [header-line down-mouse-N]:
9948 mock_input = 2, t = 1, fkey.end = 1,
9949 last_real_key_start = 0. */
4f4a84ec 9950 if (indec.end > last_real_key_start)
017be6c7 9951 {
4f4a84ec
SM
9952 indec.end = indec.start
9953 = min (last_real_key_start, indec.start);
9954 indec.map = indec.parent;
9955 if (fkey.end > last_real_key_start)
017be6c7 9956 {
4f4a84ec
SM
9957 fkey.end = fkey.start
9958 = min (last_real_key_start, fkey.start);
9959 fkey.map = fkey.parent;
9960 if (keytran.end > last_real_key_start)
9961 {
9962 keytran.end = keytran.start
9963 = min (last_real_key_start, keytran.start);
9964 keytran.map = keytran.parent;
9965 }
017be6c7
SM
9966 }
9967 }
559f9d04
RS
9968 if (t == last_real_key_start)
9969 {
9970 mock_input = 0;
9971 goto replay_key;
9972 }
9973 else
9974 {
9975 mock_input = last_real_key_start;
9976 goto replay_sequence;
9977 }
9978 }
9979
27203ead 9980 new_head
7539e11f 9981 = apply_modifiers (modifiers, XCAR (breakdown));
27203ead
RS
9982 new_click
9983 = Fcons (new_head, Fcons (EVENT_START (key), Qnil));
fbcd35bd
JB
9984
9985 /* Look for a binding for this new key. follow_key
9986 promises that it didn't munge submaps the
9987 last time we called it, since key was unbound. */
27203ead
RS
9988 first_binding
9989 = (follow_key (new_click,
9990 nmaps - local_first_binding,
9991 submaps + local_first_binding,
9992 defs + local_first_binding,
4e50f26a 9993 submaps + local_first_binding)
27203ead 9994 + local_first_binding);
fbcd35bd
JB
9995
9996 /* If that click is bound, go for it. */
9997 if (first_binding < nmaps)
9998 {
9999 key = new_click;
10000 break;
10001 }
10002 /* Otherwise, we'll leave key set to the drag event. */
10003 }
0a7f1fc0
JB
10004 }
10005 }
10006 }
10007
284f4730 10008 keybuf[t++] = key;
7d6de002
RS
10009 /* Normally, last_nonmenu_event gets the previous key we read.
10010 But when a mouse popup menu is being used,
10011 we don't update last_nonmenu_event; it continues to hold the mouse
10012 event that preceded the first level of menu. */
10013 if (!used_mouse_menu)
10014 last_nonmenu_event = key;
284f4730 10015
6321824f
RS
10016 /* Record what part of this_command_keys is the current key sequence. */
10017 this_single_command_key_start = this_command_key_count - t;
10018
4f4a84ec
SM
10019 /* Look for this sequence in input-decode-map.
10020 Scan from indec.end until we find a bound suffix. */
10021 while (indec.end < t)
10022 {
10023 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
10024 int done, diff;
10025
10026 GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
10027 done = keyremap_step (keybuf, bufsize, &indec, max (t, mock_input),
10028 1, &diff, prompt);
10029 UNGCPRO;
10030 if (done)
10031 {
10032 mock_input = diff + max (t, mock_input);
10033 goto replay_sequence;
10034 }
10035 }
10036
10037 if (first_binding < nmaps && NILP (submaps[first_binding])
10038 && indec.start >= t)
65e0fbbf 10039 /* There is a binding and it's not a prefix.
4f4a84ec 10040 (and it doesn't have any input-decode-map translation pending).
65e0fbbf
SM
10041 There is thus no function-key in this sequence.
10042 Moving fkey.start is important in this case to allow keytran.start
10043 to go over the sequence before we return (since we keep the
10044 invariant that keytran.end <= fkey.start). */
10045 {
a7f26f28 10046 if (fkey.start < t)
24d80a06 10047 (fkey.start = fkey.end = t, fkey.map = fkey.parent);
65e0fbbf
SM
10048 }
10049 else
10050 /* If the sequence is unbound, see if we can hang a function key
10051 off the end of it. */
fe5b94c5 10052 /* Continue scan from fkey.end until we find a bound suffix. */
4f4a84ec 10053 while (fkey.end < indec.start)
a612e298 10054 {
4f4a84ec 10055 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
fe5b94c5
SM
10056 int done, diff;
10057
4f4a84ec 10058 GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
fe5b94c5
SM
10059 done = keyremap_step (keybuf, bufsize, &fkey,
10060 max (t, mock_input),
10061 /* If there's a binding (i.e.
10062 first_binding >= nmaps) we don't want
10063 to apply this function-key-mapping. */
10064 fkey.end + 1 == t && first_binding >= nmaps,
24d80a06 10065 &diff, prompt);
fe5b94c5
SM
10066 UNGCPRO;
10067 if (done)
a612e298 10068 {
fe5b94c5 10069 mock_input = diff + max (t, mock_input);
4f4a84ec
SM
10070 /* Adjust the input-decode-map counters. */
10071 indec.end += diff;
10072 indec.start += diff;
10073
a612e298
RS
10074 goto replay_sequence;
10075 }
fe5b94c5 10076 }
a612e298 10077
fe5b94c5
SM
10078 /* Look for this sequence in key-translation-map.
10079 Scan from keytran.end until we find a bound suffix. */
10080 while (keytran.end < fkey.start)
10081 {
4f4a84ec 10082 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
fe5b94c5 10083 int done, diff;
a612e298 10084
4f4a84ec 10085 GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
fe5b94c5 10086 done = keyremap_step (keybuf, bufsize, &keytran, max (t, mock_input),
24d80a06 10087 1, &diff, prompt);
fe5b94c5
SM
10088 UNGCPRO;
10089 if (done)
10090 {
10091 mock_input = diff + max (t, mock_input);
4f4a84ec
SM
10092 /* Adjust the function-key-map and input-decode-map counters. */
10093 indec.end += diff;
10094 indec.start += diff;
fe5b94c5
SM
10095 fkey.end += diff;
10096 fkey.start += diff;
6b61353c 10097
fe5b94c5
SM
10098 goto replay_sequence;
10099 }
10100 }
4e50f26a
RS
10101
10102 /* If KEY is not defined in any of the keymaps,
10103 and cannot be part of a function key or translation,
10104 and is an upper case letter
10105 use the corresponding lower-case letter instead. */
65e0fbbf 10106 if (first_binding >= nmaps
4f4a84ec 10107 && /* indec.start >= t && fkey.start >= t && */ keytran.start >= t
8c18cbfb 10108 && INTEGERP (key)
c23cad0b 10109 && ((CHARACTERP (make_number (XINT (key) & ~CHAR_MODIFIER_MASK))
16747e03 10110 && UPPERCASEP (XINT (key) & ~CHAR_MODIFIER_MASK))
4e50f26a
RS
10111 || (XINT (key) & shift_modifier)))
10112 {
569871d2 10113 Lisp_Object new_key;
569871d2 10114
309b0fc8
RS
10115 original_uppercase = key;
10116 original_uppercase_position = t - 1;
10117
831f35a2 10118 if (XINT (key) & shift_modifier)
569871d2 10119 XSETINT (new_key, XINT (key) & ~shift_modifier);
4e50f26a 10120 else
16747e03 10121 XSETINT (new_key, (DOWNCASE (XINT (key) & ~CHAR_MODIFIER_MASK)
a864f6d6 10122 | (XINT (key) & CHAR_MODIFIER_MASK)));
569871d2 10123
3fe8e9a2
RS
10124 /* We have to do this unconditionally, regardless of whether
10125 the lower-case char is defined in the keymaps, because they
10126 might get translated through function-key-map. */
10127 keybuf[t - 1] = new_key;
2cf4b7b2 10128 mock_input = max (t, mock_input);
025ae953 10129 shift_translated = 1;
3fe8e9a2
RS
10130
10131 goto replay_sequence;
4e50f26a 10132 }
ef8fd672
RS
10133 /* If KEY is not defined in any of the keymaps,
10134 and cannot be part of a function key or translation,
10135 and is a shifted function key,
10136 use the corresponding unshifted function key instead. */
65e0fbbf 10137 if (first_binding >= nmaps
21ec2c43 10138 && /* indec.start >= t && fkey.start >= t && */ keytran.start >= t)
ef8fd672 10139 {
21ec2c43
SM
10140 Lisp_Object breakdown = parse_modifiers (key);
10141 int modifiers
10142 = CONSP (breakdown) ? (XINT (XCAR (XCDR (breakdown)))) : 0;
10143
10144 if (modifiers & shift_modifier
10145 /* Treat uppercase keys as shifted. */
10146 || (INTEGERP (key)
87df3c32
SM
10147 && (KEY_TO_CHAR (key)
10148 < XCHAR_TABLE (current_buffer->downcase_table)->size)
21ec2c43 10149 && UPPERCASEP (KEY_TO_CHAR (key))))
ef8fd672 10150 {
21ec2c43
SM
10151 Lisp_Object new_key
10152 = (modifiers & shift_modifier
10153 ? apply_modifiers (modifiers & ~shift_modifier,
10154 XCAR (breakdown))
10155 : make_number (DOWNCASE (KEY_TO_CHAR (key)) | modifiers));
3fe8e9a2
RS
10156
10157 original_uppercase = key;
10158 original_uppercase_position = t - 1;
ef8fd672 10159
21ec2c43
SM
10160 /* We have to do this unconditionally, regardless of whether
10161 the lower-case char is defined in the keymaps, because they
10162 might get translated through function-key-map. */
3fe8e9a2 10163 keybuf[t - 1] = new_key;
2cf4b7b2 10164 mock_input = max (t, mock_input);
21ec2c43
SM
10165 /* Reset fkey (and consequently keytran) to apply
10166 function-key-map on the result, so that S-backspace is
10167 correctly mapped to DEL (via backspace). OTOH,
10168 input-decode-map doesn't need to go through it again. */
10169 fkey.start = fkey.end = 0;
10170 keytran.start = keytran.end = 0;
025ae953 10171 shift_translated = 1;
21ec2c43 10172
3fe8e9a2 10173 goto replay_sequence;
ef8fd672
RS
10174 }
10175 }
284f4730 10176 }
309b0fc8 10177 if (!dummyflag)
bc536d84
RS
10178 read_key_sequence_cmd = (first_binding < nmaps
10179 ? defs[first_binding]
10180 : Qnil);
284f4730 10181
cd21b839 10182 unread_switch_frame = delayed_switch_frame;
f4255cd1 10183 unbind_to (count, Qnil);
07f76a14 10184
3fe8e9a2
RS
10185 /* Don't downcase the last character if the caller says don't.
10186 Don't downcase it if the result is undefined, either. */
10187 if ((dont_downcase_last || first_binding >= nmaps)
a53fe666 10188 && t > 0
3fe8e9a2 10189 && t - 1 == original_uppercase_position)
025ae953
CY
10190 {
10191 keybuf[t - 1] = original_uppercase;
10192 shift_translated = 0;
10193 }
10194
10195 if (shift_translated)
10196 Vthis_command_keys_shift_translated = Qt;
309b0fc8 10197
07f76a14
JB
10198 /* Occasionally we fabricate events, perhaps by expanding something
10199 according to function-key-map, or by adding a prefix symbol to a
10200 mouse click in the scroll bar or modeline. In this cases, return
10201 the entire generated key sequence, even if we hit an unbound
10202 prefix or a definition before the end. This means that you will
10203 be able to push back the event properly, and also means that
10204 read-key-sequence will always return a logical unit.
10205
10206 Better ideas? */
cca310da
JB
10207 for (; t < mock_input; t++)
10208 {
f2647d04
DL
10209 if ((FLOATP (Vecho_keystrokes) || INTEGERP (Vecho_keystrokes))
10210 && NILP (Fzerop (Vecho_keystrokes)))
a98ea3f9 10211 echo_char (keybuf[t]);
cca310da
JB
10212 add_command_key (keybuf[t]);
10213 }
07f76a14 10214
2dc00208 10215 UNGCPRO;
284f4730
JB
10216 return t;
10217}
10218
d5eecefb 10219DEFUN ("read-key-sequence", Fread_key_sequence, Sread_key_sequence, 1, 5, 0,
4707d2d0
PJ
10220 doc: /* Read a sequence of keystrokes and return as a string or vector.
10221The sequence is sufficient to specify a non-prefix command in the
10222current local and global maps.
10223
10224First arg PROMPT is a prompt string. If nil, do not prompt specially.
10225Second (optional) arg CONTINUE-ECHO, if non-nil, means this key echos
10226as a continuation of the previous key.
10227
10228The third (optional) arg DONT-DOWNCASE-LAST, if non-nil, means do not
10229convert the last event to lower case. (Normally any upper case event
10230is converted to lower case if the original event is undefined and the lower
10231case equivalent is defined.) A non-nil value is appropriate for reading
10232a key sequence to be defined.
10233
10234A C-g typed while in this function is treated like any other character,
10235and `quit-flag' is not set.
10236
10237If the key sequence starts with a mouse click, then the sequence is read
10238using the keymaps of the buffer of the window clicked in, not the buffer
10239of the selected window as normal.
10240
10241`read-key-sequence' drops unbound button-down events, since you normally
10242only care about the click or drag events which follow them. If a drag
10243or multi-click event is unbound, but the corresponding click event would
10244be bound, `read-key-sequence' turns the event into a click event at the
10245drag's starting position. This means that you don't have to distinguish
10246between click and drag, double, or triple events unless you want to.
10247
10248`read-key-sequence' prefixes mouse events on mode lines, the vertical
10249lines separating windows, and scroll bars with imaginary keys
10250`mode-line', `vertical-line', and `vertical-scroll-bar'.
10251
10252Optional fourth argument CAN-RETURN-SWITCH-FRAME non-nil means that this
10253function will process a switch-frame event if the user switches frames
10254before typing anything. If the user switches frames in the middle of a
10255key sequence, or at the start of the sequence but CAN-RETURN-SWITCH-FRAME
10256is nil, then the event will be put off until after the current key sequence.
10257
10258`read-key-sequence' checks `function-key-map' for function key
10259sequences, where they wouldn't conflict with ordinary bindings. See
10260`function-key-map' for more details.
10261
10262The optional fifth argument COMMAND-LOOP, if non-nil, means
10263that this key sequence is being read by something that will
10264read commands one after another. It should be nil if the caller
10265will read just one key sequence. */)
d5eecefb
RS
10266 (prompt, continue_echo, dont_downcase_last, can_return_switch_frame,
10267 command_loop)
309b0fc8 10268 Lisp_Object prompt, continue_echo, dont_downcase_last;
d5eecefb 10269 Lisp_Object can_return_switch_frame, command_loop;
284f4730
JB
10270{
10271 Lisp_Object keybuf[30];
10272 register int i;
03cee6ae 10273 struct gcpro gcpro1;
aed13378 10274 int count = SPECPDL_INDEX ();
284f4730
JB
10275
10276 if (!NILP (prompt))
b7826503 10277 CHECK_STRING (prompt);
284f4730
JB
10278 QUIT;
10279
d5eecefb
RS
10280 specbind (Qinput_method_exit_on_first_char,
10281 (NILP (command_loop) ? Qt : Qnil));
10282 specbind (Qinput_method_use_echo_area,
10283 (NILP (command_loop) ? Qt : Qnil));
10284
284f4730
JB
10285 bzero (keybuf, sizeof keybuf);
10286 GCPRO1 (keybuf[0]);
10287 gcpro1.nvars = (sizeof keybuf/sizeof (keybuf[0]));
10288
daa37602 10289 if (NILP (continue_echo))
6321824f
RS
10290 {
10291 this_command_key_count = 0;
63020c46 10292 this_command_key_count_reset = 0;
6321824f
RS
10293 this_single_command_key_start = 0;
10294 }
c0a58692 10295
d148e14d 10296#ifdef HAVE_WINDOW_SYSTEM
526a058f
GM
10297 if (display_hourglass_p)
10298 cancel_hourglass ();
d0c48478
GM
10299#endif
10300
309b0fc8 10301 i = read_key_sequence (keybuf, (sizeof keybuf/sizeof (keybuf[0])),
ce98e608 10302 prompt, ! NILP (dont_downcase_last),
f571ae0d 10303 ! NILP (can_return_switch_frame), 0);
284f4730 10304
ae18aa3b 10305#if 0 /* The following is fine for code reading a key sequence and
f95c4fe5 10306 then proceeding with a lenghty computation, but it's not good
ae18aa3b 10307 for code reading keys in a loop, like an input method. */
d148e14d 10308#ifdef HAVE_WINDOW_SYSTEM
526a058f
GM
10309 if (display_hourglass_p)
10310 start_hourglass ();
ae18aa3b 10311#endif
d0c48478
GM
10312#endif
10313
dcc408a0
RS
10314 if (i == -1)
10315 {
10316 Vquit_flag = Qt;
10317 QUIT;
10318 }
284f4730 10319 UNGCPRO;
d5eecefb 10320 return unbind_to (count, make_event_array (i, keybuf));
284f4730 10321}
e39da3d7
RS
10322
10323DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,
d5eecefb 10324 Sread_key_sequence_vector, 1, 5, 0,
4707d2d0
PJ
10325 doc: /* Like `read-key-sequence' but always return a vector. */)
10326 (prompt, continue_echo, dont_downcase_last, can_return_switch_frame,
10327 command_loop)
e39da3d7 10328 Lisp_Object prompt, continue_echo, dont_downcase_last;
d5eecefb 10329 Lisp_Object can_return_switch_frame, command_loop;
e39da3d7
RS
10330{
10331 Lisp_Object keybuf[30];
10332 register int i;
03cee6ae 10333 struct gcpro gcpro1;
aed13378 10334 int count = SPECPDL_INDEX ();
e39da3d7
RS
10335
10336 if (!NILP (prompt))
b7826503 10337 CHECK_STRING (prompt);
e39da3d7
RS
10338 QUIT;
10339
d5eecefb
RS
10340 specbind (Qinput_method_exit_on_first_char,
10341 (NILP (command_loop) ? Qt : Qnil));
10342 specbind (Qinput_method_use_echo_area,
10343 (NILP (command_loop) ? Qt : Qnil));
10344
e39da3d7
RS
10345 bzero (keybuf, sizeof keybuf);
10346 GCPRO1 (keybuf[0]);
10347 gcpro1.nvars = (sizeof keybuf/sizeof (keybuf[0]));
10348
10349 if (NILP (continue_echo))
10350 {
10351 this_command_key_count = 0;
63020c46 10352 this_command_key_count_reset = 0;
e39da3d7
RS
10353 this_single_command_key_start = 0;
10354 }
10355
d148e14d 10356#ifdef HAVE_WINDOW_SYSTEM
526a058f
GM
10357 if (display_hourglass_p)
10358 cancel_hourglass ();
d0c48478
GM
10359#endif
10360
e39da3d7
RS
10361 i = read_key_sequence (keybuf, (sizeof keybuf/sizeof (keybuf[0])),
10362 prompt, ! NILP (dont_downcase_last),
10363 ! NILP (can_return_switch_frame), 0);
10364
d148e14d 10365#ifdef HAVE_WINDOW_SYSTEM
526a058f
GM
10366 if (display_hourglass_p)
10367 start_hourglass ();
d0c48478
GM
10368#endif
10369
e39da3d7
RS
10370 if (i == -1)
10371 {
10372 Vquit_flag = Qt;
10373 QUIT;
10374 }
10375 UNGCPRO;
d5eecefb 10376 return unbind_to (count, Fvector (i, keybuf));
e39da3d7 10377}
284f4730 10378\f
158f7532 10379DEFUN ("command-execute", Fcommand_execute, Scommand_execute, 1, 4, 0,
4707d2d0
PJ
10380 doc: /* Execute CMD as an editor command.
10381CMD must be a symbol that satisfies the `commandp' predicate.
10382Optional second arg RECORD-FLAG non-nil
10383means unconditionally put this command in `command-history'.
10384Otherwise, that is done only if an arg is read using the minibuffer.
10385The argument KEYS specifies the value to use instead of (this-command-keys)
10386when reading the arguments; if it is nil, (this-command-keys) is used.
10387The argument SPECIAL, if non-nil, means that this command is executing
10388a special event, so ignore the prefix argument and don't clear it. */)
158f7532
RS
10389 (cmd, record_flag, keys, special)
10390 Lisp_Object cmd, record_flag, keys, special;
284f4730
JB
10391{
10392 register Lisp_Object final;
10393 register Lisp_Object tem;
10394 Lisp_Object prefixarg;
284f4730
JB
10395 extern int debug_on_next_call;
10396
284f4730
JB
10397 debug_on_next_call = 0;
10398
158f7532
RS
10399 if (NILP (special))
10400 {
10401 prefixarg = current_kboard->Vprefix_arg;
10402 Vcurrent_prefix_arg = prefixarg;
10403 current_kboard->Vprefix_arg = Qnil;
10404 }
10405 else
10406 prefixarg = Qnil;
10407
8c18cbfb 10408 if (SYMBOLP (cmd))
284f4730
JB
10409 {
10410 tem = Fget (cmd, Qdisabled);
88ce066e 10411 if (!NILP (tem) && !NILP (Vrun_hooks))
b78ce8fb 10412 {
971e4c98 10413 tem = Fsymbol_value (Qdisabled_command_function);
b78ce8fb 10414 if (!NILP (tem))
971e4c98 10415 return call1 (Vrun_hooks, Qdisabled_command_function);
b78ce8fb 10416 }
284f4730
JB
10417 }
10418
01e26217 10419 while (1)
284f4730 10420 {
a7f96a35 10421 final = Findirect_function (cmd, Qnil);
284f4730
JB
10422
10423 if (CONSP (final) && (tem = Fcar (final), EQ (tem, Qautoload)))
b516a185
RS
10424 {
10425 struct gcpro gcpro1, gcpro2;
10426
10427 GCPRO2 (cmd, prefixarg);
10428 do_autoload (final, cmd);
10429 UNGCPRO;
10430 }
284f4730
JB
10431 else
10432 break;
10433 }
10434
8c18cbfb 10435 if (STRINGP (final) || VECTORP (final))
284f4730
JB
10436 {
10437 /* If requested, place the macro in the command history. For
10438 other sorts of commands, call-interactively takes care of
10439 this. */
e57d8fd8 10440 if (!NILP (record_flag))
f4385381
RS
10441 {
10442 Vcommand_history
10443 = Fcons (Fcons (Qexecute_kbd_macro,
10444 Fcons (final, Fcons (prefixarg, Qnil))),
10445 Vcommand_history);
10446
10447 /* Don't keep command history around forever. */
10448 if (NUMBERP (Vhistory_length) && XINT (Vhistory_length) > 0)
10449 {
10450 tem = Fnthcdr (Vhistory_length, Vcommand_history);
10451 if (CONSP (tem))
f3fbd155 10452 XSETCDR (tem, Qnil);
f4385381
RS
10453 }
10454 }
284f4730 10455
caa06051 10456 return Fexecute_kbd_macro (final, prefixarg, Qnil);
284f4730 10457 }
f4385381 10458
8c18cbfb 10459 if (CONSP (final) || SUBRP (final) || COMPILEDP (final))
6d0867e5
SM
10460 /* Don't call Fcall_interactively directly because we want to make
10461 sure the backtrace has an entry for `call-interactively'.
10462 For the same reason, pass `cmd' rather than `final'. */
10463 return call3 (Qcall_interactively, cmd, record_flag, keys);
284f4730 10464
284f4730
JB
10465 return Qnil;
10466}
c970a760
GM
10467
10468
284f4730 10469\f
284f4730 10470DEFUN ("execute-extended-command", Fexecute_extended_command, Sexecute_extended_command,
4707d2d0 10471 1, 1, "P",
dfb4bff5
EZ
10472 doc: /* Read function name, then read its arguments and call it.
10473
10474To pass a numeric argument to the command you are invoking with, specify
10475the numeric argument to this command.
10476
10477Noninteractively, the argument PREFIXARG is the prefix argument to
10478give to the command you invoke, if it asks for an argument. */)
4707d2d0 10479 (prefixarg)
284f4730
JB
10480 Lisp_Object prefixarg;
10481{
10482 Lisp_Object function;
10483 char buf[40];
2e1a49ad
SM
10484 int saved_last_point_position;
10485 Lisp_Object saved_keys, saved_last_point_position_buffer;
5434fce6 10486 Lisp_Object bindings, value;
2e1a49ad 10487 struct gcpro gcpro1, gcpro2, gcpro3;
d148e14d 10488#ifdef HAVE_WINDOW_SYSTEM
a25e44b2
JD
10489 /* The call to Fcompleting_read wil start and cancel the hourglass,
10490 but if the hourglass was already scheduled, this means that no
10491 hourglass will be shown for the actual M-x command itself.
10492 So we restart it if it is already scheduled. Note that checking
10493 hourglass_shown_p is not enough, normally the hourglass is not shown,
10494 just scheduled to be shown. */
10495 int hstarted = hourglass_started ();
10496#endif
284f4730 10497
b0f2a7bf
KH
10498 saved_keys = Fvector (this_command_key_count,
10499 XVECTOR (this_command_keys)->contents);
2e1a49ad
SM
10500 saved_last_point_position_buffer = last_point_position_buffer;
10501 saved_last_point_position = last_point_position;
284f4730 10502 buf[0] = 0;
2e1a49ad 10503 GCPRO3 (saved_keys, prefixarg, saved_last_point_position_buffer);
284f4730
JB
10504
10505 if (EQ (prefixarg, Qminus))
10506 strcpy (buf, "- ");
7539e11f 10507 else if (CONSP (prefixarg) && XINT (XCAR (prefixarg)) == 4)
284f4730 10508 strcpy (buf, "C-u ");
7539e11f 10509 else if (CONSP (prefixarg) && INTEGERP (XCAR (prefixarg)))
cea5d0d4 10510 sprintf (buf, "%ld ", (long) XINT (XCAR (prefixarg)));
8c18cbfb 10511 else if (INTEGERP (prefixarg))
cea5d0d4 10512 sprintf (buf, "%ld ", (long) XINT (prefixarg));
284f4730
JB
10513
10514 /* This isn't strictly correct if execute-extended-command
10515 is bound to anything else. Perhaps it should use
10516 this_command_keys? */
10517 strcat (buf, "M-x ");
10518
10519 /* Prompt with buf, and then read a string, completing from and
10520 restricting to the set of all defined commands. Don't provide
51763820 10521 any initial input. Save the command read on the extended-command
03b4122a 10522 history list. */
284f4730
JB
10523 function = Fcompleting_read (build_string (buf),
10524 Vobarray, Qcommandp,
4328577a
KH
10525 Qt, Qnil, Qextended_command_history, Qnil,
10526 Qnil);
284f4730 10527
d148e14d 10528#ifdef HAVE_WINDOW_SYSTEM
a25e44b2
JD
10529 if (hstarted) start_hourglass ();
10530#endif
10531
d5db4077 10532 if (STRINGP (function) && SCHARS (function) == 0)
1f5b1641
RS
10533 error ("No command name given");
10534
1113d9db
JB
10535 /* Set this_command_keys to the concatenation of saved_keys and
10536 function, followed by a RET. */
284f4730 10537 {
b0f2a7bf 10538 Lisp_Object *keys;
284f4730 10539 int i;
284f4730 10540
1113d9db 10541 this_command_key_count = 0;
63020c46 10542 this_command_key_count_reset = 0;
6321824f 10543 this_single_command_key_start = 0;
1113d9db 10544
b0f2a7bf
KH
10545 keys = XVECTOR (saved_keys)->contents;
10546 for (i = 0; i < XVECTOR (saved_keys)->size; i++)
10547 add_command_key (keys[i]);
1113d9db 10548
1b049b51 10549 for (i = 0; i < SCHARS (function); i++)
301738ed 10550 add_command_key (Faref (function, make_number (i)));
1113d9db 10551
301738ed 10552 add_command_key (make_number ('\015'));
284f4730
JB
10553 }
10554
2e1a49ad
SM
10555 last_point_position = saved_last_point_position;
10556 last_point_position_buffer = saved_last_point_position_buffer;
10557
284f4730
JB
10558 UNGCPRO;
10559
0a7f1fc0 10560 function = Fintern (function, Qnil);
d8bcf58e 10561 current_kboard->Vprefix_arg = prefixarg;
d5eecefb
RS
10562 Vthis_command = function;
10563 real_this_command = function;
284f4730 10564
6526ab49
RS
10565 /* If enabled, show which key runs this command. */
10566 if (!NILP (Vsuggest_key_bindings)
ce0d2858 10567 && NILP (Vexecuting_kbd_macro)
6526ab49 10568 && SYMBOLP (function))
5434fce6 10569 bindings = Fwhere_is_internal (function, Voverriding_local_map,
8b9940e6 10570 Qt, Qnil, Qnil);
5434fce6
RS
10571 else
10572 bindings = Qnil;
6526ab49 10573
5434fce6 10574 value = Qnil;
6d0867e5 10575 GCPRO3 (bindings, value, function);
5434fce6 10576 value = Fcommand_execute (function, Qt, Qnil, Qnil);
6526ab49 10577
5434fce6 10578 /* If the command has a key binding, print it now. */
3ababa60 10579 if (!NILP (bindings)
ee112567
KH
10580 && ! (VECTORP (bindings) && EQ (Faref (bindings, make_number (0)),
10581 Qmouse_movement)))
5434fce6
RS
10582 {
10583 /* But first wait, and skip the message if there is input. */
7ba07a1a
CY
10584 Lisp_Object waited;
10585
666dc232
KS
10586 /* If this command displayed something in the echo area;
10587 wait a few seconds, then display our suggestion message. */
10588 if (NILP (echo_area_buffer[0]))
10589 waited = sit_for (make_number (0), 0, 2);
10590 else if (NUMBERP (Vsuggest_key_bindings))
2bcac766 10591 waited = sit_for (Vsuggest_key_bindings, 0, 2);
426939cc 10592 else
666dc232 10593 waited = sit_for (make_number (2), 0, 2);
426939cc 10594
7ba07a1a 10595 if (!NILP (waited) && ! CONSP (Vunread_command_events))
6526ab49 10596 {
5434fce6
RS
10597 Lisp_Object binding;
10598 char *newmessage;
985f9f66 10599 int message_p = push_message ();
331379bf 10600 int count = SPECPDL_INDEX ();
5434fce6 10601
65efd7da 10602 record_unwind_protect (pop_message_unwind, Qnil);
a1bfe073 10603 binding = Fkey_description (bindings, Qnil);
5434fce6
RS
10604
10605 newmessage
d5db4077
KR
10606 = (char *) alloca (SCHARS (SYMBOL_NAME (function))
10607 + SBYTES (binding)
5434fce6 10608 + 100);
3ababa60 10609 sprintf (newmessage, "You can run the command `%s' with %s",
d5db4077
KR
10610 SDATA (SYMBOL_NAME (function)),
10611 SDATA (binding));
301738ed
RS
10612 message2_nolog (newmessage,
10613 strlen (newmessage),
10614 STRING_MULTIBYTE (binding));
7ba07a1a 10615 if (NUMBERP (Vsuggest_key_bindings))
666dc232 10616 waited = sit_for (Vsuggest_key_bindings, 0, 2);
7ba07a1a 10617 else
666dc232 10618 waited = sit_for (make_number (2), 0, 2);
7ba07a1a
CY
10619
10620 if (!NILP (waited) && message_p)
985f9f66
GM
10621 restore_message ();
10622
c970a760 10623 unbind_to (count, Qnil);
6526ab49
RS
10624 }
10625 }
10626
5434fce6 10627 RETURN_UNGCPRO (value);
284f4730 10628}
6526ab49 10629
284f4730 10630\f
d9d4c147 10631/* Return nonzero if input events are pending. */
284f4730 10632
dfcf069d 10633int
284f4730
JB
10634detect_input_pending ()
10635{
10636 if (!input_pending)
d9d4c147
KH
10637 get_input_pending (&input_pending, 0);
10638
10639 return input_pending;
10640}
10641
a2d5fca0
JD
10642/* Return nonzero if input events other than mouse movements are
10643 pending. */
10644
10645int
10646detect_input_pending_ignore_squeezables ()
10647{
10648 if (!input_pending)
10649 get_input_pending (&input_pending, READABLE_EVENTS_IGNORE_SQUEEZABLES);
10650
10651 return input_pending;
10652}
10653
b1878f45 10654/* Return nonzero if input events are pending, and run any pending timers. */
d9d4c147 10655
dfcf069d 10656int
87dd9b9b
RS
10657detect_input_pending_run_timers (do_display)
10658 int do_display;
d9d4c147 10659{
87dd9b9b
RS
10660 int old_timers_run = timers_run;
10661
d9d4c147 10662 if (!input_pending)
a2d5fca0 10663 get_input_pending (&input_pending, READABLE_EVENTS_DO_TIMERS_NOW);
284f4730 10664
87dd9b9b 10665 if (old_timers_run != timers_run && do_display)
7ee32cda 10666 {
3007ebfb 10667 redisplay_preserve_echo_area (8);
7ee32cda
GM
10668 /* The following fixes a bug when using lazy-lock with
10669 lazy-lock-defer-on-the-fly set to t, i.e. when fontifying
10670 from an idle timer function. The symptom of the bug is that
10671 the cursor sometimes doesn't become visible until the next X
10672 event is processed. --gerd. */
fa971ac3
KL
10673 {
10674 Lisp_Object tail, frame;
10675 FOR_EACH_FRAME (tail, frame)
10676 if (FRAME_RIF (XFRAME (frame)))
10677 FRAME_RIF (XFRAME (frame))->flush_display (XFRAME (frame));
10678 }
7ee32cda 10679 }
87dd9b9b 10680
284f4730
JB
10681 return input_pending;
10682}
10683
ffd56f97
JB
10684/* This is called in some cases before a possible quit.
10685 It cases the next call to detect_input_pending to recompute input_pending.
10686 So calling this function unnecessarily can't do any harm. */
07a59269
KH
10687
10688void
ffd56f97
JB
10689clear_input_pending ()
10690{
10691 input_pending = 0;
10692}
10693
b1878f45 10694/* Return nonzero if there are pending requeued events.
d64b707c 10695 This isn't used yet. The hope is to make wait_reading_process_output
27fd22dc 10696 call it, and return if it runs Lisp code that unreads something.
b1878f45
RS
10697 The problem is, kbd_buffer_get_event needs to be fixed to know what
10698 to do in that case. It isn't trivial. */
10699
dfcf069d 10700int
b1878f45
RS
10701requeued_events_pending_p ()
10702{
10703 return (!NILP (Vunread_command_events) || unread_command_char != -1);
10704}
10705
10706
284f4730 10707DEFUN ("input-pending-p", Finput_pending_p, Sinput_pending_p, 0, 0, 0,
a064684d
RS
10708 doc: /* Return t if command input is currently available with no wait.
10709Actually, the value is nil only if we can be sure that no input is available;
10710if there is a doubt, the value is t. */)
4707d2d0 10711 ()
284f4730 10712{
182f67de
KS
10713 if (!NILP (Vunread_command_events) || unread_command_char != -1
10714 || !NILP (Vunread_post_input_method_events)
10715 || !NILP (Vunread_input_method_events))
284f4730
JB
10716 return (Qt);
10717
a2d5fca0
JD
10718 get_input_pending (&input_pending,
10719 READABLE_EVENTS_DO_TIMERS_NOW
10720 | READABLE_EVENTS_FILTER_EVENTS);
d9d4c147 10721 return input_pending > 0 ? Qt : Qnil;
284f4730
JB
10722}
10723
10724DEFUN ("recent-keys", Frecent_keys, Srecent_keys, 0, 0, 0,
0721f230 10725 doc: /* Return vector of last 300 events, not counting those from keyboard macros. */)
4707d2d0 10726 ()
284f4730 10727{
5160df46 10728 Lisp_Object *keys = XVECTOR (recent_keys)->contents;
284f4730
JB
10729 Lisp_Object val;
10730
10731 if (total_keys < NUM_RECENT_KEYS)
5160df46 10732 return Fvector (total_keys, keys);
284f4730
JB
10733 else
10734 {
5160df46
JB
10735 val = Fvector (NUM_RECENT_KEYS, keys);
10736 bcopy (keys + recent_keys_index,
284f4730
JB
10737 XVECTOR (val)->contents,
10738 (NUM_RECENT_KEYS - recent_keys_index) * sizeof (Lisp_Object));
5160df46 10739 bcopy (keys,
284f4730
JB
10740 XVECTOR (val)->contents + NUM_RECENT_KEYS - recent_keys_index,
10741 recent_keys_index * sizeof (Lisp_Object));
10742 return val;
10743 }
10744}
10745
10746DEFUN ("this-command-keys", Fthis_command_keys, Sthis_command_keys, 0, 0, 0,
4707d2d0 10747 doc: /* Return the key sequence that invoked this command.
92501652 10748However, if the command has called `read-key-sequence', it returns
4052e7bb 10749the last key sequence that has been read.
65849ada
EZ
10750The value is a string or a vector.
10751
10752See also `this-command-keys-vector'. */)
4707d2d0 10753 ()
284f4730 10754{
86e5706b
RS
10755 return make_event_array (this_command_key_count,
10756 XVECTOR (this_command_keys)->contents);
284f4730
JB
10757}
10758
e39da3d7 10759DEFUN ("this-command-keys-vector", Fthis_command_keys_vector, Sthis_command_keys_vector, 0, 0, 0,
92501652
RS
10760 doc: /* Return the key sequence that invoked this command, as a vector.
10761However, if the command has called `read-key-sequence', it returns
65849ada
EZ
10762the last key sequence that has been read.
10763
10764See also `this-command-keys'. */)
4707d2d0 10765 ()
e39da3d7
RS
10766{
10767 return Fvector (this_command_key_count,
10768 XVECTOR (this_command_keys)->contents);
10769}
10770
6321824f
RS
10771DEFUN ("this-single-command-keys", Fthis_single_command_keys,
10772 Sthis_single_command_keys, 0, 0, 0,
4707d2d0 10773 doc: /* Return the key sequence that invoked this command.
92501652
RS
10774More generally, it returns the last key sequence read, either by
10775the command loop or by `read-key-sequence'.
4707d2d0
PJ
10776Unlike `this-command-keys', this function's value
10777does not include prefix arguments.
10778The value is always a vector. */)
10779 ()
6321824f 10780{
e39da3d7
RS
10781 return Fvector (this_command_key_count
10782 - this_single_command_key_start,
10783 (XVECTOR (this_command_keys)->contents
10784 + this_single_command_key_start));
6321824f
RS
10785}
10786
7d18f9ae
RS
10787DEFUN ("this-single-command-raw-keys", Fthis_single_command_raw_keys,
10788 Sthis_single_command_raw_keys, 0, 0, 0,
4707d2d0 10789 doc: /* Return the raw events that were read for this command.
92501652
RS
10790More generally, it returns the last key sequence read, either by
10791the command loop or by `read-key-sequence'.
4707d2d0
PJ
10792Unlike `this-single-command-keys', this function's value
10793shows the events before all translations (except for input methods).
10794The value is always a vector. */)
10795 ()
7d18f9ae
RS
10796{
10797 return Fvector (raw_keybuf_count,
10798 (XVECTOR (raw_keybuf)->contents));
10799}
10800
71918b75 10801DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,
4707d2d0 10802 Sreset_this_command_lengths, 0, 0, 0,
63020c46
RS
10803 doc: /* Make the unread events replace the last command and echo.
10804Used in `universal-argument-other-key'.
4707d2d0
PJ
10805
10806`universal-argument-other-key' rereads the event just typed.
10807It then gets translated through `function-key-map'.
63020c46
RS
10808The translated event has to replace the real events,
10809both in the value of (this-command-keys) and in echoing.
10810To achieve this, `universal-argument-other-key' calls
10811`reset-this-command-lengths', which discards the record of reading
10812these events the first time. */)
4707d2d0 10813 ()
71918b75 10814{
22b94eeb
RS
10815 this_command_key_count = before_command_key_count;
10816 if (this_command_key_count < this_single_command_key_start)
10817 this_single_command_key_start = this_command_key_count;
63020c46 10818
22b94eeb
RS
10819 echo_truncate (before_command_echo_length);
10820
63020c46
RS
10821 /* Cause whatever we put into unread-command-events
10822 to echo as if it were being freshly read from the keyboard. */
10823 this_command_key_count_reset = 1;
10824
6e5742a0 10825 return Qnil;
71918b75
RS
10826}
10827
82e6e5af 10828DEFUN ("clear-this-command-keys", Fclear_this_command_keys,
ab1959fc 10829 Sclear_this_command_keys, 0, 1, 0,
4707d2d0 10830 doc: /* Clear out the vector that `this-command-keys' returns.
ab1959fc
KS
10831Also clear the record of the last 100 events, unless optional arg
10832KEEP-RECORD is non-nil. */)
10833 (keep_record)
10834 Lisp_Object keep_record;
82e6e5af 10835{
fb0dde6c 10836 int i;
c60ee5e7 10837
82e6e5af 10838 this_command_key_count = 0;
63020c46 10839 this_command_key_count_reset = 0;
fb0dde6c 10840
ab1959fc
KS
10841 if (NILP (keep_record))
10842 {
10843 for (i = 0; i < XVECTOR (recent_keys)->size; ++i)
10844 XVECTOR (recent_keys)->contents[i] = Qnil;
10845 total_keys = 0;
10846 recent_keys_index = 0;
10847 }
82e6e5af
RS
10848 return Qnil;
10849}
10850
284f4730 10851DEFUN ("recursion-depth", Frecursion_depth, Srecursion_depth, 0, 0, 0,
4707d2d0
PJ
10852 doc: /* Return the current depth in recursive edits. */)
10853 ()
284f4730
JB
10854{
10855 Lisp_Object temp;
bb9e9bed 10856 XSETFASTINT (temp, command_loop_level + minibuf_level);
284f4730
JB
10857 return temp;
10858}
10859
10860DEFUN ("open-dribble-file", Fopen_dribble_file, Sopen_dribble_file, 1, 1,
4707d2d0
PJ
10861 "FOpen dribble file: ",
10862 doc: /* Start writing all keyboard characters to a dribble file called FILE.
10863If FILE is nil, close any open dribble file. */)
10864 (file)
284f4730
JB
10865 Lisp_Object file;
10866{
6cb52def 10867 if (dribble)
284f4730 10868 {
34f5c10f 10869 BLOCK_INPUT;
6cb52def 10870 fclose (dribble);
34f5c10f 10871 UNBLOCK_INPUT;
6cb52def 10872 dribble = 0;
284f4730 10873 }
6cb52def 10874 if (!NILP (file))
284f4730
JB
10875 {
10876 file = Fexpand_file_name (file, Qnil);
d5db4077 10877 dribble = fopen (SDATA (file), "w");
ab6ca1de
KH
10878 if (dribble == 0)
10879 report_file_error ("Opening dribble", Fcons (file, Qnil));
284f4730
JB
10880 }
10881 return Qnil;
10882}
10883
10884DEFUN ("discard-input", Fdiscard_input, Sdiscard_input, 0, 0, 0,
4707d2d0 10885 doc: /* Discard the contents of the terminal input buffer.
2b17d5ed 10886Also end any kbd macro being defined. */)
4707d2d0 10887 ()
284f4730 10888{
2b17d5ed
KS
10889 if (!NILP (current_kboard->defining_kbd_macro))
10890 {
10891 /* Discard the last command from the macro. */
10892 Fcancel_kbd_macro_events ();
10893 end_kbd_macro ();
10894 }
10895
284f4730
JB
10896 update_mode_lines++;
10897
24597608 10898 Vunread_command_events = Qnil;
86e5706b 10899 unread_command_char = -1;
284f4730
JB
10900
10901 discard_tty_input ();
10902
7ee32cda 10903 kbd_fetch_ptr = kbd_store_ptr;
284f4730
JB
10904 input_pending = 0;
10905
10906 return Qnil;
10907}
10908\f
10909DEFUN ("suspend-emacs", Fsuspend_emacs, Ssuspend_emacs, 0, 1, "",
4707d2d0
PJ
10910 doc: /* Stop Emacs and return to superior process. You can resume later.
10911If `cannot-suspend' is non-nil, or if the system doesn't support job
10912control, run a subshell instead.
10913
10914If optional arg STUFFSTRING is non-nil, its characters are stuffed
10915to be read as terminal input by Emacs's parent, after suspension.
10916
10917Before suspending, run the normal hook `suspend-hook'.
10918After resumption run the normal hook `suspend-resume-hook'.
10919
10920Some operating systems cannot stop the Emacs process and resume it later.
10921On such systems, Emacs starts a subshell instead of suspending. */)
10922 (stuffstring)
284f4730
JB
10923 Lisp_Object stuffstring;
10924{
aed13378 10925 int count = SPECPDL_INDEX ();
284f4730
JB
10926 int old_height, old_width;
10927 int width, height;
03cee6ae 10928 struct gcpro gcpro1;
284f4730 10929
9628b887 10930 if (tty_list && tty_list->next)
4a933ef8 10931 error ("There are other tty frames open; close them before suspending Emacs");
3b7fbceb 10932
284f4730 10933 if (!NILP (stuffstring))
b7826503 10934 CHECK_STRING (stuffstring);
284f4730 10935
1e95ed28
JB
10936 /* Run the functions in suspend-hook. */
10937 if (!NILP (Vrun_hooks))
10938 call1 (Vrun_hooks, intern ("suspend-hook"));
284f4730 10939
b7d2ebbf 10940 GCPRO1 (stuffstring);
0b0d3e0b 10941 get_tty_size (fileno (CURTTY ()->input), &old_width, &old_height);
28d440ab 10942 reset_all_sys_modes ();
284f4730
JB
10943 /* sys_suspend can get an error if it tries to fork a subshell
10944 and the system resources aren't available for that. */
017bbc62 10945 record_unwind_protect ((Lisp_Object (*) P_ ((Lisp_Object))) init_all_sys_modes,
d52a7a92 10946 Qnil);
284f4730 10947 stuff_buffered_input (stuffstring);
8026024c
KH
10948 if (cannot_suspend)
10949 sys_subshell ();
10950 else
10951 sys_suspend ();
284f4730
JB
10952 unbind_to (count, Qnil);
10953
10954 /* Check if terminal/window size has changed.
10955 Note that this is not useful when we are running directly
10956 with a window system; but suspend should be disabled in that case. */
0b0d3e0b 10957 get_tty_size (fileno (CURTTY ()->input), &width, &height);
284f4730 10958 if (width != old_width || height != old_height)
788f89eb 10959 change_frame_size (SELECTED_FRAME (), height, width, 0, 0, 0);
284f4730 10960
1e95ed28 10961 /* Run suspend-resume-hook. */
284f4730
JB
10962 if (!NILP (Vrun_hooks))
10963 call1 (Vrun_hooks, intern ("suspend-resume-hook"));
df0f2ba1 10964
284f4730
JB
10965 UNGCPRO;
10966 return Qnil;
10967}
10968
10969/* If STUFFSTRING is a string, stuff its contents as pending terminal input.
eb8c3be9 10970 Then in any case stuff anything Emacs has read ahead and not used. */
284f4730 10971
07a59269 10972void
284f4730
JB
10973stuff_buffered_input (stuffstring)
10974 Lisp_Object stuffstring;
10975{
0c1c1b93 10976#ifdef SIGTSTP /* stuff_char is defined if SIGTSTP. */
612b78ef 10977 register unsigned char *p;
612b78ef 10978
8c18cbfb 10979 if (STRINGP (stuffstring))
284f4730
JB
10980 {
10981 register int count;
10982
d5db4077
KR
10983 p = SDATA (stuffstring);
10984 count = SBYTES (stuffstring);
284f4730
JB
10985 while (count-- > 0)
10986 stuff_char (*p++);
10987 stuff_char ('\n');
10988 }
c60ee5e7 10989
284f4730 10990 /* Anything we have read ahead, put back for the shell to read. */
beecf6a1 10991 /* ?? What should this do when we have multiple keyboards??
0c1c1b93 10992 Should we ignore anything that was typed in at the "wrong" kboard?
26503ad2 10993
0c1c1b93
RS
10994 rms: we should stuff everything back into the kboard
10995 it came from. */
beecf6a1 10996 for (; kbd_fetch_ptr != kbd_store_ptr; kbd_fetch_ptr++)
284f4730 10997 {
c60ee5e7 10998
beecf6a1
KH
10999 if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
11000 kbd_fetch_ptr = kbd_buffer;
3b8f9651 11001 if (kbd_fetch_ptr->kind == ASCII_KEYSTROKE_EVENT)
beecf6a1 11002 stuff_char (kbd_fetch_ptr->code);
c60ee5e7 11003
6b61353c 11004 clear_event (kbd_fetch_ptr);
284f4730 11005 }
c60ee5e7 11006
284f4730 11007 input_pending = 0;
0c1c1b93 11008#endif /* SIGTSTP */
284f4730
JB
11009}
11010\f
dfcf069d 11011void
ffd56f97
JB
11012set_waiting_for_input (time_to_clear)
11013 EMACS_TIME *time_to_clear;
284f4730 11014{
ffd56f97 11015 input_available_clear_time = time_to_clear;
284f4730 11016
114a8b8c 11017 /* Tell handle_interrupt to throw back to read_char, */
284f4730
JB
11018 waiting_for_input = 1;
11019
114a8b8c 11020 /* If handle_interrupt was called before and buffered a C-g,
284f4730
JB
11021 make it run again now, to avoid timing error. */
11022 if (!NILP (Vquit_flag))
11023 quit_throw_to_read_char ();
284f4730
JB
11024}
11025
07a59269 11026void
284f4730
JB
11027clear_waiting_for_input ()
11028{
114a8b8c 11029 /* Tell handle_interrupt not to throw back to read_char, */
284f4730 11030 waiting_for_input = 0;
ffd56f97 11031 input_available_clear_time = 0;
284f4730
JB
11032}
11033
da8e1115 11034/* The SIGINT handler.
284f4730 11035
e72cf5ee
KL
11036 If we have a frame on the controlling tty, we assume that the
11037 SIGINT was generated by C-g, so we call handle_interrupt.
11038 Otherwise, the handler kills Emacs. */
284f4730 11039
14e40288 11040static SIGTYPE
91c049d4
RS
11041interrupt_signal (signalnum) /* If we don't have an argument, */
11042 int signalnum; /* some compilers complain in signal calls. */
284f4730 11043{
284f4730
JB
11044 /* Must preserve main program's value of errno. */
11045 int old_errno = errno;
6ed8eeff 11046 struct terminal *terminal;
284f4730 11047
5970a8cb 11048#if defined (USG) && !defined (POSIX_SIGNALS)
7b00d185
KL
11049 /* USG systems forget handlers when they are used;
11050 must reestablish each time */
11051 signal (SIGINT, interrupt_signal);
11052 signal (SIGQUIT, interrupt_signal);
284f4730
JB
11053#endif /* USG */
11054
333f1b6f 11055 SIGNAL_THREAD_CHECK (signalnum);
e72cf5ee 11056
6ed8eeff 11057 /* See if we have an active terminal on our controlling tty. */
fdf5ebde 11058 terminal = get_named_tty ("/dev/tty");
6ed8eeff 11059 if (!terminal)
3224dac1 11060 {
4ca927b4
KL
11061 /* If there are no frames there, let's pretend that we are a
11062 well-behaving UN*X program and quit. */
b3e6f69c 11063 Fkill_emacs (Qnil);
3224dac1 11064 }
4ca927b4
KL
11065 else
11066 {
11067 /* Otherwise, the SIGINT was probably generated by C-g. */
3b7fbceb 11068
4ca927b4
KL
11069 /* Set internal_last_event_frame to the top frame of the
11070 controlling tty, if we have a frame there. We disable the
11071 interrupt key on secondary ttys, so the SIGINT must have come
11072 from the controlling tty. */
6ed8eeff 11073 internal_last_event_frame = terminal->display_info.tty->top_frame;
4ca927b4
KL
11074
11075 handle_interrupt ();
4ca927b4 11076 }
114a8b8c
KL
11077
11078 errno = old_errno;
11079}
11080
da8e1115 11081/* This routine is called at interrupt level in response to C-g.
3b7fbceb 11082
da8e1115
KL
11083 It is called from the SIGINT handler or kbd_buffer_store_event.
11084
11085 If `waiting_for_input' is non zero, then unless `echoing' is
11086 nonzero, immediately throw back to read_char.
11087
11088 Otherwise it sets the Lisp variable quit-flag not-nil. This causes
11089 eval to throw, when it gets a chance. If quit-flag is already
11090 non-nil, it stops the job right away. */
114a8b8c 11091
114a8b8c
KL
11092static void
11093handle_interrupt ()
11094{
3b7fbceb 11095 char c;
114a8b8c 11096
284f4730
JB
11097 cancel_echoing ();
11098
3224dac1 11099 /* XXX This code needs to be revised for multi-tty support. */
d44004c0 11100 if (!NILP (Vquit_flag) && get_named_tty ("/dev/tty"))
284f4730 11101 {
31e4e97b
EZ
11102 /* If SIGINT isn't blocked, don't let us be interrupted by
11103 another SIGINT, it might be harmful due to non-reentrancy
11104 in I/O functions. */
11105 sigblock (sigmask (SIGINT));
11106
284f4730 11107 fflush (stdout);
28d440ab 11108 reset_all_sys_modes ();
31e4e97b 11109
284f4730
JB
11110#ifdef SIGTSTP /* Support possible in later USG versions */
11111/*
11112 * On systems which can suspend the current process and return to the original
11113 * shell, this command causes the user to end up back at the shell.
11114 * The "Auto-save" and "Abort" questions are not asked until
11115 * the user elects to return to emacs, at which point he can save the current
11116 * job and either dump core or continue.
11117 */
11118 sys_suspend ();
11119#else
284f4730
JB
11120 /* Perhaps should really fork an inferior shell?
11121 But that would not provide any way to get back
11122 to the original shell, ever. */
11123 printf ("No support for stopping a process on this operating system;\n");
11124 printf ("you can continue or abort.\n");
284f4730 11125#endif /* not SIGTSTP */
80e4aa30
RS
11126#ifdef MSDOS
11127 /* We must remain inside the screen area when the internal terminal
11128 is used. Note that [Enter] is not echoed by dos. */
cb22456d 11129 cursor_to (SELECTED_FRAME (), 0, 0);
80e4aa30 11130#endif
118d6ca9
RS
11131 /* It doesn't work to autosave while GC is in progress;
11132 the code used for auto-saving doesn't cope with the mark bit. */
11133 if (!gc_in_progress)
9fd7d808 11134 {
118d6ca9
RS
11135 printf ("Auto-save? (y or n) ");
11136 fflush (stdout);
11137 if (((c = getchar ()) & ~040) == 'Y')
11138 {
11139 Fdo_auto_save (Qt, Qnil);
80e4aa30 11140#ifdef MSDOS
118d6ca9 11141 printf ("\r\nAuto-save done");
80e4aa30 11142#else /* not MSDOS */
118d6ca9 11143 printf ("Auto-save done\n");
80e4aa30 11144#endif /* not MSDOS */
118d6ca9
RS
11145 }
11146 while (c != '\n') c = getchar ();
9fd7d808 11147 }
c60ee5e7 11148 else
118d6ca9
RS
11149 {
11150 /* During GC, it must be safe to reenable quitting again. */
11151 Vinhibit_quit = Qnil;
11152#ifdef MSDOS
11153 printf ("\r\n");
11154#endif /* not MSDOS */
11155 printf ("Garbage collection in progress; cannot auto-save now\r\n");
11156 printf ("but will instead do a real quit after garbage collection ends\r\n");
11157 fflush (stdout);
11158 }
11159
80e4aa30
RS
11160#ifdef MSDOS
11161 printf ("\r\nAbort? (y or n) ");
11162#else /* not MSDOS */
284f4730 11163 printf ("Abort (and dump core)? (y or n) ");
80e4aa30 11164#endif /* not MSDOS */
284f4730
JB
11165 fflush (stdout);
11166 if (((c = getchar ()) & ~040) == 'Y')
11167 abort ();
11168 while (c != '\n') c = getchar ();
80e4aa30
RS
11169#ifdef MSDOS
11170 printf ("\r\nContinuing...\r\n");
11171#else /* not MSDOS */
284f4730 11172 printf ("Continuing...\n");
80e4aa30 11173#endif /* not MSDOS */
284f4730 11174 fflush (stdout);
28d440ab 11175 init_all_sys_modes ();
31e4e97b 11176 sigfree ();
284f4730
JB
11177 }
11178 else
11179 {
11180 /* If executing a function that wants to be interrupted out of
11181 and the user has not deferred quitting by binding `inhibit-quit'
11182 then quit right away. */
11183 if (immediate_quit && NILP (Vinhibit_quit))
11184 {
e39da3d7
RS
11185 struct gl_state_s saved;
11186 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
11187
284f4730
JB
11188 immediate_quit = 0;
11189 sigfree ();
e39da3d7
RS
11190 saved = gl_state;
11191 GCPRO4 (saved.object, saved.global_code,
11192 saved.current_syntax_table, saved.old_prop);
284f4730 11193 Fsignal (Qquit, Qnil);
e39da3d7
RS
11194 gl_state = saved;
11195 UNGCPRO;
284f4730
JB
11196 }
11197 else
11198 /* Else request quit when it's safe */
11199 Vquit_flag = Qt;
11200 }
11201
8ad093db
AR
11202/* TODO: The longjmp in this call throws the NS event loop integration off,
11203 and it seems to do fine without this. Probably some attention
11204 needs to be paid to the setting of waiting_for_input in
11205 wait_reading_process_output() under HAVE_NS because of the call
11206 to ns_select there (needed because otherwise events aren't picked up
11207 outside of polling since we don't get SIGIO like X and we don't have a
11208 separate event loop thread like W32. */
11209#ifndef HAVE_NS
284f4730 11210 if (waiting_for_input && !echoing)
4ca927b4 11211 quit_throw_to_read_char ();
8ad093db 11212#endif
284f4730
JB
11213}
11214
11215/* Handle a C-g by making read_char return C-g. */
11216
07a59269 11217void
284f4730
JB
11218quit_throw_to_read_char ()
11219{
284f4730
JB
11220 sigfree ();
11221 /* Prevent another signal from doing this before we finish. */
f76475ad 11222 clear_waiting_for_input ();
284f4730
JB
11223 input_pending = 0;
11224
24597608 11225 Vunread_command_events = Qnil;
86e5706b 11226 unread_command_char = -1;
284f4730 11227
087feab3
RS
11228#if 0 /* Currently, sit_for is called from read_char without turning
11229 off polling. And that can call set_waiting_for_input.
11230 It seems to be harmless. */
e6b01c14
JB
11231#ifdef POLL_FOR_INPUT
11232 /* May be > 1 if in recursive minibuffer. */
11233 if (poll_suppress_count == 0)
11234 abort ();
11235#endif
087feab3 11236#endif
4c52b668 11237 if (FRAMEP (internal_last_event_frame)
788f89eb 11238 && !EQ (internal_last_event_frame, selected_frame))
719191cf 11239 do_switch_frame (make_lispy_switch_frame (internal_last_event_frame),
e630dfc6 11240 0, 0, Qnil);
e6b01c14 11241
284f4730
JB
11242 _longjmp (getcjmp, 1);
11243}
11244\f
a712a8c3
KL
11245DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode, Sset_input_interrupt_mode, 1, 1, 0,
11246 doc: /* Set interrupt mode of reading keyboard input.
11247If INTERRUPT is non-nil, Emacs will use input interrupts;
11248otherwise Emacs uses CBREAK mode.
11249
4707d2d0 11250See also `current-input-mode'. */)
a712a8c3
KL
11251 (interrupt)
11252 Lisp_Object interrupt;
284f4730 11253{
a712a8c3 11254 int new_interrupt_input;
284f4730
JB
11255#ifdef SIGIO
11256/* Note SIGIO has been undef'd if FIONREAD is missing. */
4beb2d71 11257#ifdef HAVE_X_WINDOWS
6bbba5a6 11258 if (x_display_list != NULL)
9a0f60bb
KH
11259 {
11260 /* When using X, don't give the user a real choice,
11261 because we haven't implemented the mechanisms to support it. */
11262#ifdef NO_SOCK_SIGIO
a712a8c3 11263 new_interrupt_input = 0;
9a0f60bb 11264#else /* not NO_SOCK_SIGIO */
a712a8c3 11265 new_interrupt_input = 1;
284f4730 11266#endif /* NO_SOCK_SIGIO */
9a0f60bb
KH
11267 }
11268 else
8ad093db 11269#endif /* HAVE_X_WINDOWS */
a712a8c3 11270 new_interrupt_input = !NILP (interrupt);
284f4730 11271#else /* not SIGIO */
a712a8c3 11272 new_interrupt_input = 0;
284f4730 11273#endif /* not SIGIO */
9a0f60bb 11274
033b73e2 11275 if (new_interrupt_input != interrupt_input)
a712a8c3
KL
11276 {
11277#ifdef POLL_FOR_INPUT
11278 stop_polling ();
11279#endif
11280#ifndef DOS_NT
11281 /* this causes startup screen to be restored and messes with the mouse */
11282 reset_all_sys_modes ();
11283#endif
11284 interrupt_input = new_interrupt_input;
11285#ifndef DOS_NT
11286 init_all_sys_modes ();
284f4730 11287#endif
9a0f60bb 11288
a712a8c3
KL
11289#ifdef POLL_FOR_INPUT
11290 poll_suppress_count = 1;
11291 start_polling ();
11292#endif
11293 }
11294 return Qnil;
11295}
6bbba5a6 11296
a712a8c3
KL
11297DEFUN ("set-output-flow-control", Fset_output_flow_control, Sset_output_flow_control, 1, 2, 0,
11298 doc: /* Enable or disable ^S/^Q flow control for output to TERMINAL.
11299If FLOW is non-nil, flow control is enabled and you cannot use C-s or
11300C-q in key sequences.
11301
6ed8eeff 11302This setting only has an effect on tty terminals and only when
a712a8c3
KL
11303Emacs reads input in CBREAK mode; see `set-input-interrupt-mode'.
11304
11305See also `current-input-mode'. */)
11306 (flow, terminal)
11307 Lisp_Object flow, terminal;
11308{
6ed8eeff 11309 struct terminal *t = get_terminal (terminal, 1);
a712a8c3 11310 struct tty_display_info *tty;
d44004c0 11311 if (t == NULL || (t->type != output_termcap && t->type != output_msdos_raw))
a712a8c3 11312 return Qnil;
6ed8eeff 11313 tty = t->display_info.tty;
a712a8c3
KL
11314
11315 if (tty->flow_control != !NILP (flow))
daf01701 11316 {
a712a8c3
KL
11317#ifndef DOS_NT
11318 /* this causes startup screen to be restored and messes with the mouse */
11319 reset_sys_modes (tty);
11320#endif
11321
daf01701 11322 tty->flow_control = !NILP (flow);
a712a8c3
KL
11323
11324#ifndef DOS_NT
11325 init_sys_modes (tty);
11326#endif
daf01701 11327 }
ed8dad6b 11328 return Qnil;
a712a8c3
KL
11329}
11330
11331DEFUN ("set-input-meta-mode", Fset_input_meta_mode, Sset_input_meta_mode, 1, 2, 0,
11332 doc: /* Enable or disable 8-bit input on TERMINAL.
11333If META is t, Emacs will accept 8-bit input, and interpret the 8th
11334bit as the Meta modifier.
11335
11336If META is nil, Emacs will ignore the top bit, on the assumption it is
11337parity.
11338
11339Otherwise, Emacs will accept and pass through 8-bit input without
11340specially interpreting the top bit.
11341
6ed8eeff 11342This setting only has an effect on tty terminal devices.
3b7fbceb 11343
6ed8eeff 11344Optional parameter TERMINAL specifies the tty terminal device to use.
708e05dc
CY
11345It may be a terminal object, a frame, or nil for the terminal used by
11346the currently selected frame.
a712a8c3
KL
11347
11348See also `current-input-mode'. */)
11349 (meta, terminal)
11350 Lisp_Object meta, terminal;
11351{
6ed8eeff 11352 struct terminal *t = get_terminal (terminal, 1);
a712a8c3
KL
11353 struct tty_display_info *tty;
11354 int new_meta;
033b73e2 11355
d44004c0 11356 if (t == NULL || (t->type != output_termcap && t->type != output_msdos_raw))
a712a8c3 11357 return Qnil;
6ed8eeff 11358 tty = t->display_info.tty;
a712a8c3 11359
b04904fb 11360 if (NILP (meta))
a712a8c3 11361 new_meta = 0;
b04904fb 11362 else if (EQ (meta, Qt))
a712a8c3 11363 new_meta = 1;
b04904fb 11364 else
a712a8c3 11365 new_meta = 2;
284f4730 11366
033b73e2 11367 if (tty->meta_key != new_meta)
a712a8c3 11368 {
07de30b9 11369#ifndef DOS_NT
a712a8c3
KL
11370 /* this causes startup screen to be restored and messes with the mouse */
11371 reset_sys_modes (tty);
2ee250ec 11372#endif
34f04431 11373
a712a8c3 11374 tty->meta_key = new_meta;
033b73e2 11375
a712a8c3
KL
11376#ifndef DOS_NT
11377 init_sys_modes (tty);
34f04431 11378#endif
a712a8c3
KL
11379 }
11380 return Qnil;
11381}
11382
11383DEFUN ("set-quit-char", Fset_quit_char, Sset_quit_char, 1, 1, 0,
11384 doc: /* Specify character used for quitting.
11385QUIT must be an ASCII character.
11386
fdf5ebde
KL
11387This function only has an effect on the controlling tty of the Emacs
11388process.
a712a8c3
KL
11389
11390See also `current-input-mode'. */)
11391 (quit)
11392 Lisp_Object quit;
11393{
fdf5ebde 11394 struct terminal *t = get_named_tty ("/dev/tty");
a712a8c3 11395 struct tty_display_info *tty;
d44004c0 11396 if (t == NULL || (t->type != output_termcap && t->type != output_msdos_raw))
a712a8c3 11397 return Qnil;
6ed8eeff 11398 tty = t->display_info.tty;
a712a8c3 11399
6213d5b3
KL
11400 if (NILP (quit) || !INTEGERP (quit) || XINT (quit) < 0 || XINT (quit) > 0400)
11401 error ("QUIT must be an ASCII character");
11402
a712a8c3
KL
11403#ifndef DOS_NT
11404 /* this causes startup screen to be restored and messes with the mouse */
11405 reset_sys_modes (tty);
11406#endif
033b73e2 11407
a712a8c3
KL
11408 /* Don't let this value be out of range. */
11409 quit_char = XINT (quit) & (tty->meta_key == 0 ? 0177 : 0377);
11410
11411#ifndef DOS_NT
11412 init_sys_modes (tty);
34f04431 11413#endif
a712a8c3
KL
11414
11415 return Qnil;
11416}
033b73e2 11417
a712a8c3
KL
11418DEFUN ("set-input-mode", Fset_input_mode, Sset_input_mode, 3, 4, 0,
11419 doc: /* Set mode of reading keyboard input.
11420First arg INTERRUPT non-nil means use input interrupts;
11421 nil means use CBREAK mode.
11422Second arg FLOW non-nil means use ^S/^Q flow control for output to terminal
11423 (no effect except in CBREAK mode).
11424Third arg META t means accept 8-bit input (for a Meta key).
11425 META nil means ignore the top bit, on the assumption it is parity.
11426 Otherwise, accept 8-bit input and don't use the top bit for Meta.
11427Optional fourth arg QUIT if non-nil specifies character to use for quitting.
11428See also `current-input-mode'. */)
11429 (interrupt, flow, meta, quit)
11430 Lisp_Object interrupt, flow, meta, quit;
11431{
11432 Fset_input_interrupt_mode (interrupt);
11433 Fset_output_flow_control (flow, Qnil);
11434 Fset_input_meta_mode (meta, Qnil);
0a42be6d
RF
11435 if (!NILP (quit))
11436 Fset_quit_char (quit);
284f4730
JB
11437 return Qnil;
11438}
80645119
JB
11439
11440DEFUN ("current-input-mode", Fcurrent_input_mode, Scurrent_input_mode, 0, 0, 0,
4707d2d0
PJ
11441 doc: /* Return information about the way Emacs currently reads keyboard input.
11442The value is a list of the form (INTERRUPT FLOW META QUIT), where
11443 INTERRUPT is non-nil if Emacs is using interrupt-driven input; if
11444 nil, Emacs is using CBREAK mode.
11445 FLOW is non-nil if Emacs uses ^S/^Q flow control for output to the
11446 terminal; this does not apply if Emacs uses interrupt-driven input.
11447 META is t if accepting 8-bit input with 8th bit as Meta flag.
11448 META nil means ignoring the top bit, on the assumption it is parity.
11449 META is neither t nor nil if accepting 8-bit input and using
11450 all 8 bits as the character code.
11451 QUIT is the character Emacs currently uses to quit.
11452The elements of this list correspond to the arguments of
11453`set-input-mode'. */)
11454 ()
80645119
JB
11455{
11456 Lisp_Object val[4];
daf01701 11457 struct frame *sf = XFRAME (selected_frame);
80645119
JB
11458
11459 val[0] = interrupt_input ? Qt : Qnil;
d44004c0 11460 if (FRAME_TERMCAP_P (sf) || FRAME_MSDOS_P (sf))
daf01701
KL
11461 {
11462 val[1] = FRAME_TTY (sf)->flow_control ? Qt : Qnil;
c3b4957f
KL
11463 val[2] = (FRAME_TTY (sf)->meta_key == 2
11464 ? make_number (0)
11465 : (CURTTY ()->meta_key == 1 ? Qt : Qnil));
daf01701
KL
11466 }
11467 else
11468 {
11469 val[1] = Qnil;
11470 val[2] = Qt;
11471 }
bb9e9bed 11472 XSETFASTINT (val[3], quit_char);
80645119 11473
bf673a7a 11474 return Flist (sizeof (val) / sizeof (val[0]), val);
80645119
JB
11475}
11476
a25f766a 11477DEFUN ("posn-at-x-y", Fposn_at_x_y, Sposn_at_x_y, 2, 4, 0,
ec026e7a
KS
11478 doc: /* Return position information for pixel coordinates X and Y.
11479By default, X and Y are relative to text area of the selected window.
6e604a9b 11480Optional third arg FRAME-OR-WINDOW non-nil specifies frame or window.
a25f766a
KS
11481If optional fourth arg WHOLE is non-nil, X is relative to the left
11482edge of the window.
ec026e7a
KS
11483
11484The return value is similar to a mouse click position:
11485 (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
11486 IMAGE (DX . DY) (WIDTH . HEIGHT))
11487The `posn-' functions access elements of such lists. */)
a25f766a
KS
11488 (x, y, frame_or_window, whole)
11489 Lisp_Object x, y, frame_or_window, whole;
ec026e7a 11490{
f4a5a485
SM
11491 CHECK_NATNUM (x);
11492 CHECK_NATNUM (y);
11493
ec026e7a
KS
11494 if (NILP (frame_or_window))
11495 frame_or_window = selected_window;
11496
11497 if (WINDOWP (frame_or_window))
11498 {
11499 struct window *w;
11500
11501 CHECK_LIVE_WINDOW (frame_or_window);
11502
11503 w = XWINDOW (frame_or_window);
6507c4c7
KS
11504 XSETINT (x, (XINT (x)
11505 + WINDOW_LEFT_EDGE_X (w)
a25f766a
KS
11506 + (NILP (whole)
11507 ? window_box_left_offset (w, TEXT_AREA)
6507c4c7 11508 : 0)));
ec026e7a
KS
11509 XSETINT (y, WINDOW_TO_FRAME_PIXEL_Y (w, XINT (y)));
11510 frame_or_window = w->frame;
11511 }
11512
11513 CHECK_LIVE_FRAME (frame_or_window);
11514
11515 return make_lispy_position (XFRAME (frame_or_window), &x, &y, 0);
11516}
11517
11518DEFUN ("posn-at-point", Fposn_at_point, Sposn_at_point, 0, 2, 0,
11519 doc: /* Return position information for buffer POS in WINDOW.
11520POS defaults to point in WINDOW; WINDOW defaults to the selected window.
11521
11522Return nil if position is not visible in window. Otherwise,
883d272e 11523the return value is similar to that returned by `event-start' for
ec026e7a
KS
11524a mouse click at the upper left corner of the glyph corresponding
11525to the given buffer position:
11526 (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
11527 IMAGE (DX . DY) (WIDTH . HEIGHT))
8f1657f0 11528The `posn-' functions access elements of such lists. */)
ec026e7a
KS
11529 (pos, window)
11530 Lisp_Object pos, window;
11531{
11532 Lisp_Object tem;
11533
6507c4c7
KS
11534 if (NILP (window))
11535 window = selected_window;
11536
ec026e7a
KS
11537 tem = Fpos_visible_in_window_p (pos, window, Qt);
11538 if (!NILP (tem))
6507c4c7
KS
11539 {
11540 Lisp_Object x = XCAR (tem);
11541 Lisp_Object y = XCAR (XCDR (tem));
11542
11543 /* Point invisible due to hscrolling? */
11544 if (XINT (x) < 0)
11545 return Qnil;
11546 tem = Fposn_at_x_y (x, y, window, Qnil);
11547 }
11548
ec026e7a
KS
11549 return tem;
11550}
11551
284f4730 11552\f
6c6083a9 11553/*
c5fdd383 11554 * Set up a new kboard object with reasonable initial values.
6c6083a9
KH
11555 */
11556void
c5fdd383
KH
11557init_kboard (kb)
11558 KBOARD *kb;
6c6083a9 11559{
217258d5 11560 kb->Voverriding_terminal_local_map = Qnil;
6c7178b9 11561 kb->Vlast_command = Qnil;
75045dcb 11562 kb->Vreal_last_command = Qnil;
2e478293 11563 kb->Vkeyboard_translate_table = Qnil;
d0d3a311 11564 kb->Vlast_repeatable_command = Qnil;
d8bcf58e 11565 kb->Vprefix_arg = Qnil;
75045dcb 11566 kb->Vlast_prefix_arg = Qnil;
c5fdd383
KH
11567 kb->kbd_queue = Qnil;
11568 kb->kbd_queue_has_data = 0;
11569 kb->immediate_echo = 0;
678e9d18 11570 kb->echo_string = Qnil;
c5fdd383
KH
11571 kb->echo_after_prompt = -1;
11572 kb->kbd_macro_buffer = 0;
11573 kb->kbd_macro_bufsize = 0;
11574 kb->defining_kbd_macro = Qnil;
11575 kb->Vlast_kbd_macro = Qnil;
11576 kb->reference_count = 0;
7c97ffdc 11577 kb->Vsystem_key_alist = Qnil;
142e6c73 11578 kb->system_key_syms = Qnil;
70b8d0a4 11579 kb->Vwindow_system = Qt; /* Unset. */
4f4a84ec 11580 kb->Vinput_decode_map = Fmake_sparse_keymap (Qnil);
ac09dc1e
KL
11581 kb->Vlocal_function_key_map = Fmake_sparse_keymap (Qnil);
11582 Fset_keymap_parent (kb->Vlocal_function_key_map, Vfunction_key_map);
9ba47203 11583 kb->Vdefault_minibuffer_frame = Qnil;
6c6083a9
KH
11584}
11585
11586/*
c5fdd383 11587 * Destroy the contents of a kboard object, but not the object itself.
8e6208c5 11588 * We use this just before deleting it, or if we're going to initialize
6c6083a9
KH
11589 * it a second time.
11590 */
e50b8090 11591static void
c5fdd383
KH
11592wipe_kboard (kb)
11593 KBOARD *kb;
6c6083a9 11594{
70fdbb46 11595 xfree (kb->kbd_macro_buffer);
6c6083a9
KH
11596}
11597
a122a38e
GM
11598/* Free KB and memory referenced from it. */
11599
e50b8090
KH
11600void
11601delete_kboard (kb)
a122a38e 11602 KBOARD *kb;
e50b8090
KH
11603{
11604 KBOARD **kbp;
c60ee5e7 11605
e50b8090
KH
11606 for (kbp = &all_kboards; *kbp != kb; kbp = &(*kbp)->next_kboard)
11607 if (*kbp == NULL)
11608 abort ();
11609 *kbp = kb->next_kboard;
a122a38e
GM
11610
11611 /* Prevent a dangling reference to KB. */
18f534df
GM
11612 if (kb == current_kboard
11613 && FRAMEP (selected_frame)
11614 && FRAME_LIVE_P (XFRAME (selected_frame)))
a122a38e 11615 {
b3e6f69c
KL
11616 current_kboard = FRAME_KBOARD (XFRAME (selected_frame));
11617 single_kboard = 0;
a122a38e
GM
11618 if (current_kboard == kb)
11619 abort ();
11620 }
c60ee5e7 11621
e50b8090
KH
11622 wipe_kboard (kb);
11623 xfree (kb);
11624}
a122a38e 11625
dfcf069d 11626void
284f4730
JB
11627init_keyboard ()
11628{
284f4730
JB
11629 /* This is correct before outermost invocation of the editor loop */
11630 command_loop_level = -1;
11631 immediate_quit = 0;
11632 quit_char = Ctl ('g');
24597608 11633 Vunread_command_events = Qnil;
86e5706b 11634 unread_command_char = -1;
87dd9b9b 11635 EMACS_SET_SECS_USECS (timer_idleness_start_time, -1, -1);
284f4730 11636 total_keys = 0;
9deb415a 11637 recent_keys_index = 0;
beecf6a1
KH
11638 kbd_fetch_ptr = kbd_buffer;
11639 kbd_store_ptr = kbd_buffer;
ae372f41 11640#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
a9d77f1f 11641 do_mouse_tracking = Qnil;
2eb6bfbe 11642#endif
284f4730 11643 input_pending = 0;
4c180390
JD
11644 interrupt_input_blocked = 0;
11645 interrupt_input_pending = 0;
07a1e794 11646#ifdef SYNC_INPUT
ceb18827 11647 pending_signals = 0;
07a1e794 11648#endif
284f4730 11649
4c52b668
KH
11650 /* This means that command_loop_1 won't try to select anything the first
11651 time through. */
11652 internal_last_event_frame = Qnil;
11653 Vlast_event_frame = internal_last_event_frame;
4c52b668 11654
aaca43a1 11655 current_kboard = initial_kboard;
1bc973c2 11656 /* Re-initialize the keyboard again. */
aaca43a1 11657 wipe_kboard (current_kboard);
c5fdd383 11658 init_kboard (current_kboard);
1bc973c2
SM
11659 /* A value of nil for Vwindow_system normally means a tty, but we also use
11660 it for the initial terminal since there is no window system there. */
11661 current_kboard->Vwindow_system = Qnil;
07d2b8de 11662
7b00d185 11663 if (!noninteractive)
284f4730 11664 {
3224dac1
KL
11665 /* Before multi-tty support, these handlers used to be installed
11666 only if the current session was a tty session. Now an Emacs
11667 session may have multiple display types, so we always handle
11668 SIGINT. There is special code in interrupt_signal to exit
4ca927b4
KL
11669 Emacs on SIGINT when there are no termcap frames on the
11670 controlling terminal. */
284f4730 11671 signal (SIGINT, interrupt_signal);
cb5df6ae 11672#if defined (HAVE_TERMIO) || defined (HAVE_TERMIOS)
284f4730
JB
11673 /* For systems with SysV TERMIO, C-g is set up for both SIGINT and
11674 SIGQUIT and we can't tell which one it will give us. */
11675 signal (SIGQUIT, interrupt_signal);
11676#endif /* HAVE_TERMIO */
7a80a6f6 11677 }
284f4730
JB
11678/* Note SIGIO has been undef'd if FIONREAD is missing. */
11679#ifdef SIGIO
7a80a6f6
RS
11680 if (!noninteractive)
11681 signal (SIGIO, input_available_signal);
8ea0a720 11682#endif /* SIGIO */
284f4730
JB
11683
11684/* Use interrupt input by default, if it works and noninterrupt input
11685 has deficiencies. */
11686
11687#ifdef INTERRUPT_INPUT
11688 interrupt_input = 1;
11689#else
11690 interrupt_input = 0;
11691#endif
11692
284f4730
JB
11693 sigfree ();
11694 dribble = 0;
11695
11696 if (keyboard_init_hook)
11697 (*keyboard_init_hook) ();
11698
11699#ifdef POLL_FOR_INPUT
c3c963a0 11700 poll_timer = NULL;
284f4730
JB
11701 poll_suppress_count = 1;
11702 start_polling ();
11703#endif
11704}
11705
df0f2ba1 11706/* This type's only use is in syms_of_keyboard, to initialize the
284f4730
JB
11707 event header symbols and put properties on them. */
11708struct event_head {
11709 Lisp_Object *var;
11710 char *name;
11711 Lisp_Object *kind;
11712};
11713
11714struct event_head head_table[] = {
7406e988
PJ
11715 {&Qmouse_movement, "mouse-movement", &Qmouse_movement},
11716 {&Qscroll_bar_movement, "scroll-bar-movement", &Qmouse_movement},
11717 {&Qswitch_frame, "switch-frame", &Qswitch_frame},
11718 {&Qdelete_frame, "delete-frame", &Qdelete_frame},
11719 {&Qiconify_frame, "iconify-frame", &Qiconify_frame},
a697f886 11720 {&Qmake_frame_visible, "make-frame-visible", &Qmake_frame_visible},
6901b111
SM
11721 /* `select-window' should be handled just like `switch-frame'
11722 in read_key_sequence. */
11723 {&Qselect_window, "select-window", &Qswitch_frame}
284f4730
JB
11724};
11725
dfcf069d 11726void
284f4730
JB
11727syms_of_keyboard ()
11728{
58555d81 11729 pending_funcalls = Qnil;
864660a2 11730 staticpro (&pending_funcalls);
58555d81 11731
a4ada374 11732 Vlispy_mouse_stem = make_pure_c_string ("mouse");
8e1e4240 11733 staticpro (&Vlispy_mouse_stem);
f0c1cc56 11734
9ea173e8 11735 /* Tool-bars. */
d67b4f80 11736 QCimage = intern_c_string (":image");
7ee32cda
GM
11737 staticpro (&QCimage);
11738
11739 staticpro (&Qhelp_echo);
d67b4f80 11740 Qhelp_echo = intern_c_string ("help-echo");
7ee32cda 11741
cf0590c4 11742 staticpro (&Qrtl);
d67b4f80 11743 Qrtl = intern_c_string (":rtl");
cf0590c4 11744
e8886a1d
RS
11745 staticpro (&item_properties);
11746 item_properties = Qnil;
11747
9ea173e8
GM
11748 staticpro (&tool_bar_item_properties);
11749 tool_bar_item_properties = Qnil;
11750 staticpro (&tool_bar_items_vector);
11751 tool_bar_items_vector = Qnil;
7ee32cda 11752
d5eecefb
RS
11753 staticpro (&real_this_command);
11754 real_this_command = Qnil;
11755
d67b4f80 11756 Qtimer_event_handler = intern_c_string ("timer-event-handler");
d925fb39
RS
11757 staticpro (&Qtimer_event_handler);
11758
d67b4f80 11759 Qdisabled_command_function = intern_c_string ("disabled-command-function");
971e4c98 11760 staticpro (&Qdisabled_command_function);
2e894dab 11761
d67b4f80 11762 Qself_insert_command = intern_c_string ("self-insert-command");
284f4730
JB
11763 staticpro (&Qself_insert_command);
11764
d67b4f80 11765 Qforward_char = intern_c_string ("forward-char");
284f4730
JB
11766 staticpro (&Qforward_char);
11767
d67b4f80 11768 Qbackward_char = intern_c_string ("backward-char");
284f4730
JB
11769 staticpro (&Qbackward_char);
11770
d67b4f80 11771 Qdisabled = intern_c_string ("disabled");
284f4730
JB
11772 staticpro (&Qdisabled);
11773
d67b4f80 11774 Qundefined = intern_c_string ("undefined");
e58aa385
RS
11775 staticpro (&Qundefined);
11776
d67b4f80 11777 Qpre_command_hook = intern_c_string ("pre-command-hook");
86e5706b
RS
11778 staticpro (&Qpre_command_hook);
11779
d67b4f80 11780 Qpost_command_hook = intern_c_string ("post-command-hook");
86e5706b
RS
11781 staticpro (&Qpost_command_hook);
11782
d67b4f80 11783 Qdeferred_action_function = intern_c_string ("deferred-action-function");
3ef14e46
RS
11784 staticpro (&Qdeferred_action_function);
11785
d67b4f80 11786 Qcommand_hook_internal = intern_c_string ("command-hook-internal");
40932d1a
RS
11787 staticpro (&Qcommand_hook_internal);
11788
d67b4f80 11789 Qfunction_key = intern_c_string ("function-key");
284f4730 11790 staticpro (&Qfunction_key);
d67b4f80 11791 Qmouse_click = intern_c_string ("mouse-click");
284f4730 11792 staticpro (&Qmouse_click);
9e2a2647 11793#if defined (WINDOWSNT)
d67b4f80 11794 Qlanguage_change = intern_c_string ("language-change");
1161d367 11795 staticpro (&Qlanguage_change);
07de30b9 11796#endif
d67b4f80 11797 Qdrag_n_drop = intern_c_string ("drag-n-drop");
a24dc617 11798 staticpro (&Qdrag_n_drop);
284f4730 11799
d67b4f80 11800 Qsave_session = intern_c_string ("save-session");
6e604a9b 11801 staticpro (&Qsave_session);
c60ee5e7 11802
033b73e2 11803#ifdef HAVE_DBUS
d67b4f80 11804 Qdbus_event = intern_c_string ("dbus-event");
033b73e2
MA
11805 staticpro (&Qdbus_event);
11806#endif
11807
d67b4f80 11808 Qmenu_enable = intern_c_string ("menu-enable");
598a9fa7 11809 staticpro (&Qmenu_enable);
d67b4f80 11810 QCenable = intern_c_string (":enable");
e8886a1d 11811 staticpro (&QCenable);
d67b4f80 11812 QCvisible = intern_c_string (":visible");
e8886a1d 11813 staticpro (&QCvisible);
d67b4f80 11814 QChelp = intern_c_string (":help");
7ee32cda 11815 staticpro (&QChelp);
d67b4f80 11816 QCfilter = intern_c_string (":filter");
e8886a1d 11817 staticpro (&QCfilter);
d67b4f80 11818 QCbutton = intern_c_string (":button");
e8886a1d 11819 staticpro (&QCbutton);
d67b4f80 11820 QCkeys = intern_c_string (":keys");
74c1de23 11821 staticpro (&QCkeys);
d67b4f80 11822 QCkey_sequence = intern_c_string (":key-sequence");
74c1de23 11823 staticpro (&QCkey_sequence);
d67b4f80 11824 QCtoggle = intern_c_string (":toggle");
e8886a1d 11825 staticpro (&QCtoggle);
d67b4f80 11826 QCradio = intern_c_string (":radio");
e8886a1d 11827 staticpro (&QCradio);
598a9fa7 11828
d67b4f80 11829 Qmode_line = intern_c_string ("mode-line");
284f4730 11830 staticpro (&Qmode_line);
d67b4f80 11831 Qvertical_line = intern_c_string ("vertical-line");
e5d77022 11832 staticpro (&Qvertical_line);
d67b4f80 11833 Qvertical_scroll_bar = intern_c_string ("vertical-scroll-bar");
3c370943 11834 staticpro (&Qvertical_scroll_bar);
d67b4f80 11835 Qmenu_bar = intern_c_string ("menu-bar");
5ec75a55 11836 staticpro (&Qmenu_bar);
4bb994d1 11837
ae372f41 11838#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
d67b4f80 11839 Qmouse_fixup_help_message = intern_c_string ("mouse-fixup-help-message");
c22237f7
KS
11840 staticpro (&Qmouse_fixup_help_message);
11841#endif
11842
d67b4f80 11843 Qabove_handle = intern_c_string ("above-handle");
4bb994d1 11844 staticpro (&Qabove_handle);
d67b4f80 11845 Qhandle = intern_c_string ("handle");
4bb994d1 11846 staticpro (&Qhandle);
d67b4f80 11847 Qbelow_handle = intern_c_string ("below-handle");
4bb994d1 11848 staticpro (&Qbelow_handle);
d67b4f80 11849 Qup = intern_c_string ("up");
db08707d 11850 staticpro (&Qup);
d67b4f80 11851 Qdown = intern_c_string ("down");
db08707d 11852 staticpro (&Qdown);
d67b4f80 11853 Qtop = intern_c_string ("top");
7ee32cda 11854 staticpro (&Qtop);
d67b4f80 11855 Qbottom = intern_c_string ("bottom");
7ee32cda 11856 staticpro (&Qbottom);
d67b4f80 11857 Qend_scroll = intern_c_string ("end-scroll");
7ee32cda 11858 staticpro (&Qend_scroll);
d67b4f80 11859 Qratio = intern_c_string ("ratio");
eef28553 11860 staticpro (&Qratio);
284f4730 11861
d67b4f80 11862 Qevent_kind = intern_c_string ("event-kind");
284f4730 11863 staticpro (&Qevent_kind);
d67b4f80 11864 Qevent_symbol_elements = intern_c_string ("event-symbol-elements");
88cb0656 11865 staticpro (&Qevent_symbol_elements);
d67b4f80 11866 Qevent_symbol_element_mask = intern_c_string ("event-symbol-element-mask");
0a7f1fc0 11867 staticpro (&Qevent_symbol_element_mask);
d67b4f80 11868 Qmodifier_cache = intern_c_string ("modifier-cache");
0a7f1fc0 11869 staticpro (&Qmodifier_cache);
284f4730 11870
d67b4f80 11871 Qrecompute_lucid_menubar = intern_c_string ("recompute-lucid-menubar");
48e416d4 11872 staticpro (&Qrecompute_lucid_menubar);
d67b4f80 11873 Qactivate_menubar_hook = intern_c_string ("activate-menubar-hook");
48e416d4
RS
11874 staticpro (&Qactivate_menubar_hook);
11875
d67b4f80 11876 Qpolling_period = intern_c_string ("polling-period");
f4eef8b4
RS
11877 staticpro (&Qpolling_period);
11878
d67b4f80 11879 Qinput_method_function = intern_c_string ("input-method-function");
7d18f9ae
RS
11880 staticpro (&Qinput_method_function);
11881
d67b4f80 11882 Qinput_method_exit_on_first_char = intern_c_string ("input-method-exit-on-first-char");
d5eecefb 11883 staticpro (&Qinput_method_exit_on_first_char);
d67b4f80 11884 Qinput_method_use_echo_area = intern_c_string ("input-method-use-echo-area");
d5eecefb
RS
11885 staticpro (&Qinput_method_use_echo_area);
11886
11887 Fset (Qinput_method_exit_on_first_char, Qnil);
11888 Fset (Qinput_method_use_echo_area, Qnil);
11889
e18dfbf4 11890 last_point_position_buffer = Qnil;
bb0e1d19 11891 last_point_position_window = Qnil;
e18dfbf4 11892
284f4730
JB
11893 {
11894 struct event_head *p;
11895
11896 for (p = head_table;
11897 p < head_table + (sizeof (head_table) / sizeof (head_table[0]));
11898 p++)
11899 {
d67b4f80 11900 *p->var = intern_c_string (p->name);
284f4730
JB
11901 staticpro (p->var);
11902 Fput (*p->var, Qevent_kind, *p->kind);
88cb0656 11903 Fput (*p->var, Qevent_symbol_elements, Fcons (*p->var, Qnil));
284f4730
JB
11904 }
11905 }
11906
1373f3be 11907 button_down_location = Fmake_vector (make_number (5), Qnil);
7b4aedb9 11908 staticpro (&button_down_location);
1373f3be 11909 mouse_syms = Fmake_vector (make_number (5), Qnil);
8e1e4240 11910 staticpro (&mouse_syms);
3208cb35
YM
11911 wheel_syms = Fmake_vector (make_number (sizeof (lispy_wheel_names)
11912 / sizeof (lispy_wheel_names[0])),
11913 Qnil);
8006e4bb 11914 staticpro (&wheel_syms);
88cb0656
JB
11915
11916 {
11917 int i;
11918 int len = sizeof (modifier_names) / sizeof (modifier_names[0]);
11919
11920 modifier_symbols = Fmake_vector (make_number (len), Qnil);
11921 for (i = 0; i < len; i++)
86e5706b 11922 if (modifier_names[i])
d67b4f80 11923 XVECTOR (modifier_symbols)->contents[i] = intern_c_string (modifier_names[i]);
88cb0656
JB
11924 staticpro (&modifier_symbols);
11925 }
11926
9deb415a
JB
11927 recent_keys = Fmake_vector (make_number (NUM_RECENT_KEYS), Qnil);
11928 staticpro (&recent_keys);
11929
6569cc8d 11930 this_command_keys = Fmake_vector (make_number (40), Qnil);
715d9345 11931 staticpro (&this_command_keys);
6569cc8d 11932
7d18f9ae
RS
11933 raw_keybuf = Fmake_vector (make_number (30), Qnil);
11934 staticpro (&raw_keybuf);
11935
d67b4f80 11936 Qextended_command_history = intern_c_string ("extended-command-history");
03b4122a
BF
11937 Fset (Qextended_command_history, Qnil);
11938 staticpro (&Qextended_command_history);
11939
24597608
RS
11940 accent_key_syms = Qnil;
11941 staticpro (&accent_key_syms);
11942
284f4730
JB
11943 func_key_syms = Qnil;
11944 staticpro (&func_key_syms);
11945
a24dc617
RS
11946 drag_n_drop_syms = Qnil;
11947 staticpro (&drag_n_drop_syms);
07de30b9 11948
cd21b839
JB
11949 unread_switch_frame = Qnil;
11950 staticpro (&unread_switch_frame);
11951
fe412364
EN
11952 internal_last_event_frame = Qnil;
11953 staticpro (&internal_last_event_frame);
11954
11955 read_key_sequence_cmd = Qnil;
11956 staticpro (&read_key_sequence_cmd);
11957
759860a6
RS
11958 menu_bar_one_keymap_changed_items = Qnil;
11959 staticpro (&menu_bar_one_keymap_changed_items);
11960
7320c7de
KS
11961 menu_bar_items_vector = Qnil;
11962 staticpro (&menu_bar_items_vector);
11963
638d3da0
CY
11964 help_form_saved_window_configs = Qnil;
11965 staticpro (&help_form_saved_window_configs);
11966
ff458d81 11967 defsubr (&Scurrent_idle_time);
58da34c7 11968 defsubr (&Sevent_symbol_parse_modifiers);
a1706c30 11969 defsubr (&Sevent_convert_list);
284f4730 11970 defsubr (&Sread_key_sequence);
e39da3d7 11971 defsubr (&Sread_key_sequence_vector);
284f4730 11972 defsubr (&Srecursive_edit);
ae372f41 11973#if defined (HAVE_MOUSE) || defined (HAVE_GPM)
284f4730 11974 defsubr (&Strack_mouse);
2eb6bfbe 11975#endif
284f4730
JB
11976 defsubr (&Sinput_pending_p);
11977 defsubr (&Scommand_execute);
11978 defsubr (&Srecent_keys);
11979 defsubr (&Sthis_command_keys);
e39da3d7 11980 defsubr (&Sthis_command_keys_vector);
6321824f 11981 defsubr (&Sthis_single_command_keys);
7d18f9ae 11982 defsubr (&Sthis_single_command_raw_keys);
71918b75 11983 defsubr (&Sreset_this_command_lengths);
82e6e5af 11984 defsubr (&Sclear_this_command_keys);
284f4730
JB
11985 defsubr (&Ssuspend_emacs);
11986 defsubr (&Sabort_recursive_edit);
11987 defsubr (&Sexit_recursive_edit);
11988 defsubr (&Srecursion_depth);
11989 defsubr (&Stop_level);
11990 defsubr (&Sdiscard_input);
11991 defsubr (&Sopen_dribble_file);
a712a8c3
KL
11992 defsubr (&Sset_input_interrupt_mode);
11993 defsubr (&Sset_output_flow_control);
11994 defsubr (&Sset_input_meta_mode);
11995 defsubr (&Sset_quit_char);
284f4730 11996 defsubr (&Sset_input_mode);
80645119 11997 defsubr (&Scurrent_input_mode);
284f4730 11998 defsubr (&Sexecute_extended_command);
ec026e7a
KS
11999 defsubr (&Sposn_at_point);
12000 defsubr (&Sposn_at_x_y);
284f4730 12001
4b09796d 12002 DEFVAR_LISP ("last-command-event", &last_command_event,
4707d2d0 12003 doc: /* Last input event that was part of a command. */);
284f4730 12004
7d6de002 12005 DEFVAR_LISP ("last-nonmenu-event", &last_nonmenu_event,
4707d2d0
PJ
12006 doc: /* Last input event in a command, except for mouse menu events.
12007Mouse menus give back keys that don't look like mouse events;
12008this variable holds the actual mouse event that led to the menu,
12009so that you can determine whether the command was run by mouse or not. */);
7d6de002 12010
4b09796d 12011 DEFVAR_LISP ("last-input-event", &last_input_event,
fa1361cb 12012 doc: /* Last input event. */);
86e5706b 12013
24597608 12014 DEFVAR_LISP ("unread-command-events", &Vunread_command_events,
4707d2d0 12015 doc: /* List of events to be read as the command input.
96f4f7ec
KS
12016These events are processed first, before actual keyboard input.
12017Events read from this list are not normally added to `this-command-keys',
12018as they will already have been added once as they were read for the first time.
12019An element of the form (t . EVENT) forces EVENT to be added to that list. */);
7d18f9ae 12020 Vunread_command_events = Qnil;
284f4730 12021
86e5706b 12022 DEFVAR_INT ("unread-command-char", &unread_command_char,
4707d2d0 12023 doc: /* If not -1, an object to be read as next command input event. */);
86e5706b 12024
7d18f9ae 12025 DEFVAR_LISP ("unread-post-input-method-events", &Vunread_post_input_method_events,
4707d2d0 12026 doc: /* List of events to be processed as input by input methods.
748726f4 12027These events are processed before `unread-command-events'
7d8d0914 12028and actual keyboard input, but are not given to `input-method-function'. */);
7d18f9ae
RS
12029 Vunread_post_input_method_events = Qnil;
12030
12031 DEFVAR_LISP ("unread-input-method-events", &Vunread_input_method_events,
4707d2d0
PJ
12032 doc: /* List of events to be processed as input by input methods.
12033These events are processed after `unread-command-events', but
748726f4
KH
12034before actual keyboard input.
12035If there's an active input method, the events are given to
12036`input-method-function'. */);
7d18f9ae
RS
12037 Vunread_input_method_events = Qnil;
12038
284f4730 12039 DEFVAR_LISP ("meta-prefix-char", &meta_prefix_char,
4707d2d0
PJ
12040 doc: /* Meta-prefix character code.
12041Meta-foo as command input turns into this character followed by foo. */);
18cd2eeb 12042 XSETINT (meta_prefix_char, 033);
284f4730 12043
6c7178b9 12044 DEFVAR_KBOARD ("last-command", Vlast_command,
4707d2d0
PJ
12045 doc: /* The last command executed.
12046Normally a symbol with a function definition, but can be whatever was found
12047in the keymap, or whatever the variable `this-command' was set to by that
12048command.
12049
12050The value `mode-exit' is special; it means that the previous command
12051read an event that told it to exit, and it did so and unread that event.
12052In other words, the present command is the event that made the previous
12053command exit.
12054
12055The value `kill-region' is special; it means that the previous command
2a42d440
KL
12056was a kill command.
12057
6ed8eeff 12058`last-command' has a separate binding for each terminal device.
2a42d440 12059See Info node `(elisp)Multiple displays'. */);
284f4730 12060
75045dcb 12061 DEFVAR_KBOARD ("real-last-command", Vreal_last_command,
4707d2d0 12062 doc: /* Same as `last-command', but never altered by Lisp code. */);
75045dcb 12063
d0d3a311
MR
12064 DEFVAR_KBOARD ("last-repeatable-command", Vlast_repeatable_command,
12065 doc: /* Last command that may be repeated.
12066The last command executed that was not bound to an input event.
12067This is the command `repeat' will try to repeat. */);
12068
d5eecefb 12069 DEFVAR_LISP ("this-command", &Vthis_command,
4707d2d0
PJ
12070 doc: /* The command now being executed.
12071The command can set this variable; whatever is put here
12072will be in `last-command' during the following command. */);
d5eecefb 12073 Vthis_command = Qnil;
284f4730 12074
025ae953
CY
12075 DEFVAR_LISP ("this-command-keys-shift-translated",
12076 &Vthis_command_keys_shift_translated,
12077 doc: /* Non-nil if the key sequence activating this command was shift-translated.
12078Shift-translation occurs when there is no binding for the key sequence
12079as entered, but a binding was found by changing an upper-case letter
12080to lower-case, or a shifted function key to an unshifted one. */);
12081 Vthis_command_keys_shift_translated = Qnil;
12082
8b9940e6 12083 DEFVAR_LISP ("this-original-command", &Vthis_original_command,
f5613d1e
KS
12084 doc: /* The command bound to the current key sequence before remapping.
12085It equals `this-command' if the original command was not remapped through
12086any of the active keymaps. Otherwise, the value of `this-command' is the
177c0ea7 12087result of looking up the original command in the active keymaps. */);
8b9940e6
KS
12088 Vthis_original_command = Qnil;
12089
284f4730 12090 DEFVAR_INT ("auto-save-interval", &auto_save_interval,
4707d2d0
PJ
12091 doc: /* *Number of input events between auto-saves.
12092Zero means disable autosaving due to number of characters typed. */);
284f4730
JB
12093 auto_save_interval = 300;
12094
12095 DEFVAR_LISP ("auto-save-timeout", &Vauto_save_timeout,
4707d2d0
PJ
12096 doc: /* *Number of seconds idle time before auto-save.
12097Zero or nil means disable auto-saving due to idleness.
12098After auto-saving due to this many seconds of idle time,
12099Emacs also does a garbage collection if that seems to be warranted. */);
bb9e9bed 12100 XSETFASTINT (Vauto_save_timeout, 30);
284f4730 12101
39aab679 12102 DEFVAR_LISP ("echo-keystrokes", &Vecho_keystrokes,
4707d2d0
PJ
12103 doc: /* *Nonzero means echo unfinished commands after this many seconds of pause.
12104The value may be integer or floating point. */);
39aab679 12105 Vecho_keystrokes = make_number (1);
284f4730
JB
12106
12107 DEFVAR_INT ("polling-period", &polling_period,
4707d2d0
PJ
12108 doc: /* *Interval between polling for input during Lisp execution.
12109The reason for polling is to make C-g work to stop a running program.
12110Polling is needed only when using X windows and SIGIO does not work.
12111Polling is automatically disabled in all other cases. */);
284f4730 12112 polling_period = 2;
df0f2ba1 12113
564dc952 12114 DEFVAR_LISP ("double-click-time", &Vdouble_click_time,
4707d2d0 12115 doc: /* *Maximum time between mouse clicks to make a double-click.
05e0ac99
JB
12116Measured in milliseconds. The value nil means disable double-click
12117recognition; t means double-clicks have no time limit and are detected
4707d2d0 12118by position only. */);
aab06933 12119 Vdouble_click_time = make_number (500);
fbcd35bd 12120
222d557c 12121 DEFVAR_INT ("double-click-fuzz", &double_click_fuzz,
4707d2d0
PJ
12122 doc: /* *Maximum mouse movement between clicks to make a double-click.
12123On window-system frames, value is the number of pixels the mouse may have
12124moved horizontally or vertically between two clicks to make a double-click.
12125On non window-system frames, value is interpreted in units of 1/8 characters
1ca6a9c4
RS
12126instead of pixels.
12127
12128This variable is also the threshold for motion of the mouse
12129to count as a drag. */);
222d557c 12130 double_click_fuzz = 3;
c60ee5e7 12131
03361bcc 12132 DEFVAR_BOOL ("inhibit-local-menu-bar-menus", &inhibit_local_menu_bar_menus,
4707d2d0 12133 doc: /* *Non-nil means inhibit local map menu bar menus. */);
03361bcc
RS
12134 inhibit_local_menu_bar_menus = 0;
12135
284f4730 12136 DEFVAR_INT ("num-input-keys", &num_input_keys,
4707d2d0
PJ
12137 doc: /* Number of complete key sequences read as input so far.
12138This includes key sequences read from keyboard macros.
12139The number is effectively the number of interactive command invocations. */);
284f4730
JB
12140 num_input_keys = 0;
12141
c43b1734 12142 DEFVAR_INT ("num-nonmacro-input-events", &num_nonmacro_input_events,
4707d2d0
PJ
12143 doc: /* Number of input events read from the keyboard so far.
12144This does not include events generated by keyboard macros. */);
c43b1734 12145 num_nonmacro_input_events = 0;
fa90970d 12146
4c52b668 12147 DEFVAR_LISP ("last-event-frame", &Vlast_event_frame,
4707d2d0
PJ
12148 doc: /* The frame in which the most recently read event occurred.
12149If the last event came from a keyboard macro, this is set to `macro'. */);
4c52b668
KH
12150 Vlast_event_frame = Qnil;
12151
fa90970d
RS
12152 /* This variable is set up in sysdep.c. */
12153 DEFVAR_LISP ("tty-erase-char", &Vtty_erase_char,
4707d2d0 12154 doc: /* The ERASE character as set by the user with stty. */);
fa90970d 12155
7e85b935 12156 DEFVAR_LISP ("help-char", &Vhelp_char,
4707d2d0
PJ
12157 doc: /* Character to recognize as meaning Help.
12158When it is read, do `(eval help-form)', and display result if it's a string.
12159If the value of `help-form' is nil, this char can be read normally. */);
18cd2eeb 12160 XSETINT (Vhelp_char, Ctl ('H'));
284f4730 12161
ecb7cb34 12162 DEFVAR_LISP ("help-event-list", &Vhelp_event_list,
4707d2d0
PJ
12163 doc: /* List of input events to recognize as meaning Help.
12164These work just like the value of `help-char' (see that). */);
ecb7cb34
KH
12165 Vhelp_event_list = Qnil;
12166
284f4730 12167 DEFVAR_LISP ("help-form", &Vhelp_form,
4707d2d0
PJ
12168 doc: /* Form to execute when character `help-char' is read.
12169If the form returns a string, that string is displayed.
12170If `help-form' is nil, the help char is not recognized. */);
284f4730
JB
12171 Vhelp_form = Qnil;
12172
7e85b935 12173 DEFVAR_LISP ("prefix-help-command", &Vprefix_help_command,
4707d2d0
PJ
12174 doc: /* Command to run when `help-char' character follows a prefix key.
12175This command is used only when there is no actual binding
12176for that character after that prefix key. */);
7e85b935
RS
12177 Vprefix_help_command = Qnil;
12178
284f4730 12179 DEFVAR_LISP ("top-level", &Vtop_level,
4707d2d0
PJ
12180 doc: /* Form to evaluate when Emacs starts up.
12181Useful to set before you dump a modified Emacs. */);
284f4730
JB
12182 Vtop_level = Qnil;
12183
2e478293
KL
12184 DEFVAR_KBOARD ("keyboard-translate-table", Vkeyboard_translate_table,
12185 doc: /* Translate table for local keyboard input, or nil.
669de2fb
LT
12186If non-nil, the value should be a char-table. Each character read
12187from the keyboard is looked up in this char-table. If the value found
12188there is non-nil, then it is used instead of the actual input character.
12189
12190The value can also be a string or vector, but this is considered obsolete.
12191If it is a string or vector of length N, character codes N and up are left
12192untranslated. In a vector, an element which is nil means "no translation".
a0acc6c7
DL
12193
12194This is applied to the characters supplied to input methods, not their
2e478293
KL
12195output. See also `translation-table-for-input'.
12196
6ed8eeff
KL
12197This variable has a separate binding for each terminal. See Info node
12198`(elisp)Multiple displays'. */);
284f4730 12199
8026024c 12200 DEFVAR_BOOL ("cannot-suspend", &cannot_suspend,
4707d2d0
PJ
12201 doc: /* Non-nil means to always spawn a subshell instead of suspending.
12202\(Even if the operating system has support for stopping a process.\) */);
8026024c
KH
12203 cannot_suspend = 0;
12204
284f4730 12205 DEFVAR_BOOL ("menu-prompting", &menu_prompting,
4707d2d0
PJ
12206 doc: /* Non-nil means prompt with menus when appropriate.
12207This is done when reading from a keymap that has a prompt string,
12208for elements that have prompt strings.
12209The menu is displayed on the screen
12210if X menus were enabled at configuration
12211time and the previous event was a mouse click prefix key.
12212Otherwise, menu prompting uses the echo area. */);
284f4730
JB
12213 menu_prompting = 1;
12214
12215 DEFVAR_LISP ("menu-prompt-more-char", &menu_prompt_more_char,
4707d2d0
PJ
12216 doc: /* Character to see next line of menu prompt.
12217Type this character while in a menu prompt to rotate around the lines of it. */);
18cd2eeb 12218 XSETINT (menu_prompt_more_char, ' ');
9fa4395d
RS
12219
12220 DEFVAR_INT ("extra-keyboard-modifiers", &extra_keyboard_modifiers,
4707d2d0
PJ
12221 doc: /* A mask of additional modifier keys to use with every keyboard character.
12222Emacs applies the modifiers of the character stored here to each keyboard
12223character it reads. For example, after evaluating the expression
12224 (setq extra-keyboard-modifiers ?\\C-x)
12225all input characters will have the control modifier applied to them.
12226
12227Note that the character ?\\C-@, equivalent to the integer zero, does
12228not count as a control character; rather, it counts as a character
12229with no modifiers; thus, setting `extra-keyboard-modifiers' to zero
12230cancels any modification. */);
9fa4395d 12231 extra_keyboard_modifiers = 0;
86e5706b
RS
12232
12233 DEFVAR_LISP ("deactivate-mark", &Vdeactivate_mark,
4707d2d0
PJ
12234 doc: /* If an editing command sets this to t, deactivate the mark afterward.
12235The command loop sets this to nil before each command,
12236and tests the value when the command returns.
12237Buffer modification stores t in this variable. */);
86e5706b 12238 Vdeactivate_mark = Qnil;
d67b4f80 12239 Qdeactivate_mark = intern_c_string ("deactivate-mark");
5c4cc82a 12240 staticpro (&Qdeactivate_mark);
86e5706b 12241
b0f2a7bf 12242 DEFVAR_LISP ("command-hook-internal", &Vcommand_hook_internal,
f761d6b6 12243 doc: /* Temporary storage of `pre-command-hook' or `post-command-hook'. */);
b0f2a7bf
KH
12244 Vcommand_hook_internal = Qnil;
12245
86e5706b 12246 DEFVAR_LISP ("pre-command-hook", &Vpre_command_hook,
4707d2d0
PJ
12247 doc: /* Normal hook run before each command is executed.
12248If an unhandled error happens in running this hook,
12249the hook value is set to nil, since otherwise the error
12250might happen repeatedly and make Emacs nonfunctional. */);
86e5706b
RS
12251 Vpre_command_hook = Qnil;
12252
12253 DEFVAR_LISP ("post-command-hook", &Vpost_command_hook,
4707d2d0
PJ
12254 doc: /* Normal hook run after each command is executed.
12255If an unhandled error happens in running this hook,
12256the hook value is set to nil, since otherwise the error
12257might happen repeatedly and make Emacs nonfunctional. */);
86e5706b 12258 Vpost_command_hook = Qnil;
48e416d4 12259
cf24f894
RS
12260#if 0
12261 DEFVAR_LISP ("echo-area-clear-hook", ...,
4707d2d0 12262 doc: /* Normal hook run when clearing the echo area. */);
cf24f894 12263#endif
d67b4f80 12264 Qecho_area_clear_hook = intern_c_string ("echo-area-clear-hook");
c8e16a02 12265 staticpro (&Qecho_area_clear_hook);
1373f3be 12266 Fset (Qecho_area_clear_hook, Qnil);
cdb9d665 12267
48e416d4 12268 DEFVAR_LISP ("lucid-menu-bar-dirty-flag", &Vlucid_menu_bar_dirty_flag,
fa1361cb 12269 doc: /* Non-nil means menu bar, specified Lucid style, needs to be recomputed. */);
48e416d4 12270 Vlucid_menu_bar_dirty_flag = Qnil;
a73c5e29 12271
9f9c0e27 12272 DEFVAR_LISP ("menu-bar-final-items", &Vmenu_bar_final_items,
4707d2d0
PJ
12273 doc: /* List of menu bar items to move to the end of the menu bar.
12274The elements of the list are event types that may have menu bar bindings. */);
9f9c0e27 12275 Vmenu_bar_final_items = Qnil;
e9bf89a0 12276
217258d5
KH
12277 DEFVAR_KBOARD ("overriding-terminal-local-map",
12278 Voverriding_terminal_local_map,
4707d2d0
PJ
12279 doc: /* Per-terminal keymap that overrides all other local keymaps.
12280If this variable is non-nil, it is used as a keymap instead of the
12281buffer's local map, and the minor mode keymaps and text property keymaps.
5a45dd33
RS
12282It also replaces `overriding-local-map'.
12283
4707d2d0 12284This variable is intended to let commands such as `universal-argument'
2a42d440
KL
12285set up a different keymap for reading the next command.
12286
6ed8eeff
KL
12287`overriding-terminal-local-map' has a separate binding for each
12288terminal device.
2a42d440 12289See Info node `(elisp)Multiple displays'. */);
217258d5 12290
9dd3131c 12291 DEFVAR_LISP ("overriding-local-map", &Voverriding_local_map,
4707d2d0 12292 doc: /* Keymap that overrides all other local keymaps.
5a45dd33
RS
12293If this variable is non-nil, it is used as a keymap--replacing the
12294buffer's local map, the minor mode keymaps, and char property keymaps. */);
9dd3131c
RS
12295 Voverriding_local_map = Qnil;
12296
d0a49716 12297 DEFVAR_LISP ("overriding-local-map-menu-flag", &Voverriding_local_map_menu_flag,
4707d2d0
PJ
12298 doc: /* Non-nil means `overriding-local-map' applies to the menu bar.
12299Otherwise, the menu bar continues to reflect the buffer's local map
12300and the minor mode maps regardless of `overriding-local-map'. */);
d0a49716
RS
12301 Voverriding_local_map_menu_flag = Qnil;
12302
7f07d5ca 12303 DEFVAR_LISP ("special-event-map", &Vspecial_event_map,
4707d2d0 12304 doc: /* Keymap defining bindings for special events to execute at low level. */);
d67b4f80 12305 Vspecial_event_map = Fcons (intern_c_string ("keymap"), Qnil);
7f07d5ca 12306
71edead1 12307 DEFVAR_LISP ("track-mouse", &do_mouse_tracking,
4707d2d0 12308 doc: /* *Non-nil means generate motion events for mouse motion. */);
80e4aa30 12309
7c97ffdc 12310 DEFVAR_KBOARD ("system-key-alist", Vsystem_key_alist,
4707d2d0
PJ
12311 doc: /* Alist of system-specific X windows key symbols.
12312Each element should have the form (N . SYMBOL) where N is the
12313numeric keysym code (sans the \"system-specific\" bit 1<<28)
2a42d440
KL
12314and SYMBOL is its name.
12315
6ed8eeff 12316`system-key-alist' has a separate binding for each terminal device.
e93b2956 12317See Info node `(elisp)Multiple displays'. */);
8a792f3a 12318
ac09dc1e 12319 DEFVAR_KBOARD ("local-function-key-map", Vlocal_function_key_map,
e93b2956 12320 doc: /* Keymap that translates key sequences to key sequences during input.
4f4a84ec
SM
12321This is used mainly for mapping key sequences into some preferred
12322key events (symbols).
f01b6d17
KL
12323
12324The `read-key-sequence' function replaces any subsequence bound by
7a81ec10
KL
12325`local-function-key-map' with its binding. More precisely, when the
12326active keymaps have no binding for the current key sequence but
12327`local-function-key-map' binds a suffix of the sequence to a vector or
12328string, `read-key-sequence' replaces the matching suffix with its
12329binding, and continues with the new sequence.
f01b6d17 12330
feba0cd6
KL
12331If the binding is a function, it is called with one argument (the prompt)
12332and its return value (a key sequence) is used.
12333
7a81ec10
KL
12334The events that come from bindings in `local-function-key-map' are not
12335themselves looked up in `local-function-key-map'.
f01b6d17 12336
7a81ec10 12337For example, suppose `local-function-key-map' binds `ESC O P' to [f1].
f01b6d17 12338Typing `ESC O P' to `read-key-sequence' would return [f1]. Typing
7a81ec10
KL
12339`C-x ESC O P' would return [?\\C-x f1]. If [f1] were a prefix key,
12340typing `ESC O P x' would return [f1 x].
f01b6d17 12341
6ed8eeff 12342`local-function-key-map' has a separate binding for each terminal
7a81ec10 12343device. See Info node `(elisp)Multiple displays'. If you need to
6ed8eeff 12344define a binding on all terminals, change `function-key-map'
7a81ec10 12345instead. Initially, `local-function-key-map' is an empty keymap that
6ed8eeff 12346has `function-key-map' as its parent on all terminal devices. */);
f01b6d17 12347
4f4a84ec
SM
12348 DEFVAR_KBOARD ("input-decode-map", Vinput_decode_map,
12349 doc: /* Keymap that decodes input escape sequences.
12350This is used mainly for mapping ASCII function key sequences into
12351real Emacs function key events (symbols).
12352
12353The `read-key-sequence' function replaces any subsequence bound by
9d0644c4 12354`input-decode-map' with its binding. Contrary to `function-key-map',
4f4a84ec
SM
12355this map applies its rebinding regardless of the presence of an ordinary
12356binding. So it is more like `key-translation-map' except that it applies
12357before `function-key-map' rather than after.
12358
12359If the binding is a function, it is called with one argument (the prompt)
12360and its return value (a key sequence) is used.
12361
12362The events that come from bindings in `input-decode-map' are not
12363themselves looked up in `input-decode-map'.
12364
12365This variable is keyboard-local. */);
12366
ac09dc1e
KL
12367 DEFVAR_LISP ("function-key-map", &Vfunction_key_map,
12368 doc: /* The parent keymap of all `local-function-key-map' instances.
6ed8eeff 12369Function key definitions that apply to all terminal devices should go
7a81ec10
KL
12370here. If a mapping is defined in both the current
12371`local-function-key-map' binding and this variable, then the local
12372definition will take precendence. */);
ac09dc1e 12373 Vfunction_key_map = Fmake_sparse_keymap (Qnil);
033b73e2 12374
4f4a84ec
SM
12375 DEFVAR_LISP ("key-translation-map", &Vkey_translation_map,
12376 doc: /* Keymap of key translations that can override keymaps.
4ea81208
KL
12377This keymap works like `function-key-map', but comes after that,
12378and its non-prefix bindings override ordinary bindings.
4f4a84ec 12379Another difference is that it is global rather than keyboard-local. */);
ac09dc1e 12380 Vkey_translation_map = Fmake_sparse_keymap (Qnil);
8a792f3a
RS
12381
12382 DEFVAR_LISP ("deferred-action-list", &Vdeferred_action_list,
4707d2d0
PJ
12383 doc: /* List of deferred actions to be performed at a later time.
12384The precise format isn't relevant here; we just check whether it is nil. */);
8a792f3a
RS
12385 Vdeferred_action_list = Qnil;
12386
12387 DEFVAR_LISP ("deferred-action-function", &Vdeferred_action_function,
4707d2d0
PJ
12388 doc: /* Function to call to handle deferred actions, after each command.
12389This function is called with no arguments after each command
12390whenever `deferred-action-list' is non-nil. */);
8a792f3a 12391 Vdeferred_action_function = Qnil;
6526ab49
RS
12392
12393 DEFVAR_LISP ("suggest-key-bindings", &Vsuggest_key_bindings,
4707d2d0
PJ
12394 doc: /* *Non-nil means show the equivalent key-binding when M-x command has one.
12395The value can be a length of time to show the message for.
12396If the value is non-nil and not a number, we wait 2 seconds. */);
6526ab49 12397 Vsuggest_key_bindings = Qt;
8bb1c042 12398
c04cbc3b 12399 DEFVAR_LISP ("timer-list", &Vtimer_list,
4707d2d0 12400 doc: /* List of active absolute time timers in order of increasing time. */);
c04cbc3b 12401 Vtimer_list = Qnil;
d9d4c147
KH
12402
12403 DEFVAR_LISP ("timer-idle-list", &Vtimer_idle_list,
4707d2d0 12404 doc: /* List of active idle-time timers in order of increasing time. */);
d9d4c147 12405 Vtimer_idle_list = Qnil;
7d18f9ae
RS
12406
12407 DEFVAR_LISP ("input-method-function", &Vinput_method_function,
4707d2d0
PJ
12408 doc: /* If non-nil, the function that implements the current input method.
12409It's called with one argument, a printing character that was just read.
12410\(That means a character with code 040...0176.)
12411Typically this function uses `read-event' to read additional events.
12412When it does so, it should first bind `input-method-function' to nil
12413so it will not be called recursively.
12414
12415The function should return a list of zero or more events
12416to be used as input. If it wants to put back some events
12417to be reconsidered, separately, by the input method,
12418it can add them to the beginning of `unread-command-events'.
12419
f761d6b6 12420The input method function can find in `input-method-previous-message'
4707d2d0
PJ
12421the previous echo area message.
12422
12423The input method function should refer to the variables
12424`input-method-use-echo-area' and `input-method-exit-on-first-char'
12425for guidance on what to do. */);
7d18f9ae 12426 Vinput_method_function = Qnil;
d5eecefb
RS
12427
12428 DEFVAR_LISP ("input-method-previous-message",
12429 &Vinput_method_previous_message,
4707d2d0
PJ
12430 doc: /* When `input-method-function' is called, hold the previous echo area message.
12431This variable exists because `read-event' clears the echo area
12432before running the input method. It is nil if there was no message. */);
d5eecefb 12433 Vinput_method_previous_message = Qnil;
7ee32cda
GM
12434
12435 DEFVAR_LISP ("show-help-function", &Vshow_help_function,
4707d2d0
PJ
12436 doc: /* If non-nil, the function that implements the display of help.
12437It's called with one argument, the help string to display. */);
7ee32cda 12438 Vshow_help_function = Qnil;
adf5cb9c
KH
12439
12440 DEFVAR_LISP ("disable-point-adjustment", &Vdisable_point_adjustment,
4707d2d0
PJ
12441 doc: /* If non-nil, suppress point adjustment after executing a command.
12442
12443After a command is executed, if point is moved into a region that has
12444special properties (e.g. composition, display), we adjust point to
5fee9a2f
LT
12445the boundary of the region. But, when a command sets this variable to
12446non-nil, we suppress the point adjustment.
4707d2d0
PJ
12447
12448This variable is set to nil before reading a command, and is checked
12449just after executing the command. */);
adf5cb9c
KH
12450 Vdisable_point_adjustment = Qnil;
12451
12452 DEFVAR_LISP ("global-disable-point-adjustment",
12453 &Vglobal_disable_point_adjustment,
4707d2d0
PJ
12454 doc: /* *If non-nil, always suppress point adjustment.
12455
12456The default value is nil, in which case, point adjustment are
12457suppressed only after special commands that set
12458`disable-point-adjustment' (which see) to non-nil. */);
adf5cb9c 12459 Vglobal_disable_point_adjustment = Qnil;
3626fb1a 12460
00392ce6 12461 DEFVAR_LISP ("minibuffer-message-timeout", &Vminibuffer_message_timeout,
4707d2d0
PJ
12462 doc: /* *How long to display an echo-area message when the minibuffer is active.
12463If the value is not a number, such messages don't time out. */);
00392ce6 12464 Vminibuffer_message_timeout = make_number (2);
2a84c6da
KS
12465
12466 DEFVAR_LISP ("throw-on-input", &Vthrow_on_input,
12467 doc: /* If non-nil, any keyboard input throws to this symbol.
12468The value of that variable is passed to `quit-flag' and later causes a
12469peculiar kind of quitting. */);
12470 Vthrow_on_input = Qnil;
9d56e0da 12471
04d8c47d
RS
12472 DEFVAR_LISP ("command-error-function", &Vcommand_error_function,
12473 doc: /* If non-nil, function to output error messages.
12474The arguments are the error data, a list of the form
12475 (SIGNALED-CONDITIONS . SIGNAL-DATA)
12476such as just as `condition-case' would bind its variable to,
12477the context (a string which normally goes at the start of the message),
12478and the Lisp function within which the error was signaled. */);
12479 Vcommand_error_function = Qnil;
12480
9d56e0da
EZ
12481 DEFVAR_LISP ("enable-disabled-menus-and-buttons",
12482 &Venable_disabled_menus_and_buttons,
12483 doc: /* If non-nil, don't ignore events produced by disabled menu items and tool-bar.
12484
12485Help functions bind this to allow help on disabled menu items
12486and tool-bar buttons. */);
12487 Venable_disabled_menus_and_buttons = Qnil;
1bc973c2 12488
1bc973c2
SM
12489 /* Create the initial keyboard. */
12490 initial_kboard = (KBOARD *) xmalloc (sizeof (KBOARD));
12491 init_kboard (initial_kboard);
12492 /* Vwindow_system is left at t for now. */
12493 initial_kboard->next_kboard = all_kboards;
12494 all_kboards = initial_kboard;
284f4730
JB
12495}
12496
dfcf069d 12497void
284f4730
JB
12498keys_of_keyboard ()
12499{
12500 initial_define_key (global_map, Ctl ('Z'), "suspend-emacs");
12501 initial_define_key (control_x_map, Ctl ('Z'), "suspend-emacs");
12502 initial_define_key (meta_map, Ctl ('C'), "exit-recursive-edit");
12503 initial_define_key (global_map, Ctl (']'), "abort-recursive-edit");
12504 initial_define_key (meta_map, 'x', "execute-extended-command");
7f07d5ca
RS
12505
12506 initial_define_lispy_key (Vspecial_event_map, "delete-frame",
12507 "handle-delete-frame");
8612b71a
AR
12508 initial_define_lispy_key (Vspecial_event_map, "ns-put-working-text",
12509 "ns-put-working-text");
12510 initial_define_lispy_key (Vspecial_event_map, "ns-unput-working-text",
12511 "ns-unput-working-text");
a18bf897
SM
12512 /* Here we used to use `ignore-event' which would simple set prefix-arg to
12513 current-prefix-arg, as is done in `handle-switch-frame'.
12514 But `handle-switch-frame is not run from the special-map.
12515 Commands from that map are run in a special way that automatically
12516 preserves the prefix-arg. Restoring the prefix arg here is not just
12517 redundant but harmful:
12518 - C-u C-x v =
12519 - current-prefix-arg is set to non-nil, prefix-arg is set to nil.
12520 - after the first prompt, the exit-minibuffer-hook is run which may
12521 iconify a frame and thus push a `iconify-frame' event.
12522 - after running exit-minibuffer-hook, current-prefix-arg is
12523 restored to the non-nil value it had before the prompt.
12524 - we enter the second prompt.
12525 current-prefix-arg is non-nil, prefix-arg is nil.
12526 - before running the first real event, we run the special iconify-frame
12527 event, but we pass the `special' arg to execute-command so
12528 current-prefix-arg and prefix-arg are left untouched.
12529 - here we foolishly copy the non-nil current-prefix-arg to prefix-arg.
12530 - the next key event will have a spuriously non-nil current-prefix-arg. */
7f07d5ca 12531 initial_define_lispy_key (Vspecial_event_map, "iconify-frame",
a18bf897 12532 "ignore");
7f07d5ca 12533 initial_define_lispy_key (Vspecial_event_map, "make-frame-visible",
a18bf897 12534 "ignore");
a4e19f6e
SM
12535 /* Handling it at such a low-level causes read_key_sequence to get
12536 * confused because it doesn't realize that the current_buffer was
12537 * changed by read_char.
6b61353c 12538 *
a4e19f6e
SM
12539 * initial_define_lispy_key (Vspecial_event_map, "select-window",
12540 * "handle-select-window"); */
4ebc27a5
JD
12541 initial_define_lispy_key (Vspecial_event_map, "save-session",
12542 "handle-save-session");
033b73e2
MA
12543
12544#ifdef HAVE_DBUS
12545 /* Define a special event which is raised for dbus callback
12546 functions. */
12547 initial_define_lispy_key (Vspecial_event_map, "dbus-event",
12548 "dbus-handle-event");
12549#endif
284f4730 12550}
1269a761
SM
12551
12552/* Mark the pointers in the kboard objects.
12553 Called by the Fgarbage_collector. */
12554void
12555mark_kboards ()
12556{
12557 KBOARD *kb;
12558 Lisp_Object *p;
12559 for (kb = all_kboards; kb; kb = kb->next_kboard)
12560 {
12561 if (kb->kbd_macro_buffer)
12562 for (p = kb->kbd_macro_buffer; p < kb->kbd_macro_ptr; p++)
3ebb8729
SM
12563 mark_object (*p);
12564 mark_object (kb->Voverriding_terminal_local_map);
12565 mark_object (kb->Vlast_command);
12566 mark_object (kb->Vreal_last_command);
1d33157f 12567 mark_object (kb->Vkeyboard_translate_table);
d0d3a311 12568 mark_object (kb->Vlast_repeatable_command);
3ebb8729
SM
12569 mark_object (kb->Vprefix_arg);
12570 mark_object (kb->Vlast_prefix_arg);
12571 mark_object (kb->kbd_queue);
12572 mark_object (kb->defining_kbd_macro);
12573 mark_object (kb->Vlast_kbd_macro);
12574 mark_object (kb->Vsystem_key_alist);
12575 mark_object (kb->system_key_syms);
70b8d0a4 12576 mark_object (kb->Vwindow_system);
4f4a84ec 12577 mark_object (kb->Vinput_decode_map);
ac09dc1e 12578 mark_object (kb->Vlocal_function_key_map);
3ebb8729
SM
12579 mark_object (kb->Vdefault_minibuffer_frame);
12580 mark_object (kb->echo_string);
1269a761
SM
12581 }
12582 {
12583 struct input_event *event;
12584 for (event = kbd_fetch_ptr; event != kbd_store_ptr; event++)
12585 {
12586 if (event == kbd_buffer + KBD_BUFFER_SIZE)
12587 event = kbd_buffer;
e3f6e7c7
KS
12588 if (event->kind != SELECTION_REQUEST_EVENT
12589 && event->kind != SELECTION_CLEAR_EVENT)
0161caf9
KS
12590 {
12591 mark_object (event->x);
12592 mark_object (event->y);
12593 }
3ebb8729
SM
12594 mark_object (event->frame_or_window);
12595 mark_object (event->arg);
1269a761
SM
12596 }
12597 }
12598}
6b61353c
KH
12599
12600/* arch-tag: 774e34d7-6d31-42f3-8397-e079a4e4c9ca
12601 (do not change this comment) */