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