* termhooks.h (struct input_event): Doc fix.
[bpt/emacs.git] / src / termhooks.h
1 /* Hooks by which low level terminal operations
2 can be made to call other routines.
3 Copyright (C) 1985, 1986, 1992 Free Software Foundation, Inc.
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
9 the Free Software Foundation; either version 2, or (at your option)
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
21
22 extern int (*cursor_to_hook) ();
23 extern int (*raw_cursor_to_hook) ();
24
25 extern int (*clear_to_end_hook) ();
26 extern int (*clear_frame_hook) ();
27 extern int (*clear_end_of_line_hook) ();
28
29 extern int (*ins_del_lines_hook) ();
30
31 extern int (*change_line_highlight_hook) ();
32 extern int (*reassert_line_highlight_hook) ();
33
34 extern int (*insert_glyphs_hook) ();
35 extern int (*write_glyphs_hook) ();
36 extern int (*delete_glyphs_hook) ();
37
38 extern int (*ring_bell_hook) ();
39
40 extern int (*reset_terminal_modes_hook) ();
41 extern int (*set_terminal_modes_hook) ();
42 extern int (*update_begin_hook) ();
43 extern int (*update_end_hook) ();
44 extern int (*set_terminal_window_hook) ();
45
46 extern int (*read_socket_hook) ();
47
48 /* Return the current position of the mouse. This should clear
49 mouse_moved until the next motion event arrives. */
50 extern void (*mouse_position_hook) ( /* FRAME_PTR *f,
51 Lisp_Object *x,
52 Lisp_Object *y,
53 unsigned long *time */ );
54
55 /* The window system handling code should set this if the mouse has
56 moved since the last call to the mouse_position_hook. Calling that
57 hook should clear this. */
58 extern int mouse_moved;
59
60 /* When a frame's focus redirection is changed, this hook tells the
61 window system code to re-decide where to put the highlight. Under
62 X, this means that Emacs lies about where the focus is. */
63 extern void (*frame_rehighlight_hook) ( /* void */ );
64
65 /* If nonzero, send all terminal output characters to this stream also. */
66 extern FILE *termscript;
67
68 /* Expedient hack: only provide the below definitions to files that
69 are prepared to handle lispy things. XINT is defined iff lisp.h
70 has been included before this file. */
71 #ifdef XINT
72
73 /* The keyboard input buffer is an array of these structures. Each one
74 represents some sort of input event - a keystroke, a mouse click, or
75 a window system event. These get turned into their lispy forms when
76 they are removed from the event queue. */
77
78 struct input_event {
79
80 /* What kind of event was this? */
81 enum {
82 no_event, /* nothing happened. This should never
83 actually appear in the event queue. */
84 ascii_keystroke, /* The ASCII code is in .code.
85 .frame is the frame in which the key
86 was typed.
87 Note that this includes meta-keys, and
88 the modifiers field of the event
89 is unused.
90 .timestamp gives a timestamp (in
91 milliseconds) for the keystroke. */
92 non_ascii_keystroke, /* .code is a number identifying the
93 function key. A code N represents
94 a key whose name is
95 function_key_names[N]; function_key_names
96 is a table in keyboard.c to which you
97 should feel free to add missing keys.
98 .modifiers holds the state of the
99 modifier keys.
100 .frame is the frame in which the key
101 was typed.
102 .timestamp gives a timestamp (in
103 milliseconds) for the keystroke. */
104 mouse_click, /* The button number is in .code; it must
105 be >= 0 and < NUM_MOUSE_BUTTONS, defined
106 below.
107 .modifiers holds the state of the
108 modifier keys.
109 .x and .y give the mouse position,
110 in characters, within the window.
111 .frame gives the frame the mouse
112 click occurred in.
113 .timestamp gives a timestamp (in
114 milliseconds) for the click. */
115 scrollbar_click, /* .code gives the number of the mouse
116 button that was clicked.
117 .part is a lisp symbol indicating which
118 part of the scrollbar got clicked. This
119 indicates whether the scroll bar was
120 horizontal or vertical.
121 .modifiers gives the state of the
122 modifier keys.
123 .x gives the distance from the start
124 of the scroll bar of the click; .y gives
125 the total length of the scroll bar.
126 .frame gives the frame the click
127 should apply to.
128 .timestamp gives a timestamp (in
129 milliseconds) for the click. */
130 #if 0
131 frame_selected, /* The user has moved the focus to another
132 frame.
133 .frame is the frame that should become
134 selected at the next convenient time. */
135 #endif
136 } kind;
137
138 Lisp_Object code;
139 Lisp_Object part;
140
141 /* This is obviously wrong, but I'm not sure what else I should do.
142 Obviously, this should be a FRAME_PTR. But that would require that
143 every file which #includes this one should also #include "frame.h",
144 which would mean that files like cm.c and other innocents would be
145 dragged into the set of frame.h users. Maybe the definition of this
146 structure should be elsewhere? In its own file? */
147 #ifdef MULTI_FRAME
148 struct frame *frame;
149 #else
150 int frame;
151 #endif
152 int modifiers; /* See enum below for interpretation. */
153
154 Lisp_Object x, y;
155 unsigned long timestamp;
156 };
157
158 /* This is used in keyboard.c, to tell how many buttons we will need
159 to track the positions of. */
160 #define NUM_MOUSE_BUTTONS (5)
161
162 /* Bits in the modifiers member of the input_event structure.
163 Note that reorder_modifiers assumes that the bits are in canonical
164 order.
165
166 The modifiers applied to mouse clicks are rather ornate. The
167 window-system-specific code should store mouse clicks with
168 up_modifier or down_modifier set; the window-system independent
169 code turns all up_modifier events into either drag_modifier or
170 click_modifier. The click_modifier has no written representation
171 in the names of the symbols used as event heads, but it does appear
172 in the Qevent_symbol_components property of the event heads. */
173 enum {
174 up_modifier = 1, /* Only used on mouse buttons - always
175 turned into a click or a drag modifier
176 before lisp code sees the event. */
177 alt_modifier = 2, /* Under X, the XK_Alt_[LR] keysyms. */
178 ctrl_modifier = 4,
179 hyper_modifier= 8, /* Under X, the XK_Hyper_[LR] keysyms. */
180 meta_modifier = 16, /* Under X, the XK_Meta_[LR] keysyms. */
181 shift_modifier= 32,
182 super_modifier= 64, /* Under X, the XK_Super_[LR] keysyms. */
183 down_modifier = 128, /* Only used on mouse buttons. */
184 drag_modifier = 256, /* This is never used in the event
185 queue; it's only used internally by
186 the window-system-independent code. */
187 click_modifier= 512, /* See drag_modifier. */
188 last_modifier /* This should always be one more than the
189 highest modifier bit defined. */
190 };
191
192 #endif