*** 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
ef15f270 43
d2729198
JB
44/* HAVE_X11R4 is defined if we have the features of X11R4. It should
45 be defined when we're using X11R5, since X11R5 has the features of
46 X11R4. If, in the future, we find we need more of these flags
47 (HAVE_X11R5, for example), code should always be written to test
48 the most recent flag first:
49
50 #ifdef HAVE_X11R5
51 ...
52 #elif HAVE_X11R4
53 ...
54 #elif HAVE_X11
55 ...
56 #endif
57
58 If you ever find yourself writing a "#ifdef HAVE_FOO" clause that
59 looks a lot like another one, consider moving the text into a macro
60 whose definition is configuration-dependent, but whose usage is
61 universal - like the stuff in systime.h.
62
63 It turns out that we can auto-detect whether we're being compiled
ef15f270
JB
64 with X11R3 or X11R4 by looking for the flag macros for R4 structure
65 members that R3 doesn't have. */
66#ifdef PBaseSize
67#define HAVE_X11R4
68#endif
69
3f930d20
JB
70#define PIX_TYPE unsigned long
71#define XDISPLAY x_current_display,
72#define XFlushQueue() XFlush(x_current_display)
73#define BLACK_PIX_DEFAULT BlackPixel (x_current_display, \
74 XDefaultScreen (x_current_display))
75#define WHITE_PIX_DEFAULT WhitePixel (x_current_display, \
76 XDefaultScreen (x_current_display))
77#define DISPLAY_SCREEN_ARG x_current_display, \
78 XDefaultScreen (x_current_display)
79#define DISPLAY_CELLS DisplayCells (x_current_display, XDefaultScreen (x_current_display))
80#define ROOT_WINDOW RootWindow (x_current_display, XDefaultScreen (x_current_display))
81#define FONT_TYPE XFontStruct
82#define Color XColor
83
84#define XExposeRegionEvent XExposeEvent
85#define Bitmap Pixmap /* In X11, Bitmaps are are kind of
86 Pixmap. */
87#define WINDOWINFO_TYPE XWindowAttributes
88#define XGetWindowInfo(w, i) XGetWindowAttributes (x_current_display, \
89 (w), (i))
90#define XGetFont(f) XLoadQueryFont (x_current_display, (f))
91#define XLoseFont(f) XFreeFont (x_current_display, (f))
92#define XStuffPending() XPending (x_current_display)
93#define XClear(w) XClearWindow (x_current_display, (w))
94#define XWarpMousePointer(w,x,y) XWarpPointer (x_current_display, None, w, \
95 0,0,0,0, x, y)
96#define XHandleError XSetErrorHandler
97#define XHandleIOError XSetIOErrorHandler
98
99#define XChangeWindowSize(w,x,y) XResizeWindow(x_current_display,w,x,y)
100
101#define FONT_WIDTH(f) ((f)->max_bounds.width)
102#define FONT_HEIGHT(f) ((f)->ascent + (f)->descent)
103#define FONT_BASE(f) ((f)->ascent)
104
105/* GC values used for drawing non-standard (other face) text. */
106extern XGCValues face_gc_values;
107
108/* The mask of events that text windows always want to receive. This
8828b393
JB
109 does not include mouse movement events. It is used when the window
110 is created (in x_window) and when we ask/unask for mouse movement
111 events (in XTmouse_tracking_enable).
112
113 We do include ButtonReleases in this set because elisp isn't always
114 fast enough to catch them when it wants them, and they're rare
115 enough that they don't use much processor time. */
3f930d20
JB
116
117#define STANDARD_EVENT_SET \
118 (KeyPressMask \
119 | ExposureMask \
120 | ButtonPressMask \
8828b393
JB
121 | ButtonReleaseMask \
122 | PointerMotionMask \
123 | PointerMotionHintMask \
3f930d20
JB
124 | StructureNotifyMask \
125 | FocusChangeMask \
126 | LeaveWindowMask \
127 | EnterWindowMask \
128 | VisibilityChangeMask)
129
130#else /* X10 */
131
132#define ConnectionNumber(dpy) dpyno()
133#define PIX_TYPE int
134#define XDISPLAY
135#define XFlushQueue() XFlush()
136#define BLACK_PIX_DEFAULT BlackPixel
137#define WHITE_PIX_DEFAULT WhitePixel
138#define DISPLAY_SCREEN_ARG
139#define DISPLAY_CELLS DisplayCells ()
140#define ROOT_WINDOW RootWindow
141#define XFree free
142#define FONT_TYPE FontInfo
143
144#define WINDOWINFO_TYPE WindowInfo
145#define XGetWindowInfo(w, i) XQueryWindow ((w), (i))
146#define XGetFont(f) XOpenFont ((f))
147#define XLoseFont(f) XCloseFont ((f))
148#define XStuffPending() XPending ()
149#define XWarpMousePointer(w,x,y) XWarpMouse (w,x,y)
150#define XHandleError XErrorHandler
151#define XHandleIOError XIOErrorHandler
152
153#define FONT_WIDTH(f) ((f)->width)
154#define FONT_HEIGHT(f) ((f)->height)
155#define FONT_BASE(f) ((f)->base)
156
157#define XChangeWindowSize(w,x,y) XChangeWindow(w,x,y)
158
159#endif /* X10 */
160
161struct event_queue
162 {
163 int rindex; /* Index at which to fetch next. */
164 int windex; /* Index at which to store next. */
165 XEvent xrep[EVENT_BUFFER_SIZE];
166 };
167
168/* Queue for mouse clicks. */
169extern struct event_queue x_mouse_queue;
170
171/* Mechanism for interlocking between main program level
172 and input interrupt level. */
173
174/* Nonzero during a critical section. At such a time, an input interrupt
175 does nothing but set `x_pending_input'. */
176extern int x_input_blocked;
177
178/* Nonzero means an input interrupt has arrived
179 during the current critical section. */
180extern int x_pending_input;
181
3f930d20
JB
182/* Begin critical section. */
183#define BLOCK_INPUT (x_input_blocked++)
184
185/* End critical section. */
265a9e55
JB
186#define UNBLOCK_INPUT \
187 (x_input_blocked--, (x_input_blocked < 0 ? (abort (), 0) : 0))
3f930d20
JB
188
189#define TOTALLY_UNBLOCK_INPUT (x_input_blocked = 0)
190#define UNBLOCK_INPUT_RESIGNAL UNBLOCK_INPUT
191
192/* This is the X connection that we are using. */
193
194extern Display *x_current_display;
195
f676886a 196extern struct frame *x_window_to_frame ();
3f930d20 197
f676886a
JB
198/* The frame (if any) which has the X window that has keyboard focus.
199 Zero if none. This is examined by Ffocus_frame in xfns.c */
3f930d20 200
f676886a 201struct frame *x_focus_frame;
3f930d20
JB
202
203#ifdef HAVE_X11
204/* Variables associated with the X display screen this emacs is using. */
205
206/* How many screens this X display has. */
207extern Lisp_Object x_screen_count;
208
209/* The vendor supporting this X server. */
210extern Lisp_Object Vx_vendor;
211
212/* The vendor's release number for this X server. */
213extern Lisp_Object x_release;
214
215/* Height of this X screen in pixels. */
216extern Lisp_Object x_screen_height;
217
218/* Height of this X screen in millimeters. */
219extern Lisp_Object x_screen_height_mm;
220
221/* Width of this X screen in pixels. */
222extern Lisp_Object x_screen_width;
223
224/* Width of this X screen in millimeters. */
225extern Lisp_Object x_screen_width_mm;
226
227/* Does this X screen do backing store? */
228extern Lisp_Object Vx_backing_store;
229
230/* Does this X screen do save-unders? */
231extern Lisp_Object x_save_under;
232
233/* Number of planes for this screen. */
234extern Lisp_Object x_screen_planes;
235
236/* X Visual type of this screen. */
237extern Lisp_Object Vx_screen_visual;
238
239#endif /* HAVE_X11 */
240\f
241enum text_cursor_kinds {
242 filled_box_cursor, hollow_box_cursor, bar_cursor
243};
244
245#define PIXEL_WIDTH(s) ((s)->display.x->pixel_width)
246#define PIXEL_HEIGHT(s) ((s)->display.x->pixel_height)
247
f676886a 248/* Each X frame object points to its own struct x_display object
3f930d20
JB
249 in the display.x field. The x_display structure contains all
250 the information that is specific to X windows. */
251
252struct x_display
253{
254 /* Position of the X window (x and y offsets in root window). */
255 int left_pos;
256 int top_pos;
257
258 /* Border width of the X window as known by the X window system. */
259 int border_width;
260
261 /* Size of the X window in pixels. */
262 int pixel_height, pixel_width;
263
264#ifdef HAVE_X11
f676886a 265 /* The tiled border used when the mouse is out of the frame. */
3f930d20
JB
266 Pixmap border_tile;
267
268 /* Here are the Graphics Contexts for the default font. */
269 GC normal_gc; /* Normal video */
270 GC reverse_gc; /* Reverse video */
271 GC cursor_gc; /* cursor drawing */
272#endif /* HAVE_X11 */
273
274 /* Width of the internal border. This is a line of background color
f676886a 275 just inside the window's border. When the frame is selected,
3f930d20
JB
276 a highlighting is displayed inside the internal border. */
277 int internal_border_width;
278
f676886a
JB
279 /* The X window used for this frame.
280 May be zero while the frame object is being created
3f930d20
JB
281 and the X window has not yet been created. */
282 Window window_desc;
283
284 /* The X window used for the bitmap icon;
285 or 0 if we don't have a bitmap icon. */
286 Window icon_desc;
287
288 /* The X window that is the parent of this X window.
289 Usually but not always RootWindow. */
290 Window parent_desc;
291
292 /* 1 for bitmap icon, 0 for text icon. */
293 int icon_bitmap_flag;
294
295 FONT_TYPE *font;
296
297 /* Pixel values used for various purposes.
298 border_pixel may be -1 meaning use a gray tile. */
299 PIX_TYPE background_pixel;
300 PIX_TYPE foreground_pixel;
301 PIX_TYPE cursor_pixel;
302 PIX_TYPE border_pixel;
303 PIX_TYPE mouse_pixel;
304
305 /* Windows for scrollbars */
306 Window v_scrollbar;
307 Window v_thumbup;
308 Window v_thumbdown;
309 Window v_slider;
310
311 Window h_scrollbar;
312 Window h_thumbleft;
313 Window h_thumbright;
314 Window h_slider;
315
316 /* Scrollbar info */
317
318 int v_scrollbar_width;
319 int h_scrollbar_height;
320
321 /* Descriptor for the cursor in use for this window. */
322#ifdef HAVE_X11
323 Cursor text_cursor;
324 Cursor nontext_cursor;
325 Cursor modeline_cursor;
326#else
327 Cursor cursor;
328#endif
329
330 /* The name that was associated with the icon, the last time
331 it was refreshed. Usually the same as the name of the
f676886a 332 buffer in the currently selected window in the frame */
3f930d20
JB
333 char *icon_label;
334
335 /* Flag to set when the X window needs to be completely repainted. */
336 int needs_exposure;
337
338 /* What kind of text cursor is drawn in this window right now? (If
339 there is no cursor (phys_cursor_x < 0), then this means nothing. */
340 enum text_cursor_kinds text_cursor_kind;
ef15f270
JB
341
342 /* These are the current window manager hints. It seems that
343 XSetWMHints, when presented with an unset bit in the `flags'
344 member of the hints structure, does not leave the corresponding
345 attribute unchanged; rather, it resets that attribute to its
346 default value. For example, unless you set the `icon_pixmap'
347 field and the `IconPixmapHint' bit, XSetWMHints will forget what
348 your icon pixmap was. This is rather troublesome, since some of
349 the members (for example, `input' and `icon_pixmap') want to stay
350 the same throughout the execution of Emacs. So, we keep this
351 structure around, just leaving values in it and adding new bits
352 to the mask as we go. */
353 XWMHints wm_hints;
3f930d20 354};
d2729198
JB
355
356/* Return the window associated with the frame F. */
357#define FRAME_X_WINDOW(f) ((f)->display.x->window_desc)
358
3f930d20
JB
359\f
360/* When X windows are used, a glyf may be a 16 bit unsigned datum.
361 The high order byte is the face number and is used as an index
362 in the face table. A face is a font plus:
363 1) the unhighlighted foreground color,
364 2) the unhighlighted background color.
365 For highlighting, the two colors are exchanged.
366 Face number 0 is unused. The low order byte of a glyf gives
367 the character within the font. All fonts are assumed to be
368 fixed width, and to have the same height and width. */
369
370#ifdef HAVE_X11
f676886a 371/* Table of GC's used for this frame. */
3f930d20
JB
372GC *gc_table;
373
374/* How many GCs are in the table. */
375int gcs_in_use;
376
377struct face
378{
379 GC face_gc;
380 unsigned int foreground;
381 unsigned int background;
382 Pixmap stipple;
383 XFontStruct *font;
384};
385
386#else /* X10 */
387
388struct face
389{
390 FONT_TYPE *font; /* Font info for specified font. */
391 int fg; /* Unhighlighted foreground. */
392 int bg; /* Unhighlighted background. */
393};
394#endif /* X10 */
395
396#define MAX_FACES_AND_GLYPHS 256
397extern struct face *x_face_table[];