1 /* Definitions and headers for communication with X protocol.
2 Copyright (C) 1989 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 1, or (at your option)
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
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>
31 /* Define a queue for X-events. One such queue is used for mouse clicks.
32 Another is used for expose events. */
34 #define EVENT_BUFFER_SIZE 64
36 /* Max and Min sizes in character columns. */
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:
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.
63 It turns out that we can auto-detect whether we're being compiled
64 with X11R3 or X11R4 by looking for the flag macros for R4 structure
65 members that R3 doesn't have. */
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
84 #define XExposeRegionEvent XExposeEvent
85 #define Bitmap Pixmap /* In X11, Bitmaps are are kind of
87 #define WINDOWINFO_TYPE XWindowAttributes
88 #define XGetWindowInfo(w, i) XGetWindowAttributes (x_current_display, \
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, \
96 #define XHandleError XSetErrorHandler
97 #define XHandleIOError XSetIOErrorHandler
99 #define XChangeWindowSize(w,x,y) XResizeWindow(x_current_display,w,x,y)
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)
105 /* GC values used for drawing non-standard (other face) text. */
106 extern XGCValues face_gc_values
;
108 /* The mask of events that text windows always want to receive. This
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).
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. */
117 #define STANDARD_EVENT_SET \
121 | ButtonReleaseMask \
122 | PointerMotionMask \
123 | PointerMotionHintMask \
124 | StructureNotifyMask \
128 | VisibilityChangeMask)
132 #define ConnectionNumber(dpy) dpyno()
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
142 #define FONT_TYPE FontInfo
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
153 #define FONT_WIDTH(f) ((f)->width)
154 #define FONT_HEIGHT(f) ((f)->height)
155 #define FONT_BASE(f) ((f)->base)
157 #define XChangeWindowSize(w,x,y) XChangeWindow(w,x,y)
163 int rindex
; /* Index at which to fetch next. */
164 int windex
; /* Index at which to store next. */
165 XEvent xrep
[EVENT_BUFFER_SIZE
];
168 /* Queue for mouse clicks. */
169 extern struct event_queue x_mouse_queue
;
171 /* Mechanism for interlocking between main program level
172 and input interrupt level. */
174 /* Nonzero during a critical section. At such a time, an input interrupt
175 does nothing but set `x_pending_input'. */
176 extern int x_input_blocked
;
178 /* Nonzero means an input interrupt has arrived
179 during the current critical section. */
180 extern int x_pending_input
;
182 /* Begin critical section. */
183 #define BLOCK_INPUT (x_input_blocked++)
185 /* End critical section. */
186 #define UNBLOCK_INPUT \
187 (x_input_blocked--, (x_input_blocked < 0 ? (abort (), 0) : 0))
189 #define TOTALLY_UNBLOCK_INPUT (x_input_blocked = 0)
190 #define UNBLOCK_INPUT_RESIGNAL UNBLOCK_INPUT
192 /* This is the X connection that we are using. */
194 extern Display
*x_current_display
;
196 extern struct frame
*x_window_to_frame ();
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 */
201 struct frame
*x_focus_frame
;
204 /* Variables associated with the X display screen this emacs is using. */
206 /* How many screens this X display has. */
207 extern Lisp_Object x_screen_count
;
209 /* The vendor supporting this X server. */
210 extern Lisp_Object Vx_vendor
;
212 /* The vendor's release number for this X server. */
213 extern Lisp_Object x_release
;
215 /* Height of this X screen in pixels. */
216 extern Lisp_Object x_screen_height
;
218 /* Height of this X screen in millimeters. */
219 extern Lisp_Object x_screen_height_mm
;
221 /* Width of this X screen in pixels. */
222 extern Lisp_Object x_screen_width
;
224 /* Width of this X screen in millimeters. */
225 extern Lisp_Object x_screen_width_mm
;
227 /* Does this X screen do backing store? */
228 extern Lisp_Object Vx_backing_store
;
230 /* Does this X screen do save-unders? */
231 extern Lisp_Object x_save_under
;
233 /* Number of planes for this screen. */
234 extern Lisp_Object x_screen_planes
;
236 /* X Visual type of this screen. */
237 extern Lisp_Object Vx_screen_visual
;
239 #endif /* HAVE_X11 */
241 enum text_cursor_kinds
{
242 filled_box_cursor
, hollow_box_cursor
, bar_cursor
245 #define PIXEL_WIDTH(s) ((s)->display.x->pixel_width)
246 #define PIXEL_HEIGHT(s) ((s)->display.x->pixel_height)
248 /* Each X frame object points to its own struct x_display object
249 in the display.x field. The x_display structure contains all
250 the information that is specific to X windows. */
254 /* Position of the X window (x and y offsets in root window). */
258 /* Border width of the X window as known by the X window system. */
261 /* Size of the X window in pixels. */
262 int pixel_height
, pixel_width
;
265 /* The tiled border used when the mouse is out of the frame. */
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 */
274 /* Width of the internal border. This is a line of background color
275 just inside the window's border. When the frame is selected,
276 a highlighting is displayed inside the internal border. */
277 int internal_border_width
;
279 /* The X window used for this frame.
280 May be zero while the frame object is being created
281 and the X window has not yet been created. */
284 /* The X window used for the bitmap icon;
285 or 0 if we don't have a bitmap icon. */
288 /* The X window that is the parent of this X window.
289 Usually but not always RootWindow. */
292 /* 1 for bitmap icon, 0 for text icon. */
293 int icon_bitmap_flag
;
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
;
305 /* Windows for scrollbars */
318 int v_scrollbar_width
;
319 int h_scrollbar_height
;
321 /* Descriptor for the cursor in use for this window. */
324 Cursor nontext_cursor
;
325 Cursor modeline_cursor
;
330 /* The name that was associated with the icon, the last time
331 it was refreshed. Usually the same as the name of the
332 buffer in the currently selected window in the frame */
335 /* Flag to set when the X window needs to be completely repainted. */
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
;
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. */
356 /* Return the window associated with the frame F. */
357 #define FRAME_X_WINDOW(f) ((f)->display.x->window_desc)
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. */
371 /* Table of GC's used for this frame. */
374 /* How many GCs are in the table. */
380 unsigned int foreground
;
381 unsigned int background
;
390 FONT_TYPE
*font
; /* Font info for specified font. */
391 int fg
; /* Unhighlighted foreground. */
392 int bg
; /* Unhighlighted background. */
396 #define MAX_FACES_AND_GLYPHS 256
397 extern struct face
*x_face_table
[];