296
|
1 /* Hooks by which low level terminal operations
|
|
2 can be made to call other routines.
|
7307
|
3 Copyright (C) 1985, 1986, 1993, 1994 Free Software Foundation, Inc.
|
296
|
4
|
|
5 This file is part of GNU Emacs.
|
|
6
|
|
7 GNU Emacs is free software; you can redistribute it and/or modify
|
|
8 it under the terms of the GNU General Public License as published by
|
648
|
9 the Free Software Foundation; either version 2, or (at your option)
|
296
|
10 any later version.
|
|
11
|
|
12 GNU Emacs is distributed in the hope that it will be useful,
|
|
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15 GNU General Public License for more details.
|
|
16
|
|
17 You should have received a copy of the GNU General Public License
|
|
18 along with GNU Emacs; see the file COPYING. If not, write to
|
14186
|
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
20 Boston, MA 02111-1307, USA. */
|
296
|
21
|
1782
|
22
|
|
23 /* Miscellanea. */
|
|
24
|
|
25 /* If nonzero, send all terminal output characters to this stream also. */
|
|
26 extern FILE *termscript;
|
|
27
|
|
28
|
|
29 /* Text display hooks. */
|
296
|
30
|
|
31 extern int (*cursor_to_hook) ();
|
|
32 extern int (*raw_cursor_to_hook) ();
|
|
33
|
|
34 extern int (*clear_to_end_hook) ();
|
766
|
35 extern int (*clear_frame_hook) ();
|
296
|
36 extern int (*clear_end_of_line_hook) ();
|
|
37
|
|
38 extern int (*ins_del_lines_hook) ();
|
|
39
|
|
40 extern int (*change_line_highlight_hook) ();
|
|
41 extern int (*reassert_line_highlight_hook) ();
|
|
42
|
|
43 extern int (*insert_glyphs_hook) ();
|
|
44 extern int (*write_glyphs_hook) ();
|
|
45 extern int (*delete_glyphs_hook) ();
|
|
46
|
|
47 extern int (*ring_bell_hook) ();
|
|
48
|
|
49 extern int (*reset_terminal_modes_hook) ();
|
|
50 extern int (*set_terminal_modes_hook) ();
|
|
51 extern int (*update_begin_hook) ();
|
|
52 extern int (*update_end_hook) ();
|
|
53 extern int (*set_terminal_window_hook) ();
|
|
54
|
1782
|
55
|
|
56
|
|
57 /* Multi-frame and mouse support hooks. */
|
296
|
58
|
1994
|
59 enum scroll_bar_part {
|
|
60 scroll_bar_above_handle,
|
|
61 scroll_bar_handle,
|
15176
|
62 scroll_bar_below_handle,
|
|
63 scroll_bar_up_arrow,
|
15181
|
64 scroll_bar_down_arrow
|
1717
|
65 };
|
|
66
|
|
67 /* Return the current position of the mouse.
|
1782
|
68
|
|
69 Set *f to the frame the mouse is in, or zero if the mouse is in no
|
|
70 Emacs frame. If it is set to zero, all the other arguments are
|
|
71 garbage.
|
|
72
|
1994
|
73 If the motion started in a scroll bar, set *bar_window to the
|
|
74 scroll bar's window, *part to the part the mouse is currently over,
|
|
75 *x to the position of the mouse along the scroll bar, and *y to the
|
|
76 overall length of the scroll bar.
|
1782
|
77
|
|
78 Otherwise, set *bar_window to Qnil, and *x and *y to the column and
|
|
79 row of the character cell the mouse is over.
|
|
80
|
|
81 Set *time to the time the mouse was at the returned position.
|
|
82
|
|
83 This should clear mouse_moved until the next motion
|
|
84 event arrives. */
|
766
|
85 extern void (*mouse_position_hook) ( /* FRAME_PTR *f,
|
1782
|
86 Lisp_Object *bar_window,
|
1994
|
87 enum scroll_bar_part *part,
|
485
|
88 Lisp_Object *x,
|
|
89 Lisp_Object *y,
|
732
|
90 unsigned long *time */ );
|
296
|
91
|
485
|
92 /* The window system handling code should set this if the mouse has
|
|
93 moved since the last call to the mouse_position_hook. Calling that
|
|
94 hook should clear this. */
|
|
95 extern int mouse_moved;
|
296
|
96
|
766
|
97 /* When a frame's focus redirection is changed, this hook tells the
|
357
|
98 window system code to re-decide where to put the highlight. Under
|
485
|
99 X, this means that Emacs lies about where the focus is. */
|
766
|
100 extern void (*frame_rehighlight_hook) ( /* void */ );
|
338
|
101
|
1821
|
102 /* If we're displaying frames using a window system that can stack
|
|
103 frames on top of each other, this hook allows you to bring a frame
|
|
104 to the front, or bury it behind all the other windows. If this
|
|
105 hook is zero, that means the device we're displaying on doesn't
|
|
106 support overlapping frames, so there's no need to raise or lower
|
|
107 anything.
|
|
108
|
|
109 If RAISE is non-zero, F is brought to the front, before all other
|
|
110 windows. If RAISE is zero, F is sent to the back, behind all other
|
|
111 windows. */
|
|
112 extern void (*frame_raise_lower_hook) ( /* FRAME_PTR f, int raise */ );
|
1782
|
113
|
|
114
|
1994
|
115 /* Scroll bar hooks. */
|
1782
|
116
|
1994
|
117 /* The representation of scroll bars is determined by the code which
|
1782
|
118 implements them, except for one thing: they must be represented by
|
|
119 lisp objects. This allows us to place references to them in
|
|
120 Lisp_Windows without worrying about those references becoming
|
1994
|
121 dangling references when the scroll bar is destroyed.
|
1782
|
122
|
|
123 The window-system-independent portion of Emacs just refers to
|
1994
|
124 scroll bars via their windows, and never looks inside the scroll bar
|
1782
|
125 representation; it always uses hook functions to do all the
|
1994
|
126 scroll bar manipulation it needs.
|
1782
|
127
|
1994
|
128 The `vertical_scroll_bar' field of a Lisp_Window refers to that
|
|
129 window's scroll bar, or is nil if the window doesn't have a
|
|
130 scroll bar.
|
1782
|
131
|
1994
|
132 The `scroll_bars' and `condemned_scroll_bars' fields of a Lisp_Frame
|
|
133 are free for use by the scroll bar implementation in any way it sees
|
1782
|
134 fit. They are marked by the garbage collector. */
|
|
135
|
|
136
|
1994
|
137 /* Set the vertical scroll bar for WINDOW to have its upper left corner
|
1782
|
138 at (TOP, LEFT), and be LENGTH rows high. Set its handle to
|
|
139 indicate that we are displaying PORTION characters out of a total
|
|
140 of WHOLE characters, starting at POSITION. If WINDOW doesn't yet
|
1994
|
141 have a scroll bar, create one for it. */
|
|
142 extern void (*set_vertical_scroll_bar_hook)
|
1782
|
143 ( /* struct window *window,
|
|
144 int portion, int whole, int position */ );
|
1717
|
145
|
|
146
|
|
147 /* The following three hooks are used when we're doing a thorough
|
1994
|
148 redisplay of the frame. We don't explicitly know which scroll bars
|
1717
|
149 are going to be deleted, because keeping track of when windows go
|
|
150 away is a real pain - can you say set-window-configuration?
|
|
151 Instead, we just assert at the beginning of redisplay that *all*
|
1994
|
152 scroll bars are to be removed, and then save scroll bars from the
|
14034
|
153 fiery pit when we actually redisplay their window. */
|
1717
|
154
|
1994
|
155 /* Arrange for all scroll bars on FRAME to be removed at the next call
|
|
156 to `*judge_scroll_bars_hook'. A scroll bar may be spared if
|
|
157 `*redeem_scroll_bar_hook' is applied to its window before the judgement.
|
1782
|
158
|
|
159 This should be applied to each frame each time its window tree is
|
1994
|
160 redisplayed, even if it is not displaying scroll bars at the moment;
|
|
161 if the HAS_SCROLL_BARS flag has just been turned off, only calling
|
|
162 this and the judge_scroll_bars_hook will get rid of them.
|
1717
|
163
|
1782
|
164 If non-zero, this hook should be safe to apply to any frame,
|
1994
|
165 whether or not it can support scroll bars, and whether or not it is
|
1782
|
166 currently displaying them. */
|
1994
|
167 extern void (*condemn_scroll_bars_hook)( /* FRAME_PTR *frame */ );
|
1782
|
168
|
1994
|
169 /* Unmark WINDOW's scroll bar for deletion in this judgement cycle.
|
|
170 Note that it's okay to redeem a scroll bar that is not condemned. */
|
|
171 extern void (*redeem_scroll_bar_hook)( /* struct window *window */ );
|
1717
|
172
|
1994
|
173 /* Remove all scroll bars on FRAME that haven't been saved since the
|
|
174 last call to `*condemn_scroll_bars_hook'.
|
1782
|
175
|
|
176 This should be applied to each frame after each time its window
|
1994
|
177 tree is redisplayed, even if it is not displaying scroll bars at the
|
|
178 moment; if the HAS_SCROLL_BARS flag has just been turned off, only
|
|
179 calling this and condemn_scroll_bars_hook will get rid of them.
|
1782
|
180
|
|
181 If non-zero, this hook should be safe to apply to any frame,
|
1994
|
182 whether or not it can support scroll bars, and whether or not it is
|
1782
|
183 currently displaying them. */
|
1994
|
184 extern void (*judge_scroll_bars_hook)( /* FRAME_PTR *FRAME */ );
|
1717
|
185
|
1782
|
186
|
|
187 /* Input queue declarations and hooks. */
|
1717
|
188
|
6602
|
189 /* Called to read input events. */
|
1782
|
190 extern int (*read_socket_hook) ();
|
296
|
191
|
6602
|
192 /* Called when a frame's display becomes entirely up to date. */
|
|
193 extern int (*frame_up_to_date_hook) ();
|
|
194
|
296
|
195 /* Expedient hack: only provide the below definitions to files that
|
6747
|
196 are prepared to handle lispy things. CONSP is defined iff lisp.h
|
485
|
197 has been included before this file. */
|
4143
|
198 #ifdef CONSP
|
296
|
199
|
2186
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
200 enum event_kind
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
201 {
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
202 no_event, /* nothing happened. This should never
|
296
|
203 actually appear in the event queue. */
|
4799
|
204
|
|
205 ascii_keystroke, /* The ASCII code is in .code, perhaps
|
|
206 with modifiers applied.
|
|
207 .modifiers holds the state of the
|
|
208 modifier keys.
|
1782
|
209 .frame_or_window is the frame in
|
|
210 which the key was typed.
|
485
|
211 .timestamp gives a timestamp (in
|
|
212 milliseconds) for the keystroke. */
|
2186
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
213 non_ascii_keystroke, /* .code is a number identifying the
|
296
|
214 function key. A code N represents
|
|
215 a key whose name is
|
|
216 function_key_names[N]; function_key_names
|
|
217 is a table in keyboard.c to which you
|
|
218 should feel free to add missing keys.
|
|
219 .modifiers holds the state of the
|
338
|
220 modifier keys.
|
1782
|
221 .frame_or_window is the frame in
|
|
222 which the key was typed.
|
485
|
223 .timestamp gives a timestamp (in
|
|
224 milliseconds) for the keystroke. */
|
14407
|
225 timer_event, /* A timer fired. */
|
2186
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
226 mouse_click, /* The button number is in .code; it must
|
1312
|
227 be >= 0 and < NUM_MOUSE_BUTTONS, defined
|
|
228 below.
|
296
|
229 .modifiers holds the state of the
|
|
230 modifier keys.
|
|
231 .x and .y give the mouse position,
|
708
|
232 in characters, within the window.
|
1782
|
233 .frame_or_window gives the frame
|
|
234 the mouse click occurred in.
|
296
|
235 .timestamp gives a timestamp (in
|
|
236 milliseconds) for the click. */
|
2186
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
237 scroll_bar_click, /* .code gives the number of the mouse button
|
1717
|
238 that was clicked.
|
|
239 .modifiers holds the state of the modifier
|
|
240 keys.
|
296
|
241 .part is a lisp symbol indicating which
|
1994
|
242 part of the scroll bar got clicked.
|
1717
|
243 .x gives the distance from the start of the
|
|
244 scroll bar of the click; .y gives the total
|
|
245 length of the scroll bar.
|
1782
|
246 .frame_or_window gives the window
|
1994
|
247 whose scroll bar was clicked in.
|
296
|
248 .timestamp gives a timestamp (in
|
|
249 milliseconds) for the click. */
|
15176
|
250 #ifdef WINDOWSNT
|
16588
|
251 w32_scroll_bar_click, /* as for scroll_bar_click, but only generated
|
15176
|
252 by MS-Windows scroll bar controls. */
|
|
253 #endif
|
2186
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
254 selection_request_event, /* Another X client wants a selection from us.
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
255 See `struct selection_event'. */
|
5106
|
256 selection_clear_event, /* Another X client cleared our selection. */
|
6747
|
257 buffer_switch_event, /* A process filter has switched buffers. */
|
7097
|
258 delete_window_event, /* An X client said "delete this window". */
|
9728
|
259 menu_bar_event, /* An event generated by the menu bar.
|
10798
|
260 The frame_or_window field's cdr holds the
|
7097
|
261 Lisp-level event value.
|
|
262 (Only the toolkit version uses these.) */
|
9728
|
263 iconify_event, /* An X client iconified this window. */
|
12660
|
264 deiconify_event, /* An X client deiconified this window. */
|
|
265 menu_bar_activate_event /* A button press in the menu bar
|
|
266 (toolkit version only). */
|
2186
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
267 };
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
268
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
269 /* If a struct input_event has a kind which is selection_request_event
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
270 or selection_clear_event, then its contents are really described
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
271 by `struct selection_event'; see xterm.h. */
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
272
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
273 /* The keyboard input buffer is an array of these structures. Each one
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
274 represents some sort of input event - a keystroke, a mouse click, or
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
275 a window system event. These get turned into their lispy forms when
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
276 they are removed from the event queue. */
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
277
|
14393
|
278 struct input_event
|
|
279 {
|
2186
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
280
|
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
281 /* What kind of event was this? */
|
14393
|
282 int kind;
|
296
|
283
|
5226
|
284 /* For an ascii_keystroke, this is the character.
|
|
285 For a non_ascii_keystroke, this is the keysym code.
|
5361
|
286 For a mouse event, this is the button number. */
|
5226
|
287 int code;
|
1994
|
288 enum scroll_bar_part part;
|
732
|
289
|
14161
|
290 int modifiers; /* See enum below for interpretation. */
|
|
291
|
|
292 Lisp_Object x, y;
|
|
293 unsigned long timestamp;
|
|
294
|
14393
|
295 /* This is padding just to put the frame_or_window field
|
|
296 past the size of struct selection_event. */
|
|
297 int *padding[2];
|
|
298
|
1782
|
299 /* This field is copied into a vector while the event is in the queue,
|
|
300 so that garbage collections won't kill it. */
|
10798
|
301 /* In a menu_bar_event, this is a cons cell whose car is the frame
|
|
302 and whose cdr is the Lisp object that is the event's value. */
|
14161
|
303 /* This field is last so that struct selection_input_event
|
|
304 does not overlap with it. */
|
1782
|
305 Lisp_Object frame_or_window;
|
296
|
306 };
|
2186
82e8ee492593
(selection_request_event, selection_clear_event): New event kinds.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
307
|
1312
|
308 /* This is used in keyboard.c, to tell how many buttons we will need
|
|
309 to track the positions of. */
|
|
310 #define NUM_MOUSE_BUTTONS (5)
|
|
311
|
1238
|
312 /* Bits in the modifiers member of the input_event structure.
|
|
313 Note that reorder_modifiers assumes that the bits are in canonical
|
1312
|
314 order.
|
|
315
|
|
316 The modifiers applied to mouse clicks are rather ornate. The
|
|
317 window-system-specific code should store mouse clicks with
|
1319
|
318 up_modifier or down_modifier set. Having an explicit down modifier
|
|
319 simplifies some of window-system-independent code; without it, the
|
|
320 code would have to recognize down events by checking if the event
|
|
321 is a mouse click lacking the click and drag modifiers.
|
|
322
|
|
323 The window-system independent code turns all up_modifier events
|
3861
|
324 bits into drag_modifier, click_modifier, double_modifier, or
|
|
325 triple_modifier events. The click_modifier has no written
|
|
326 representation in the names of the symbols used as event heads,
|
|
327 but it does appear in the Qevent_symbol_components property of the
|
|
328 event heads. */
|
296
|
329 enum {
|
1312
|
330 up_modifier = 1, /* Only used on mouse buttons - always
|
|
331 turned into a click or a drag modifier
|
|
332 before lisp code sees the event. */
|
2659
|
333 down_modifier = 2, /* Only used on mouse buttons. */
|
|
334 drag_modifier = 4, /* This is never used in the event
|
1312
|
335 queue; it's only used internally by
|
|
336 the window-system-independent code. */
|
2659
|
337 click_modifier= 8, /* See drag_modifier. */
|
3861
|
338 double_modifier= 16, /* See drag_modifier. */
|
|
339 triple_modifier= 32, /* See drag_modifier. */
|
2659
|
340
|
|
341 /* The next four modifier bits are used also in keyboard events at
|
|
342 the Lisp level.
|
2046
|
343
|
2659
|
344 It's probably not the greatest idea to use the 2^23 bit for any
|
|
345 modifier. It may or may not be the sign bit, depending on
|
|
346 VALBITS, so using it to represent a modifier key means that
|
|
347 characters thus modified have different integer equivalents
|
|
348 depending on the architecture they're running on. Oh, and
|
|
349 applying XINT to a character whose 2^23 bit is set sign-extends
|
|
350 it, so you get a bunch of bits in the mask you didn't want.
|
|
351
|
|
352 The CHAR_ macros are defined in lisp.h. */
|
|
353 alt_modifier = CHAR_ALT, /* Under X, the XK_Alt_[LR] keysyms. */
|
|
354 super_modifier= CHAR_SUPER, /* Under X, the XK_Super_[LR] keysyms. */
|
|
355 hyper_modifier= CHAR_HYPER, /* Under X, the XK_Hyper_[LR] keysyms. */
|
|
356 shift_modifier= CHAR_SHIFT,
|
|
357 ctrl_modifier = CHAR_CTL,
|
4569
|
358 meta_modifier = CHAR_META /* Under X, the XK_Meta_[LR] keysyms. */
|
296
|
359 };
|
|
360
|
|
361 #endif
|