JimB's changes from January 18 to present
[bpt/emacs.git] / src / xterm.h
CommitLineData
3f930d20 1/* Definitions and headers for communication with X protocol.
4e027793 2 Copyright (C) 1989, 1993 Free Software Foundation, Inc.
3f930d20
JB
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
4e027793 8the Free Software Foundation; either version 2, or (at your option)
3f930d20
JB
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))
bbe42033 80#define ROOT_WINDOW RootWindow (x_current_display, DefaultScreen (x_current_display))
3f930d20
JB
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
3f930d20 105/* The mask of events that text windows always want to receive. This
8828b393
JB
106 does not include mouse movement events. It is used when the window
107 is created (in x_window) and when we ask/unask for mouse movement
108 events (in XTmouse_tracking_enable).
109
110 We do include ButtonReleases in this set because elisp isn't always
111 fast enough to catch them when it wants them, and they're rare
112 enough that they don't use much processor time. */
3f930d20
JB
113
114#define STANDARD_EVENT_SET \
115 (KeyPressMask \
116 | ExposureMask \
117 | ButtonPressMask \
8828b393
JB
118 | ButtonReleaseMask \
119 | PointerMotionMask \
120 | PointerMotionHintMask \
3f930d20
JB
121 | StructureNotifyMask \
122 | FocusChangeMask \
123 | LeaveWindowMask \
124 | EnterWindowMask \
125 | VisibilityChangeMask)
126
127#else /* X10 */
128
129#define ConnectionNumber(dpy) dpyno()
130#define PIX_TYPE int
131#define XDISPLAY
132#define XFlushQueue() XFlush()
133#define BLACK_PIX_DEFAULT BlackPixel
134#define WHITE_PIX_DEFAULT WhitePixel
135#define DISPLAY_SCREEN_ARG
136#define DISPLAY_CELLS DisplayCells ()
137#define ROOT_WINDOW RootWindow
138#define XFree free
139#define FONT_TYPE FontInfo
140
141#define WINDOWINFO_TYPE WindowInfo
142#define XGetWindowInfo(w, i) XQueryWindow ((w), (i))
143#define XGetFont(f) XOpenFont ((f))
144#define XLoseFont(f) XCloseFont ((f))
145#define XStuffPending() XPending ()
146#define XWarpMousePointer(w,x,y) XWarpMouse (w,x,y)
147#define XHandleError XErrorHandler
148#define XHandleIOError XIOErrorHandler
149
150#define FONT_WIDTH(f) ((f)->width)
151#define FONT_HEIGHT(f) ((f)->height)
152#define FONT_BASE(f) ((f)->base)
153
154#define XChangeWindowSize(w,x,y) XChangeWindow(w,x,y)
155
156#endif /* X10 */
157
158struct event_queue
159 {
160 int rindex; /* Index at which to fetch next. */
161 int windex; /* Index at which to store next. */
162 XEvent xrep[EVENT_BUFFER_SIZE];
163 };
164
165/* Queue for mouse clicks. */
166extern struct event_queue x_mouse_queue;
167
168/* Mechanism for interlocking between main program level
169 and input interrupt level. */
170
171/* Nonzero during a critical section. At such a time, an input interrupt
172 does nothing but set `x_pending_input'. */
173extern int x_input_blocked;
174
175/* Nonzero means an input interrupt has arrived
176 during the current critical section. */
177extern int x_pending_input;
178
3f930d20
JB
179/* Begin critical section. */
180#define BLOCK_INPUT (x_input_blocked++)
181
182/* End critical section. */
265a9e55
JB
183#define UNBLOCK_INPUT \
184 (x_input_blocked--, (x_input_blocked < 0 ? (abort (), 0) : 0))
3f930d20
JB
185
186#define TOTALLY_UNBLOCK_INPUT (x_input_blocked = 0)
187#define UNBLOCK_INPUT_RESIGNAL UNBLOCK_INPUT
188
189/* This is the X connection that we are using. */
190
191extern Display *x_current_display;
192
f676886a 193extern struct frame *x_window_to_frame ();
3f930d20 194
f676886a
JB
195/* The frame (if any) which has the X window that has keyboard focus.
196 Zero if none. This is examined by Ffocus_frame in xfns.c */
3f930d20 197
f676886a 198struct frame *x_focus_frame;
3f930d20
JB
199
200#ifdef HAVE_X11
201/* Variables associated with the X display screen this emacs is using. */
202
203/* How many screens this X display has. */
259c5af9 204extern int x_screen_count;
3f930d20
JB
205
206/* The vendor supporting this X server. */
207extern Lisp_Object Vx_vendor;
208
209/* The vendor's release number for this X server. */
259c5af9 210extern int x_release;
3f930d20
JB
211
212/* Height of this X screen in pixels. */
259c5af9 213extern int x_screen_height;
3f930d20
JB
214
215/* Height of this X screen in millimeters. */
259c5af9 216extern int x_screen_height_mm;
3f930d20
JB
217
218/* Width of this X screen in pixels. */
259c5af9 219extern int x_screen_width;
3f930d20
JB
220
221/* Width of this X screen in millimeters. */
259c5af9 222extern int x_screen_width_mm;
3f930d20
JB
223
224/* Does this X screen do backing store? */
225extern Lisp_Object Vx_backing_store;
226
227/* Does this X screen do save-unders? */
259c5af9 228extern int x_save_under;
3f930d20
JB
229
230/* Number of planes for this screen. */
259c5af9 231extern int x_screen_planes;
3f930d20
JB
232
233/* X Visual type of this screen. */
234extern Lisp_Object Vx_screen_visual;
235
236#endif /* HAVE_X11 */
237\f
238enum text_cursor_kinds {
239 filled_box_cursor, hollow_box_cursor, bar_cursor
240};
241
c8e3cbe0
JB
242#define PIXEL_WIDTH(f) ((f)->display.x->pixel_width)
243#define PIXEL_HEIGHT(f) ((f)->display.x->pixel_height)
3f930d20 244
f676886a 245/* Each X frame object points to its own struct x_display object
3f930d20
JB
246 in the display.x field. The x_display structure contains all
247 the information that is specific to X windows. */
248
249struct x_display
250{
251 /* Position of the X window (x and y offsets in root window). */
252 int left_pos;
253 int top_pos;
254
255 /* Border width of the X window as known by the X window system. */
256 int border_width;
257
258 /* Size of the X window in pixels. */
259 int pixel_height, pixel_width;
260
261#ifdef HAVE_X11
f676886a 262 /* The tiled border used when the mouse is out of the frame. */
3f930d20
JB
263 Pixmap border_tile;
264
265 /* Here are the Graphics Contexts for the default font. */
266 GC normal_gc; /* Normal video */
267 GC reverse_gc; /* Reverse video */
268 GC cursor_gc; /* cursor drawing */
269#endif /* HAVE_X11 */
270
271 /* Width of the internal border. This is a line of background color
f676886a 272 just inside the window's border. When the frame is selected,
3f930d20
JB
273 a highlighting is displayed inside the internal border. */
274 int internal_border_width;
275
f676886a
JB
276 /* The X window used for this frame.
277 May be zero while the frame object is being created
3f930d20
JB
278 and the X window has not yet been created. */
279 Window window_desc;
280
281 /* The X window used for the bitmap icon;
282 or 0 if we don't have a bitmap icon. */
283 Window icon_desc;
284
285 /* The X window that is the parent of this X window.
286 Usually but not always RootWindow. */
287 Window parent_desc;
288
289 /* 1 for bitmap icon, 0 for text icon. */
290 int icon_bitmap_flag;
291
292 FONT_TYPE *font;
293
294 /* Pixel values used for various purposes.
295 border_pixel may be -1 meaning use a gray tile. */
296 PIX_TYPE background_pixel;
297 PIX_TYPE foreground_pixel;
298 PIX_TYPE cursor_pixel;
299 PIX_TYPE border_pixel;
300 PIX_TYPE mouse_pixel;
301
3f930d20
JB
302 /* Descriptor for the cursor in use for this window. */
303#ifdef HAVE_X11
304 Cursor text_cursor;
305 Cursor nontext_cursor;
306 Cursor modeline_cursor;
307#else
308 Cursor cursor;
309#endif
310
311 /* The name that was associated with the icon, the last time
312 it was refreshed. Usually the same as the name of the
f676886a 313 buffer in the currently selected window in the frame */
3f930d20
JB
314 char *icon_label;
315
316 /* Flag to set when the X window needs to be completely repainted. */
317 int needs_exposure;
318
319 /* What kind of text cursor is drawn in this window right now? (If
320 there is no cursor (phys_cursor_x < 0), then this means nothing. */
321 enum text_cursor_kinds text_cursor_kind;
ef15f270
JB
322
323 /* These are the current window manager hints. It seems that
324 XSetWMHints, when presented with an unset bit in the `flags'
325 member of the hints structure, does not leave the corresponding
326 attribute unchanged; rather, it resets that attribute to its
327 default value. For example, unless you set the `icon_pixmap'
328 field and the `IconPixmapHint' bit, XSetWMHints will forget what
329 your icon pixmap was. This is rather troublesome, since some of
330 the members (for example, `input' and `icon_pixmap') want to stay
331 the same throughout the execution of Emacs. So, we keep this
332 structure around, just leaving values in it and adding new bits
333 to the mask as we go. */
334 XWMHints wm_hints;
c8e3cbe0 335
c8e3cbe0
JB
336 /* The size of the extra width currently allotted for vertical
337 scrollbars, in pixels. */
338 int vertical_scrollbar_extra;
3f930d20 339};
d2729198
JB
340
341/* Return the window associated with the frame F. */
342#define FRAME_X_WINDOW(f) ((f)->display.x->window_desc)
343
3f930d20
JB
344\f
345/* When X windows are used, a glyf may be a 16 bit unsigned datum.
346 The high order byte is the face number and is used as an index
347 in the face table. A face is a font plus:
348 1) the unhighlighted foreground color,
349 2) the unhighlighted background color.
350 For highlighting, the two colors are exchanged.
351 Face number 0 is unused. The low order byte of a glyf gives
352 the character within the font. All fonts are assumed to be
353 fixed width, and to have the same height and width. */
354
355#ifdef HAVE_X11
3f930d20 356
9d46c2e6 357/* Face declared in dispextern.h */
3f930d20
JB
358
359#else /* X10 */
360
361struct face
362{
363 FONT_TYPE *font; /* Font info for specified font. */
364 int fg; /* Unhighlighted foreground. */
365 int bg; /* Unhighlighted background. */
366};
367#endif /* X10 */
368
369#define MAX_FACES_AND_GLYPHS 256
370extern struct face *x_face_table[];
c8e3cbe0
JB
371
372\f
373/* X-specific scrollbar stuff. */
374
4e027793
JB
375/* We represent scrollbars as lisp vectors. This allows us to place
376 references to them in windows without worrying about whether we'll
377 end up with windows referring to dead scrollbars; the garbage
378 collector will free it when its time comes.
379
380 We use struct scrollbar as a template for accessing fields of the
381 vector. */
382
c8e3cbe0
JB
383struct scrollbar {
384
4e027793
JB
385 /* These fields are shared by all vectors. */
386 int size_from_Lisp_Vector_struct;
387 struct Lisp_Vector *next_from_Lisp_Vector_struct;
388
389 /* The window we're a scrollbar for. */
390 Lisp_Object window;
c8e3cbe0 391
4e027793
JB
392 /* The next and previous in the chain of scrollbars in this frame. */
393 Lisp_Object next, prev;
c8e3cbe0 394
4e027793
JB
395 /* The X window representing this scrollbar. Since this is a full
396 32-bit quantity, we store it split into two 32-bit values. */
397 Lisp_Object x_window_low, x_window_high;
c8e3cbe0
JB
398
399 /* The position and size of the scrollbar in pixels, relative to the
400 frame. */
4e027793 401 Lisp_Object top, left, width, height;
c8e3cbe0 402
4e027793
JB
403 /* The starting and ending positions of the handle, relative to the
404 handle area (i.e. zero is the top position, not
405 SCROLLBAR_TOP_BORDER). If they're equal, that means the handle
406 hasn't been drawn yet.
c8e3cbe0 407
4e027793
JB
408 These are not actually the locations where the beginning and end
409 are drawn; in order to keep handles from becoming invisible when
410 editing large files, we establish a minimum height by always
411 drawing handle bottoms VERTICAL_SCROLLBAR_MIN_HANDLE pixels below
412 where they would be normally; the bottom and top are in a
413 different co-ordinate system. */
414 Lisp_Object start, end;
c8e3cbe0
JB
415
416 /* If the scrollbar handle is currently being dragged by the user,
417 this is the number of pixels from the top of the handle to the
418 place where the user grabbed it. If the handle isn't currently
4e027793
JB
419 being dragged, this is Qnil. */
420 Lisp_Object dragging;
c8e3cbe0
JB
421};
422
4e027793
JB
423/* The number of elements a vector holding a struct scrollbar needs. */
424#define SCROLLBAR_VEC_SIZE \
425 ((sizeof (struct scrollbar) - sizeof (int) - sizeof (struct Lisp_Vector *)) \
426 / sizeof (Lisp_Object))
427
428/* Turning a lisp vector value into a pointer to a struct scrollbar. */
429#define XSCROLLBAR(vec) ((struct scrollbar *) XPNTR (vec))
430
431
432/* Building a 32-bit C integer from two 16-bit lisp integers. */
433#define SCROLLBAR_PACK(low, high) (XINT (high) << 16 | XINT (low))
434
435/* Setting two lisp integers to the low and high words of a 32-bit C int. */
436#define SCROLLBAR_UNPACK(low, high, int32) \
437 (XSET ((low), Lisp_Int, (int32) & 0xffff), \
438 XSET ((high), Lisp_Int, ((int32) >> 16) & 0xffff))
439
440
441/* Extract the X window id of the scrollbar from a struct scrollbar. */
442#define SCROLLBAR_X_WINDOW(ptr) \
443 ((Window) SCROLLBAR_PACK ((ptr)->x_window_low, (ptr)->x_window_high))
444
445/* Store a window id in a struct scrollbar. */
446#define SET_SCROLLBAR_X_WINDOW(ptr, id) \
447 (SCROLLBAR_UNPACK ((ptr)->x_window_low, (ptr)->x_window_high, (int) id))
448
449
c8e3cbe0
JB
450/* Return the outside pixel width for a vertical scrollbar on frame F. */
451#define VERTICAL_SCROLLBAR_PIXEL_WIDTH(f) (2*FONT_WIDTH ((f)->display.x->font))
452
453/* Return the outside pixel height for a vertical scrollbar HEIGHT
454 rows high on frame F. */
455#define VERTICAL_SCROLLBAR_PIXEL_HEIGHT(f, height) \
456 ((height) * FONT_HEIGHT ((f)->display.x->font))
457
4e027793
JB
458/* Return the inside width of a vertical scrollbar, given the outside
459 width. */
460#define VERTICAL_SCROLLBAR_INSIDE_WIDTH(width) \
461 ((width) - VERTICAL_SCROLLBAR_LEFT_BORDER - VERTICAL_SCROLLBAR_RIGHT_BORDER)
c8e3cbe0 462
4e027793
JB
463/* Return the length of the rectangle within which the top of the
464 handle must stay. This isn't equivalent to the inside height,
465 because the scrollbar handle has a minimum height.
466
467 This is the real range of motion for the scrollbar, so when we're
468 scaling buffer positions to scrollbar positions, we use this, not
469 VERTICAL_SCROLLBAR_INSIDE_HEIGHT. */
470#define VERTICAL_SCROLLBAR_TOP_RANGE(height) \
471 (VERTICAL_SCROLLBAR_INSIDE_HEIGHT (height) - VERTICAL_SCROLLBAR_MIN_HANDLE)
472
473/* Return the inside height of vertical scrollbar, given the outside
474 height. See VERTICAL_SCROLLBAR_TOP_RANGE too. */
475#define VERTICAL_SCROLLBAR_INSIDE_HEIGHT(height) \
476 ((height) - VERTICAL_SCROLLBAR_TOP_BORDER - VERTICAL_SCROLLBAR_BOTTOM_BORDER)
477
478
479/* Border widths for scrollbars.
480
481 Scrollbar windows don't have any X borders; their border width is
482 set to zero, and we redraw borders ourselves. This makes the code
483 a bit cleaner, since we don't have to convert between outside width
484 (used when relating to the rest of the screen) and inside width
485 (used when sizing and drawing the scrollbar window itself).
486
487 The handle moves up and down/back and forth in a rectange inset
488 from the edges of the scrollbar. These are widths by which we
489 inset the handle boundaries from the scrollbar edges. */
490#define VERTICAL_SCROLLBAR_LEFT_BORDER (2)
491#define VERTICAL_SCROLLBAR_RIGHT_BORDER (3)
492#define VERTICAL_SCROLLBAR_TOP_BORDER (2)
493#define VERTICAL_SCROLLBAR_BOTTOM_BORDER (2)
494
495/* Minimum lengths for scrollbar handles, in pixels. */
496#define VERTICAL_SCROLLBAR_MIN_HANDLE (5)
c8e3cbe0
JB
497
498\f
499/* Manipulating pixel sizes and character sizes.
500 Knowledge of which factors affect the overall size of the window should
501 be hidden in these macros, if that's possible.
502
4e027793
JB
503/* Return the upper/left pixel position of the character cell on frame F
504 at ROW/COL. */
505#define CHAR_TO_PIXEL_ROW(f, row) \
506 ((f)->display.x->internal_border_width \
507 + (row) * FONT_HEIGHT ((f)->display.x->font))
508#define CHAR_TO_PIXEL_COL(f, col) \
509 ((f)->display.x->internal_border_width \
510 + (col) * FONT_WIDTH ((f)->display.x->font))
511
512/* Return the pixel width/height of frame F if it has
513 WIDTH columns/HEIGHT rows. */
c8e3cbe0 514#define CHAR_TO_PIXEL_WIDTH(f, width) \
4e027793
JB
515 (CHAR_TO_PIXEL_COL (f, width) \
516 + (f)->display.x->vertical_scrollbar_extra \
517 + (f)->display.x->internal_border_width)
c8e3cbe0 518#define CHAR_TO_PIXEL_HEIGHT(f, height) \
4e027793
JB
519 (CHAR_TO_PIXEL_ROW (f, height) \
520 + (f)->display.x->internal_border_width)
c8e3cbe0 521
c8e3cbe0 522
4e027793
JB
523/* Return the row/column (zero-based) of the character cell containing
524 the pixel on FRAME at ROW/COL. */
525#define PIXEL_TO_CHAR_ROW(frame, row) \
526 (((row) - (f)->display.x->internal_border_width) \
c8e3cbe0 527 / FONT_HEIGHT ((f)->display.x->font))
4e027793
JB
528#define PIXEL_TO_CHAR_COL(frame, col) \
529 (((col) - (f)->display.x->internal_border_width) \
530 / FONT_WIDTH ((f)->display.x->font))
c8e3cbe0 531
4e027793
JB
532/* How many columns/rows of text can we fit in WIDTH/HEIGHT pixels on
533 frame F? */
534#define PIXEL_TO_CHAR_WIDTH(f, width) \
535 (PIXEL_TO_CHAR_COL (f, ((width) \
536 - (f)->display.x->internal_border_width \
537 - (f)->display.x->vertical_scrollbar_extra)))
538#define PIXEL_TO_CHAR_HEIGHT(f, height) \
539 (PIXEL_TO_CHAR_ROW (f, ((height) \
540 - (f)->display.x->internal_border_width)))