#define HAVE_X11R4
#endif
+#ifdef XlibSpecificationRelease
+#if XlibSpecificationRelease >= 5
+#define HAVE_X11R5
+#endif
+#endif
+
#define PIX_TYPE unsigned long
#define XDISPLAY x_current_display,
#define XFlushQueue() XFlush(x_current_display)
/* Queue for mouse clicks. */
extern struct event_queue x_mouse_queue;
-/* Mechanism for interlocking between main program level
- and input interrupt level. */
-
-/* Nonzero during a critical section. At such a time, an input interrupt
- does nothing but set `x_pending_input'. */
-extern int x_input_blocked;
-
-/* Nonzero means an input interrupt has arrived
- during the current critical section. */
-extern int x_pending_input;
-
-/* Begin critical section. */
-#define BLOCK_INPUT (x_input_blocked++)
-
-/* End critical section. */
-#define UNBLOCK_INPUT \
- (x_input_blocked--, (x_input_blocked < 0 ? (abort (), 0) : 0))
-
-#define TOTALLY_UNBLOCK_INPUT (x_input_blocked = 0)
-#define UNBLOCK_INPUT_RESIGNAL UNBLOCK_INPUT
-
/* This is the X connection that we are using. */
extern Display *x_current_display;
/* The frame (if any) which has the X window that has keyboard focus.
Zero if none. This is examined by Ffocus_frame in xfns.c */
-struct frame *x_focus_frame;
+extern struct frame *x_focus_frame;
#ifdef HAVE_X11
/* Variables associated with the X display screen this emacs is using. */
PIX_TYPE cursor_pixel;
PIX_TYPE border_pixel;
PIX_TYPE mouse_pixel;
+ PIX_TYPE cursor_foreground_pixel;
/* Descriptor for the cursor in use for this window. */
#ifdef HAVE_X11
/* The size of the extra width currently allotted for vertical
scroll bars, in pixels. */
int vertical_scroll_bar_extra;
+
+ /* Table of parameter faces for this frame. Any X resources (pixel
+ values, fonts) referred to here have been allocated explicitly
+ for this face, and should be freed if we change the face. */
+ struct face **param_faces;
+ int n_param_faces;
+
+ /* Table of computed faces for this frame. These are the faces
+ whose indexes go into the upper bits of a glyph, computed by
+ combining the parameter faces specified by overlays, text
+ properties, and what have you. The X resources mentioned here
+ are all shared with parameter faces. */
+ struct face **computed_faces;
+ int n_computed_faces; /* How many are valid */
+ int size_computed_faces; /* How many are allocated */
};
+/* Get at the computed faces of an X window frame. */
+#define FRAME_PARAM_FACES(f) ((f)->display.x->param_faces)
+#define FRAME_N_PARAM_FACES(f) ((f)->display.x->n_param_faces)
+#define FRAME_DEFAULT_PARAM_FACE(f) (FRAME_PARAM_FACES (f)[0])
+#define FRAME_MODE_LINE_PARAM_FACE(f) (FRAME_PARAM_FACES (f)[1])
+
+#define FRAME_COMPUTED_FACES(f) ((f)->display.x->computed_faces)
+#define FRAME_N_COMPUTED_FACES(f) ((f)->display.x->n_computed_faces)
+#define FRAME_SIZE_COMPUTED_FACES(f) ((f)->display.x->size_computed_faces)
+#define FRAME_DEFAULT_FACE(f) ((f)->display.x->computed_faces[0])
+#define FRAME_MODE_LINE_FACE(f) ((f)->display.x->computed_faces[1])
+
/* Return the window associated with the frame F. */
#define FRAME_X_WINDOW(f) ((f)->display.x->window_desc)
#define FRAME_DESIRED_CURSOR(f) ((f)->display.x->desired_cursor)
\f
-/* When X windows are used, a glyf may be a 16 bit unsigned datum.
+/* When X windows are used, a glyph may be a 16 bit unsigned datum.
The high order byte is the face number and is used as an index
in the face table. A face is a font plus:
1) the unhighlighted foreground color,
2) the unhighlighted background color.
For highlighting, the two colors are exchanged.
- Face number 0 is unused. The low order byte of a glyf gives
+ Face number 0 is unused. The low order byte of a glyph gives
the character within the font. All fonts are assumed to be
fixed width, and to have the same height and width. */
(used when relating to the rest of the screen) and inside width
(used when sizing and drawing the scroll bar window itself).
- The handle moves up and down/back and forth in a rectange inset
+ The handle moves up and down/back and forth in a rectangle inset
from the edges of the scroll bar. These are widths by which we
inset the handle boundaries from the scroll bar edges. */
#define VERTICAL_SCROLL_BAR_LEFT_BORDER (2)
/* Return the row/column (zero-based) of the character cell containing
the pixel on FRAME at ROW/COL. */
-#define PIXEL_TO_CHAR_ROW(frame, row) \
+#define PIXEL_TO_CHAR_ROW(f, row) \
(((row) - (f)->display.x->internal_border_width) \
/ FONT_HEIGHT ((f)->display.x->font))
-#define PIXEL_TO_CHAR_COL(frame, col) \
+#define PIXEL_TO_CHAR_COL(f, col) \
(((col) - (f)->display.x->internal_border_width) \
/ FONT_WIDTH ((f)->display.x->font))
#define PIXEL_TO_CHAR_HEIGHT(f, height) \
(PIXEL_TO_CHAR_ROW (f, ((height) \
- (f)->display.x->internal_border_width)))
+\f
+/* If a struct input_event has a kind which is selection_request_event
+ or selection_clear_event, then its contents are really described
+ by this structure. */
+
+/* For an event of kind selection_request_event,
+ this structure really describes the contents. */
+struct selection_input_event
+{
+ int kind;
+ Display *display;
+ Window requestor;
+ Atom selection, target, property;
+ Time time;
+};
+
+#define SELECTION_EVENT_DISPLAY(eventp) \
+ (((struct selection_input_event *) (eventp))->display)
+#define SELECTION_EVENT_REQUESTOR(eventp) \
+ (((struct selection_input_event *) (eventp))->requestor)
+#define SELECTION_EVENT_SELECTION(eventp) \
+ (((struct selection_input_event *) (eventp))->selection)
+#define SELECTION_EVENT_TARGET(eventp) \
+ (((struct selection_input_event *) (eventp))->target)
+#define SELECTION_EVENT_PROPERTY(eventp) \
+ (((struct selection_input_event *) (eventp))->property)
+#define SELECTION_EVENT_TIME(eventp) \
+ (((struct selection_input_event *) (eventp))->time)
+
+\f
+/* Interface to the face code functions. */
+
+/* Create the first two computed faces for a frame -- the ones that
+ have GC's. */
+extern void init_frame_faces (/* FRAME_PTR */);
+
+/* Free the resources for the faces associated with a frame. */
+extern void free_frame_faces (/* FRAME_PTR */);
+
+/* Given a computed face, find or make an equivalent display face
+ in face_vector, and return a pointer to it. */
+extern struct face *intern_face (/* FRAME_PTR, struct face * */);
+
+/* Given a frame and a face name, return the face's ID number, or
+ zero if it isn't a recognized face name. */
+extern int face_name_id_number (/* FRAME_PTR, Lisp_Object */);
+
+/* Return non-zero if FONT1 and FONT2 have the same size bounding box.
+ We assume that they're both character-cell fonts. */
+extern int same_size_fonts (/* XFontStruct *, XFontStruct * */);
+
+/* Recompute the GC's for the default and modeline faces.
+ We call this after changing frame parameters on which those GC's
+ depend. */
+extern void recompute_basic_faces (/* FRAME_PTR */);
+
+/* Return the face ID associated with a buffer position POS. Store
+ into *ENDPTR the next position at which a different face is
+ needed. This does not take account of glyphs that specify their
+ own face codes. F is the frame in use for display, and W is a
+ window displaying the current buffer.
+
+ REGION_BEG, REGION_END delimit the region, so it can be highlighted. */
+extern int compute_char_face (/* FRAME_PTR frame,
+ struct window *w,
+ int pos,
+ int region_beg, int region_end,
+ int *endptr */);
+/* Return the face ID to use to display a special glyph which selects
+ FACE_CODE as the face ID, assuming that ordinarily the face would
+ be BASIC_FACE. F is the frame. */
+extern int compute_glyph_face (/* FRAME_PTR, int */);