Commit | Line | Data |
---|---|---|
6ed8eeff | 1 | /* Parameters and display hooks for terminal devices. |
95df8112 | 2 | |
ba318903 | 3 | Copyright (C) 1985-1986, 1993-1994, 2001-2014 Free Software Foundation, |
ab422c4d | 4 | Inc. |
80856e74 JB |
5 | |
6 | This file is part of GNU Emacs. | |
7 | ||
b9b1cc14 | 8 | GNU Emacs is free software: you can redistribute it and/or modify |
80856e74 | 9 | it under the terms of the GNU General Public License as published by |
b9b1cc14 GM |
10 | the Free Software Foundation, either version 3 of the License, or |
11 | (at your option) any later version. | |
80856e74 JB |
12 | |
13 | GNU Emacs is distributed in the hope that it will be useful, | |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public License | |
b9b1cc14 | 19 | along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
80856e74 | 20 | |
9d7693d7 DA |
21 | #ifndef EMACS_TERMHOOKS_H |
22 | #define EMACS_TERMHOOKS_H | |
23 | ||
ec3f896c JB |
24 | /* Miscellanea. */ |
25 | ||
08dc5ae6 PE |
26 | #include "systime.h" /* for Time */ |
27 | ||
3f22b86f | 28 | INLINE_HEADER_BEGIN |
80856e74 | 29 | |
a3c87d4e | 30 | enum scroll_bar_part { |
927eec55 | 31 | scroll_bar_nowhere = -1, |
a3c87d4e JB |
32 | scroll_bar_above_handle, |
33 | scroll_bar_handle, | |
33d5f42a RS |
34 | scroll_bar_below_handle, |
35 | scroll_bar_up_arrow, | |
6820433e GM |
36 | scroll_bar_down_arrow, |
37 | scroll_bar_to_top, | |
38 | scroll_bar_to_bottom, | |
57207f1e SM |
39 | scroll_bar_end_scroll, |
40 | scroll_bar_move_ratio | |
20a558dc JB |
41 | }; |
42 | ||
9d7693d7 DA |
43 | /* Output method of a terminal (and frames on this terminal, respectively). */ |
44 | ||
45 | enum output_method | |
46 | { | |
47 | output_initial, | |
48 | output_termcap, | |
49 | output_x_window, | |
50 | output_msdos_raw, | |
51 | output_w32, | |
52 | output_ns | |
53 | }; | |
54 | ||
ec3f896c | 55 | /* Input queue declarations and hooks. */ |
20a558dc | 56 | |
351c638e RS |
57 | enum event_kind |
58 | { | |
3b8f9651 | 59 | NO_EVENT, /* nothing happened. This should never |
80856e74 | 60 | actually appear in the event queue. */ |
f05ddc05 | 61 | |
3b8f9651 | 62 | ASCII_KEYSTROKE_EVENT, /* The ASCII code is in .code, perhaps |
f05ddc05 JB |
63 | with modifiers applied. |
64 | .modifiers holds the state of the | |
65 | modifier keys. | |
ec3f896c JB |
66 | .frame_or_window is the frame in |
67 | which the key was typed. | |
265a9e55 JB |
68 | .timestamp gives a timestamp (in |
69 | milliseconds) for the keystroke. */ | |
3b8f9651 | 70 | MULTIBYTE_CHAR_KEYSTROKE_EVENT, /* The multibyte char code is in .code, |
4ff939ad KH |
71 | perhaps with modifiers applied. |
72 | The others are the same as | |
7273faa1 | 73 | ASCII_KEYSTROKE_EVENT. */ |
3b8f9651 | 74 | NON_ASCII_KEYSTROKE_EVENT, /* .code is a number identifying the |
80856e74 JB |
75 | function key. A code N represents |
76 | a key whose name is | |
77 | function_key_names[N]; function_key_names | |
78 | is a table in keyboard.c to which you | |
79 | should feel free to add missing keys. | |
80 | .modifiers holds the state of the | |
62c07cc7 | 81 | modifier keys. |
ec3f896c JB |
82 | .frame_or_window is the frame in |
83 | which the key was typed. | |
265a9e55 JB |
84 | .timestamp gives a timestamp (in |
85 | milliseconds) for the keystroke. */ | |
3b8f9651 PJ |
86 | TIMER_EVENT, /* A timer fired. */ |
87 | MOUSE_CLICK_EVENT, /* The button number is in .code; it must | |
a1867fb1 JB |
88 | be >= 0 and < NUM_MOUSE_BUTTONS, defined |
89 | below. | |
80856e74 JB |
90 | .modifiers holds the state of the |
91 | modifier keys. | |
92 | .x and .y give the mouse position, | |
1113d9db | 93 | in characters, within the window. |
ec3f896c JB |
94 | .frame_or_window gives the frame |
95 | the mouse click occurred in. | |
80856e74 JB |
96 | .timestamp gives a timestamp (in |
97 | milliseconds) for the click. */ | |
3ecad19e JR |
98 | WHEEL_EVENT, /* A wheel event is generated by a |
99 | wheel on a mouse (e.g., MS | |
100 | Intellimouse). | |
101 | .modifiers holds the rotate | |
102 | direction (up or down), and the | |
103 | state of the modifier keys. | |
104 | .x and .y give the mouse position, | |
105 | in characters, within the window. | |
106 | .frame_or_window gives the frame | |
107 | the wheel event occurred in. | |
108 | .timestamp gives a timestamp (in | |
109 | milliseconds) for the event. */ | |
bce179b5 JR |
110 | HORIZ_WHEEL_EVENT, /* A wheel event generated by a second |
111 | horizontal wheel that is present on some | |
112 | mice. See WHEEL_EVENT. */ | |
a9e7a9d5 | 113 | #ifdef HAVE_NTGUI |
9c5501d9 | 114 | LANGUAGE_CHANGE_EVENT, /* A LANGUAGE_CHANGE_EVENT is |
0fda9b75 | 115 | generated when HAVE_NTGUI or on Mac OS |
9c5501d9 YM |
116 | when the keyboard layout or input |
117 | language is changed by the | |
dba46b7c | 118 | user. */ |
ab8f1008 | 119 | #endif |
3b8f9651 | 120 | SCROLL_BAR_CLICK_EVENT, /* .code gives the number of the mouse button |
20a558dc JB |
121 | that was clicked. |
122 | .modifiers holds the state of the modifier | |
123 | keys. | |
80856e74 | 124 | .part is a lisp symbol indicating which |
a3c87d4e | 125 | part of the scroll bar got clicked. |
20a558dc JB |
126 | .x gives the distance from the start of the |
127 | scroll bar of the click; .y gives the total | |
128 | length of the scroll bar. | |
ec3f896c | 129 | .frame_or_window gives the window |
a3c87d4e | 130 | whose scroll bar was clicked in. |
80856e74 JB |
131 | .timestamp gives a timestamp (in |
132 | milliseconds) for the click. */ | |
3b8f9651 | 133 | SELECTION_REQUEST_EVENT, /* Another X client wants a selection from us. |
0f8dad45 | 134 | See `struct selection_input_event'. */ |
3b8f9651 PJ |
135 | SELECTION_CLEAR_EVENT, /* Another X client cleared our selection. */ |
136 | BUFFER_SWITCH_EVENT, /* A process filter has switched buffers. */ | |
137 | DELETE_WINDOW_EVENT, /* An X client said "delete this window". */ | |
4d92e48d | 138 | MENU_BAR_EVENT, /* An event generated by the menu bar. |
b90afe71 | 139 | The frame_or_window field's cdr holds the |
765a05bc RS |
140 | Lisp-level event value. |
141 | (Only the toolkit version uses these.) */ | |
3b8f9651 PJ |
142 | ICONIFY_EVENT, /* An X client iconified this window. */ |
143 | DEICONIFY_EVENT, /* An X client deiconified this window. */ | |
144 | MENU_BAR_ACTIVATE_EVENT, /* A button press in the menu bar | |
c8b5ebed | 145 | (toolkit version only). */ |
3b8f9651 | 146 | DRAG_N_DROP_EVENT, /* A drag-n-drop event is generated when |
523812cd RS |
147 | files selected outside of Emacs are dropped |
148 | onto an Emacs window. | |
177c0ea7 | 149 | .modifiers holds the state of the |
523812cd RS |
150 | modifier keys. |
151 | .x and .y give the mouse position, | |
152 | in characters, within the window. | |
bf0f0659 YM |
153 | .frame_or_window is the frame in |
154 | which the drop was made. | |
155 | .arg is a platform-dependent | |
156 | representation of the dropped items. | |
523812cd RS |
157 | .timestamp gives a timestamp (in |
158 | milliseconds) for the click. */ | |
4d92e48d GM |
159 | USER_SIGNAL_EVENT, /* A user signal. |
160 | code is a number identifying it, | |
6820433e GM |
161 | index into lispy_user_signals. */ |
162 | ||
4d92e48d GM |
163 | /* Help events. Member `frame_or_window' of the input_event is the |
164 | frame on which the event occurred, and member `arg' contains | |
165 | the help to show. */ | |
6820433e GM |
166 | HELP_EVENT, |
167 | ||
4d92e48d GM |
168 | /* An event from a tool-bar. Member `arg' of the input event |
169 | contains the tool-bar item selected. If `frame_or_window' | |
170 | and `arg' are equal, this is a prefix event. */ | |
0f98c4c2 GM |
171 | TOOL_BAR_EVENT, |
172 | ||
173 | /* Queued from XTread_socket on FocusIn events. Translated into | |
174 | `switch-frame' events in kbd_buffer_get_event, if necessary. */ | |
408b2bfb JD |
175 | FOCUS_IN_EVENT, |
176 | ||
18c26d81 JD |
177 | FOCUS_OUT_EVENT, |
178 | ||
827b15c6 PJ |
179 | /* Generated when mouse moves over window not currently selected. */ |
180 | SELECT_WINDOW_EVENT, | |
181 | ||
408b2bfb JD |
182 | /* Queued from XTread_socket when session manager sends |
183 | save yourself before shutdown. */ | |
fba2cc7f | 184 | SAVE_SESSION_EVENT |
0f8dad45 | 185 | |
7e5a23bd | 186 | #ifdef HAVE_GPM |
1af74d06 | 187 | , GPM_CLICK_EVENT |
b2b25916 JR |
188 | #endif |
189 | ||
033b73e2 MA |
190 | #ifdef HAVE_DBUS |
191 | , DBUS_EVENT | |
192 | #endif | |
193 | ||
637fa988 JD |
194 | , CONFIG_CHANGED_EVENT |
195 | ||
0fda9b75 | 196 | #ifdef HAVE_NTGUI |
b2b25916 JR |
197 | /* Generated when an APPCOMMAND event is received, in response to |
198 | Multimedia or Internet buttons on some keyboards. | |
199 | Such keys are available as normal function keys on X through the | |
200 | Xkeyboard extension. | |
201 | On Windows, some of them get mapped to normal function key events, | |
202 | but others need to be handled by APPCOMMAND. Handling them all as | |
203 | APPCOMMAND events means they can be disabled | |
204 | (w32-pass-multimedia-buttons-to-system), important on Windows since | |
205 | the system never sees these keys if Emacs claims to handle them. | |
206 | On X, the window manager seems to grab the keys it wants | |
207 | first, so this is not a problem there. */ | |
208 | , MULTIMEDIA_KEY_EVENT | |
0f8dad45 | 209 | #endif |
8612b71a AR |
210 | |
211 | #ifdef HAVE_NS | |
212 | /* Generated when native multi-keystroke input method is used to modify | |
213 | tentative or indicative text display. */ | |
214 | , NS_TEXT_EVENT | |
e76df1c0 DR |
215 | /* Non-key system events (e.g. application menu events) */ |
216 | , NS_NONKEY_EVENT | |
8612b71a AR |
217 | #endif |
218 | ||
c9628c79 | 219 | #ifdef USE_FILE_NOTIFY |
81606b10 RS |
220 | /* File or directory was changed. */ |
221 | , FILE_NOTIFY_EVENT | |
222 | #endif | |
223 | ||
351c638e RS |
224 | }; |
225 | ||
3b8f9651 PJ |
226 | /* If a struct input_event has a kind which is SELECTION_REQUEST_EVENT |
227 | or SELECTION_CLEAR_EVENT, then its contents are really described | |
0f8dad45 | 228 | by `struct selection_input_event'; see xterm.h. */ |
351c638e RS |
229 | |
230 | /* The keyboard input buffer is an array of these structures. Each one | |
231 | represents some sort of input event - a keystroke, a mouse click, or | |
232 | a window system event. These get turned into their lispy forms when | |
233 | they are removed from the event queue. */ | |
234 | ||
f879067d RS |
235 | struct input_event |
236 | { | |
351c638e | 237 | /* What kind of event was this? */ |
a9dff54b | 238 | enum event_kind kind; |
177c0ea7 | 239 | |
3b8f9651 PJ |
240 | /* For an ASCII_KEYSTROKE_EVENT and MULTIBYTE_CHAR_KEYSTROKE_EVENT, |
241 | this is the character. | |
242 | For a NON_ASCII_KEYSTROKE_EVENT, this is the keysym code. | |
41118bd3 EZ |
243 | For a mouse event, this is the button number. |
244 | For a HELP_EVENT, this is the position within the object | |
245 | (stored in ARG below) where the help was found. */ | |
d311d28c | 246 | ptrdiff_t code; |
a3c87d4e | 247 | enum scroll_bar_part part; |
ec3f896c | 248 | |
46cfcdb4 RS |
249 | int modifiers; /* See enum below for interpretation. */ |
250 | ||
251 | Lisp_Object x, y; | |
08dc5ae6 | 252 | Time timestamp; |
46cfcdb4 | 253 | |
2b371ff7 DA |
254 | /* This field is copied into a vector while the event is in |
255 | the queue, so that garbage collections won't kill it. */ | |
ec3f896c | 256 | Lisp_Object frame_or_window; |
4d92e48d GM |
257 | |
258 | /* Additional event argument. This is used for TOOL_BAR_EVENTs and | |
259 | HELP_EVENTs and avoids calling Fcons during signal handling. */ | |
260 | Lisp_Object arg; | |
80856e74 | 261 | }; |
ec5d8db7 | 262 | |
72af86bd | 263 | #define EVENT_INIT(event) memset (&(event), 0, sizeof (struct input_event)) |
5400da8f | 264 | |
21cec071 JB |
265 | /* Bits in the modifiers member of the input_event structure. |
266 | Note that reorder_modifiers assumes that the bits are in canonical | |
177c0ea7 | 267 | order. |
a1867fb1 JB |
268 | |
269 | The modifiers applied to mouse clicks are rather ornate. The | |
270 | window-system-specific code should store mouse clicks with | |
45288343 JB |
271 | up_modifier or down_modifier set. Having an explicit down modifier |
272 | simplifies some of window-system-independent code; without it, the | |
273 | code would have to recognize down events by checking if the event | |
274 | is a mouse click lacking the click and drag modifiers. | |
275 | ||
276 | The window-system independent code turns all up_modifier events | |
fbcd35bd JB |
277 | bits into drag_modifier, click_modifier, double_modifier, or |
278 | triple_modifier events. The click_modifier has no written | |
279 | representation in the names of the symbols used as event heads, | |
280 | but it does appear in the Qevent_symbol_components property of the | |
281 | event heads. */ | |
80856e74 | 282 | enum { |
a1867fb1 JB |
283 | up_modifier = 1, /* Only used on mouse buttons - always |
284 | turned into a click or a drag modifier | |
285 | before lisp code sees the event. */ | |
d82222e1 JB |
286 | down_modifier = 2, /* Only used on mouse buttons. */ |
287 | drag_modifier = 4, /* This is never used in the event | |
a1867fb1 JB |
288 | queue; it's only used internally by |
289 | the window-system-independent code. */ | |
d82222e1 | 290 | click_modifier= 8, /* See drag_modifier. */ |
fbcd35bd JB |
291 | double_modifier= 16, /* See drag_modifier. */ |
292 | triple_modifier= 32, /* See drag_modifier. */ | |
d82222e1 JB |
293 | |
294 | /* The next four modifier bits are used also in keyboard events at | |
295 | the Lisp level. | |
296 | ||
722e028b | 297 | It's probably not the greatest idea to use the 2^28 bit for any |
d82222e1 | 298 | modifier. It may or may not be the sign bit, depending on |
722e028b | 299 | FIXNUM_BITS, so using it to represent a modifier key means that |
d82222e1 JB |
300 | characters thus modified have different integer equivalents |
301 | depending on the architecture they're running on. Oh, and | |
722e028b | 302 | applying XINT to a character whose 2^28 bit is set might sign-extend |
d82222e1 JB |
303 | it, so you get a bunch of bits in the mask you didn't want. |
304 | ||
305 | The CHAR_ macros are defined in lisp.h. */ | |
306 | alt_modifier = CHAR_ALT, /* Under X, the XK_Alt_[LR] keysyms. */ | |
307 | super_modifier= CHAR_SUPER, /* Under X, the XK_Super_[LR] keysyms. */ | |
308 | hyper_modifier= CHAR_HYPER, /* Under X, the XK_Hyper_[LR] keysyms. */ | |
309 | shift_modifier= CHAR_SHIFT, | |
310 | ctrl_modifier = CHAR_CTL, | |
6cd195e2 | 311 | meta_modifier = CHAR_META /* Under X, the XK_Meta_[LR] keysyms. */ |
80856e74 JB |
312 | }; |
313 | ||
7e5a23bd | 314 | #ifdef HAVE_GPM |
d036ccf4 | 315 | #include <gpm.h> |
7be1c21a | 316 | extern int handle_one_term_event (struct tty_display_info *, Gpm_Event *, struct input_event *); |
64520e5c | 317 | #ifndef HAVE_WINDOW_SYSTEM |
b2d1ffb1 | 318 | extern void term_mouse_moveto (int, int); |
64520e5c | 319 | #endif |
d036ccf4 | 320 | |
71f44e7a SM |
321 | /* The device for which we have enabled gpm support. */ |
322 | extern struct tty_display_info *gpm_tty; | |
7be1c21a MB |
323 | #endif |
324 | ||
6ed8eeff KL |
325 | /* Terminal-local parameters. */ |
326 | struct terminal | |
428a555e | 327 | { |
eab3844f | 328 | /* This is for Lisp; the terminal code does not refer to it. */ |
b102ceb1 | 329 | struct vectorlike_header header; |
597cc809 | 330 | |
ff16b875 SM |
331 | /* Parameter alist of this terminal. */ |
332 | Lisp_Object param_alist; | |
333 | ||
b18fad6d KH |
334 | /* List of charsets supported by the terminal. It is set by |
335 | Fset_terminal_coding_system_internal along with | |
336 | the member terminal_coding. */ | |
337 | Lisp_Object charset_list; | |
338 | ||
a9f737ee CY |
339 | /* This is an association list containing the X selections that |
340 | Emacs might own on this terminal. Each element has the form | |
341 | (SELECTION-NAME SELECTION-VALUE SELECTION-TIMESTAMP FRAME) | |
342 | SELECTION-NAME is a lisp symbol, whose name is the name of an X Atom. | |
343 | SELECTION-VALUE is the value that emacs owns for that selection. | |
344 | It may be any kind of Lisp object. | |
345 | SELECTION-TIMESTAMP is the time at which emacs began owning this | |
346 | selection, as a cons of two 16-bit numbers (making a 32 bit | |
347 | time.) | |
348 | FRAME is the frame for which we made the selection. If there is | |
349 | an entry in this alist, then it can be assumed that Emacs owns | |
350 | that selection. | |
351 | The only (eq) parts of this list that are visible from Lisp are | |
352 | the selection-values. */ | |
353 | Lisp_Object Vselection_alist; | |
354 | ||
ff16b875 SM |
355 | /* All fields before `next_terminal' should be Lisp_Object and are traced |
356 | by the GC. All fields afterwards are ignored by the GC. */ | |
033b73e2 | 357 | |
6ed8eeff KL |
358 | /* Chain of all terminal devices. */ |
359 | struct terminal *next_terminal; | |
428a555e | 360 | |
6ed8eeff | 361 | /* Unique id for this terminal device. */ |
b6660415 KL |
362 | int id; |
363 | ||
6ed8eeff | 364 | /* The number of frames that are on this terminal. */ |
428a555e | 365 | int reference_count; |
a98f1617 | 366 | |
6ed8eeff | 367 | /* The type of the terminal device. */ |
428a555e KL |
368 | enum output_method type; |
369 | ||
ab797f65 KL |
370 | /* The name of the terminal device. Do not use this to uniquely |
371 | identify a terminal; the same device may be opened multiple | |
372 | times. */ | |
b6660415 KL |
373 | char *name; |
374 | ||
6ed8eeff | 375 | /* The terminal's keyboard object. */ |
bedb9c0e | 376 | struct kboard *kboard; |
bedb9c0e | 377 | |
354884c4 SM |
378 | #ifdef HAVE_WINDOW_SYSTEM |
379 | /* Cache of images. */ | |
380 | struct image_cache *image_cache; | |
381 | #endif /* HAVE_WINDOW_SYSTEM */ | |
382 | ||
cbae07d5 | 383 | /* Device-type dependent data shared amongst all frames on this terminal. */ |
428a555e KL |
384 | union display_info |
385 | { | |
386 | struct tty_display_info *tty; /* termchar.h */ | |
387 | struct x_display_info *x; /* xterm.h */ | |
936ad3d6 | 388 | struct w32_display_info *w32; /* w32term.h */ |
edfda783 | 389 | struct ns_display_info *ns; /* nsterm.h */ |
428a555e KL |
390 | } display_info; |
391 | ||
392 | \f | |
b8299c66 KL |
393 | /* Coding-system to be used for encoding terminal output. This |
394 | structure contains information of a coding-system specified by | |
395 | the function `set-terminal-coding-system'. Also see | |
396 | `safe_terminal_coding' in coding.h. */ | |
397 | struct coding_system *terminal_coding; | |
398 | ||
399 | /* Coding-system of what is sent from terminal keyboard. This | |
400 | structure contains information of a coding-system specified by | |
401 | the function `set-keyboard-coding-system'. */ | |
402 | struct coding_system *keyboard_coding; | |
403 | ||
428a555e KL |
404 | /* Window-based redisplay interface for this device (0 for tty |
405 | devices). */ | |
406 | struct redisplay_interface *rif; | |
407 | ||
408 | /* Frame-based redisplay interface. */ | |
033b73e2 | 409 | |
428a555e KL |
410 | /* Text display hooks. */ |
411 | ||
383e0970 J |
412 | void (*cursor_to_hook) (struct frame *f, int vpos, int hpos); |
413 | void (*raw_cursor_to_hook) (struct frame *, int, int); | |
033b73e2 | 414 | |
383e0970 J |
415 | void (*clear_to_end_hook) (struct frame *); |
416 | void (*clear_frame_hook) (struct frame *); | |
417 | void (*clear_end_of_line_hook) (struct frame *, int); | |
033b73e2 | 418 | |
383e0970 | 419 | void (*ins_del_lines_hook) (struct frame *f, int, int); |
033b73e2 | 420 | |
383e0970 J |
421 | void (*insert_glyphs_hook) (struct frame *f, struct glyph *s, int n); |
422 | void (*write_glyphs_hook) (struct frame *f, struct glyph *s, int n); | |
423 | void (*delete_glyphs_hook) (struct frame *, int); | |
033b73e2 | 424 | |
383e0970 J |
425 | void (*ring_bell_hook) (struct frame *f); |
426 | void (*toggle_invisible_pointer_hook) (struct frame *f, int invisible); | |
033b73e2 | 427 | |
383e0970 J |
428 | void (*reset_terminal_modes_hook) (struct terminal *); |
429 | void (*set_terminal_modes_hook) (struct terminal *); | |
385ed61f | 430 | |
383e0970 J |
431 | void (*update_begin_hook) (struct frame *); |
432 | void (*update_end_hook) (struct frame *); | |
433 | void (*set_terminal_window_hook) (struct frame *, int); | |
428a555e KL |
434 | |
435 | /* Multi-frame and mouse support hooks. */ | |
436 | ||
437 | /* Return the current position of the mouse. | |
438 | ||
439 | Set *f to the frame the mouse is in, or zero if the mouse is in no | |
440 | Emacs frame. If it is set to zero, all the other arguments are | |
441 | garbage. | |
033b73e2 | 442 | |
428a555e KL |
443 | If the motion started in a scroll bar, set *bar_window to the |
444 | scroll bar's window, *part to the part the mouse is currently over, | |
445 | *x to the position of the mouse along the scroll bar, and *y to the | |
446 | overall length of the scroll bar. | |
447 | ||
448 | Otherwise, set *bar_window to Qnil, and *x and *y to the column and | |
449 | row of the character cell the mouse is over. | |
450 | ||
be49ba74 | 451 | Set *time to the time the mouse was at the returned position. */ |
383e0970 J |
452 | void (*mouse_position_hook) (struct frame **f, int, |
453 | Lisp_Object *bar_window, | |
454 | enum scroll_bar_part *part, | |
455 | Lisp_Object *x, | |
456 | Lisp_Object *y, | |
08dc5ae6 | 457 | Time *); |
428a555e | 458 | |
428a555e KL |
459 | /* When a frame's focus redirection is changed, this hook tells the |
460 | window system code to re-decide where to put the highlight. Under | |
461 | X, this means that Emacs lies about where the focus is. */ | |
383e0970 | 462 | void (*frame_rehighlight_hook) (struct frame *); |
428a555e KL |
463 | |
464 | /* If we're displaying frames using a window system that can stack | |
465 | frames on top of each other, this hook allows you to bring a frame | |
466 | to the front, or bury it behind all the other windows. If this | |
6ed8eeff | 467 | hook is zero, that means the terminal we're displaying on doesn't |
428a555e KL |
468 | support overlapping frames, so there's no need to raise or lower |
469 | anything. | |
033b73e2 | 470 | |
e264f262 PE |
471 | If RAISE_FLAG is non-zero, F is brought to the front, before all other |
472 | windows. If RAISE_FLAG is zero, F is sent to the back, behind all other | |
428a555e | 473 | windows. */ |
e264f262 | 474 | void (*frame_raise_lower_hook) (struct frame *f, int raise_flag); |
428a555e | 475 | |
fb55b9d1 | 476 | /* If the value of the frame parameter changed, this hook is called. |
974b73e8 KL |
477 | For example, if going from fullscreen to not fullscreen this hook |
478 | may do something OS dependent, like extended window manager hints on X11. */ | |
383e0970 | 479 | void (*fullscreen_hook) (struct frame *f); |
033b73e2 | 480 | |
cfd794af DA |
481 | /* This hook is called to display menus. */ |
482 | Lisp_Object (*menu_show_hook) (struct frame *f, int x, int y, int menuflags, | |
483 | Lisp_Object title, const char **error_name); | |
484 | ||
680a6ad9 DA |
485 | /* This hook is called to display popup dialog. */ |
486 | Lisp_Object (*popup_dialog_hook) (struct frame *f, Lisp_Object header, | |
487 | Lisp_Object contents); | |
488 | ||
428a555e KL |
489 | /* Scroll bar hooks. */ |
490 | ||
491 | /* The representation of scroll bars is determined by the code which | |
492 | implements them, except for one thing: they must be represented by | |
493 | lisp objects. This allows us to place references to them in | |
494 | Lisp_Windows without worrying about those references becoming | |
495 | dangling references when the scroll bar is destroyed. | |
033b73e2 | 496 | |
428a555e KL |
497 | The window-system-independent portion of Emacs just refers to |
498 | scroll bars via their windows, and never looks inside the scroll bar | |
499 | representation; it always uses hook functions to do all the | |
500 | scroll bar manipulation it needs. | |
033b73e2 | 501 | |
428a555e KL |
502 | The `vertical_scroll_bar' field of a Lisp_Window refers to that |
503 | window's scroll bar, or is nil if the window doesn't have a | |
504 | scroll bar. | |
033b73e2 | 505 | |
428a555e KL |
506 | The `scroll_bars' and `condemned_scroll_bars' fields of a Lisp_Frame |
507 | are free for use by the scroll bar implementation in any way it sees | |
508 | fit. They are marked by the garbage collector. */ | |
033b73e2 MA |
509 | |
510 | ||
428a555e KL |
511 | /* Set the vertical scroll bar for WINDOW to have its upper left corner |
512 | at (TOP, LEFT), and be LENGTH rows high. Set its handle to | |
513 | indicate that we are displaying PORTION characters out of a total | |
514 | of WHOLE characters, starting at POSITION. If WINDOW doesn't yet | |
515 | have a scroll bar, create one for it. */ | |
383e0970 J |
516 | void (*set_vertical_scroll_bar_hook) (struct window *window, |
517 | int portion, int whole, | |
518 | int position); | |
428a555e KL |
519 | |
520 | ||
521 | /* The following three hooks are used when we're doing a thorough | |
522 | redisplay of the frame. We don't explicitly know which scroll bars | |
523 | are going to be deleted, because keeping track of when windows go | |
524 | away is a real pain - can you say set-window-configuration? | |
525 | Instead, we just assert at the beginning of redisplay that *all* | |
526 | scroll bars are to be removed, and then save scroll bars from the | |
527 | fiery pit when we actually redisplay their window. */ | |
033b73e2 | 528 | |
428a555e KL |
529 | /* Arrange for all scroll bars on FRAME to be removed at the next call |
530 | to `*judge_scroll_bars_hook'. A scroll bar may be spared if | |
333f9019 | 531 | `*redeem_scroll_bar_hook' is applied to its window before the judgment. |
033b73e2 | 532 | |
428a555e KL |
533 | This should be applied to each frame each time its window tree is |
534 | redisplayed, even if it is not displaying scroll bars at the moment; | |
535 | if the HAS_SCROLL_BARS flag has just been turned off, only calling | |
536 | this and the judge_scroll_bars_hook will get rid of them. | |
033b73e2 | 537 | |
428a555e KL |
538 | If non-zero, this hook should be safe to apply to any frame, |
539 | whether or not it can support scroll bars, and whether or not it is | |
540 | currently displaying them. */ | |
383e0970 | 541 | void (*condemn_scroll_bars_hook) (struct frame *frame); |
428a555e | 542 | |
333f9019 | 543 | /* Unmark WINDOW's scroll bar for deletion in this judgment cycle. |
428a555e | 544 | Note that it's okay to redeem a scroll bar that is not condemned. */ |
383e0970 | 545 | void (*redeem_scroll_bar_hook) (struct window *window); |
428a555e KL |
546 | |
547 | /* Remove all scroll bars on FRAME that haven't been saved since the | |
548 | last call to `*condemn_scroll_bars_hook'. | |
549 | ||
550 | This should be applied to each frame after each time its window | |
551 | tree is redisplayed, even if it is not displaying scroll bars at the | |
552 | moment; if the HAS_SCROLL_BARS flag has just been turned off, only | |
553 | calling this and condemn_scroll_bars_hook will get rid of them. | |
033b73e2 | 554 | |
428a555e KL |
555 | If non-zero, this hook should be safe to apply to any frame, |
556 | whether or not it can support scroll bars, and whether or not it is | |
557 | currently displaying them. */ | |
383e0970 | 558 | void (*judge_scroll_bars_hook) (struct frame *FRAME); |
428a555e KL |
559 | |
560 | \f | |
d448e982 KL |
561 | /* Called to read input events. |
562 | ||
6ed8eeff | 563 | TERMINAL indicates which terminal device to read from. Input |
4d7e6e51 | 564 | events should be read into HOLD_QUIT. |
d448e982 KL |
565 | |
566 | A positive return value indicates that that many input events | |
f75beb47 | 567 | were read into BUF. |
d448e982 KL |
568 | Zero means no events were immediately available. |
569 | A value of -1 means a transient read error, while -2 indicates | |
f75beb47 | 570 | that the device was closed (hangup), and it should be deleted. */ |
383e0970 | 571 | int (*read_socket_hook) (struct terminal *terminal, |
383e0970 | 572 | struct input_event *hold_quit); |
428a555e KL |
573 | |
574 | /* Called when a frame's display becomes entirely up to date. */ | |
383e0970 | 575 | void (*frame_up_to_date_hook) (struct frame *); |
428a555e KL |
576 | |
577 | \f | |
578 | /* Called to delete the device-specific portions of a frame that is | |
6ed8eeff | 579 | on this terminal device. */ |
383e0970 | 580 | void (*delete_frame_hook) (struct frame *); |
428a555e | 581 | |
6ed8eeff | 582 | /* Called after the last frame on this terminal is deleted, or when |
d448e982 | 583 | the display device was closed (hangup). |
033b73e2 | 584 | |
6ed8eeff KL |
585 | If this is NULL, then the generic delete_terminal is called |
586 | instead. Otherwise the hook must call delete_terminal itself. | |
428a555e | 587 | |
d448e982 | 588 | The hook must check for and close any live frames that are still |
e2749141 | 589 | on the terminal. delete_frame ensures that there are no live |
6ed8eeff | 590 | frames on the terminal when it calls this hook, so infinite |
d448e982 | 591 | recursion is prevented. */ |
383e0970 | 592 | void (*delete_terminal_hook) (struct terminal *); |
428a555e KL |
593 | }; |
594 | ||
3f22b86f PE |
595 | /* Most code should use these functions to set Lisp fields in struct |
596 | terminal. */ | |
00382e8b | 597 | INLINE void |
3f22b86f PE |
598 | tset_charset_list (struct terminal *t, Lisp_Object val) |
599 | { | |
600 | t->charset_list = val; | |
601 | } | |
00382e8b | 602 | INLINE void |
3f22b86f PE |
603 | tset_selection_alist (struct terminal *t, Lisp_Object val) |
604 | { | |
605 | t->Vselection_alist = val; | |
606 | } | |
428a555e | 607 | |
cbae07d5 | 608 | /* Chain of all terminal devices currently in use. */ |
6ed8eeff | 609 | extern struct terminal *terminal_list; |
428a555e | 610 | |
77e3b1b7 DA |
611 | #define FRAME_MUST_WRITE_SPACES(f) (FRAME_TTY (f)->must_write_spaces) |
612 | #define FRAME_LINE_INS_DEL_OK(f) (FRAME_TTY (f)->line_ins_del_ok) | |
613 | #define FRAME_CHAR_INS_DEL_OK(f) (FRAME_TTY (f)->char_ins_del_ok) | |
614 | #define FRAME_SCROLL_REGION_OK(f) (FRAME_TTY (f)->scroll_region_ok) | |
615 | #define FRAME_SCROLL_REGION_COST(f) (FRAME_TTY (f)->scroll_region_cost) | |
616 | #define FRAME_MEMORY_BELOW_FRAME(f) (FRAME_TTY (f)->memory_below_frame) | |
428a555e | 617 | |
6ed8eeff KL |
618 | #define FRAME_TERMINAL_CODING(f) ((f)->terminal->terminal_coding) |
619 | #define FRAME_KEYBOARD_CODING(f) ((f)->terminal->keyboard_coding) | |
b8299c66 | 620 | |
6ed8eeff KL |
621 | #define TERMINAL_TERMINAL_CODING(d) ((d)->terminal_coding) |
622 | #define TERMINAL_KEYBOARD_CODING(d) ((d)->keyboard_coding) | |
68bba4e4 | 623 | |
6ed8eeff | 624 | #define FRAME_RIF(f) ((f)->terminal->rif) |
428a555e | 625 | |
6ed8eeff | 626 | #define FRAME_TERMINAL(f) ((f)->terminal) |
428a555e | 627 | |
cbae07d5 SM |
628 | /* Return true if the terminal device is not suspended. */ |
629 | #define TERMINAL_ACTIVE_P(d) \ | |
630 | (((d)->type != output_termcap && (d)->type != output_msdos_raw) \ | |
631 | || (d)->display_info.tty->input) | |
b6660415 | 632 | |
d141d701 DA |
633 | /* Return font cache data for the specified terminal. The historical |
634 | name is grossly misleading, actually it is (NAME . FONT-LIST-CACHE). */ | |
635 | #if defined (HAVE_X_WINDOWS) | |
636 | #define TERMINAL_FONT_CACHE(t) \ | |
637 | (t->type == output_x_window ? t->display_info.x->name_list_element : Qnil) | |
638 | #elif defined (HAVE_NTGUI) | |
639 | #define TERMINAL_FONT_CACHE(t) \ | |
640 | (t->type == output_w32 ? t->display_info.w32->name_list_element : Qnil) | |
641 | #elif defined (HAVE_NS) | |
642 | #define TERMINAL_FONT_CACHE(t) \ | |
643 | (t->type == output_ns ? t->display_info.ns->name_list_element : Qnil) | |
644 | #endif | |
645 | ||
653d4f43 | 646 | extern struct terminal *get_terminal (Lisp_Object terminal, bool); |
6f1d9822 DA |
647 | extern struct terminal *create_terminal (enum output_method, |
648 | struct redisplay_interface *); | |
383e0970 | 649 | extern void delete_terminal (struct terminal *); |
428a555e | 650 | |
cbae07d5 | 651 | /* The initial terminal device, created by initial_term_init. */ |
6ed8eeff | 652 | extern struct terminal *initial_terminal; |
114a8b8c | 653 | |
7ef4b50c EZ |
654 | extern unsigned char *encode_terminal_code (struct glyph *, int, |
655 | struct coding_system *); | |
656 | ||
ed5ff21d | 657 | #ifdef HAVE_GPM |
d347e494 | 658 | extern void close_gpm (int gpm_fd); |
ed5ff21d | 659 | #endif |
b5e9cbb6 EZ |
660 | |
661 | #ifdef WINDOWSNT | |
e7873136 EZ |
662 | extern int cursorX (struct tty_display_info *); |
663 | extern int cursorY (struct tty_display_info *); | |
664 | #else | |
665 | #define cursorX(t) curX(t) | |
666 | #define cursorY(t) curY(t) | |
b5e9cbb6 EZ |
667 | #endif |
668 | ||
3f22b86f | 669 | INLINE_HEADER_END |
9d7693d7 DA |
670 | |
671 | #endif /* EMACS_TERMHOOKS_H */ |