entered into RCS
[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.
105 .modifiers holds the state of the
106 modifier keys.
107 .x and .y give the mouse position,
108 in characters, within the window.
109 .frame gives the frame the mouse
110 click occurred in.
111 .timestamp gives a timestamp (in
112 milliseconds) for the click. */
113 scrollbar_click, /* .code gives the number of the mouse
114 button that was clicked.
115 .part is a lisp symbol indicating which
116 part of the scrollbar got clicked. This
117 indicates whether the scroll bar was
118 horizontal or vertical.
119 .modifiers gives the state of the
120 modifier keys.
121 .x gives the distance from the start
122 of the scroll bar of the click; .y gives
123 the total length of the scroll bar.
124 .frame gives the frame the click
125 should apply to.
126 .timestamp gives a timestamp (in
127 milliseconds) for the click. */
128 #if 0
129 frame_selected, /* The user has moved the focus to another
130 frame.
131 .frame is the frame that should become
132 selected at the next convenient time. */
133 #endif
134 } kind;
135
136 Lisp_Object code;
137 Lisp_Object part;
138
139 /* This is obviously wrong, but I'm not sure what else I should do.
140 Obviously, this should be a FRAME_PTR. But that would require that
141 every file which #includes this one should also #include "frame.h",
142 which would mean that files like cm.c and other innocents would be
143 dragged into the set of frame.h users. Maybe the definition of this
144 structure should be elsewhere? In its own file? */
145 #ifdef MULTI_FRAME
146 struct frame *frame;
147 #else
148 int frame;
149 #endif
150 int modifiers; /* See enum below for interpretation. */
151
152 Lisp_Object x, y;
153 unsigned long timestamp;
154 };
155
156 /* Bits in the modifiers member of the input_event structure. */
157 enum {
158 shift_modifier = 1,
159 ctrl_modifier = 2,
160 meta_modifier = 4,
161 up_modifier = 8, /* This only applies to mouse buttons. */
162 last_modifier /* This should always be one more than the
163 highest modifier bit defined. */
164 };
165
166 #define NUM_MODIFIER_COMBOS ((last_modifier-1) << 1)
167
168 #endif