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