(wait_reading_process_input): If wait_for_cell, do call
[bpt/emacs.git] / src / xterm.h
index b0744a0..ebff567 100644 (file)
@@ -67,6 +67,12 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #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)
@@ -165,27 +171,6 @@ struct event_queue
 /* 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;
@@ -195,7 +180,7 @@ extern struct frame *x_window_to_frame ();
 /* 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. */
@@ -295,6 +280,7 @@ struct x_display
   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
@@ -337,8 +323,35 @@ struct x_display
   /* 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)
 
@@ -349,13 +362,13 @@ struct x_display
 #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. */
 
@@ -491,7 +504,7 @@ struct scroll_bar {
    (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)
@@ -529,10 +542,10 @@ struct scroll_bar {
 
 /* 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))
 
@@ -545,3 +558,75 @@ struct scroll_bar {
 #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 */);