annotate src/keyboard.c @ 939:c4dcdc9aed70

Clear the eighth bit of the character from the key sequence, NOT the index of the character IN the key sequence. How many tries will it take to get it right?
author Jim Blandy <jimb@redhat.com>
date Wed, 05 Aug 1992 05:18:27 +0000
parents ef5f79a6535a
children eb74884fc95a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1 /* Keyboard and mouse input; editor command loop.
586
c792b1df8110 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 562
diff changeset
2 Copyright (C) 1985, 1986, 1987, 1988, 1989, 1992 Free Software Foundation, Inc.
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4 This file is part of GNU Emacs.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
8 the Free Software Foundation; either version 1, or (at your option)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 any later version.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 GNU General Public License for more details.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20 /* Allow config.h to undefine symbols found here. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21 #include <signal.h>
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
23 #include "config.h"
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24 #include <stdio.h>
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
25 #undef NULL
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26 #include "termchar.h"
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
27 #include "termopts.h"
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
28 #include "lisp.h"
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
29 #include "termhooks.h"
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
30 #include "macros.h"
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
31 #include "frame.h"
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32 #include "window.h"
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
33 #include "commands.h"
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
34 #include "buffer.h"
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
35 #include "disptab.h"
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
36 #include "keyboard.h"
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
37 #include <setjmp.h>
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38 #include <errno.h>
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
39
562
0d73d7b5fff0 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 547
diff changeset
40 #ifndef VMS
0d73d7b5fff0 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 547
diff changeset
41 #include <sys/ioctl.h>
0d73d7b5fff0 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 547
diff changeset
42 #endif
0d73d7b5fff0 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 547
diff changeset
43
0d73d7b5fff0 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 547
diff changeset
44 #include "syssignal.h"
0d73d7b5fff0 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 547
diff changeset
45 #include "systerm.h"
648
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
46 #include "systime.h"
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
47
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
48 extern int errno;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
49
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
50 #ifdef HAVE_X_WINDOWS
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
51 extern Lisp_Object Vmouse_grabbed;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
52
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
53 /* Make all keyboard buffers much bigger when using X windows. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
54 #define KBD_BUFFER_SIZE 4096
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
55 #else /* No X-windows, character input */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
56 #define KBD_BUFFER_SIZE 256
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
57 #endif /* No X-windows */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
58
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
59 /* Following definition copied from eval.c */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
60
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
61 struct backtrace
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
62 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
63 struct backtrace *next;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
64 Lisp_Object *function;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
65 Lisp_Object *args; /* Points to vector of args. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
66 int nargs; /* length of vector. If nargs is UNEVALLED,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
67 args points to slot holding list of
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
68 unevalled args */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69 char evalargs;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
70 };
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
71
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
72 /* Non-nil disable property on a command means
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
73 do not execute it; call disabled-command-hook's value instead. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
74 Lisp_Object Qdisabled, Vdisabled_command_hook;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
75
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76 #define NUM_RECENT_KEYS (100)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 int recent_keys_index; /* Index for storing next element into recent_keys */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
78 int total_keys; /* Total number of elements stored into recent_keys */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
79 Lisp_Object recent_keys[NUM_RECENT_KEYS]; /* Holds last 100 keystrokes */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
80
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
81 /* Buffer holding the key that invoked the current command. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
82 Lisp_Object *this_command_keys;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
83 int this_command_key_count; /* Size in use. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84 int this_command_keys_size; /* Size allocated. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
85
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
86 extern int minbuf_level;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
87
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
88 extern struct backtrace *backtrace_list;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
90 /* Nonzero means do menu prompting. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
91 static int menu_prompting;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
92
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
93 /* Character to see next line of menu prompt. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
94 static Lisp_Object menu_prompt_more_char;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
95
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
96 /* For longjmp to where kbd input is being done. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
97 static jmp_buf getcjmp;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
98
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
99 /* True while doing kbd input. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
100 int waiting_for_input;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
101
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
102 /* True while displaying for echoing. Delays C-g throwing. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
103 static int echoing;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
104
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
105 /* Nonzero means C-G should cause immediate error-signal. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
106 int immediate_quit;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
107
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
108 /* Character to recognize as the help char. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
109 Lisp_Object help_char;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
110
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
111 /* Form to execute when help char is typed. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
112 Lisp_Object Vhelp_form;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
113
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
114 /* Character that causes a quit. Normally C-g.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
115
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
116 If we are running on an ordinary terminal, this must be an ordinary
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
117 ASCII char, since we want to make it our interrupt character.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
118
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
119 If we are not running on an ordinary terminal, it still needs to be
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
120 an ordinary ASCII char. This character needs to be recognized in
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
121 the input interrupt handler. At this point, the keystroke is
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
122 represented as a struct input_event, while the desired quit
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
123 character is specified as a lispy event. The mapping from struct
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
124 input_events to lispy events cannot run in an interrupt handler,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125 and the reverse mapping is difficult for anything but ASCII
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
126 keystrokes.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
127
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128 FOR THESE ELABORATE AND UNSATISFYING REASONS, quit_char must be an
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
129 ASCII character. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
130 int quit_char;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
131
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
132 extern Lisp_Object current_global_map;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
133 extern int minibuf_level;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
134
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
135 /* Current depth in recursive edits. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
136 int command_loop_level;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
138 /* Total number of times command_loop has read a key sequence. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
139 int num_input_keys;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
141 /* Last input character read as a command. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
142 Lisp_Object last_command_char;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
143
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
144 /* Last input character read for any purpose. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
145 Lisp_Object last_input_char;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
146
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
147 /* If not Qnil, an object to be read as the next command input. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
148 Lisp_Object unread_command_char;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
149
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
150 /* Char to use as prefix when a meta character is typed in.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
151 This is bound on entry to minibuffer in case ESC is changed there. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
152
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
153 Lisp_Object meta_prefix_char;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
154
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
155 /* Last size recorded for a current buffer which is not a minibuffer. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
156 static int last_non_minibuf_size;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
157
687
e2b747dd6a6e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 682
diff changeset
158 /* Number of idle seconds before an auto-save and garbage collection. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
159 static Lisp_Object Vauto_save_timeout;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
160
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
161 /* Total number of times read_char has returned. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
162 int num_input_chars;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
163
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
164 /* Auto-save automatically when this many characters have been typed
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
165 since the last time. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
166
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
167 static int auto_save_interval;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
168
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
169 /* Value of num_input_chars as of last auto save. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
170
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
171 int last_auto_save;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
172
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
173 /* Last command executed by the editor command loop, not counting
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
174 commands that set the prefix argument. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
175
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
176 Lisp_Object last_command;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
177
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
178 /* The command being executed by the command loop.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
179 Commands may set this, and the value set will be copied into last_command
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
180 instead of the actual command. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
181 Lisp_Object this_command;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
182
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
183 #ifndef HAVE_X11
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
184 /* Window of last mouse click. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
185 extern Lisp_Object Vmouse_window;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
186
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
187 /* List containing details of last mouse click. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
188 extern Lisp_Object Vmouse_event;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189 #endif /* defined HAVE_X11 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
190
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
191 /* Hook to call on each mouse event after running its definition. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
192 Lisp_Object Vmouse_event_function;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
193
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
194 /* Hook to call when mouse leaves frame. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
195 Lisp_Object Vmouse_left_hook;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
196
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
197 /* Hook to call when a frame is mapped. */
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
198 Lisp_Object Vmap_frame_hook;
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
199
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
200 /* Hook to call when a frame is unmapped. */
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
201 Lisp_Object Vunmap_frame_hook;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
202
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
203 /* Handler for non-grabbed (no keys depressed) mouse motion. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
204 Lisp_Object Vmouse_motion_handler;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
205
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
206 /* The frame in which the last input event occurred.
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
207 command_loop_1 will select this frame before running the
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
208 command bound to an event sequence, and read_key_sequence will
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
209 toss the existing prefix if the user starts typing at a
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
210 new frame. */
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
211 Lisp_Object Vlast_event_frame;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
212
708
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
213 /* The timestamp of the last input event we received from the X server.
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
214 X Windows wants this for selection ownership. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
215 unsigned long last_event_timestamp;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
216
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
217 Lisp_Object Qself_insert_command;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
218 Lisp_Object Qforward_char;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
219 Lisp_Object Qbackward_char;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
220
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
221 /* read_key_sequence stores here the command definition of the
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
222 key sequence that it reads. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
223 Lisp_Object read_key_sequence_cmd;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
224
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
225 /* Form to evaluate (if non-nil) when Emacs is started. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
226 Lisp_Object Vtop_level;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
227
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
228 /* User-supplied string to translate input characters through. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
229 Lisp_Object Vkeyboard_translate_table;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
231 /* Keymap mapping ASCII function key sequences onto their preferred forms. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
232 extern Lisp_Object Vfunction_key_map;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
233
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
234 /* File in which we write all commands we read. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
235 FILE *dribble;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
236
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
237 /* Nonzero if input is available. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
238 int input_pending;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
239
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
240 /* Nonzero if should obey 0200 bit in input chars as "Meta". */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
241 int meta_key;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
242
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
243 extern char *pending_malloc_warning;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
244
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
245 /* Circular buffer for pre-read keyboard input. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
246 static struct input_event kbd_buffer[KBD_BUFFER_SIZE];
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
247
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
248 /* Pointer to next available character in kbd_buffer.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
249 If kbd_fetch_ptr == kbd_store_ptr, the buffer is empty.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
250 This may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the the
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
251 next available char is in kbd_buffer[0]. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
252 static struct input_event *kbd_fetch_ptr;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
253
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
254 /* Pointer to next place to store character in kbd_buffer. This
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
255 may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the next
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
256 character should go in kbd_buffer[0]. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
257 static struct input_event *kbd_store_ptr;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
258
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
259 /* The above pair of variables forms a "queue empty" flag. When we
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
260 enqueue a non-hook event, we increment kbd_write_count. When we
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
261 dequeue a non-hook event, we increment kbd_read_count. We say that
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
262 there is input available iff the two counters are equal.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
263
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
264 Why not just have a flag set and cleared by the enqueuing and
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
265 dequeuing functions? Such a flag could be screwed up by interrupts
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
266 at inopportune times. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
267
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
268 /* If this flag is non-zero, mouse movement events will appear in the
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
269 input stream. If is zero, mouse movement will be ignored. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
270 int do_mouse_tracking;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
272 /* The window system handling code should set this if the mouse has
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
273 moved since the last call to the mouse_position_hook. Calling that
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
274 hook should clear this. Code assumes that if this is set, it can
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
275 call mouse_position_hook to get the promised position, so don't set
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
276 it unless you're prepared to substantiate the claim! */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
277 int mouse_moved;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
278
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
279 /* True iff there is an event in kbd_buffer, or if mouse tracking is
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
280 enabled and there is a new mouse position in the mouse movement
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
281 buffer. Note that if this is false, that doesn't mean that there
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
282 is readable input; all the events in the queue might be button-up
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
283 events, and do_mouse_tracking might be off. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
284 #define EVENT_QUEUES_EMPTY \
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
285 ((kbd_fetch_ptr == kbd_store_ptr) && (!do_mouse_tracking || !mouse_moved))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
286
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
287
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288 /* Symbols to head events. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
289 Lisp_Object Qmouse_movement;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
290
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
291 Lisp_Object Qvscrollbar_part;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
292 Lisp_Object Qvslider_part;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
293 Lisp_Object Qvthumbup_part;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
294 Lisp_Object Qvthumbdown_part;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
295
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
296 Lisp_Object Qhscrollbar_part;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
297 Lisp_Object Qhslider_part;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
298 Lisp_Object Qhthumbleft_part;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
299 Lisp_Object Qhthumbright_part;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
300
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
301 /* Symbols to denote kinds of events. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
302 Lisp_Object Qfunction_key;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
303 Lisp_Object Qmouse_click;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
304 /* Lisp_Object Qmouse_movement; - also an event header */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
305 Lisp_Object Qscrollbar_click;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
306
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
307 /* Properties of event headers. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
308 Lisp_Object Qevent_kind;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
309 Lisp_Object Qevent_unmodified;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
310
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
311 /* Symbols to use for non-text mouse positions. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
312 Lisp_Object Qmode_line;
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 727
diff changeset
313 Lisp_Object Qvertical_line;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
314
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
315
648
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
316 /* Address (if not 0) of EMACS_TIME to zero out if a SIGIO interrupt
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
317 happens. */
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
318 EMACS_TIME *input_available_clear_time;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
319
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
320 /* Nonzero means use SIGIO interrupts; zero means use CBREAK mode.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
321 Default is 1 if INTERRUPT_INPUT is defined. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
322 int interrupt_input;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
323
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
324 /* Nonzero while interrupts are temporarily deferred during redisplay. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
325 int interrupts_deferred;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
326
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
327 /* nonzero means use ^S/^Q for flow control. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
328 int flow_control;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
329
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
330 /* Allow m- file to inhibit use of FIONREAD. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
331 #ifdef BROKEN_FIONREAD
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
332 #undef FIONREAD
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
333 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
334
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
335 /* We are unable to use interrupts if FIONREAD is not available,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
336 so flush SIGIO so we won't try. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
337 #ifndef FIONREAD
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
338 #ifdef SIGIO
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
339 #undef SIGIO
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
340 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
341 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
342
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
343 /* If we support X Windows, and won't get an interrupt when input
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
344 arrives from the server, poll periodically so we can detect C-g. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
345 #ifdef HAVE_X_WINDOWS
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
346 #ifndef SIGIO
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
347 #define POLL_FOR_INPUT
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
348 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
349 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
350
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
351 /* Global variable declarations. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
352
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
353 /* Function for init_keyboard to call with no args (if nonzero). */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
354 void (*keyboard_init_hook) ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
355
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
356 static int read_avail_input ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
357 static void get_input_pending ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
358
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
359 /* > 0 if we are to echo keystrokes. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
360 static int echo_keystrokes;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
361
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
362 /* Nonzero means echo each character as typed. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
363 static int immediate_echo;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
364
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
365 /* The text we're echoing in the modeline - partial key sequences,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
366 usually. '\0'-terminated. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
367 static char echobuf[100];
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
368
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
369 /* Where to append more text to echobuf if we want to. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
370 static char *echoptr;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
371
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
372 #define min(a,b) ((a)<(b)?(a):(b))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
373 #define max(a,b) ((a)>(b)?(a):(b))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
374
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
375 /* Install the string STR as the beginning of the string of echoing,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
376 so that it serves as a prompt for the next character.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
377 Also start echoing. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
378
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
379 echo_prompt (str)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
380 char *str;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
381 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
382 int len = strlen (str);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
383 if (len > sizeof echobuf - 4)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
384 len = sizeof echobuf - 4;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
385 bcopy (str, echobuf, len + 1);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
386 echoptr = echobuf + len;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
387
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
388 echo ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
389 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
390
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
391 /* Add C to the echo string, if echoing is going on.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
392 C can be a character, which is printed prettily ("M-C-x" and all that
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
393 jazz), or a symbol, whose name is printed. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
394
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
395 echo_char (c)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
396 Lisp_Object c;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
397 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
398 extern char *push_key_description ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
399
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
400 if (immediate_echo)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
401 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
402 char *ptr = echoptr;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
403
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
404 if (ptr != echobuf)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
405 *ptr++ = ' ';
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
406
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
407 /* If someone has passed us a composite event, use its head symbol. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
408 if (EVENT_HAS_PARAMETERS (c))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
409 c = EVENT_HEAD (c);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
410
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
411 if (XTYPE (c) == Lisp_Int)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
412 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
413 if (ptr - echobuf > sizeof echobuf - 6)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
414 return;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
415
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
416 ptr = push_key_description (c, ptr);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
417 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
418 else if (XTYPE (c) == Lisp_Symbol)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
419 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
420 struct Lisp_String *name = XSYMBOL (c)->name;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
421 if (((ptr - echobuf) + name->size + 4) > sizeof echobuf)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
422 return;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
423 bcopy (name->data, ptr, name->size);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
424 ptr += name->size;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
425 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
426
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
427 if (echoptr == echobuf && c == help_char)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
428 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
429 strcpy (ptr, " (Type ? for further options)");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
430 ptr += strlen (ptr);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
431 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
432
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
433 *ptr = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
434 echoptr = ptr;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
435
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
436 echo ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
437 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
438 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
439
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
440 /* Temporarily add a dash to the end of the echo string if it's not
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
441 empty, so that it serves as a mini-prompt for the very next character. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
442
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
443 echo_dash ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
444 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
445 if (!immediate_echo && echoptr == echobuf)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
446 return;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
447
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
448 /* Put a dash at the end of the buffer temporarily,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
449 but make it go away when the next character is added. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
450 echoptr[0] = '-';
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
451 echoptr[1] = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
452
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
453 echo ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
454 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
455
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
456 /* Display the current echo string, and begin echoing if not already
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
457 doing so. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
458
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
459 echo ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
460 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
461 if (!immediate_echo)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
462 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
463 int i;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
464 immediate_echo = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
465
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
466 for (i = 0; i < this_command_key_count; i++)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
467 echo_char (this_command_keys[i]);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
468 echo_dash ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
469 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
470
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
471 echoing = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
472 message1 (echobuf);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
473 echoing = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
474
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
475 if (waiting_for_input && !NILP (Vquit_flag))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
476 quit_throw_to_read_char ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
477 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
478
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
479 /* Turn off echoing, for the start of a new command. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
480
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
481 cancel_echoing ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
482 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
483 immediate_echo = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
484 echoptr = echobuf;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
485 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
486
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
487 /* Return the length of the current echo string. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
488
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
489 static int
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
490 echo_length ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
491 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
492 return echoptr - echobuf;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
493 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
494
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
495 /* Truncate the current echo message to its first LEN chars.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
496 This and echo_char get used by read_key_sequence when the user
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
497 switches frames while entering a key sequence. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
498
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
499 static void
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
500 echo_truncate (len)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
501 int len;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
502 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
503 echobuf[len] = '\0';
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
504 echoptr = echobuf + strlen (echobuf);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
505 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
506
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
507
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
508 /* Functions for manipulating this_command_keys. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
509 static void
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
510 add_command_key (key)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
511 Lisp_Object key;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
512 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
513 if (this_command_key_count == this_command_keys_size)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
514 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
515 this_command_keys_size *= 2;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
516 this_command_keys
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
517 = (Lisp_Object *) xrealloc (this_command_keys,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
518 (this_command_keys_size
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
519 * sizeof (Lisp_Object)));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
520 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
521 this_command_keys[this_command_key_count++] = key;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
522 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
523
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
524 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
525 recursive_edit_1 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
526 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
527 int count = specpdl_ptr - specpdl;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
528 Lisp_Object val;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
529
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
530 if (command_loop_level > 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
531 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
532 specbind (Qstandard_output, Qt);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
533 specbind (Qstandard_input, Qt);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
534 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
535
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
536 val = command_loop ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
537 if (EQ (val, Qt))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
538 Fsignal (Qquit, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
539
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
540 unbind_to (count);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
541 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
542 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
543
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
544 /* When an auto-save happens, record the "time", and don't do again soon. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
545 record_auto_save ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
546 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
547 last_auto_save = num_input_chars;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
548 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
549
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
550 Lisp_Object recursive_edit_unwind (), command_loop ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
551
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
552 DEFUN ("recursive-edit", Frecursive_edit, Srecursive_edit, 0, 0, "",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
553 "Invoke the editor command loop recursively.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
554 To get out of the recursive edit, a command can do `(throw 'exit nil)';\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
555 that tells this function to return.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
556 Alternately, `(throw 'exit t)' makes this function signal an error.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
557 This function is called by the editor initialization to begin editing.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
558 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
559 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
560 int count = specpdl_ptr - specpdl;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
561 Lisp_Object val;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
562
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
563 command_loop_level++;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
564 update_mode_lines = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
565
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
566 record_unwind_protect (recursive_edit_unwind,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
567 (command_loop_level
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
568 && current_buffer != XBUFFER (XWINDOW (selected_window)->buffer))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
569 ? Fcurrent_buffer ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
570 : Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
571 recursive_edit_1 ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
572 return unbind_to (count, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
573 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
574
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
575 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
576 recursive_edit_unwind (buffer)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
577 Lisp_Object buffer;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
578 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
579 if (!NILP (buffer))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
580 Fset_buffer (buffer);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
581
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
582 command_loop_level--;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
583 update_mode_lines = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
584 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
585 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
586
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
587 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
588 cmd_error (data)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
589 Lisp_Object data;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
590 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
591 Lisp_Object errmsg, tail, errname, file_error;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
592 Lisp_Object stream;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
593 struct gcpro gcpro1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
594 int i;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
595
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
596 Vquit_flag = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
597 Vinhibit_quit = Qt;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
598 Vstandard_output = Qt;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
599 Vstandard_input = Qt;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
600 Vexecuting_macro = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
601 echo_area_glyphs = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
602
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
603 /* If the window system or terminal frame hasn't been initialized
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
604 yet, or we're not interactive, it's best to dump this message out
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
605 to stderr and exit. */
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
606 if (! FRAME_MESSAGE_BUF (selected_frame)
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
607 || noninteractive)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
608 stream = Qexternal_debugging_output;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
609 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
610 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
611 Fdiscard_input ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
612 bitch_at_user ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
613 stream = Qt;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
614 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
615
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
616 errname = Fcar (data);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
617
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
618 if (EQ (errname, Qerror))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
619 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
620 data = Fcdr (data);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
621 if (!CONSP (data)) data = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
622 errmsg = Fcar (data);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
623 file_error = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
624 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
625 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
626 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
627 errmsg = Fget (errname, Qerror_message);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
628 file_error = Fmemq (Qfile_error,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
629 Fget (errname, Qerror_conditions));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
630 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
631
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
632 /* Print an error message including the data items.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
633 This is done by printing it into a scratch buffer
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
634 and then making a copy of the text in the buffer. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
635
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
636 if (!CONSP (data)) data = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
637 tail = Fcdr (data);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
638 GCPRO1 (tail);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
639
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
640 /* For file-error, make error message by concatenating
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
641 all the data items. They are all strings. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
642 if (!NILP (file_error) && !NILP (tail))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
643 errmsg = XCONS (tail)->car, tail = XCONS (tail)->cdr;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
644
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
645 if (XTYPE (errmsg) == Lisp_String)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
646 Fprinc (errmsg, stream);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
647 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
648 write_string_1 ("peculiar error", -1, stream);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
649
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
650 for (i = 0; CONSP (tail); tail = Fcdr (tail), i++)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
651 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
652 write_string_1 (i ? ", " : ": ", 2, stream);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
653 if (!NILP (file_error))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
654 Fprinc (Fcar (tail), stream);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
655 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
656 Fprin1 (Fcar (tail), stream);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
657 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
658 UNGCPRO;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
659
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
660 /* If the window system or terminal frame hasn't been initialized
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
661 yet, or we're in -batch mode, this error should cause Emacs to exit. */
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
662 if (! FRAME_MESSAGE_BUF (selected_frame)
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
663 || noninteractive)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
664 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
665 Fterpri (stream);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
666 Fkill_emacs (make_number (-1));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
667 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
668
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
669 Vquit_flag = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
670
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
671 Vinhibit_quit = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
672 return make_number (0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
673 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
674
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
675 Lisp_Object command_loop_1 ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
676 Lisp_Object command_loop_2 ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
677 Lisp_Object top_level_1 ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
678
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
679 /* Entry to editor-command-loop.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
680 This level has the catches for exiting/returning to editor command loop.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
681 It returns nil to exit recursive edit, t to abort it. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
682
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
683 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
684 command_loop ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
685 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
686 if (command_loop_level > 0 || minibuf_level > 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
687 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
688 return internal_catch (Qexit, command_loop_2, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
689 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
690 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
691 while (1)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
692 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
693 internal_catch (Qtop_level, top_level_1, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
694 internal_catch (Qtop_level, command_loop_2, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
695
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
696 /* End of file in -batch run causes exit here. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
697 if (noninteractive)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
698 Fkill_emacs (Qt);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
699 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
700 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
701
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
702 /* Here we catch errors in execution of commands within the
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
703 editing loop, and reenter the editing loop.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
704 When there is an error, cmd_error runs and returns a non-nil
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
705 value to us. A value of nil means that cmd_loop_1 itself
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
706 returned due to end of file (or end of kbd macro). */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
707
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
708 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
709 command_loop_2 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
710 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
711 register Lisp_Object val;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
712
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
713 do
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
714 val = internal_condition_case (command_loop_1, Qerror, cmd_error);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
715 while (!NILP (val));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
716
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
717 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
718 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
719
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
720 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
721 top_level_2 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
722 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
723 return Feval (Vtop_level);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
724 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
725
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
726 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
727 top_level_1 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
728 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
729 /* On entry to the outer level, run the startup file */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
730 if (!NILP (Vtop_level))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
731 internal_condition_case (top_level_2, Qerror, cmd_error);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
732 else if (!NILP (Vpurify_flag))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
733 message ("Bare impure Emacs (standard Lisp code not loaded)");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
734 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
735 message ("Bare Emacs (standard Lisp code not loaded)");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
736 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
737 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
738
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
739 DEFUN ("top-level", Ftop_level, Stop_level, 0, 0, "",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
740 "Exit all recursive editing levels.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
741 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
742 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
743 Fthrow (Qtop_level, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
744 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
745
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
746 DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, "",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
747 "Exit from the innermost recursive edit or minibuffer.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
748 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
749 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
750 if (command_loop_level > 0 || minibuf_level > 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
751 Fthrow (Qexit, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
752
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
753 error ("No recursive edit is in progress");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
754 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
755
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
756 DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 0, 0, "",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
757 "Abort the command that requested this recursive edit or minibuffer input.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
758 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
759 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
760 if (command_loop_level > 0 || minibuf_level > 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
761 Fthrow (Qexit, Qt);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
762
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
763 error ("No recursive edit is in progress");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
764 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
765
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
766 /* This is the actual command reading loop,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
767 sans error-handling encapsulation. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
768
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
769 Lisp_Object Fcommand_execute ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
770 static int read_key_sequence ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
771
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
772 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
773 command_loop_1 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
774 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
775 Lisp_Object cmd;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
776 int lose;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
777 int nonundocount;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
778 Lisp_Object keybuf[30];
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
779 int i;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
780 int no_redisplay;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
781 int no_direct;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
782
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
783 Vprefix_arg = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
784 waiting_for_input = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
785 cancel_echoing ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
786
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
787 /* Don't clear out last_command at the beginning of a macro. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
788 if (XTYPE (Vexecuting_macro) != Lisp_String)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
789 last_command = Qt;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
790
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
791 nonundocount = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
792 no_redisplay = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
793 this_command_key_count = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
794
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
795 while (1)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
796 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
797 /* Install chars successfully executed in kbd macro. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
798
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
799 if (defining_kbd_macro && NILP (Vprefix_arg))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
800 finalize_kbd_macro_chars ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
801
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
802 /* Make sure the current window's buffer is selected. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
803 if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
804 set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
805
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
806 /* Display any malloc warning that just came out. Use while because
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
807 displaying one warning can cause another. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
808
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
809 while (pending_malloc_warning)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
810 display_malloc_warning ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
811
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
812 no_direct = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
813
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
814 /* If minibuffer on and echo area in use,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
815 wait 2 sec and redraw minibufer. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
816
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
817 if (minibuf_level && echo_area_glyphs)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
818 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
819 Fsit_for (make_number (2), Qnil, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
820 echo_area_glyphs = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
821 no_direct = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
822 if (!NILP (Vquit_flag))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
823 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
824 Vquit_flag = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
825 unread_command_char = make_number (quit_char);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
826 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
827 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
828
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
829 #ifdef C_ALLOCA
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
830 alloca (0); /* Cause a garbage collection now */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
831 /* Since we can free the most stuff here. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
832 #endif /* C_ALLOCA */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
833
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
834 /* Read next key sequence; i gets its length. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
835 i = read_key_sequence (keybuf, (sizeof keybuf / sizeof (keybuf[0])), 0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
836
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
837 ++num_input_keys;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
838
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
839 #ifdef MULTI_FRAME
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
840 /* Select the frame that the key sequence came from. */
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
841 if (XTYPE (Vlast_event_frame) == Lisp_Frame
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
842 && XFRAME (Vlast_event_frame) != selected_frame)
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
843 Fselect_frame (Vlast_event_frame, Qnil);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
844 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
845
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
846 /* Now we have read a key sequence of length I,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
847 or else I is 0 and we found end of file. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
848
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
849 if (i == 0) /* End of file -- happens only in */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
850 return Qnil; /* a kbd macro, at the end. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
851
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
852 #if 0
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
853 #ifdef HAVE_X_WINDOWS
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
854 if (FRAME_IS_X (selected_frame))
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
855 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
856 if (i == -1) /* Mouse event */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
857 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
858 nonundocount = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
859 if (NILP (Vprefix_arg) && NILP (Vexecuting_macro) &&
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
860 !EQ (minibuf_window, selected_window))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
861 Fundo_boundary ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
862
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
863 if (defining_kbd_macro)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
864 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
865 /* Be nice if this worked... */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
866 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
867 Fexecute_mouse_event (read_key_sequence_cmd);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
868 no_redisplay = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
869 goto directly_done;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
870 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
871
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
872 if (i == -2) /* Lisp Symbol */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
873 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
874 nonundocount = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
875 if (NILP (Vprefix_arg) && NILP (Vexecuting_macro) &&
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
876 !EQ (minibuf_window, selected_window))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
877 Fundo_boundary ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
878
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
879 goto directly_done;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
880 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
881 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
882 #endif /* HAVE_X_WINDOWS */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
883 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
884
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
885 last_command_char = keybuf[i - 1];
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
886
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
887 cmd = read_key_sequence_cmd;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
888 if (!NILP (Vexecuting_macro))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
889 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
890 if (!NILP (Vquit_flag))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
891 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
892 Vexecuting_macro = Qt;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
893 QUIT; /* Make some noise. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
894 /* Will return since macro now empty. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
895 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
896 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
897
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
898 /* Do redisplay processing after this command except in special
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
899 cases identified below that set no_redisplay to 1. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
900 no_redisplay = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
901
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
902 /* Execute the command. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
903
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
904 if (NILP (cmd))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
905 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
906 /* nil means key is undefined. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
907 bitch_at_user ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
908 defining_kbd_macro = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
909 update_mode_lines = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
910 Vprefix_arg = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
911 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
912 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
913 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
914 this_command = cmd;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
915 if (NILP (Vprefix_arg) && ! no_direct)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
916 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
917 /* Recognize some common commands in common situations and
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
918 do them directly. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
919 if (EQ (cmd, Qforward_char) && point < ZV)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
920 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
921 struct Lisp_Vector *dp
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
922 = window_display_table (XWINDOW (selected_window));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
923 lose = FETCH_CHAR (point);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
924 SET_PT (point + 1);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
925 if (((dp == 0 && lose >= 040 && lose < 0177)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
926 ||
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
927 (dp && (XTYPE (dp->contents[lose]) != Lisp_String
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
928 || XSTRING (dp->contents[lose])->size == sizeof (GLYPH))))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
929 && (XFASTINT (XWINDOW (selected_window)->last_modified)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
930 >= MODIFF)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
931 && (XFASTINT (XWINDOW (selected_window)->last_point)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
932 == point - 1)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
933 && !windows_or_buffers_changed
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
934 && EQ (current_buffer->selective_display, Qnil)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
935 && !detect_input_pending ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
936 && NILP (Vexecuting_macro))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
937 no_redisplay = direct_output_forward_char (1);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
938 goto directly_done;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
939 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
940 else if (EQ (cmd, Qbackward_char) && point > BEGV)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
941 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
942 struct Lisp_Vector *dp
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
943 = window_display_table (XWINDOW (selected_window));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
944 SET_PT (point - 1);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
945 lose = FETCH_CHAR (point);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
946 if (((dp == 0 && lose >= 040 && lose < 0177)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
947 ||
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
948 (dp && (XTYPE (dp->contents[lose]) != Lisp_String
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
949 || XSTRING (dp->contents[lose])->size == sizeof (GLYPH))))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
950 && (XFASTINT (XWINDOW (selected_window)->last_modified)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
951 >= MODIFF)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
952 && (XFASTINT (XWINDOW (selected_window)->last_point)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
953 == point + 1)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
954 && !windows_or_buffers_changed
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
955 && EQ (current_buffer->selective_display, Qnil)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
956 && !detect_input_pending ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
957 && NILP (Vexecuting_macro))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
958 no_redisplay = direct_output_forward_char (-1);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
959 goto directly_done;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
960 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
961 else if (EQ (cmd, Qself_insert_command)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
962 /* Try this optimization only on ascii keystrokes. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
963 && XTYPE (last_command_char) == Lisp_Int)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
964 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
965 unsigned char c = XINT (last_command_char);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
966
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
967 if (NILP (Vexecuting_macro) &&
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
968 !EQ (minibuf_window, selected_window))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
969 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
970 if (!nonundocount || nonundocount >= 20)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
971 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
972 Fundo_boundary ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
973 nonundocount = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
974 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
975 nonundocount++;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
976 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
977 lose = (XFASTINT (XWINDOW (selected_window)->last_modified)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
978 < MODIFF)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
979 || (XFASTINT (XWINDOW (selected_window)->last_point)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
980 != point)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
981 || MODIFF <= current_buffer->save_modified
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
982 || windows_or_buffers_changed
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
983 || !EQ (current_buffer->selective_display, Qnil)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
984 || detect_input_pending ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
985 || !NILP (Vexecuting_macro);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
986 if (internal_self_insert (c, 0))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
987 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
988 lose = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
989 nonundocount = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
990 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
991 if (!lose &&
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
992 (point == ZV || FETCH_CHAR (point) == '\n'))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
993 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
994 struct Lisp_Vector *dp
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
995 = window_display_table (XWINDOW (selected_window));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
996
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
997 if (dp == 0 || XTYPE (dp->contents[c]) != Lisp_String)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
998 no_redisplay = direct_output_for_insert (c);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
999 else if (XSTRING (dp->contents[c])->size
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1000 == sizeof (GLYPH))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1001 no_redisplay =
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1002 direct_output_for_insert (*(GLYPH *)XSTRING (dp->contents[c])->data);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1003 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1004 goto directly_done;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1005 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1006 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1007
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1008 /* Here for a command that isn't executed directly */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1009
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1010 nonundocount = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1011 if (NILP (Vprefix_arg))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1012 Fundo_boundary ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1013 Fcommand_execute (cmd, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1014
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1015 }
547
1856d835aac3 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 518
diff changeset
1016 directly_done: ;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1017
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1018 /* If there is a prefix argument,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1019 1) We don't want last_command to be ``universal-argument''
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1020 (that would be dumb), so don't set last_command,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1021 2) we want to leave echoing on so that the prefix will be
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1022 echoed as part of this key sequence, so don't call
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1023 cancel_echoing, and
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1024 3) we want to leave this_command_key_count non-zero, so that
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1025 read_char will realize that it is re-reading a character, and
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1026 not echo it a second time. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1027 if (NILP (Vprefix_arg))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1028 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1029 last_command = this_command;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1030 cancel_echoing ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1031 this_command_key_count = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1032 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1033 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1034 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1035
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1036 /* Number of seconds between polling for input. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1037 int polling_period;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1038
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1039 /* Nonzero means polling for input is temporarily suppresed. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1040 int poll_suppress_count;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1041
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1042 #ifdef POLL_FOR_INPUT
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1043 int polling_for_input;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1044
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1045 /* Handle an alarm once each second and read pending input
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1046 so as to handle a C-g if it comces in. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1047
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1048 SIGTYPE
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1049 input_poll_signal ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1050 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1051 #ifdef HAVE_X_WINDOWS
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1052 extern int x_input_blocked;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1053 if (x_input_blocked == 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1054 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1055 if (!waiting_for_input)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1056 read_avail_input (0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1057 signal (SIGALRM, input_poll_signal);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1058 alarm (polling_period);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1059 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1060
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1061 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1062
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1063 /* Begin signals to poll for input, if they are appropriate.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1064 This function is called unconditionally from various places. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1065
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1066 start_polling ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1067 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1068 #ifdef POLL_FOR_INPUT
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1069 if (read_socket_hook)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1070 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1071 poll_suppress_count--;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1072 if (poll_suppress_count == 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1073 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1074 signal (SIGALRM, input_poll_signal);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1075 polling_for_input = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1076 alarm (polling_period);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1077 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1078 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1079 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1080 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1081
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1082 /* Turn off polling. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1083
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1084 stop_polling ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1085 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1086 #ifdef POLL_FOR_INPUT
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1087 if (read_socket_hook)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1088 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1089 if (poll_suppress_count == 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1090 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1091 polling_for_input = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1092 alarm (0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1093 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1094 poll_suppress_count++;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1095 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1096 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1097 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1098
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1099 /* Input of single characters from keyboard */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1100
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1101 Lisp_Object print_help ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1102 static Lisp_Object kbd_buffer_get_event ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1103
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1104 /* read a character from the keyboard; call the redisplay if needed */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1105 /* commandflag 0 means do not do auto-saving, but do do redisplay.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1106 -1 means do not do redisplay, but do do autosaving.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1107 1 means do both. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1108
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1109 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1110 read_char (commandflag)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1111 int commandflag;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1112 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1113 register Lisp_Object c;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1114 int count;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1115 jmp_buf save_jump;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1116
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1117 if (!NILP (unread_command_char))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1118 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1119 c = unread_command_char;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1120 unread_command_char = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1121
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1122 #if 0 /* We're not handling mouse keys specially anymore. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1123 if (!EQ (XTYPE (obj), Lisp_Int)) /* Mouse thing */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1124 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1125 num_input_chars++;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1126 last_input_char = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1127 return obj;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1128 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1129 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1130
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1131 if (this_command_key_count == 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1132 goto reread_first;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1133 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1134 goto reread;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1135 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1136
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1137 if (!NILP (Vexecuting_macro))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1138 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1139 if (executing_macro_index >= Flength (Vexecuting_macro))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1140 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1141 XSET (c, Lisp_Int, -1);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1142 return c;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1143 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1144
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1145 c = Faref (Vexecuting_macro, make_number (executing_macro_index));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1146 executing_macro_index++;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1147
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1148 goto from_macro;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1149 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1150
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1151 /* Save outer setjmp data, in case called recursively. */
650
39f0e62a8511 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 648
diff changeset
1152 save_getcjmp (save_jump);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1153
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1154 stop_polling ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1155
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1156 if (commandflag >= 0 && !input_pending && !detect_input_pending ())
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1157 redisplay ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1158
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1159 if (_setjmp (getcjmp))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1160 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1161 XSET (c, Lisp_Int, quit_char);
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1162 #ifdef MULTI_FRAME
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1163 XSET (Vlast_event_frame, Lisp_Frame, selected_frame);
586
c792b1df8110 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 562
diff changeset
1164 #endif
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1165
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1166 goto non_reread;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1167 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1168
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1169 /* Message turns off echoing unless more keystrokes turn it on again. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1170 if (echo_area_glyphs && *echo_area_glyphs && echo_area_glyphs != echobuf)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1171 cancel_echoing ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1172 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1173 /* If already echoing, continue. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1174 echo_dash ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1175
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1176 /* If in middle of key sequence and minibuffer not active,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1177 start echoing if enough time elapses. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1178 if (minibuf_level == 0 && !immediate_echo && this_command_key_count > 0
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1179 && echo_keystrokes > 0
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1180 && (echo_area_glyphs == 0 || *echo_area_glyphs == 0))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1181 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1182 Lisp_Object tem0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1183
650
39f0e62a8511 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 648
diff changeset
1184 tem0 = sit_for (echo_keystrokes, 0, 1, 1);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1185 if (EQ (tem0, Qt))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1186 echo ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1187 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1188
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1189 /* Maybe auto save due to number of keystrokes or idle time. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1190
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1191 if (commandflag != 0
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1192 && auto_save_interval > 0
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1193 && num_input_chars - last_auto_save > max (auto_save_interval, 20)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1194 && !detect_input_pending ())
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1195 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1196 jmp_buf temp;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1197 save_getcjmp (temp);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1198 Fdo_auto_save (Qnil, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1199 restore_getcjmp (temp);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1200 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1201
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1202 /* Slow down auto saves logarithmically in size of current buffer,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1203 and garbage collect while we're at it. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1204 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1205 int delay_level, buffer_size;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1206
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1207 if (! MINI_WINDOW_P (XWINDOW (selected_window)))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1208 last_non_minibuf_size = Z - BEG;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1209 buffer_size = (last_non_minibuf_size >> 8) + 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1210 delay_level = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1211 while (buffer_size > 64)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1212 delay_level++, buffer_size -= buffer_size >> 2;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1213 if (delay_level < 4) delay_level = 4;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1214 /* delay_level is 4 for files under around 50k, 7 at 100k,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1215 9 at 200k, 11 at 300k, and 12 at 500k. It is 15 at 1 meg. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1216
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1217 /* Auto save if enough time goes by without input. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1218 if (commandflag != 0
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1219 && num_input_chars > last_auto_save
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1220 && XTYPE (Vauto_save_timeout) == Lisp_Int
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1221 && XINT (Vauto_save_timeout) > 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1222 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1223 Lisp_Object tem0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1224 int delay = delay_level * XFASTINT (Vauto_save_timeout) / 4;
650
39f0e62a8511 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 648
diff changeset
1225 tem0 = sit_for (delay, 0, 1, 1);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1226 if (EQ (tem0, Qt))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1227 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1228 jmp_buf temp;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1229 save_getcjmp (temp);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1230 Fdo_auto_save (Qnil, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1231 restore_getcjmp (temp);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1232
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1233 /* If we have auto-saved and there is still no input
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1234 available, garbage collect if there has been enough
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1235 consing going on to make it worthwhile. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1236 if (!detect_input_pending ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1237 && consing_since_gc > gc_cons_threshold / 2)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1238 Fgarbage_collect ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1239 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1240 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1241 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1242
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1243 /* Actually read a character, waiting if necessary. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1244 c = kbd_buffer_get_event ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1245
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1246 if (NILP (c))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1247 abort (); /* Don't think this can happen. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1248
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1249 #if 0 /* I think that all the different kinds of events should be
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1250 handled together now... */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1251 if (XTYPE (c) != Lisp_Int)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1252 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1253 start_polling ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1254 return c;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1255 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1256 c = XINT (obj);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1257 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1258
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1259 /* Terminate Emacs in batch mode if at eof. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1260 if (noninteractive && c < 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1261 Fkill_emacs (make_number (1));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1262
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1263 non_reread:
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1264
650
39f0e62a8511 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 648
diff changeset
1265 restore_getcjmp (save_jump);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1266
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1267 start_polling ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1268
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1269 echo_area_glyphs = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1270
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1271 /* Handle things that only apply to characters. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1272 if (XTYPE (c) == Lisp_Int)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1273 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1274 /* If kbd_buffer_get_event gave us an EOF, return that. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1275 if (XINT (c) < 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1276 return c;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1277
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1278 /* Strip the high bits, and maybe the meta bit too. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1279 XSETINT (c, c & (meta_key ? 0377 : 0177));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1280
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1281 if (XTYPE (Vkeyboard_translate_table) == Lisp_String
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1282 && XSTRING (Vkeyboard_translate_table)->size > XINT (c))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1283 XSETINT (c, XSTRING (Vkeyboard_translate_table)->data[c]);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1284 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1285
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1286 total_keys++;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1287 recent_keys[recent_keys_index] = c;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1288 if (++recent_keys_index >= (sizeof (recent_keys)/sizeof(recent_keys[0])))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1289 recent_keys_index = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1290
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1291 /* Write c to the dribble file. If c is a lispy event, write
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1292 the event's symbol to the dribble file, in <brackets>. Bleaugh.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1293 If you, dear reader, have a better idea, you've got the source. :-) */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1294 if (dribble)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1295 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1296 if (XTYPE (c) == Lisp_Int)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1297 putc (c, dribble);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1298 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1299 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1300 Lisp_Object dribblee = c;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1301
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1302 /* If it's a structured event, take the event header. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1303 if (EVENT_HAS_PARAMETERS (dribblee))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1304 dribblee = EVENT_HEAD (dribblee);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1305
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1306 if (XTYPE (c) == Lisp_Symbol)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1307 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1308 putc ('<', dribble);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1309 fwrite (XSYMBOL (c)->name->data, sizeof (char),
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1310 XSYMBOL (c)->name->size,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1311 dribble);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1312 putc ('>', dribble);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1313 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1314 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1315
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1316 fflush (dribble);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1317 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1318
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1319 store_kbd_macro_char (c);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1320
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1321 from_macro:
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1322 reread_first:
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1323 echo_char (c);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1324
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1325 /* Record this character as part of the current key. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1326 add_command_key (c);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1327
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1328 /* Re-reading in the middle of a command */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1329 reread:
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1330 last_input_char = c;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1331 num_input_chars++;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1332
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1333 /* Process the help character specially if enabled */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1334 if (EQ (c, help_char) && !NILP (Vhelp_form))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1335 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1336 Lisp_Object tem0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1337 count = specpdl_ptr - specpdl;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1338
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1339 record_unwind_protect (Fset_window_configuration,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1340 Fcurrent_window_configuration (Qnil));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1341
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1342 tem0 = Feval (Vhelp_form);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1343 if (XTYPE (tem0) == Lisp_String)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1344 internal_with_output_to_temp_buffer ("*Help*", print_help, tem0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1345
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1346 cancel_echoing ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1347 c = read_char (0);
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1348 /* Remove the help from the frame */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1349 unbind_to (count, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1350 redisplay ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1351 if (EQ (c, make_number (040)))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1352 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1353 cancel_echoing ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1354 c = read_char (0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1355 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1356 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1357
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1358 return c;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1359 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1360
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1361 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1362 print_help (object)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1363 Lisp_Object object;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1364 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1365 Fprinc (object, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1366 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1367 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1368
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1369 /* Copy out or in the info on where C-g should throw to.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1370 This is used when running Lisp code from within get_char,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1371 in case get_char is called recursively.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1372 See read_process_output. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1373
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1374 save_getcjmp (temp)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1375 jmp_buf temp;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1376 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1377 bcopy (getcjmp, temp, sizeof getcjmp);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1378 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1379
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1380 restore_getcjmp (temp)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1381 jmp_buf temp;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1382 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1383 bcopy (temp, getcjmp, sizeof getcjmp);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1384 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1385
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1386
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1387 /* Low level keyboard/mouse input.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1388 kbd_buffer_store_event places events in kbd_buffer, and
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1389 kbd_buffer_get_event retrieves them.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1390 mouse_moved indicates when the mouse has moved again, and
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1391 *mouse_position_hook provides the mouse position. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1392
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1393 /* Set this for debugging, to have a way to get out */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1394 int stop_character;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1395
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1396 extern int frame_garbaged;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1397
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1398 /* Return true iff there are any events in the queue that read-char
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1399 would return. If this returns false, a read-char would block. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1400 static int
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1401 readable_events ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1402 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1403 struct input_event *ep;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1404
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1405 if (EVENT_QUEUES_EMPTY)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1406 return 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1407
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1408 if (do_mouse_tracking)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1409 return 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1410
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1411 /* Mouse tracking is disabled, so we need to actually scan the
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1412 input queue to see if any events are currently readable. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1413 for (ep = kbd_fetch_ptr; ep != kbd_store_ptr; ep++)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1414 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1415 if (ep == kbd_buffer + KBD_BUFFER_SIZE)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1416 ep = kbd_buffer;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1417
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1418 /* Skip button-up events. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1419 if ((ep->kind == mouse_click || ep->kind == scrollbar_click)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1420 && (ep->modifiers & up_modifier))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1421 continue;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1422
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1423 return 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1424 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1425
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1426 return 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1427 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1428
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1429
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1430 /* Restore mouse tracking enablement. See Ftrack_mouse for the only use
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1431 of this function. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1432 static Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1433 tracking_off (old_value)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1434 Lisp_Object old_value;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1435 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1436 if (! XFASTINT (old_value))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1437 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1438 do_mouse_tracking = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1439
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1440 /* Redisplay may have been preempted because there was input
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1441 available, and it assumes it will be called again after the
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1442 input has been processed. If the only input available was
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1443 the sort that we have just disabled, then we need to call
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1444 redisplay. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1445 if (!readable_events ())
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1446 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1447 redisplay_preserve_echo_area ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1448 get_input_pending (&input_pending);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1449 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1450 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1451 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1452
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1453 DEFUN ("track-mouse", Ftrack_mouse, Strack_mouse, 0, UNEVALLED, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1454 "Evaluate BODY with mouse movement and button release events enabled.\n\
682
71f59bd24996 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 650
diff changeset
1455 Within a `track-mouse', mouse motion and button releases generate input\n\
71f59bd24996 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 650
diff changeset
1456 events that you can read with `read-event'.\n\
71f59bd24996 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 650
diff changeset
1457 Normally, these occurrences don't generate events.")
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1458 (args)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1459 Lisp_Object args;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1460 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1461 int count = specpdl_ptr - specpdl;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1462 Lisp_Object val;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1463
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1464 XSET (val, Lisp_Int, do_mouse_tracking);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1465 record_unwind_protect (tracking_off, val);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1466
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1467 do_mouse_tracking = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1468
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1469 val = Fprogn (args);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1470 return unbind_to (count, val);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1471 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1472
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1473 /* Store an event obtained at interrupt level into kbd_buffer, fifo */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1474
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1475 void
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1476 kbd_buffer_store_event (event)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1477 register struct input_event *event;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1478 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1479 if (event->kind == no_event)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1480 abort ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1481
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1482 if (event->kind == ascii_keystroke)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1483 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1484 register int c = XFASTINT (event->code) & 0377;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1485
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1486 if (c == quit_char
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1487 || ((c == (0200 | quit_char)) && !meta_key))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1488 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1489 /* If this results in a quit_char being returned to Emacs as
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1490 input, set last-event-frame properly. If this doesn't
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1491 get returned to Emacs as an event, the next event read
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1492 will set Vlast_event_frame again, so this is safe to do. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1493 extern SIGTYPE interrupt_signal ();
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1494 Vlast_event_frame = FRAME_FOCUS_FRAME (event->frame);
648
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
1495 last_event_timestamp = event->timestamp;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1496 interrupt_signal ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1497 return;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1498 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1499
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1500 if (c && c == stop_character)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1501 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1502 sys_suspend ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1503 return;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1504 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1505
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1506 XSET (event->code, Lisp_Int, c);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1507 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1508
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1509 if (kbd_store_ptr - kbd_buffer == KBD_BUFFER_SIZE)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1510 kbd_store_ptr = kbd_buffer;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1511
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1512 /* Don't let the very last slot in the buffer become full,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1513 since that would make the two pointers equal,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1514 and that is indistinguishable from an empty buffer.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1515 Discard the event if it would fill the last slot. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1516 if (kbd_fetch_ptr - 1 != kbd_store_ptr)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1517 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1518 kbd_store_ptr->kind = event->kind;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1519 kbd_store_ptr->code = event->code;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1520 kbd_store_ptr->part = event->part;
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1521 kbd_store_ptr->frame = event->frame;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1522 kbd_store_ptr->modifiers = event->modifiers;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1523 kbd_store_ptr->x = event->x;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1524 kbd_store_ptr->y = event->y;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1525 kbd_store_ptr->timestamp = event->timestamp;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1526
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1527 kbd_store_ptr++;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1528 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1529 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1530
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1531 static Lisp_Object make_lispy_event ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1532 static Lisp_Object make_lispy_movement ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1533 static Lisp_Object modify_event_symbol ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1534
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1535 static Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1536 kbd_buffer_get_event ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1537 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1538 register int c;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1539 Lisp_Object obj;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1540
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1541 if (noninteractive)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1542 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1543 c = getchar ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1544 XSET (obj, Lisp_Int, c);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1545 return obj;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1546 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1547
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1548 /* Wait until there is input available. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1549 for (;;)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1550 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1551
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1552 /* Process or toss any events that we don't want to return as
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1553 input. The fact that we remove undesirable events here
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1554 allows us to use EVENT_QUEUES_EMPTY in the rest of this loop. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1555 if (! do_mouse_tracking)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1556 while (kbd_fetch_ptr != kbd_store_ptr)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1557 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1558 if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1559 kbd_fetch_ptr = kbd_buffer;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1560
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1561 if (kbd_fetch_ptr->kind == mouse_click
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1562 || kbd_fetch_ptr->kind == scrollbar_click)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1563 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1564 if ((kbd_fetch_ptr->modifiers & up_modifier) == 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1565 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1566 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1567 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1568 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1569
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1570 kbd_fetch_ptr++;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1571 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1572
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1573 if (!EVENT_QUEUES_EMPTY)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1574 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1575
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1576 /* If the quit flag is set, then read_char will return
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1577 quit_char, so that counts as "available input." */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1578 if (!NILP (Vquit_flag))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1579 quit_throw_to_read_char ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1580
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1581 /* One way or another, wait until input is available; then, if
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1582 interrupt handlers have not read it, read it now. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1583
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1584 #ifdef OLDVMS
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1585 wait_for_kbd_input ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1586 #else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1587 /* Note SIGIO has been undef'd if FIONREAD is missing. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1588 #ifdef SIGIO
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1589 gobble_input (0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1590 #endif /* SIGIO */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1591 if (EVENT_QUEUES_EMPTY)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1592 {
650
39f0e62a8511 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 648
diff changeset
1593 Lisp_Object minus_one;
39f0e62a8511 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 648
diff changeset
1594
39f0e62a8511 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 648
diff changeset
1595 XSET (minus_one, Lisp_Int, -1);
39f0e62a8511 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 648
diff changeset
1596 wait_reading_process_input (0, 0, minus_one, 1);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1597
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1598 if (!interrupt_input && EVENT_QUEUES_EMPTY)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1599 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1600 read_avail_input (0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1601 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1602 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1603 #endif /* not VMS */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1604 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1605
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1606 /* At this point, we know that there is a readable event available
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1607 somewhere. If the event queue is empty, then there must be a
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1608 mouse movement enabled and available. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1609 if (kbd_fetch_ptr != kbd_store_ptr)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1610 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1611 if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1612 kbd_fetch_ptr = kbd_buffer;
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1613 /* Do the redirection specified by the focus_frame
727
540b047ece4d *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 721
diff changeset
1614 member now, before we return this event. */
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1615 kbd_fetch_ptr->frame =
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1616 XFRAME (FRAME_FOCUS_FRAME (kbd_fetch_ptr->frame));
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1617 XSET (Vlast_event_frame, Lisp_Frame, kbd_fetch_ptr->frame);
708
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
1618 last_event_timestamp = kbd_fetch_ptr->timestamp;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1619 obj = make_lispy_event (kbd_fetch_ptr);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1620 kbd_fetch_ptr->kind = no_event;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1621 kbd_fetch_ptr++;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1622 if (XTYPE (obj) == Lisp_Int)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1623 XSET (obj, Lisp_Int, XINT (obj) & (meta_key ? 0377 : 0177));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1624 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1625 else if (do_mouse_tracking && mouse_moved)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1626 {
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1627 FRAME_PTR frame;
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 727
diff changeset
1628 Lisp_Object x, y;
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 727
diff changeset
1629 unsigned long time;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1630
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1631 (*mouse_position_hook) (&frame, &x, &y, &time);
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1632 XSET (Vlast_event_frame, Lisp_Frame, frame);
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1633
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1634 obj = make_lispy_movement (frame, x, y, time);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1635 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1636 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1637 /* We were promised by the above while loop that there was
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1638 something for us to read! */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1639 abort ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1640
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1641 input_pending = readable_events ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1642
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1643 return (obj);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1644 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1645
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1646 /* Caches for modify_event_symbol. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1647 static Lisp_Object func_key_syms;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1648 static Lisp_Object mouse_syms;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1649
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1650 /* You'll notice that this table is arranged to be conveniently
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1651 indexed by X Windows keysym values. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1652 static char *lispy_function_keys[] =
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1653 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1654 /* X Keysym value */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1655
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1656 "home", /* 0xff50 */ /* IsCursorKey */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1657 "left",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1658 "up",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1659 "right",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1660 "down",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1661 "prior",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1662 "next",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1663 "end",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1664 "begin",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1665 0, /* 0xff59 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1666 0, 0, 0, 0, 0, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1667 "select", /* 0xff60 */ /* IsMiscFunctionKey */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1668 "print",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1669 "execute",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1670 "insert",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1671 0, /* 0xff64 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1672 "undo",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1673 "redo",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1674 "menu",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1675 "find",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1676 "cancel",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1677 "help",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1678 "break", /* 0xff6b */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1679
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1680 /* Here are some keys found mostly on HP keyboards. The X event
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1681 handling code will strip bit 29, which flags vendor-specific
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1682 keysyms. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1683 "reset", /* 0x1000ff6c */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1684 "system",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1685 "user",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1686 "clearline",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1687 "insertline",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1688 "deleteline",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1689 "insertchar",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1690 "deletechar",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1691 "backtab",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1692 "kp_backtab", /* 0x1000ff75 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1693 0, /* 0xff76 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1694 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xff7f */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1695 "kp-space", /* 0xff80 */ /* IsKeypadKey */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1696 0, 0, 0, 0, 0, 0, 0, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1697 "kp-tab", /* 0xff89 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1698 0, 0, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1699 "kp-enter", /* 0xff8d */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1700 0, 0, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1701 "kp-f1", /* 0xff91 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1702 "kp-f2",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1703 "kp-f3",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1704 "kp-f4",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1705 0, /* 0xff95 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1706 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1707 "kp-multiply", /* 0xffaa */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1708 "kp-add",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1709 "kp-separator",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1710 "kp-subtract",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1711 "kp-decimal",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1712 "kp-divide", /* 0xffaf */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1713 "kp-0", /* 0xffb0 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1714 "kp-1", "kp-2", "kp-3", "kp-4", "kp-5", "kp-6", "kp-7", "kp-8", "kp-9",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1715 0, /* 0xffba */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1716 0, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1717 "kp-equal", /* 0xffbd */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1718 "f1", /* 0xffbe */ /* IsFunctionKey */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1719 "f2", "f3", "f4",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1720 "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1721 "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1722 "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1723 "f29", "f30", "f31", "f32", "f33", "f34", "f35" /* 0xffe0 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1724 };
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1725
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1726 static char *lispy_mouse_names[] =
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1727 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1728 "mouse-1", "mouse-2", "mouse-3", "mouse-4", "mouse-5"
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1729 };
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1730
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1731 /* Given a struct input_event, build the lisp event which represents
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1732 it. If EVENT is 0, build a mouse movement event from the mouse
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1733 movement buffer, which should have a movement event in it. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1734
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1735 static Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1736 make_lispy_event (event)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1737 struct input_event *event;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1738 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1739 #ifdef SWITCH_ENUM_BUG
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1740 switch ((int) event->kind)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1741 #else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1742 switch (event->kind)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1743 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1744 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1745
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1746 /* A simple keystroke. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1747 case ascii_keystroke:
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1748 return event->code;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1749 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1750
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1751 /* A function key. The symbol may need to have modifier prefixes
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1752 tacked onto it. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1753 case non_ascii_keystroke:
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1754 return modify_event_symbol (XFASTINT (event->code), event->modifiers,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1755 Qfunction_key,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1756 lispy_function_keys, &func_key_syms,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1757 (sizeof (lispy_function_keys)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1758 / sizeof (lispy_function_keys[0])));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1759 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1760
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1761 /* A mouse click - build a list of the relevant information. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1762 case mouse_click:
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1763 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1764 int part;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1765 Lisp_Object window =
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1766 window_from_coordinates (event->frame,
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1767 XINT (event->x), XINT (event->y),
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1768 &part);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1769 Lisp_Object posn;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1770
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1771 if (XTYPE (window) != Lisp_Window)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1772 posn = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1773 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1774 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1775 XSETINT (event->x, (XINT (event->x)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1776 - XINT (XWINDOW (window)->left)));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1777 XSETINT (event->y, (XINT (event->y)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1778 - XINT (XWINDOW (window)->top)));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1779
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1780 if (part == 1)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1781 posn = Qmode_line;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1782 else if (part == 2)
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 727
diff changeset
1783 posn = Qvertical_line;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1784 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1785 XSET (posn, Lisp_Int,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1786 buffer_posn_from_coords (XWINDOW (window),
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1787 XINT (event->x),
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1788 XINT (event->y)));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1789 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1790
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1791 return Fcons (modify_event_symbol (XFASTINT (event->code) - 1,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1792 event->modifiers,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1793 Qmouse_click,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1794 lispy_mouse_names, &mouse_syms,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1795 (sizeof (lispy_mouse_names)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1796 / sizeof (lispy_mouse_names[0]))),
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1797 Fcons (window,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1798 Fcons (posn,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1799 Fcons (Fcons (event->x, event->y),
708
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
1800 Fcons (make_number
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
1801 (event->timestamp),
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1802 Qnil)))));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1803 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1804
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1805 /* A scrollbar click. Build a list containing the relevant
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1806 information. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1807 case scrollbar_click:
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1808 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1809 Lisp_Object button
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1810 = modify_event_symbol (XFASTINT (event->code) - 1,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1811 event->modifiers,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1812 Qmouse_click,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1813 lispy_mouse_names, &mouse_syms,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1814 (sizeof (lispy_mouse_names)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1815 / sizeof (lispy_mouse_names[0])));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1816 return Fcons (event->part,
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1817 Fcons (FRAME_SELECTED_WINDOW (event->frame),
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1818 Fcons (button,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1819 Fcons (Fcons (event->x, event->y),
708
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
1820 Fcons (make_number
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
1821 (event->timestamp),
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1822 Qnil)))));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1823 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1824
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1825 /* The 'kind' field of the event is something we don't recognize. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1826 default:
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1827 abort();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1828 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1829 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1830
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1831 static Lisp_Object
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1832 make_lispy_movement (frame, x, y, time)
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1833 FRAME_PTR frame;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1834 Lisp_Object x, y;
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 727
diff changeset
1835 unsigned long time;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1836 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1837 Lisp_Object window;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1838 int ix, iy;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1839 Lisp_Object posn;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1840 int part;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1841
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1842 ix = XINT (x);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1843 iy = XINT (y);
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1844 window = (frame
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
1845 ? window_from_coordinates (frame, ix, iy, &part)
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1846 : Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1847 if (XTYPE (window) != Lisp_Window)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1848 posn = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1849 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1850 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1851 ix -= XINT (XWINDOW (window)->left);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1852 iy -= XINT (XWINDOW (window)->top);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1853 if (part == 1)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1854 posn = Qmode_line;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1855 else if (part == 2)
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 727
diff changeset
1856 posn = Qvertical_line;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1857 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1858 XSET (posn, Lisp_Int, buffer_posn_from_coords (XWINDOW (window),
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1859 ix, iy));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1860 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1861
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1862 XSETINT (x, ix);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1863 XSETINT (y, iy);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1864 return Fcons (Qmouse_movement,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1865 Fcons (window,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1866 Fcons (posn,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1867 Fcons (Fcons (x, y),
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 727
diff changeset
1868 Fcons (make_number (time), Qnil)))));
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1869 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1870
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1871
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1872
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1873 /* Place the written representation of MODIFIERS in BUF, '\0'-terminated,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1874 and return its length. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1875
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1876 static int
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1877 format_modifiers (modifiers, buf)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1878 int modifiers;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1879 char *buf;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1880 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1881 char *p = buf;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1882
708
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
1883 if (modifiers & ctrl_modifier) { *p++ = 'C'; *p++ = '-'; }
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1884 if (modifiers & meta_modifier) { *p++ = 'M'; *p++ = '-'; }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1885 if (modifiers & shift_modifier) { *p++ = 'S'; *p++ = '-'; }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1886 if (modifiers & up_modifier) { *p++ = 'U'; *p++ = '-'; }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1887 *p = '\0';
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1888
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1889 return p - buf;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1890 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1891
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1892
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1893 /* Given a symbol whose name begins with modifiers ("C-", "M-", etc),
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1894 return a symbol with the modifiers placed in the canonical order.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1895
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1896 Fdefine_key calls this to make sure that (for example) C-M-foo
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1897 and M-C-foo end up being equivalent in the keymap. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1898
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1899 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1900 reorder_modifiers (symbol)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1901 Lisp_Object symbol;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1902 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1903 struct Lisp_String *name;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1904 int i;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1905 int modifiers;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1906 int not_canonical;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1907
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1908 CHECK_SYMBOL (symbol, 1);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1909
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1910 modifiers = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1911 name = XSYMBOL (symbol)->name;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1912
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1913 /* Special case for things with only one modifier, which is
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1914 (hopefully) the vast majority of cases. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1915 if (! (name->size >= 4 && name->data[1] == '-' && name->data[3] == '-'))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1916 return symbol;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1917
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1918 for (i = 0; i + 1 < name->size && name->data[i + 1] == '-'; i += 2)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1919 switch (name->data[i])
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1920 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1921 case 'M':
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1922 not_canonical |= (modifiers & (meta_modifier|ctrl_modifier
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1923 |shift_modifier|up_modifier));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1924 modifiers |= meta_modifier;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1925 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1926
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1927 case 'C':
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1928 not_canonical |= (modifiers &
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1929 (ctrl_modifier|shift_modifier|up_modifier));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1930 modifiers |= ctrl_modifier;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1931 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1932
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1933 case 'S':
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1934 not_canonical |= (modifiers & (shift_modifier|up_modifier));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1935 modifiers |= shift_modifier;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1936 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1937
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1938 case 'U':
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1939 not_canonical |= (modifiers & (up_modifier));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1940 modifiers |= up_modifier;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1941 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1942
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1943 default:
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1944 goto no_more_modifiers;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1945 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1946 no_more_modifiers:
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1947
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1948 if (!not_canonical)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1949 return symbol;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1950
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1951 /* The modifiers were out of order, so find a new symbol with the
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1952 mods in order. Since the symbol name could contain nulls, we can't
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1953 use intern here; we have to use Fintern, which expects a genuine
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1954 Lisp_String, and keeps a reference to it. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1955 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1956 char *new_mods = (char *) alloca (sizeof ("C-M-S-U-"));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1957 int len = format_modifiers (modifiers, new_mods);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1958 Lisp_Object new_name = make_uninit_string (len + name->size - i);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1959
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1960 bcopy (new_mods, XSTRING (new_name)->data, len);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1961 bcopy (name->data + i, XSTRING (new_name)->data + len, name->size - i);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1962
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1963 return Fintern (new_name, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1964 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1965 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1966
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1967
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1968 /* For handling events, we often want to produce a symbol whose name
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1969 is a series of modifier key prefixes ("M-", "C-", etcetera) attached
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1970 to some base, like the name of a function key or mouse button.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1971 modify_event_symbol produces symbols of this sort.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1972
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1973 NAME_TABLE should point to an array of strings, such that NAME_TABLE[i]
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1974 is the name of the i'th symbol. TABLE_SIZE is the number of elements
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1975 in the table.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1976
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1977 SYMBOL_TABLE should be a pointer to a Lisp_Object whose value will
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1978 persist between calls to modify_event_symbol that it can use to
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1979 store a cache of the symbols it's generated for this NAME_TABLE
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1980 before.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1981
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1982 SYMBOL_NUM is the number of the base name we want from NAME_TABLE.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1983
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1984 MODIFIERS is a set of modifier bits (as given in struct input_events)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1985 whose prefixes should be applied to the symbol name.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1986
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1987 SYMBOL_KIND is the value to be placed in the event_kind property of
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1988 the returned symbol. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1989
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1990 static Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1991 modify_event_symbol (symbol_num, modifiers, symbol_kind, name_table,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1992 symbol_table, table_size)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1993 int symbol_num;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1994 unsigned modifiers;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1995 Lisp_Object symbol_kind;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1996 char **name_table;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1997 Lisp_Object *symbol_table;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1998 int table_size;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1999 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2000 Lisp_Object *slot, *unmodified_slot;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2001
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2002 /* Is this a request for a valid symbol? */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2003 if (symbol_num < 0 || symbol_num >= table_size
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2004 || modifiers >= NUM_MODIFIER_COMBOS)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2005 abort ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2006
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2007 /* If *symbol_table is not a vector of the appropriate size,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2008 set it to one. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2009 if (XTYPE (*symbol_table) != Lisp_Vector
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2010 || XVECTOR (*symbol_table)->size != table_size)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2011 *symbol_table = Fmake_vector (make_number (table_size), Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2012
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2013 unmodified_slot = slot = & XVECTOR (*symbol_table)->contents[symbol_num];
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2014
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2015 /* If there are modifier keys, there had better be a vector in
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2016 this symbol's position of the symbol_table. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2017 if (modifiers != 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2018 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2019 Lisp_Object slot_contents = *slot;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2020
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2021 /* If there isn't the right sort of vector there, put one in. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2022 if (XTYPE (slot_contents) != Lisp_Vector
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2023 || XVECTOR (slot_contents)->size != NUM_MODIFIER_COMBOS)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2024 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2025 *slot = Fmake_vector (make_number (NUM_MODIFIER_COMBOS), Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2026
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2027 /* Make sure that the vector has an entry for the unmodified
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2028 symbol, so we can put it on the event_unmodified property. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2029 if (! NILP (slot_contents))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2030 XVECTOR (*slot)->contents[0] = slot_contents;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2031 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2032 XVECTOR (*slot)->contents[0] = intern (name_table [symbol_num]);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2033 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2034 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2035
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2036 /* If this entry has been filled in with a modified symbol vector,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2037 point to the appropriate slot within that. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2038 if (XTYPE (*slot) == Lisp_Vector)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2039 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2040 unmodified_slot = & XVECTOR (*slot)->contents[0];
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2041 slot = & XVECTOR (*slot)->contents[modifiers];
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2042 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2043
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2044 /* Make sure we have an unmodified version of the symbol in its
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2045 proper place? */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2046 if (NILP (*unmodified_slot))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2047 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2048 *unmodified_slot = intern (name_table [symbol_num]);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2049 Fput (*unmodified_slot, Qevent_kind, symbol_kind);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2050 Fput (*unmodified_slot, Qevent_unmodified, *unmodified_slot);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2051 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2052
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2053 /* Have we already created a symbol for this combination of modifiers? */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2054 if (NILP (*slot))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2055 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2056 /* No, let's create one. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2057 char *modified_name
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2058 = (char *) alloca (sizeof ("C-M-S-U-")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2059 + strlen (name_table [symbol_num]));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2060
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2061 strcpy (modified_name + format_modifiers (modifiers, modified_name),
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2062 name_table [symbol_num]);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2063
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2064 *slot = intern (modified_name);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2065 Fput (*slot, Qevent_kind, symbol_kind);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2066 Fput (*slot, Qevent_unmodified, *unmodified_slot);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2067 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2068
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2069 return *slot;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2070 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2071
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2072 DEFUN ("mouse-click-p", Fmouse_click_p, Smouse_click_p, 1, 1, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2073 "Return non-nil iff OBJECT is a representation of a mouse event.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2074 A mouse event is a list of five elements whose car is a symbol of the\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2075 form <MODIFIERS>mouse-<DIGIT>. I hope this is a temporary hack.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2076 (object)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2077 Lisp_Object object;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2078 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2079 if (EVENT_HAS_PARAMETERS (object)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2080 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (object)),
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2081 Qmouse_click))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2082 return Qt;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2083 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2084 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2085 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2086
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2087 /* Store into *addr a value nonzero if terminal input chars are available.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2088 Serves the purpose of ioctl (0, FIONREAD, addr)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2089 but works even if FIONREAD does not exist.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2090 (In fact, this may actually read some input.) */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2091
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2092 static void
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2093 get_input_pending (addr)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2094 int *addr;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2095 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2096 /* First of all, have we already counted some input? */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2097 *addr = !NILP (Vquit_flag) || readable_events ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2098
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2099 /* If input is being read as it arrives, and we have none, there is none. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2100 if (*addr > 0 || (interrupt_input && ! interrupts_deferred))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2101 return;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2102
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2103 /* Try to read some input and see how much we get. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2104 gobble_input (0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2105 *addr = !NILP (Vquit_flag) || readable_events ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2106 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2107
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2108 /* Interface to read_avail_input, blocking SIGIO if necessary. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2109
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2110 int
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2111 gobble_input (expected)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2112 int expected;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2113 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2114 #ifndef VMS
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2115 #ifdef SIGIO
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2116 if (interrupt_input)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2117 {
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 586
diff changeset
2118 SIGMASKTYPE mask;
638
40b255f55df3 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 624
diff changeset
2119 mask = sigblockx (SIGIO);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2120 read_avail_input (expected);
638
40b255f55df3 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 624
diff changeset
2121 sigsetmask (mask);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2122 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2123 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2124 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2125 read_avail_input (expected);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2126 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2127 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2128
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2129 #ifndef VMS
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2130
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2131 /* Read any terminal input already buffered up by the system
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2132 into the kbd_buffer, but do not wait.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2133
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2134 EXPECTED should be nonzero if the caller knows there is some input.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2135
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2136 Except on VMS, all input is read by this function.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2137 If interrupt_input is nonzero, this function MUST be called
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2138 only when SIGIO is blocked.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2139
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2140 Returns the number of keyboard chars read, or -1 meaning
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2141 this is a bad time to try to read input. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2142
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2143 static int
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2144 read_avail_input (expected)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2145 int expected;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2146 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2147 struct input_event buf[KBD_BUFFER_SIZE];
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2148 register int i;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2149 int nread;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2150
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2151 if (read_socket_hook)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2152 /* No need for FIONREAD or fcntl; just say don't wait. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2153 nread = (*read_socket_hook) (0, buf, KBD_BUFFER_SIZE, expected, expected);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2154 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2155 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2156 unsigned char cbuf[KBD_BUFFER_SIZE];
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2157
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2158 #ifdef FIONREAD
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2159 /* Find out how much input is available. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2160 if (ioctl (0, FIONREAD, &nread) < 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2161 /* Formerly simply reported no input, but that sometimes led to
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2162 a failure of Emacs to terminate.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2163 SIGHUP seems appropriate if we can't reach the terminal. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2164 kill (getpid (), SIGHUP);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2165 if (nread == 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2166 return 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2167 if (nread > sizeof cbuf)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2168 nread = sizeof cbuf;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2169 #else /* no FIONREAD */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2170 #ifdef USG
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2171 /* Read some input if available, but don't wait. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2172 nread = sizeof cbuf;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2173 fcntl (fileno (stdin), F_SETFL, O_NDELAY);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2174 #else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2175 you lose;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2176 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2177 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2178
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2179 /* Now read; for one reason or another, this will not block. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2180 while (1)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2181 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2182 nread = read (fileno (stdin), cbuf, nread);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2183 #ifdef AIX
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2184 /* The kernel sometimes fails to deliver SIGHUP for ptys.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2185 This looks incorrect, but it isn't, because _BSD causes
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2186 O_NDELAY to be defined in fcntl.h as O_NONBLOCK,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2187 and that causes a value other than 0 when there is no input. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2188 if (nread == 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2189 kill (SIGHUP, 0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2190 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2191 /* Retry the read if it is interrupted. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2192 if (nread >= 0
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2193 || ! (errno == EAGAIN || errno == EFAULT
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2194 #ifdef EBADSLT
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2195 || errno == EBADSLT
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2196 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2197 ))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2198 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2199 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2200
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2201 #ifndef FIONREAD
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2202 #ifdef USG
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2203 fcntl (fileno (stdin), F_SETFL, 0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2204 #endif /* USG */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2205 #endif /* no FIONREAD */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2206 for (i = 0; i < nread; i++)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2207 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2208 buf[i].kind = ascii_keystroke;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2209 XSET (buf[i].code, Lisp_Int, cbuf[i]);
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2210 buf[i].frame = selected_frame;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2211 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2212 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2213
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2214 /* Scan the chars for C-g and store them in kbd_buffer. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2215 for (i = 0; i < nread; i++)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2216 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2217 kbd_buffer_store_event (&buf[i]);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2218 /* Don't look at input that follows a C-g too closely.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2219 This reduces lossage due to autorepeat on C-g. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2220 if (buf[i].kind == ascii_keystroke
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2221 && XINT(buf[i].code) == quit_char)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2222 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2223 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2224
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2225 return nread;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2226 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2227 #endif /* not VMS */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2228
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2229 #ifdef SIGIO /* for entire page */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2230 /* Note SIGIO has been undef'd if FIONREAD is missing. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2231
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2232 input_available_signal (signo)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2233 int signo;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2234 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2235 /* Must preserve main program's value of errno. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2236 int old_errno = errno;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2237 #ifdef BSD4_1
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2238 extern int select_alarmed;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2239 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2240
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2241 #ifdef USG
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2242 /* USG systems forget handlers when they are used;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2243 must reestablish each time */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2244 signal (signo, input_available_signal);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2245 #endif /* USG */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2246
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2247 #ifdef BSD4_1
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2248 sigisheld (SIGIO);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2249 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2250
648
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
2251 if (input_available_clear_time)
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
2252 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2253
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2254 while (1)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2255 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2256 int nread;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2257 nread = read_avail_input (1);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2258 /* -1 means it's not ok to read the input now.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2259 UNBLOCK_INPUT will read it later; now, avoid infinite loop.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2260 0 means there was no keyboard input available. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2261 if (nread <= 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2262 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2263
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2264 #ifdef BSD4_1
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2265 select_alarmed = 1; /* Force the select emulator back to life */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2266 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2267 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2268
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2269 #ifdef BSD4_1
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2270 sigfree ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2271 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2272 errno = old_errno;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2273 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2274 #endif /* SIGIO */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2275
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2276 /* Return the prompt-string of a sparse keymap.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2277 This is the first element which is a string.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2278 Return nil if there is none. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2279
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2280 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2281 map_prompt (map)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2282 Lisp_Object map;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2283 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2284 while (CONSP (map))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2285 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2286 register Lisp_Object tem;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2287 tem = Fcar (map);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2288 if (XTYPE (tem) == Lisp_String)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2289 return tem;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2290 map = Fcdr (map);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2291 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2292 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2293 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2294
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2295 static int echo_flag;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2296 static int echo_now;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2297
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2298 /* Read a character like read_char but optionally prompt based on maps
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2299 LOCAL and GLOBAL.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2300
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2301 The prompting is done based on the prompt-string of the map
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2302 and the strings associated with various map elements. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2303
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2304 Lisp_Object
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2305 read_char_menu_prompt (prompt, local, global)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2306 int prompt;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2307 Lisp_Object local, global;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2308 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2309 register Lisp_Object rest, name;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2310 Lisp_Object hmap;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2311 int nlength;
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2312 int width = FRAME_WIDTH (selected_frame) - 4;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2313 char *menu = (char *) alloca (width);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2314
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2315 /* Use local over global Menu maps */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2316
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2317 if (menu_prompting)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2318 return read_char (!prompt);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2319
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2320 /* We can't get prompt strings from dense keymaps. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2321 if (CONSP (local)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2322 && EQ (Fcar (local), Qkeymap)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2323 && !(CONSP (XCONS (local)->cdr)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2324 && XTYPE (XCONS (XCONS (local)->cdr)->car) == Lisp_Vector))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2325 hmap = local;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2326 else if (CONSP (global)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2327 && EQ (Fcar (global), Qkeymap)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2328 && !(CONSP (XCONS (global)->cdr)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2329 && XTYPE (XCONS (XCONS (global)->cdr)->car) == Lisp_Vector))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2330 hmap = global;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2331 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2332 return read_char (!prompt);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2333
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2334 /* Get the map's prompt string. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2335 name = map_prompt (hmap);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2336 if (NILP (name))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2337 return read_char (!prompt);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2338
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2339 /* Prompt string always starts with map's prompt, and a space. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2340 strcpy (menu, XSTRING (name)->data);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2341 nlength = XSTRING (name)->size;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2342 menu[nlength++] = ' ';
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2343 menu[nlength] = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2344
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2345 /* Start prompting at start of map. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2346 rest = hmap; /* Current menu item */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2347
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2348 /* Present the documented bindings, a line at a time. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2349 while (1)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2350 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2351 int notfirst = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2352 int i = nlength;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2353 Lisp_Object obj;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2354 int ch;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2355
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2356 /* If reached end of map, start at beginning. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2357 if (NILP (Fcdr (rest))) rest = hmap;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2358
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2359 /* Loop over elements of map. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2360 while (!NILP (rest) && i < width)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2361 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2362 Lisp_Object s;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2363
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2364 /* Look for conses whose cadrs are strings. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2365 s = Fcar_safe (Fcdr_safe (Fcar_safe (rest)));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2366 if (XTYPE (s) != Lisp_String)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2367 /* Ignore all other elements. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2368 ;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2369 /* If first such element, or enough room, add string to prompt. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2370 else if (XSTRING (s)->size + i < width
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2371 || !notfirst)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2372 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2373 int thiswidth;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2374
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2375 /* Punctuate between strings. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2376 if (notfirst)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2377 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2378 strcpy (menu + i, ", ");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2379 i += 2;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2380 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2381 notfirst = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2382
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2383 /* Add as much of string as fits. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2384 thiswidth = XSTRING (s)->size;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2385 if (thiswidth + i > width)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2386 thiswidth = width - i;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2387 bcopy (XSTRING (s)->data, menu + i, thiswidth);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2388 i += thiswidth;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2389 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2390 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2391 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2392 /* If some elts don't fit, show there are more. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2393 strcpy (menu + i, "...");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2394 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2395 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2396
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2397 /* Move past this element. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2398 rest = Fcdr_safe (rest);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2399 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2400
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2401 /* Prompt with that and read response. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2402 message1 (menu);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2403 obj = read_char (1);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2404
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2405 if (XTYPE (obj) != Lisp_Int)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2406 return obj;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2407 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2408 ch = XINT (obj);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2409
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2410 if (obj != menu_prompt_more_char
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2411 && (XTYPE (menu_prompt_more_char) != Lisp_Int
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2412 || obj != make_number (Ctl (XINT (menu_prompt_more_char)))))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2413 return obj;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2414 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2415 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2416
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2417
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2418 /* Reading key sequences. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2419
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2420 /* Follow KEY in the maps in CURRENT[0..NMAPS-1], placing its bindings
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2421 in DEFS[0..NMAPS-1]. Set NEXT[i] to DEFS[i] if DEFS[i] is a
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2422 keymap, or nil otherwise. Return the index of the first keymap in
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2423 which KEY has any binding, or NMAPS if no map has a binding.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2424
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2425 If KEY is a meta ASCII character, treat it like meta-prefix-char
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2426 followed by the corresponding non-meta character. Keymaps in
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2427 CURRENT with non-prefix bindings for meta-prefix-char become nil in
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2428 NEXT.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2429
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2430 When KEY is not defined in any of the keymaps, if it is an upper
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2431 case letter and there are bindings for the corresponding lower-case
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2432 letter, return the bindings for the lower-case letter.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2433
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2434 NEXT may == CURRENT. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2435
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2436 static int
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2437 follow_key (key, nmaps, current, defs, next)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2438 Lisp_Object key;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2439 Lisp_Object *current, *defs, *next;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2440 int nmaps;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2441 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2442 int i, first_binding;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2443
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2444 /* If KEY is a meta ASCII character, treat it like meta-prefix-char
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2445 followed by the corresponding non-meta character. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2446 if (XTYPE (key) == Lisp_Int
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2447 && XINT (key) >= 0200)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2448 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2449 for (i = 0; i < nmaps; i++)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2450 if (! NILP (current[i]))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2451 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2452 next[i] = get_keyelt (access_keymap (current[i],
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2453 meta_prefix_char));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2454
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2455 /* Note that since we pass the resulting bindings through
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2456 get_keymap_1, non-prefix bindings for meta-prefix-char
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2457 disappear. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2458 next[i] = get_keymap_1 (next[i], 0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2459 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2460 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2461 next[i] = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2462
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2463 current = next;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2464 XSET (key, Lisp_Int, XFASTINT (key) & 0177);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2465 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2466
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2467 first_binding = nmaps;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2468 for (i = nmaps - 1; i >= 0; i--)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2469 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2470 if (! NILP (current[i]))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2471 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2472 defs[i] = get_keyelt (access_keymap (current[i], key));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2473 if (! NILP (defs[i]))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2474 first_binding = i;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2475 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2476 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2477 defs[i] = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2478 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2479
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2480 /* When KEY is not defined in any of the keymaps, if it is an upper
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2481 case letter and there are bindings for the corresponding
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2482 lower-case letter, return the bindings for the lower-case letter. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2483 if (first_binding == nmaps
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2484 && XTYPE (key) == Lisp_Int
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2485 && UPPERCASEP (XINT (key)))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2486 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2487 XSETINT (key, DOWNCASE (XINT (key)));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2488
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2489 first_binding = nmaps;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2490 for (i = nmaps - 1; i >= 0; i--)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2491 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2492 if (! NILP (current[i]))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2493 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2494 defs[i] = get_keyelt (access_keymap (current[i], key));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2495 if (! NILP (defs[i]))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2496 first_binding = i;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2497 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2498 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2499 defs[i] = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2500 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2501 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2502
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2503 /* Given the set of bindings we've found, produce the next set of maps. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2504 for (i = 0; i < nmaps; i++)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2505 next[i] = NILP (defs[i]) ? Qnil : get_keymap_1 (defs[i], 0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2506
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2507 return first_binding;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2508 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2509
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2510 /* Read a sequence of keys that ends with a non prefix character
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2511 according to the keymaps in KEYMAPS[0..nmaps-1]. Keymaps appearing
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2512 earlier in KEYMAPS take precidence over those appearing later.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2513
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2514 Store the sequence in KEYBUF, a buffer of size BUFSIZE. Prompt
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2515 with PROMPT. Echo starting immediately unless `prompt' is 0.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2516 Return the length of the key sequence stored.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2517
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2518 If the user switches frames in the midst of a key sequence, we
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2519 throw away any prefix we have read so far, and start afresh. For
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2520 mouse clicks, we look up the click in the keymap of the buffer
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2521 clicked on, throwing away any prefix if it is not the same buffer
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2522 we used to be reading from. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2523
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2524 static int
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2525 read_key_sequence (keybuf, bufsize, prompt)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2526 Lisp_Object *keybuf;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2527 int bufsize;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2528 Lisp_Object prompt;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2529 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2530 /* How many keys there are in the current key sequence. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2531 int t;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2532
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2533 /* The buffer that the most recently read event was typed at. This
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2534 helps us read mouse clicks according to the buffer clicked in,
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2535 and notice when the mouse has moved from one frame to another. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2536 struct buffer *last_event_buffer = current_buffer;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2537
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2538 /* The length of the echo buffer when we started reading, and
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2539 the length of this_command_keys when we started reading. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2540 int echo_start;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2541 int keys_start = this_command_key_count;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2542
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2543 /* The number of keymaps we're scanning right now, and the number of
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2544 keymaps we have allocated space for. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2545 int nmaps;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2546 int nmaps_allocated = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2547
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2548 /* submaps[0..nmaps-1] are the prefix definitions of KEYBUF[0..t-1]
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2549 in the current keymaps, or nil where it is not a prefix. */
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2550 Lisp_Object *submaps;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2551
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2552 /* defs[0..nmaps-1] are the definitions of KEYBUF[0..t-1] in
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2553 the current keymaps. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2554 Lisp_Object *defs;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2555
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2556 /* The index of the first keymap that has a binding for this key
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2557 sequence. In other words, the lowest i such that defs[i] is
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2558 non-nil.*/
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2559 int first_binding;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2560
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2561 /* If mock_input > t, then KEYBUF[t] should be read as the next
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2562 input key.
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2563
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2564 We use this to recover after recognizing a function key. Once we
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2565 realize that a suffix of the current key sequence is actually a
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2566 function key's escape sequence, we replace the suffix with the
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2567 function key's binding from Vfunction_key_map. Now keybuf
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2568 contains a new and different key sequence, so the echo area and
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2569 the submaps and defs arrays are wrong. In this situation, we set
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2570 mock_input to t, set t to 0, and jump to restart; the loop will
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2571 read keys from keybuf up until mock_input, which rebuilds the
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2572 state, and then it will resume reading characters from the keyboard. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2573 int mock_input = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2574
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2575 /* If the sequence is unbound in submaps[], then
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2576 keymap[fkey_start..fkey_end-1] is a prefix in Vfunction_key_map,
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2577 and fkey_map is its binding. If mock_input is in use, these
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2578 might be > t, indicating that all function key scanning should
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2579 hold off until t reaches them. */
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2580
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2581 int fkey_start = 0, fkey_end = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2582 Lisp_Object fkey_map = Vfunction_key_map;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2583
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2584 if (INTERACTIVE)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2585 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2586 if (prompt)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2587 echo_prompt (prompt);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2588 else if (cursor_in_echo_area)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2589 /* This doesn't put in a dash if the echo buffer is empty, so
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2590 you don't always see a dash hanging out in the minibuffer. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2591 echo_dash ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2592 echo_start = echo_length ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2593 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2594
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2595 /* If there is no function key map, turn off function key scanning. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2596 if (NILP (Fkeymapp (Vfunction_key_map)))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2597 fkey_start = fkey_end = bufsize + 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2598
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2599 restart:
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2600 t = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2601 this_command_key_count = keys_start;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2602
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2603 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2604 Lisp_Object *maps;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2605
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2606 nmaps = current_minor_maps (0, &maps) + 2;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2607 if (nmaps > nmaps_allocated)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2608 {
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2609 submaps = (Lisp_Object *) alloca (nmaps * sizeof (submaps[0]));
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2610 defs = (Lisp_Object *) alloca (nmaps * sizeof (defs[0]));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2611 nmaps_allocated = nmaps;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2612 }
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2613 bcopy (maps, submaps, (nmaps - 2) * sizeof (submaps[0]));
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2614 submaps[nmaps-2] = last_event_buffer->keymap;
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2615 submaps[nmaps-1] = global_map;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2616 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2617
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2618 /* Find an accurate initial value for first_binding. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2619 for (first_binding = 0; first_binding < nmaps; first_binding++)
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2620 if (! NILP (submaps[first_binding]))
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2621 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2622
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2623 while ((first_binding < nmaps && ! NILP (submaps[first_binding]))
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2624 || (first_binding >= nmaps && fkey_start < t))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2625 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2626 Lisp_Object key;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2627
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2628 if (t >= bufsize)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2629 error ("key sequence too long");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2630
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2631 /* Are we re-reading a key sequence, as indicated by mock_input? */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2632 if (t < mock_input)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2633 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2634 key = keybuf[t];
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2635 add_command_key (key);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2636 echo_char (key);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2637 }
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2638
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2639 /* If not, we should actually read a character. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2640 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2641 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2642 struct buffer *buf;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2643
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2644 if (!prompt && INTERACTIVE)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2645 key = read_char_menu_prompt (prompt, Qnil, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2646 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2647 key = read_char (!prompt);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2648
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2649 /* The above routines return -1 at the end of a macro.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2650 Emacs 18 handles this by returning immediately with a
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2651 zero, so that's what we'll do. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2652 if (XTYPE (key) == Lisp_Int && XINT (key) < 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2653 return 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2654
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2655 Vquit_flag = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2656
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2657 #ifdef MULTI_FRAME
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2658 /* What buffer was this event typed/moused at? */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2659 if (XTYPE (key) == Lisp_Int || XTYPE (key) == Lisp_Symbol)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2660 buf = (XBUFFER
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2661 (XWINDOW
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2662 (FRAME_SELECTED_WINDOW
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2663 (XFRAME (Vlast_event_frame)))->buffer));
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2664 else if (EVENT_HAS_PARAMETERS (key))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2665 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2666 Lisp_Object window = EVENT_WINDOW (key);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2667
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2668 if (NILP (window))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2669 abort ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2670
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2671 buf = XBUFFER (XWINDOW (window)->buffer);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2672 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2673 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2674 abort ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2675
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2676 /* If this event came to a different buffer than the one
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2677 we're currently in, switch buffers and start a new key
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2678 sequence, starting with key. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2679 if (buf != last_event_buffer)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2680 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2681 last_event_buffer = buf;
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2682 Fselect_frame (Vlast_event_frame, Qnil);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2683
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2684 /* Arrange to read key as the next event. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2685 keybuf[0] = key;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2686 mock_input = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2687
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2688 /* Truncate the key sequence in the echo area. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2689 if (INTERACTIVE)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2690 echo_truncate (echo_start);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2691
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2692 goto restart;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2693 }
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 727
diff changeset
2694 #endif
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2695 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2696
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2697 first_binding = (follow_key (key,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2698 nmaps - first_binding,
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2699 submaps + first_binding,
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2700 defs + first_binding,
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2701 submaps + first_binding)
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2702 + first_binding);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2703 keybuf[t++] = key;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2704
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2705 /* If the sequence is unbound, see if we can hang a function key
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2706 off the end of it. We only want to scan real keyboard input
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2707 for function key sequences, so if mock_input says that we're
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2708 re-scanning after expanding a function key, don't examine it. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2709 if (first_binding >= nmaps
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2710 && t >= mock_input)
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2711 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2712 Lisp_Object fkey_next;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2713
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2714 /* Scan from fkey_end until we find a bound suffix. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2715 while (fkey_end < t)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2716 {
853
224b0d5d1a38 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 765
diff changeset
2717 /* Look up meta-characters by prefixing them
224b0d5d1a38 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 765
diff changeset
2718 with meta_prefix_char. I hate this. */
899
ef5f79a6535a entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 853
diff changeset
2719 if (keybuf[fkey_end] & 0x80)
853
224b0d5d1a38 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 765
diff changeset
2720 fkey_next =
224b0d5d1a38 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 765
diff changeset
2721 get_keymap_1 (get_keyelt
224b0d5d1a38 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 765
diff changeset
2722 (access_keymap (fkey_map, meta_prefix_char)),
224b0d5d1a38 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 765
diff changeset
2723 0);
224b0d5d1a38 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 765
diff changeset
2724 else
224b0d5d1a38 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 765
diff changeset
2725 fkey_next = fkey_map;
224b0d5d1a38 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 765
diff changeset
2726
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2727 fkey_next =
853
224b0d5d1a38 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 765
diff changeset
2728 get_keyelt (access_keymap
939
c4dcdc9aed70 Clear the eighth bit of the character from the key sequence, NOT the
Jim Blandy <jimb@redhat.com>
parents: 899
diff changeset
2729 (fkey_next, keybuf[fkey_end++] & 0x7f));
c4dcdc9aed70 Clear the eighth bit of the character from the key sequence, NOT the
Jim Blandy <jimb@redhat.com>
parents: 899
diff changeset
2730
c4dcdc9aed70 Clear the eighth bit of the character from the key sequence, NOT the
Jim Blandy <jimb@redhat.com>
parents: 899
diff changeset
2731 /* If keybuf[fkey_start..fkey_end] is bound in the
547
1856d835aac3 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 518
diff changeset
2732 function key map and it's a suffix of the current
939
c4dcdc9aed70 Clear the eighth bit of the character from the key sequence, NOT the
Jim Blandy <jimb@redhat.com>
parents: 899
diff changeset
2733 sequence (i.e. fkey_end == t), replace it with
547
1856d835aac3 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 518
diff changeset
2734 the binding and restart with fkey_start at the end. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2735 if (XTYPE (fkey_next) == Lisp_Vector
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2736 && fkey_end == t)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2737 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2738 t = fkey_start + XVECTOR (fkey_next)->size;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2739 if (t >= bufsize)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2740 error ("key sequence too long");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2741
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2742 bcopy (XVECTOR (fkey_next)->contents,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2743 keybuf + fkey_start,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2744 (t - fkey_start) * sizeof (keybuf[0]));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2745
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2746 mock_input = t;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2747 fkey_start = fkey_end = t;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2748
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2749 /* Truncate the key sequence in the echo area. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2750 if (INTERACTIVE)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2751 echo_truncate (echo_start);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2752
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2753 goto restart;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2754 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2755
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2756 fkey_map = get_keymap_1 (fkey_next, 0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2757
547
1856d835aac3 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 518
diff changeset
2758 /* If we no longer have a bound suffix, try a new positions for
1856d835aac3 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 518
diff changeset
2759 fkey_start. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2760 if (NILP (fkey_map))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2761 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2762 fkey_end = ++fkey_start;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2763 fkey_map = Vfunction_key_map;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2764 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2765 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2766 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2767 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2768
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2769 read_key_sequence_cmd = (first_binding < nmaps
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2770 ? defs[first_binding]
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2771 : Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2772
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2773 return t;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2774 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2775
691
cae8c3ef1677 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 687
diff changeset
2776 DEFUN ("read-key-sequence", Fread_key_sequence, Sread_key_sequence, 1, 2, 0,
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2777 "Read a sequence of keystrokes and return as a string or vector.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2778 The sequence is sufficient to specify a non-prefix command in the\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2779 current local and global maps.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2780 \n\
691
cae8c3ef1677 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 687
diff changeset
2781 First arg PROMPT is a prompt string. If nil, do not prompt specially.\n\
cae8c3ef1677 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 687
diff changeset
2782 Second (optional) arg CONTINUE-ECHO, if non-nil, means this key echos\n\
cae8c3ef1677 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 687
diff changeset
2783 as a continuation of the previous key.\n\
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2784 \n\
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2785 If Emacs is running on multiple frames, switching between frames in\n\
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2786 the midst of a keystroke will toss any prefix typed so far. A C-g\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2787 typed while in this function is treated like any other character, and\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2788 `quit-flag' is not set.")
691
cae8c3ef1677 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 687
diff changeset
2789 (prompt, continue_echo)
cae8c3ef1677 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 687
diff changeset
2790 Lisp_Object prompt, continue_echo;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2791 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2792 Lisp_Object keybuf[30];
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2793 register int i;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2794 struct gcpro gcpro1, gcpro2;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2795
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2796 if (!NILP (prompt))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2797 CHECK_STRING (prompt, 0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2798 QUIT;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2799
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2800 bzero (keybuf, sizeof keybuf);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2801 GCPRO1 (keybuf[0]);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2802 gcpro1.nvars = (sizeof keybuf/sizeof (keybuf[0]));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2803
727
540b047ece4d *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 721
diff changeset
2804 if (NILP (continue_echo))
691
cae8c3ef1677 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 687
diff changeset
2805 this_command_key_count = 0;
cae8c3ef1677 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 687
diff changeset
2806
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2807 i = read_key_sequence (keybuf, (sizeof keybuf/sizeof (keybuf[0])),
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2808 NILP (prompt) ? 0 : XSTRING (prompt)->data);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2809
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2810 UNGCPRO;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2811 return make_array (i, keybuf);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2812 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2813
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2814 DEFUN ("command-execute", Fcommand_execute, Scommand_execute, 1, 2, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2815 "Execute CMD as an editor command.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2816 CMD must be a symbol that satisfies the `commandp' predicate.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2817 Optional second arg RECORD-FLAG non-nil\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2818 means unconditionally put this command in `command-history'.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2819 Otherwise, that is done only if an arg is read using the minibuffer.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2820 (cmd, record)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2821 Lisp_Object cmd, record;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2822 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2823 register Lisp_Object final;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2824 register Lisp_Object tem;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2825 Lisp_Object prefixarg;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2826 struct backtrace backtrace;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2827 extern int debug_on_next_call;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2828
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2829 prefixarg = Vprefix_arg, Vprefix_arg = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2830 Vcurrent_prefix_arg = prefixarg;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2831 debug_on_next_call = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2832
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2833 if (XTYPE (cmd) == Lisp_Symbol)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2834 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2835 tem = Fget (cmd, Qdisabled);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2836 if (!NILP (tem))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2837 return call1 (Vrun_hooks, Vdisabled_command_hook);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2838 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2839
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2840 while (1)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2841 {
648
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
2842 final = Findirect_function (cmd);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2843
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2844 if (CONSP (final) && (tem = Fcar (final), EQ (tem, Qautoload)))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2845 do_autoload (final, cmd);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2846 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2847 break;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2848 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2849
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2850 if (XTYPE (final) == Lisp_String
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2851 || XTYPE (final) == Lisp_Vector)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2852 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2853 /* If requested, place the macro in the command history. For
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2854 other sorts of commands, call-interactively takes care of
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2855 this. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2856 if (!NILP (record))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2857 Vcommand_history
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2858 = Fcons (Fcons (Qexecute_kbd_macro,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2859 Fcons (final, Fcons (prefixarg, Qnil))),
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2860 Vcommand_history);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2861
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2862 return Fexecute_kbd_macro (final, prefixarg);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2863 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2864 if (CONSP (final) || XTYPE (final) == Lisp_Subr
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2865 || XTYPE (final) == Lisp_Compiled)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2866 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2867 backtrace.next = backtrace_list;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2868 backtrace_list = &backtrace;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2869 backtrace.function = &Qcall_interactively;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2870 backtrace.args = &cmd;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2871 backtrace.nargs = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2872 backtrace.evalargs = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2873
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2874 tem = Fcall_interactively (cmd, record);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2875
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2876 backtrace_list = backtrace.next;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2877 return tem;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2878 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2879 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2880 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2881
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2882 #if 0
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2883 DEFUN ("execute-mouse-event", Fexecute_mouse_event, Sexecute_mouse_event,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2884 1, 1, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2885 "Execute the definition of the mouse-click event EVENT.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2886 The handler function is found by looking the event's key sequence up\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2887 in the buffer's local mouse map and in `global-mouse-map'.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2888 \n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2889 After running the handler, call the value of `mouse-event-function'\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2890 with EVENT as arg.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2891 (event)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2892 Lisp_Object event;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2893 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2894 Lisp_Object tem;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2895 Lisp_Object mouse_cmd;
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2896 Lisp_Object keyseq, window, frame_part, pos, time;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2897
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2898 #ifndef HAVE_X11
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2899 Vmouse_event = event;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2900 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2901
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2902 if (EQ (event, Qnil))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2903 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2904 bitch_at_user ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2905 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2906 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2907
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2908 CHECK_CONS (event, 0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2909 pos = Fcar (event);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2910 window = Fcar (Fcdr (event));
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2911 frame_part = Fcar (Fcdr (Fcdr (event)));
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2912 keyseq = Fcar (Fcdr (Fcdr (Fcdr (event))));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2913 time = Fcar (Fcdr (Fcdr (Fcdr (Fcdr (event)))));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2914 CHECK_STRING (keyseq, 0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2915 CHECK_WINDOW (window, 0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2916
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2917 /* Look up KEYSEQ in the buffer's local mouse map, then in global one. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2918
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2919 mouse_cmd = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2920
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2921 if (!NILP (XWINDOW (window)->buffer))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2922 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2923 Lisp_Object local_map;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2924
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2925 local_map = XBUFFER (XWINDOW (window)->buffer)->mouse_map;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2926 tem = Fkeymapp (local_map);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2927 if (!NILP (tem))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2928 mouse_cmd = Flookup_key (local_map, keyseq);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2929 /* A number as value means the key is too long; treat as undefined. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2930 if (XTYPE (mouse_cmd) == Lisp_Int)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2931 mouse_cmd = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2932 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2933
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2934 tem = Fkeymapp (Vglobal_mouse_map);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2935 if (NILP (mouse_cmd) && !NILP (tem))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2936 mouse_cmd = Flookup_key (Vglobal_mouse_map, keyseq);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2937 if (XTYPE (mouse_cmd) == Lisp_Int)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2938 mouse_cmd = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2939
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2940 if (NILP (mouse_cmd))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2941 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2942 /* This button/shift combination is not defined.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2943 If it is a button-down event, ring the bell. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2944 #ifdef HAVE_X11
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2945 if (XSTRING (keyseq)->data[XSTRING (keyseq)->size - 1] & 0x18 == 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2946 #else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2947 if (XSTRING (keyseq)->data[XSTRING (keyseq)->size - 1] & 4 == 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2948 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2949 bitch_at_user ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2950 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2951 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2952 {
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2953 FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (window)));
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2954
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2955 #ifndef HAVE_X11
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2956 Vmouse_window = f->selected_window;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2957 #endif /* HAVE_X11 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2958 /* It's defined; call the definition. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2959 Vprefix_arg = Qnil;
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2960 if (!NILP (frame_part))
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2961 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2962 /* For a scroll-bar click, set the prefix arg
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2963 to the number of lines down from the top the click was.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2964 Many scroll commands want to scroll by this many lines. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2965 Lisp_Object position;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2966 Lisp_Object length;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2967 Lisp_Object offset;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2968
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2969 position = Fcar (pos);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2970 length = Fcar (Fcdr (pos));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2971 offset = Fcar (Fcdr (Fcdr (pos)));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2972
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2973 if (XINT (length) != 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2974 XSET (Vprefix_arg, Lisp_Int,
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
2975 (FRAME_HEIGHT (f) * (XINT (position) + XINT (offset))
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2976 / (XINT (length) + 2 * XINT (offset))));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2977 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2978 Fcommand_execute (mouse_cmd, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2979 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2980
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2981 if (!NILP (Vmouse_event_function)) /* Not `event' so no need for GCPRO */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2982 call1 (Vmouse_event_function, Vmouse_event);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2983 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2984 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2985 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2986
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2987 DEFUN ("execute-extended-command", Fexecute_extended_command, Sexecute_extended_command,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2988 1, 1, "P",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2989 "Read function name, then read its arguments and call it.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2990 (prefixarg)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2991 Lisp_Object prefixarg;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2992 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2993 Lisp_Object function;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2994 char buf[40];
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2995 Lisp_Object saved_keys;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2996 struct gcpro gcpro1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2997
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2998 saved_keys = Fthis_command_keys ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2999 buf[0] = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3000 GCPRO1 (saved_keys);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3001
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3002 if (EQ (prefixarg, Qminus))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3003 strcpy (buf, "- ");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3004 else if (CONSP (prefixarg) && XINT (XCONS (prefixarg)->car) == 4)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3005 strcpy (buf, "C-u ");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3006 else if (CONSP (prefixarg) && XTYPE (XCONS (prefixarg)->car) == Lisp_Int)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3007 sprintf (buf, "%d ", XINT (XCONS (prefixarg)->car));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3008 else if (XTYPE (prefixarg) == Lisp_Int)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3009 sprintf (buf, "%d ", XINT (prefixarg));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3010
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3011 /* This isn't strictly correct if execute-extended-command
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3012 is bound to anything else. Perhaps it should use
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3013 this_command_keys? */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3014 strcat (buf, "M-x ");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3015
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3016 /* Prompt with buf, and then read a string, completing from and
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3017 restricting to the set of all defined commands. Don't provide
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3018 any initial input. The last Qnil says not to perform a
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3019 peculiar hack on the initial input. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3020 function = Fcompleting_read (build_string (buf),
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3021 Vobarray, Qcommandp,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3022 Qt, Qnil, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3023
708
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3024 /* Set this_command_keys to the concatenation of saved_keys and
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3025 function, followed by a RET. */
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3026 {
708
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3027 struct Lisp_String *str;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3028 int i;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3029 Lisp_Object tem;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3030
708
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3031 this_command_key_count = 0;
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3032
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3033 str = XSTRING (saved_keys);
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3034 for (i = 0; i < str->size; i++)
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3035 {
708
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3036 XFASTINT (tem) = str->data[i];
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3037 add_command_key (tem);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3038 }
708
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3039
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3040 str = XSTRING (function);
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3041 for (i = 0; i < str->size; i++)
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3042 {
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3043 XFASTINT (tem) = str->data[i];
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3044 add_command_key (tem);
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3045 }
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3046
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3047 XFASTINT (tem) = '\015';
030fb4635335 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 701
diff changeset
3048 add_command_key (tem);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3049 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3050
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3051 UNGCPRO;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3052
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3053 function = Fintern (function, Vobarray);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3054 Vprefix_arg = prefixarg;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3055 this_command = function;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3056
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3057 return Fcommand_execute (function, Qt);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3058 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3059
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3060
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3061 detect_input_pending ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3062 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3063 if (!input_pending)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3064 get_input_pending (&input_pending);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3065
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3066 return input_pending;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3067 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3068
648
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
3069 /* This is called in some cases before a possible quit.
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
3070 It cases the next call to detect_input_pending to recompute input_pending.
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
3071 So calling this function unnecessarily can't do any harm. */
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
3072 clear_input_pending ()
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
3073 {
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
3074 input_pending = 0;
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
3075 }
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
3076
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3077 DEFUN ("input-pending-p", Finput_pending_p, Sinput_pending_p, 0, 0, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3078 "T if command input is currently available with no waiting.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3079 Actually, the value is nil only if we can be sure that no input is available.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3080 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3081 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3082 if (!NILP (unread_command_char))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3083 return (Qt);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3084
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3085 return detect_input_pending () ? Qt : Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3086 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3087
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3088 DEFUN ("recent-keys", Frecent_keys, Srecent_keys, 0, 0, 0,
727
540b047ece4d *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 721
diff changeset
3089 "Return vector of last 100 chars read from terminal.")
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3090 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3091 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3092 Lisp_Object val;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3093
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3094 if (total_keys < NUM_RECENT_KEYS)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3095 return Fvector (total_keys, recent_keys);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3096 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3097 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3098 val = Fvector (NUM_RECENT_KEYS, recent_keys);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3099 bcopy (recent_keys + recent_keys_index,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3100 XVECTOR (val)->contents,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3101 (NUM_RECENT_KEYS - recent_keys_index) * sizeof (Lisp_Object));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3102 bcopy (recent_keys,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3103 XVECTOR (val)->contents + NUM_RECENT_KEYS - recent_keys_index,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3104 recent_keys_index * sizeof (Lisp_Object));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3105 return val;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3106 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3107 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3108
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3109 DEFUN ("this-command-keys", Fthis_command_keys, Sthis_command_keys, 0, 0, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3110 "Return string of the keystrokes that invoked this command.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3111 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3112 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3113 return make_array (this_command_key_count, this_command_keys);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3114 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3115
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3116 DEFUN ("recursion-depth", Frecursion_depth, Srecursion_depth, 0, 0, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3117 "Return the current depth in recursive edits.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3118 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3119 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3120 Lisp_Object temp;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3121 XFASTINT (temp) = command_loop_level + minibuf_level;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3122 return temp;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3123 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3124
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3125 DEFUN ("open-dribble-file", Fopen_dribble_file, Sopen_dribble_file, 1, 1,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3126 "FOpen dribble file: ",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3127 "Start writing all keyboard characters to FILE.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3128 (file)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3129 Lisp_Object file;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3130 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3131 if (NILP (file))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3132 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3133 fclose (dribble);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3134 dribble = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3135 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3136 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3137 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3138 file = Fexpand_file_name (file, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3139 dribble = fopen (XSTRING (file)->data, "w");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3140 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3141 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3142 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3143
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3144 DEFUN ("discard-input", Fdiscard_input, Sdiscard_input, 0, 0, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3145 "Discard the contents of the terminal input buffer.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3146 Also cancel any kbd macro being defined.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3147 ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3148 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3149 defining_kbd_macro = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3150 update_mode_lines++;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3151
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3152 #if 0
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3153 unread_command_char = make_number (-1);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3154 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3155 unread_command_char = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3156
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3157 discard_tty_input ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3158
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3159 kbd_fetch_ptr = kbd_store_ptr;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3160 input_pending = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3161
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3162 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3163 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3164
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3165 DEFUN ("suspend-emacs", Fsuspend_emacs, Ssuspend_emacs, 0, 1, "",
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3166 "Stop Emacs and return to superior process. You can resume later.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3167 On systems that don't have job control, run a subshell instead.\n\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3168 If optional arg STUFFSTRING is non-nil, its characters are stuffed\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3169 to be read as terminal input by Emacs's superior shell.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3170 Before suspending, if `suspend-hook' is bound and value is non-nil\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3171 call the value as a function of no args. Don't suspend if it returns non-nil.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3172 Otherwise, suspend normally and after resumption call\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3173 `suspend-resume-hook' if that is bound and non-nil.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3174 \n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3175 Some operating systems cannot stop the Emacs process and resume it later.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3176 On such systems, Emacs will start a subshell and wait for it to exit.")
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3177 (stuffstring)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3178 Lisp_Object stuffstring;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3179 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3180 register Lisp_Object tem;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3181 int count = specpdl_ptr - specpdl;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3182 int old_height, old_width;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3183 int width, height;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3184 struct gcpro gcpro1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3185 extern init_sys_modes ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3186
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3187 if (!NILP (stuffstring))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3188 CHECK_STRING (stuffstring, 0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3189 GCPRO1 (stuffstring);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3190
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3191 /* Call value of suspend-hook
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3192 if it is bound and value is non-nil. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3193 if (!NILP (Vrun_hooks))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3194 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3195 tem = call1 (Vrun_hooks, intern ("suspend-hook"));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3196 if (!EQ (tem, Qnil)) return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3197 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3198
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3199 get_frame_size (&old_width, &old_height);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3200 reset_sys_modes ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3201 /* sys_suspend can get an error if it tries to fork a subshell
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3202 and the system resources aren't available for that. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3203 record_unwind_protect (init_sys_modes, 0);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3204 stuff_buffered_input (stuffstring);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3205 sys_suspend ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3206 unbind_to (count, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3207
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3208 /* Check if terminal/window size has changed.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3209 Note that this is not useful when we are running directly
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3210 with a window system; but suspend should be disabled in that case. */
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3211 get_frame_size (&width, &height);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3212 if (width != old_width || height != old_height)
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3213 change_frame_size (height, width, 0);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3214
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3215 /* Call value of suspend-resume-hook
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3216 if it is bound and value is non-nil. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3217 if (!NILP (Vrun_hooks))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3218 call1 (Vrun_hooks, intern ("suspend-resume-hook"));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3219
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3220 UNGCPRO;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3221 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3222 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3223
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3224 /* If STUFFSTRING is a string, stuff its contents as pending terminal input.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3225 Then in any case stuff anthing Emacs has read ahead and not used. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3226
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3227 stuff_buffered_input (stuffstring)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3228 Lisp_Object stuffstring;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3229 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3230 register unsigned char *p;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3231
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3232 /* stuff_char works only in BSD, versions 4.2 and up. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3233 #ifdef BSD
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3234 #ifndef BSD4_1
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3235 if (XTYPE (stuffstring) == Lisp_String)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3236 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3237 register int count;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3238
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3239 p = XSTRING (stuffstring)->data;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3240 count = XSTRING (stuffstring)->size;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3241 while (count-- > 0)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3242 stuff_char (*p++);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3243 stuff_char ('\n');
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3244 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3245 /* Anything we have read ahead, put back for the shell to read. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3246 while (kbd_fetch_ptr != kbd_store_ptr)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3247 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3248 if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3249 kbd_fetch_ptr = kbd_buffer;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3250 if (kbd_fetch_ptr->kind == ascii_keystroke)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3251 stuff_char (XINT (kbd_fetch_ptr->code));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3252 kbd_fetch_ptr++;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3253 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3254 input_pending = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3255 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3256 #endif /* BSD and not BSD4_1 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3257 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3258
648
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
3259 set_waiting_for_input (time_to_clear)
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
3260 EMACS_TIME *time_to_clear;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3261 {
648
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
3262 input_available_clear_time = time_to_clear;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3263
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3264 /* Tell interrupt_signal to throw back to read_char, */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3265 waiting_for_input = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3266
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3267 /* If interrupt_signal was called before and buffered a C-g,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3268 make it run again now, to avoid timing error. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3269 if (!NILP (Vquit_flag))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3270 quit_throw_to_read_char ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3271
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3272 /* If alarm has gone off already, echo now. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3273 if (echo_flag)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3274 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3275 echo ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3276 echo_flag = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3277 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3278 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3279
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3280 clear_waiting_for_input ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3281 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3282 /* Tell interrupt_signal not to throw back to read_char, */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3283 waiting_for_input = 0;
648
70b112526394 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 638
diff changeset
3284 input_available_clear_time = 0;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3285 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3286
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3287 /* This routine is called at interrupt level in response to C-G.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3288 If interrupt_input, this is the handler for SIGINT.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3289 Otherwise, it is called from kbd_buffer_store_event,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3290 in handling SIGIO or SIGTINT.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3291
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3292 If `waiting_for_input' is non zero, then unless `echoing' is nonzero,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3293 immediately throw back to read_char.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3294
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3295 Otherwise it sets the Lisp variable quit-flag not-nil.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3296 This causes eval to throw, when it gets a chance.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3297 If quit-flag is already non-nil, it stops the job right away. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3298
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3299 SIGTYPE
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3300 interrupt_signal ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3301 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3302 char c;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3303 /* Must preserve main program's value of errno. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3304 int old_errno = errno;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3305 extern Lisp_Object Vwindow_system;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3306
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3307 #ifdef USG
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3308 /* USG systems forget handlers when they are used;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3309 must reestablish each time */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3310 signal (SIGINT, interrupt_signal);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3311 signal (SIGQUIT, interrupt_signal);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3312 #endif /* USG */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3313
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3314 cancel_echoing ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3315
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3316 if (!NILP (Vquit_flag) && FRAME_IS_TERMCAP (selected_frame))
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3317 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3318 fflush (stdout);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3319 reset_sys_modes ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3320 sigfree ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3321 #ifdef SIGTSTP /* Support possible in later USG versions */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3322 /*
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3323 * On systems which can suspend the current process and return to the original
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3324 * shell, this command causes the user to end up back at the shell.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3325 * The "Auto-save" and "Abort" questions are not asked until
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3326 * the user elects to return to emacs, at which point he can save the current
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3327 * job and either dump core or continue.
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3328 */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3329 sys_suspend ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3330 #else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3331 #ifdef VMS
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3332 if (sys_suspend () == -1)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3333 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3334 printf ("Not running as a subprocess;\n");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3335 printf ("you can continue or abort.\n");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3336 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3337 #else /* not VMS */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3338 /* Perhaps should really fork an inferior shell?
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3339 But that would not provide any way to get back
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3340 to the original shell, ever. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3341 printf ("No support for stopping a process on this operating system;\n");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3342 printf ("you can continue or abort.\n");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3343 #endif /* not VMS */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3344 #endif /* not SIGTSTP */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3345 printf ("Auto-save? (y or n) ");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3346 fflush (stdout);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3347 if (((c = getchar ()) & ~040) == 'Y')
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3348 Fdo_auto_save (Qnil, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3349 while (c != '\n') c = getchar ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3350 #ifdef VMS
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3351 printf ("Abort (and enter debugger)? (y or n) ");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3352 #else /* not VMS */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3353 printf ("Abort (and dump core)? (y or n) ");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3354 #endif /* not VMS */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3355 fflush (stdout);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3356 if (((c = getchar ()) & ~040) == 'Y')
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3357 abort ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3358 while (c != '\n') c = getchar ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3359 printf ("Continuing...\n");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3360 fflush (stdout);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3361 init_sys_modes ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3362 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3363 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3364 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3365 /* If executing a function that wants to be interrupted out of
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3366 and the user has not deferred quitting by binding `inhibit-quit'
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3367 then quit right away. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3368 if (immediate_quit && NILP (Vinhibit_quit))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3369 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3370 immediate_quit = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3371 sigfree ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3372 Fsignal (Qquit, Qnil);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3373 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3374 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3375 /* Else request quit when it's safe */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3376 Vquit_flag = Qt;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3377 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3378
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3379 if (waiting_for_input && !echoing)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3380 quit_throw_to_read_char ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3381
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3382 errno = old_errno;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3383 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3384
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3385 /* Handle a C-g by making read_char return C-g. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3386
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3387 quit_throw_to_read_char ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3388 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3389 quit_error_check ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3390 sigfree ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3391 /* Prevent another signal from doing this before we finish. */
650
39f0e62a8511 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 648
diff changeset
3392 clear_waiting_for_input ();
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3393 input_pending = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3394
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3395 #if 0
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3396 unread_command_char = make_number (-1);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3397 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3398 unread_command_char = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3399
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3400 _longjmp (getcjmp, 1);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3401 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3402
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3403 DEFUN ("set-input-mode", Fset_input_mode, Sset_input_mode, 3, 4, 0,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3404 "Set mode of reading keyboard input.\n\
695
e3fac20d3015 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 691
diff changeset
3405 First arg INTERRUPT non-nil means use input interrupts;\n\
e3fac20d3015 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 691
diff changeset
3406 nil means use CBREAK mode.\n\
e3fac20d3015 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 691
diff changeset
3407 Second arg FLOW non-nil means use ^S/^Q flow control for output to terminal\n\
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3408 (no effect except in CBREAK mode).\n\
695
e3fac20d3015 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 691
diff changeset
3409 Third arg META non-nil means accept 8-bit input (for a Meta key).\n\
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3410 Otherwise, the top bit is ignored, on the assumption it is parity.\n\
695
e3fac20d3015 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 691
diff changeset
3411 Optional fourth arg QUIT if non-nil specifies character to use for quitting.")
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3412 (interrupt, flow, meta, quit)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3413 Lisp_Object interrupt, flow, meta, quit;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3414 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3415 if (!NILP (quit)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3416 && (XTYPE (quit) != Lisp_Int
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3417 || XINT (quit) < 0 || XINT (quit) > 0400))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3418 error ("set-input-mode: QUIT must be an ASCII character.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3419
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3420 reset_sys_modes ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3421 #ifdef SIGIO
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3422 /* Note SIGIO has been undef'd if FIONREAD is missing. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3423 #ifdef NO_SOCK_SIGIO
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3424 if (read_socket_hook)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3425 interrupt_input = 0; /* No interrupts if reading from a socket. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3426 else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3427 #endif /* NO_SOCK_SIGIO */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3428 interrupt_input = !NILP (interrupt);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3429 #else /* not SIGIO */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3430 interrupt_input = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3431 #endif /* not SIGIO */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3432 /* Our VMS input only works by interrupts, as of now. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3433 #ifdef VMS
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3434 interrupt_input = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3435 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3436 flow_control = !NILP (flow);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3437 meta_key = !NILP (meta);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3438 if (!NILP (quit))
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3439 /* Don't let this value be out of range. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3440 quit_char = XINT (quit) & (meta_key ? 0377 : 0177);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3441
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3442 init_sys_modes ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3443 return Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3444 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3445
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3446 init_keyboard ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3447 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3448 this_command_keys_size = 40;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3449 this_command_keys =
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3450 (Lisp_Object *) xmalloc (this_command_keys_size * sizeof (Lisp_Object));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3451
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3452 /* This is correct before outermost invocation of the editor loop */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3453 command_loop_level = -1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3454 immediate_quit = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3455 quit_char = Ctl ('g');
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3456 unread_command_char = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3457 recent_keys_index = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3458 total_keys = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3459 kbd_fetch_ptr = kbd_buffer;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3460 kbd_store_ptr = kbd_buffer;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3461 do_mouse_tracking = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3462 input_pending = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3463
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3464 if (!noninteractive)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3465 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3466 signal (SIGINT, interrupt_signal);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3467 #ifdef HAVE_TERMIO
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3468 /* For systems with SysV TERMIO, C-g is set up for both SIGINT and
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3469 SIGQUIT and we can't tell which one it will give us. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3470 signal (SIGQUIT, interrupt_signal);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3471 #endif /* HAVE_TERMIO */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3472 /* Note SIGIO has been undef'd if FIONREAD is missing. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3473 #ifdef SIGIO
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3474 signal (SIGIO, input_available_signal);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3475 #endif SIGIO
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3476 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3477
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3478 /* Use interrupt input by default, if it works and noninterrupt input
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3479 has deficiencies. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3480
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3481 #ifdef INTERRUPT_INPUT
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3482 interrupt_input = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3483 #else
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3484 interrupt_input = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3485 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3486
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3487 /* Our VMS input only works by interrupts, as of now. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3488 #ifdef VMS
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3489 interrupt_input = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3490 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3491
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3492 sigfree ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3493 dribble = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3494
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3495 if (keyboard_init_hook)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3496 (*keyboard_init_hook) ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3497
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3498 #ifdef POLL_FOR_INPUT
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3499 poll_suppress_count = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3500 start_polling ();
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3501 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3502 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3503
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3504 /* This type's only use is in syms_of_keyboard, to initialize the
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3505 event header symbols and put properties on them. */
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3506 struct event_head {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3507 Lisp_Object *var;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3508 char *name;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3509 Lisp_Object *kind;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3510 };
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3511
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3512 struct event_head head_table[] = {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3513 &Qmouse_movement, "mouse-movement", &Qmouse_movement,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3514 &Qvscrollbar_part, "vscrollbar-part", &Qscrollbar_click,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3515 &Qvslider_part, "vslider-part", &Qscrollbar_click,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3516 &Qvthumbup_part, "vthumbup-part", &Qscrollbar_click,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3517 &Qvthumbdown_part, "vthumbdown-part", &Qscrollbar_click,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3518 &Qhscrollbar_part, "hscrollbar-part", &Qscrollbar_click,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3519 &Qhslider_part, "hslider-part", &Qscrollbar_click,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3520 &Qhthumbleft_part, "hthumbleft-part", &Qscrollbar_click,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3521 &Qhthumbright_part,"hthumbright-part", &Qscrollbar_click
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3522 };
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3523
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3524 syms_of_keyboard ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3525 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3526 Qself_insert_command = intern ("self-insert-command");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3527 staticpro (&Qself_insert_command);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3528
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3529 Qforward_char = intern ("forward-char");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3530 staticpro (&Qforward_char);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3531
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3532 Qbackward_char = intern ("backward-char");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3533 staticpro (&Qbackward_char);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3534
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3535 Qdisabled = intern ("disabled");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3536 staticpro (&Qdisabled);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3537
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3538 Qfunction_key = intern ("function-key");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3539 staticpro (&Qfunction_key);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3540 Qmouse_movement = intern ("mouse-click");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3541 staticpro (&Qmouse_click);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3542 Qmouse_movement = intern ("scrollbar-click");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3543 staticpro (&Qmouse_movement);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3544
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3545 Qmode_line = intern ("mode-line");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3546 staticpro (&Qmode_line);
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 727
diff changeset
3547 Qvertical_line = intern ("vertical-line");
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 727
diff changeset
3548 staticpro (&Qvertical_line);
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3549
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3550 Qevent_kind = intern ("event-type");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3551 staticpro (&Qevent_kind);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3552 Qevent_unmodified = intern ("event-unmodified");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3553 staticpro (&Qevent_unmodified);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3554
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3555 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3556 struct event_head *p;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3557
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3558 for (p = head_table;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3559 p < head_table + (sizeof (head_table) / sizeof (head_table[0]));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3560 p++)
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3561 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3562 *p->var = intern (p->name);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3563 staticpro (p->var);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3564 Fput (*p->var, Qevent_kind, *p->kind);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3565 Fput (*p->var, Qevent_unmodified, *p->var);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3566 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3567 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3568
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3569 func_key_syms = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3570 staticpro (&func_key_syms);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3571
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3572 mouse_syms = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3573 staticpro (&mouse_syms);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3574
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3575 defsubr (&Sread_key_sequence);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3576 defsubr (&Srecursive_edit);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3577 defsubr (&Strack_mouse);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3578 defsubr (&Smouse_click_p);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3579 defsubr (&Sinput_pending_p);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3580 defsubr (&Scommand_execute);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3581 defsubr (&Srecent_keys);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3582 defsubr (&Sthis_command_keys);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3583 defsubr (&Ssuspend_emacs);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3584 defsubr (&Sabort_recursive_edit);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3585 defsubr (&Sexit_recursive_edit);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3586 defsubr (&Srecursion_depth);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3587 defsubr (&Stop_level);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3588 defsubr (&Sdiscard_input);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3589 defsubr (&Sopen_dribble_file);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3590 defsubr (&Sset_input_mode);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3591 defsubr (&Sexecute_extended_command);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3592
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3593 DEFVAR_LISP ("disabled-command-hook", &Vdisabled_command_hook,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3594 "Value is called instead of any command that is disabled\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3595 (has a non-nil `disabled' property).");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3596
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3597 DEFVAR_LISP ("last-command-char", &last_command_char,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3598 "Last terminal input key that was part of a command.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3599
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3600 DEFVAR_LISP ("last-input-char", &last_input_char,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3601 "Last terminal input key.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3602
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3603 DEFVAR_LISP ("unread-command-char", &unread_command_char,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3604 "Object to be read as next input from input stream, or nil if none.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3605
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3606 DEFVAR_LISP ("meta-prefix-char", &meta_prefix_char,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3607 "Meta-prefix character code. Meta-foo as command input\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3608 turns into this character followed by foo.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3609 XSET (meta_prefix_char, Lisp_Int, 033);
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3610
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3611 DEFVAR_LISP ("last-command", &last_command,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3612 "The last command executed. Normally a symbol with a function definition,\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3613 but can be whatever was found in the keymap, or whatever the variable\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3614 `this-command' was set to by that command.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3615 last_command = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3616
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3617 DEFVAR_LISP ("this-command", &this_command,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3618 "The command now being executed.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3619 The command can set this variable; whatever is put here\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3620 will be in `last-command' during the following command.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3621 this_command = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3622
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3623 DEFVAR_INT ("auto-save-interval", &auto_save_interval,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3624 "*Number of keyboard input characters between auto-saves.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3625 Zero means disable autosaving due to number of characters typed.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3626 auto_save_interval = 300;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3627
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3628 DEFVAR_LISP ("auto-save-timeout", &Vauto_save_timeout,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3629 "*Number of seconds idle time before auto-save.\n\
687
e2b747dd6a6e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 682
diff changeset
3630 Zero or nil means disable auto-saving due to idleness.\n\
e2b747dd6a6e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 682
diff changeset
3631 After auto-saving due to this many seconds of idle time,\n\
701
e7eb08ed73c0 *** empty log message ***
Joseph Arceneaux <jla@gnu.org>
parents: 695
diff changeset
3632 Emacs also does a garbage collection if that seems to be warranted.");
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3633 XFASTINT (Vauto_save_timeout) = 30;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3634
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3635 DEFVAR_INT ("echo-keystrokes", &echo_keystrokes,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3636 "*Nonzero means echo unfinished commands after this many seconds of pause.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3637 echo_keystrokes = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3638
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3639 DEFVAR_INT ("polling-period", &polling_period,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3640 "*Interval between polling for input during Lisp execution.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3641 The reason for polling is to make C-g work to stop a running program.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3642 Polling is needed only when using X windows and SIGIO does not work.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3643 Polling is automatically disabled in all other cases.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3644 polling_period = 2;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3645
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3646 DEFVAR_INT ("num-input-keys", &num_input_keys,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3647 "*Number of complete keys read from the keyboard so far.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3648 num_input_keys = 0;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3649
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3650 DEFVAR_LISP ("last-event-frame", &Vlast_event_frame,
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3651 "*The frame in which the most recently read event occurred.");
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3652 Vlast_event_frame = Qnil;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3653
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3654 DEFVAR_LISP ("help-char", &help_char,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3655 "Character to recognize as meaning Help.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3656 When it is read, do `(eval help-form)', and display result if it's a string.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3657 If the value of `help-form' is nil, this char can be read normally.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3658 XSET (help_char, Lisp_Int, Ctl ('H'));
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3659
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3660 DEFVAR_LISP ("help-form", &Vhelp_form,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3661 "Form to execute when character help-char is read.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3662 If the form returns a string, that string is displayed.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3663 If `help-form' is nil, the help char is not recognized.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3664 Vhelp_form = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3665
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3666 DEFVAR_LISP ("top-level", &Vtop_level,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3667 "Form to evaluate when Emacs starts up.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3668 Useful to set before you dump a modified Emacs.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3669 Vtop_level = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3670
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3671 DEFVAR_LISP ("keyboard-translate-table", &Vkeyboard_translate_table,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3672 "String used as translate table for keyboard input, or nil.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3673 Each character is looked up in this string and the contents used instead.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3674 If string is of length N, character codes N and up are untranslated.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3675 Vkeyboard_translate_table = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3676
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3677 #ifdef HAVE_X_WINDOWS
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3678 DEFVAR_LISP ("mouse-event-function", &Vmouse_event_function,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3679 "Function to call for each mouse event, after the event's definition.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3680 Called, if non-nil, with one argument, which is the event-list.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3681 See the variable `mouse-event' for the format of this list.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3682 Vmouse_event_function = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3683
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3684 DEFVAR_LISP ("mouse-left-hook", &Vmouse_left_hook,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3685 "Function to call when mouse leaves window. No arguments.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3686 Vmouse_left_hook = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3687
765
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3688 DEFVAR_LISP ("map-frame-hook", &Vmap_frame_hook,
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3689 "Function to call when frame is mapped. No arguments.");
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3690 Vmap_frame_hook = Qnil;
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3691
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3692 DEFVAR_LISP ("unmap-frame-hook", &Vunmap_frame_hook,
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3693 "Function to call when frame is unmapped. No arguments.");
e4093444f9f8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3694 Vunmap_frame_hook = Qnil;
518
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3695
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3696 DEFVAR_LISP ("mouse-motion-handler", &Vmouse_motion_handler,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3697 "Handler for motion events. No arguments.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3698 Vmouse_motion_handler = Qnil;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3699 #endif
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3700
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3701 DEFVAR_BOOL ("menu-prompting", &menu_prompting,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3702 "Non-nil means prompt with menus in echo area when appropriate.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3703 This is done when reading from a keymap that has a prompt string,\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3704 for elements that have prompt strings.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3705 menu_prompting = 1;
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3706
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3707 DEFVAR_LISP ("menu-prompt-more-char", &menu_prompt_more_char,
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3708 "Character to see next line of menu prompt.\n\
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3709 Type this character while in a menu prompt to rotate around the lines of it.");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3710 XSET (menu_prompt_more_char, Lisp_Int, ' ');
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3711 }
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3712
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3713 keys_of_keyboard ()
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3714 {
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3715 initial_define_key (global_map, Ctl ('Z'), "suspend-emacs");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3716 initial_define_key (control_x_map, Ctl ('Z'), "suspend-emacs");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3717 initial_define_key (meta_map, Ctl ('C'), "exit-recursive-edit");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3718 initial_define_key (global_map, Ctl (']'), "abort-recursive-edit");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3719 initial_define_key (meta_map, 'x', "execute-extended-command");
3a316f923456 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3720 }