*** empty log message ***
[bpt/emacs.git] / src / xterm.h
CommitLineData
3f930d20
JB
1/* Definitions and headers for communication with X protocol.
2 Copyright (C) 1989 Free Software Foundation, Inc.
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 1, or (at your option)
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20#ifdef HAVE_X11
21#include <X11/Xlib.h>
22#include <X11/cursorfont.h>
23#include <X11/Xutil.h>
24#include <X11/keysym.h>
25#include <X11/Xatom.h>
26#include <X11/Xresource.h>
27#else
28#include <X/Xlib.h>
29#endif /* HAVE_X11 */
30
31/* Define a queue for X-events. One such queue is used for mouse clicks.
32 Another is used for expose events. */
33
34#define EVENT_BUFFER_SIZE 64
35
3f930d20
JB
36/* Max and Min sizes in character columns. */
37#define MINWIDTH 10
38#define MINHEIGHT 10
39#define MAXWIDTH 300
40#define MAXHEIGHT 80
41
42#ifdef HAVE_X11
43#define PIX_TYPE unsigned long
44#define XDISPLAY x_current_display,
45#define XFlushQueue() XFlush(x_current_display)
46#define BLACK_PIX_DEFAULT BlackPixel (x_current_display, \
47 XDefaultScreen (x_current_display))
48#define WHITE_PIX_DEFAULT WhitePixel (x_current_display, \
49 XDefaultScreen (x_current_display))
50#define DISPLAY_SCREEN_ARG x_current_display, \
51 XDefaultScreen (x_current_display)
52#define DISPLAY_CELLS DisplayCells (x_current_display, XDefaultScreen (x_current_display))
53#define ROOT_WINDOW RootWindow (x_current_display, XDefaultScreen (x_current_display))
54#define FONT_TYPE XFontStruct
55#define Color XColor
56
57#define XExposeRegionEvent XExposeEvent
58#define Bitmap Pixmap /* In X11, Bitmaps are are kind of
59 Pixmap. */
60#define WINDOWINFO_TYPE XWindowAttributes
61#define XGetWindowInfo(w, i) XGetWindowAttributes (x_current_display, \
62 (w), (i))
63#define XGetFont(f) XLoadQueryFont (x_current_display, (f))
64#define XLoseFont(f) XFreeFont (x_current_display, (f))
65#define XStuffPending() XPending (x_current_display)
66#define XClear(w) XClearWindow (x_current_display, (w))
67#define XWarpMousePointer(w,x,y) XWarpPointer (x_current_display, None, w, \
68 0,0,0,0, x, y)
69#define XHandleError XSetErrorHandler
70#define XHandleIOError XSetIOErrorHandler
71
72#define XChangeWindowSize(w,x,y) XResizeWindow(x_current_display,w,x,y)
73
74#define FONT_WIDTH(f) ((f)->max_bounds.width)
75#define FONT_HEIGHT(f) ((f)->ascent + (f)->descent)
76#define FONT_BASE(f) ((f)->ascent)
77
78/* GC values used for drawing non-standard (other face) text. */
79extern XGCValues face_gc_values;
80
81/* The mask of events that text windows always want to receive. This
8828b393
JB
82 does not include mouse movement events. It is used when the window
83 is created (in x_window) and when we ask/unask for mouse movement
84 events (in XTmouse_tracking_enable).
85
86 We do include ButtonReleases in this set because elisp isn't always
87 fast enough to catch them when it wants them, and they're rare
88 enough that they don't use much processor time. */
3f930d20
JB
89
90#define STANDARD_EVENT_SET \
91 (KeyPressMask \
92 | ExposureMask \
93 | ButtonPressMask \
8828b393
JB
94 | ButtonReleaseMask \
95 | PointerMotionMask \
96 | PointerMotionHintMask \
3f930d20
JB
97 | StructureNotifyMask \
98 | FocusChangeMask \
99 | LeaveWindowMask \
100 | EnterWindowMask \
101 | VisibilityChangeMask)
102
103#else /* X10 */
104
105#define ConnectionNumber(dpy) dpyno()
106#define PIX_TYPE int
107#define XDISPLAY
108#define XFlushQueue() XFlush()
109#define BLACK_PIX_DEFAULT BlackPixel
110#define WHITE_PIX_DEFAULT WhitePixel
111#define DISPLAY_SCREEN_ARG
112#define DISPLAY_CELLS DisplayCells ()
113#define ROOT_WINDOW RootWindow
114#define XFree free
115#define FONT_TYPE FontInfo
116
117#define WINDOWINFO_TYPE WindowInfo
118#define XGetWindowInfo(w, i) XQueryWindow ((w), (i))
119#define XGetFont(f) XOpenFont ((f))
120#define XLoseFont(f) XCloseFont ((f))
121#define XStuffPending() XPending ()
122#define XWarpMousePointer(w,x,y) XWarpMouse (w,x,y)
123#define XHandleError XErrorHandler
124#define XHandleIOError XIOErrorHandler
125
126#define FONT_WIDTH(f) ((f)->width)
127#define FONT_HEIGHT(f) ((f)->height)
128#define FONT_BASE(f) ((f)->base)
129
130#define XChangeWindowSize(w,x,y) XChangeWindow(w,x,y)
131
132#endif /* X10 */
133
134struct event_queue
135 {
136 int rindex; /* Index at which to fetch next. */
137 int windex; /* Index at which to store next. */
138 XEvent xrep[EVENT_BUFFER_SIZE];
139 };
140
141/* Queue for mouse clicks. */
142extern struct event_queue x_mouse_queue;
143
144/* Mechanism for interlocking between main program level
145 and input interrupt level. */
146
147/* Nonzero during a critical section. At such a time, an input interrupt
148 does nothing but set `x_pending_input'. */
149extern int x_input_blocked;
150
151/* Nonzero means an input interrupt has arrived
152 during the current critical section. */
153extern int x_pending_input;
154
3f930d20
JB
155/* Begin critical section. */
156#define BLOCK_INPUT (x_input_blocked++)
157
158/* End critical section. */
265a9e55
JB
159#define UNBLOCK_INPUT \
160 (x_input_blocked--, (x_input_blocked < 0 ? (abort (), 0) : 0))
3f930d20
JB
161
162#define TOTALLY_UNBLOCK_INPUT (x_input_blocked = 0)
163#define UNBLOCK_INPUT_RESIGNAL UNBLOCK_INPUT
164
165/* This is the X connection that we are using. */
166
167extern Display *x_current_display;
168
169extern struct screen *x_window_to_screen ();
170
171/* The screen (if any) which has the X window that has keyboard focus.
172 Zero if none. This is examined by Ffocus_screen in xfns.c */
173
174struct screen *x_focus_screen;
175
176#ifdef HAVE_X11
177/* Variables associated with the X display screen this emacs is using. */
178
179/* How many screens this X display has. */
180extern Lisp_Object x_screen_count;
181
182/* The vendor supporting this X server. */
183extern Lisp_Object Vx_vendor;
184
185/* The vendor's release number for this X server. */
186extern Lisp_Object x_release;
187
188/* Height of this X screen in pixels. */
189extern Lisp_Object x_screen_height;
190
191/* Height of this X screen in millimeters. */
192extern Lisp_Object x_screen_height_mm;
193
194/* Width of this X screen in pixels. */
195extern Lisp_Object x_screen_width;
196
197/* Width of this X screen in millimeters. */
198extern Lisp_Object x_screen_width_mm;
199
200/* Does this X screen do backing store? */
201extern Lisp_Object Vx_backing_store;
202
203/* Does this X screen do save-unders? */
204extern Lisp_Object x_save_under;
205
206/* Number of planes for this screen. */
207extern Lisp_Object x_screen_planes;
208
209/* X Visual type of this screen. */
210extern Lisp_Object Vx_screen_visual;
211
212#endif /* HAVE_X11 */
213\f
214enum text_cursor_kinds {
215 filled_box_cursor, hollow_box_cursor, bar_cursor
216};
217
218#define PIXEL_WIDTH(s) ((s)->display.x->pixel_width)
219#define PIXEL_HEIGHT(s) ((s)->display.x->pixel_height)
220
221/* Each X screen object points to its own struct x_display object
222 in the display.x field. The x_display structure contains all
223 the information that is specific to X windows. */
224
225struct x_display
226{
227 /* Position of the X window (x and y offsets in root window). */
228 int left_pos;
229 int top_pos;
230
231 /* Border width of the X window as known by the X window system. */
232 int border_width;
233
234 /* Size of the X window in pixels. */
235 int pixel_height, pixel_width;
236
237#ifdef HAVE_X11
238 /* The tiled border used when the mouse is out of the screen. */
239 Pixmap border_tile;
240
241 /* Here are the Graphics Contexts for the default font. */
242 GC normal_gc; /* Normal video */
243 GC reverse_gc; /* Reverse video */
244 GC cursor_gc; /* cursor drawing */
245#endif /* HAVE_X11 */
246
247 /* Width of the internal border. This is a line of background color
248 just inside the window's border. When the screen is selected,
249 a highlighting is displayed inside the internal border. */
250 int internal_border_width;
251
252 /* The X window used for this screen.
253 May be zero while the screen object is being created
254 and the X window has not yet been created. */
255 Window window_desc;
256
257 /* The X window used for the bitmap icon;
258 or 0 if we don't have a bitmap icon. */
259 Window icon_desc;
260
261 /* The X window that is the parent of this X window.
262 Usually but not always RootWindow. */
263 Window parent_desc;
264
265 /* 1 for bitmap icon, 0 for text icon. */
266 int icon_bitmap_flag;
267
268 FONT_TYPE *font;
269
270 /* Pixel values used for various purposes.
271 border_pixel may be -1 meaning use a gray tile. */
272 PIX_TYPE background_pixel;
273 PIX_TYPE foreground_pixel;
274 PIX_TYPE cursor_pixel;
275 PIX_TYPE border_pixel;
276 PIX_TYPE mouse_pixel;
277
278 /* Windows for scrollbars */
279 Window v_scrollbar;
280 Window v_thumbup;
281 Window v_thumbdown;
282 Window v_slider;
283
284 Window h_scrollbar;
285 Window h_thumbleft;
286 Window h_thumbright;
287 Window h_slider;
288
289 /* Scrollbar info */
290
291 int v_scrollbar_width;
292 int h_scrollbar_height;
293
294 /* Descriptor for the cursor in use for this window. */
295#ifdef HAVE_X11
296 Cursor text_cursor;
297 Cursor nontext_cursor;
298 Cursor modeline_cursor;
299#else
300 Cursor cursor;
301#endif
302
303 /* The name that was associated with the icon, the last time
304 it was refreshed. Usually the same as the name of the
305 buffer in the currently selected window in the screen */
306 char *icon_label;
307
308 /* Flag to set when the X window needs to be completely repainted. */
309 int needs_exposure;
310
311 /* What kind of text cursor is drawn in this window right now? (If
312 there is no cursor (phys_cursor_x < 0), then this means nothing. */
313 enum text_cursor_kinds text_cursor_kind;
314};
315\f
316/* When X windows are used, a glyf may be a 16 bit unsigned datum.
317 The high order byte is the face number and is used as an index
318 in the face table. A face is a font plus:
319 1) the unhighlighted foreground color,
320 2) the unhighlighted background color.
321 For highlighting, the two colors are exchanged.
322 Face number 0 is unused. The low order byte of a glyf gives
323 the character within the font. All fonts are assumed to be
324 fixed width, and to have the same height and width. */
325
326#ifdef HAVE_X11
327/* Table of GC's used for this screen. */
328GC *gc_table;
329
330/* How many GCs are in the table. */
331int gcs_in_use;
332
333struct face
334{
335 GC face_gc;
336 unsigned int foreground;
337 unsigned int background;
338 Pixmap stipple;
339 XFontStruct *font;
340};
341
342#else /* X10 */
343
344struct face
345{
346 FONT_TYPE *font; /* Font info for specified font. */
347 int fg; /* Unhighlighted foreground. */
348 int bg; /* Unhighlighted background. */
349};
350#endif /* X10 */
351
352#define MAX_FACES_AND_GLYPHS 256
353extern struct face *x_face_table[];