X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/831fefca49a5b1ab3d2ec5863ec157be8ff5d28b..e7427ac187c9d4693ae80c80bfba7c8e3cba80a7:/src/dispextern.h diff --git a/src/dispextern.h b/src/dispextern.h index 7d95f5564e..dcf37ceded 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -1,5 +1,5 @@ /* Interface definitions for display code. - Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001 + Copyright (C) 1985,93,94,97,98,99, 2000,01,02,03, 2004, 2005 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -25,22 +25,53 @@ Boston, MA 02111-1307, USA. */ #define DISPEXTERN_H_INCLUDED #ifdef HAVE_X_WINDOWS + #include #ifdef USE_X_TOOLKIT #include #endif /* USE_X_TOOLKIT */ + +#else /* !HAVE_X_WINDOWS */ + +/* X-related stuff used by non-X gui code. */ + +typedef struct { + unsigned long pixel; + unsigned short red, green, blue; + char flags; + char pad; +} XColor; + #endif /* HAVE_X_WINDOWS */ #ifdef MSDOS #include "msdos.h" #endif +#ifdef HAVE_X_WINDOWS +typedef struct x_display_info Display_Info; +typedef XImage * XImagePtr; +typedef XImagePtr XImagePtr_or_DC; +#define NativeRectangle XRectangle +#endif + #ifdef HAVE_NTGUI #include "w32gui.h" +typedef struct w32_display_info Display_Info; +typedef XImage *XImagePtr; +typedef HDC XImagePtr_or_DC; #endif -#ifdef macintosh +#ifdef MAC_OS #include "macgui.h" +typedef struct mac_display_info Display_Info; +/* Mac equivalent of XImage. */ +typedef Pixmap XImagePtr; +typedef XImagePtr XImagePtr_or_DC; +#endif + +#ifndef NativeRectangle +#define NativeRectangle int #endif /* Structure forward declarations. Some are here because function @@ -56,6 +87,26 @@ struct frame; struct window; +/* Values returned from coordinates_in_window. */ + +enum window_part +{ + ON_NOTHING, + ON_TEXT, + ON_MODE_LINE, + ON_VERTICAL_BORDER, + ON_HEADER_LINE, + ON_LEFT_FRINGE, + ON_RIGHT_FRINGE, + ON_LEFT_MARGIN, + ON_RIGHT_MARGIN, + ON_SCROLL_BAR +}; + +/* Number of bits allocated to store fringe bitmap numbers. */ +#define FRINGE_ID_BITS 16 + + /*********************************************************************** Debugging @@ -68,13 +119,24 @@ struct window; #define GLYPH_DEBUG 0 #endif +/* If XASSERTS is non-zero, additional consistency checks are activated. + Turn it off by defining the macro XASSERTS to zero. */ + +#ifndef XASSERTS +#define XASSERTS 0 +#endif + /* Macros to include code only if GLYPH_DEBUG != 0. */ #if GLYPH_DEBUG #define IF_DEBUG(X) X -#define xassert(X) do {if (!(X)) abort ();} while (0) #else #define IF_DEBUG(X) (void) 0 +#endif + +#if XASSERTS +#define xassert(X) do {if (!(X)) abort ();} while (0) +#else #define xassert(X) (void) 0 #endif @@ -99,7 +161,7 @@ extern int trace_redisplay_p; #endif /* GLYPH_DEBUG == 0 */ - + /*********************************************************************** Text positions @@ -108,7 +170,7 @@ extern int trace_redisplay_p; /* Starting with Emacs 20.3, characters from strings and buffers have both a character and a byte position associated with them. The following structure holds such a pair of positions. */ - + struct text_pos { /* Character position. */ @@ -164,7 +226,7 @@ struct text_pos #define SET_MARKER_FROM_TEXT_POS(MARKER, POS) \ set_marker_both ((MARKER), Qnil, CHARPOS ((POS)), BYTEPOS ((POS))) - + /* Value is non-zero if character and byte positions of POS1 and POS2 are equal. */ @@ -211,7 +273,7 @@ struct display_pos enum glyph_type { /* Glyph describes a character. */ - CHAR_GLYPH, + CHAR_GLYPH, /* Glyph describes a composition sequence. */ COMPOSITE_GLYPH, @@ -224,10 +286,21 @@ enum glyph_type }; +/* Structure describing how to use partial glyphs (images slicing) */ + +struct glyph_slice +{ + unsigned x : 16; + unsigned y : 16; + unsigned width : 16; + unsigned height : 16; +}; + + /* Glyphs. Be extra careful when changing this structure! Esp. make sure that - functions producing glyphs, like x_append_glyph, fill ALL of the + functions producing glyphs, like append_glyph, fill ALL of the glyph structure, and that GLYPH_EQUAL_P compares all display-relevant members of glyphs (not to imply that these are the only things to check when you add a member). */ @@ -242,7 +315,7 @@ struct glyph int charpos; /* Lisp object source of this glyph. Currently either a buffer or - a string, if the glyph was produced from characters which came from + a string, if the glyph was produced from characters which came from a buffer or a string; or 0 if the glyph was inserted by redisplay for its own purposes such as padding. */ Lisp_Object object; @@ -250,6 +323,9 @@ struct glyph /* Width in pixels. */ short pixel_width; + /* Ascent and descent in pixels. */ + short ascent, descent; + /* Vertical offset. If < 0, the glyph is displayed raised, if > 0 the glyph is displayed lowered. */ short voffset; @@ -288,16 +364,18 @@ struct glyph doesn't have a glyph in a font. */ unsigned glyph_not_available_p : 1; +#define FACE_ID_BITS 21 + /* Face of the glyph. */ - unsigned face_id : 22; + unsigned face_id : FACE_ID_BITS; -#ifdef WINDOWSNT - /* Type of font used to display the character glyph. Used to + /* Type of font used to display the character glyph. May be used to determine which set of functions to use to obtain font metrics - for the glyph. Value should be an enumerator of the type - w32_char_font_type. */ - unsigned w32_font_type : 2; -#endif + for the glyph. On W32, value should be an enumerator of the type + w32_char_font_type. Otherwise it equals FONT_TYPE_UNKNOWN. */ + unsigned font_type : 3; + + struct glyph_slice slice; /* A union of sub-structures for different glyph types. */ union @@ -321,23 +399,36 @@ struct glyph unsigned ascent : 16; } stretch; - + /* Used to compare all bit-fields above in one step. */ unsigned val; } u; }; +/* Default value of the glyph font_type field. */ + +#define FONT_TYPE_UNKNOWN 0 + /* Is GLYPH a space? */ #define CHAR_GLYPH_SPACE_P(GLYPH) \ (GLYPH_FROM_CHAR_GLYPH ((GLYPH)) == SPACEGLYPH) +/* Are glyph slices of glyphs *X and *Y equal */ + +#define GLYPH_SLICE_EQUAL_P(X, Y) \ + ((X)->slice.x == (Y)->slice.x \ + && (X)->slice.y == (Y)->slice.y \ + && (X)->slice.width == (Y)->slice.width \ + && (X)->slice.height == (Y)->slice.height) + /* Are glyphs *X and *Y displayed equal? */ - + #define GLYPH_EQUAL_P(X, Y) \ ((X)->type == (Y)->type \ && (X)->u.val == (Y)->u.val \ + && GLYPH_SLICE_EQUAL_P (X, Y) \ && (X)->face_id == (Y)->face_id \ && (X)->padding_p == (Y)->padding_p \ && (X)->left_box_line_p == (Y)->left_box_line_p \ @@ -354,7 +445,7 @@ struct glyph /* Fill a character glyph GLYPH. CODE, FACE_ID, PADDING_P correspond to the bits defined for the typedef `GLYPH' in lisp.h. */ - + #define SET_CHAR_GLYPH(GLYPH, CODE, FACE_ID, PADDING_P) \ do \ { \ @@ -366,7 +457,7 @@ struct glyph /* Fill a character type glyph GLYPH from a glyph typedef FROM as defined in lisp.h. */ - + #define SET_CHAR_GLYPH_FROM_GLYPH(GLYPH, FROM) \ SET_CHAR_GLYPH ((GLYPH), \ FAST_GLYPH_CHAR ((FROM)), \ @@ -375,15 +466,15 @@ struct glyph /* Construct a glyph code from a character glyph GLYPH. If the character is multibyte, return -1 as we can't use glyph table for a - multibyte character. */ - + multibyte character. */ + #define GLYPH_FROM_CHAR_GLYPH(GLYPH) \ ((GLYPH).u.ch < 256 \ ? ((GLYPH).u.ch | ((GLYPH).face_id << CHARACTERBITS)) \ : -1) /* Is GLYPH a padding glyph? */ - + #define CHAR_GLYPH_PADDING_P(GLYPH) (GLYPH).padding_p @@ -477,12 +568,14 @@ struct glyph_matrix int matrix_w, matrix_h; /* If this structure describes a window matrix of window W, - window_left_x is the value of W->left, window_top_y the value of - W->top, window_height and window_width are width and height of W, - as returned by window_box, and window_vscroll is the value of - W->vscroll at the time the matrix was last adjusted. Only set - for window-based redisplay. */ - int window_left_x, window_top_y, window_height, window_width, window_vscroll; + window_left_col is the value of W->left_col, window_top_line the + value of W->top_line, window_height and window_width are width and + height of W, as returned by window_box, and window_vscroll is the + value of W->vscroll at the time the matrix was last adjusted. + Only set for window-based redisplay. */ + int window_left_col, window_top_line; + int window_height, window_width; + int window_vscroll; /* Number of glyphs reserved for left and right marginal areas when the matrix was last adjusted. */ @@ -544,7 +637,7 @@ enum glyph_row_area Each row is partitioned into three areas. The start and end of each area is recorded in a pointer as shown below. - + +--------------------+-------------+---------------------+ | left margin area | text area | right margin area | +--------------------+-------------+---------------------+ @@ -552,13 +645,13 @@ enum glyph_row_area glyphs[LEFT_MARGIN_AREA] glyphs[RIGHT_MARGIN_AREA] | | glyphs[TEXT_AREA] | - glyphs[LAST_AREA] + glyphs[LAST_AREA] Rows in frame matrices reference glyph memory allocated in a frame glyph pool (see the description of struct glyph_pool). Rows in window matrices on frames having frame matrices reference slices of the glyphs of corresponding rows in the frame matrix. - + Rows in window matrices on frames having no frame matrices point to glyphs allocated from the heap via xmalloc; glyphs[LEFT_MARGIN_AREA] is the start address of the allocated @@ -575,7 +668,7 @@ struct glyph_row to any text; it is some buffer position if the row corresponds to an empty display line that displays a line end. This is what old redisplay used to do. (Except in code for terminal frames, this - kludge is no longer use, I believe. --gerd). + kludge is no longer used, I believe. --gerd). See also start, end, displays_text_p and ends_at_zv_p for cleaner ways to do it. The special meaning of positions 0 and -1 will be @@ -612,6 +705,10 @@ struct glyph_row frames. It may be < 0 in case of completely invisible rows. */ int visible_height; + /* Extra line spacing added after this row. Do not consider this + in last row when checking if row is fully visible. */ + int extra_line_spacing; + /* Hash code. This hash code is available as soon as the row is constructed, i.e. after a call to display_line. */ unsigned hash; @@ -629,24 +726,49 @@ struct glyph_row position of the next row. */ struct display_pos end; + /* Non-zero means the overlay arrow bitmap is on this line. + -1 means use default overlay arrow bitmap, else + it specifies actual fringe bitmap number. */ + int overlay_arrow_bitmap; + + /* Left fringe bitmap number (enum fringe_bitmap_type). */ + unsigned left_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Right fringe bitmap number (enum fringe_bitmap_type). */ + unsigned right_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Left fringe bitmap number (enum fringe_bitmap_type). */ + unsigned left_fringe_bitmap : FRINGE_ID_BITS; + + /* Right fringe bitmap number (enum fringe_bitmap_type). */ + unsigned right_fringe_bitmap : FRINGE_ID_BITS; + + /* Face of the left fringe glyph. */ + unsigned left_user_fringe_face_id : FACE_ID_BITS; + + /* Face of the right fringe glyph. */ + unsigned right_user_fringe_face_id : FACE_ID_BITS; + + /* Face of the left fringe glyph. */ + unsigned left_fringe_face_id : FACE_ID_BITS; + + /* Face of the right fringe glyph. */ + unsigned right_fringe_face_id : FACE_ID_BITS; + + /* 1 means that we must draw the bitmaps of this row. */ + unsigned redraw_fringe_bitmaps_p : 1; + /* In a desired matrix, 1 means that this row must be updated. In a current matrix, 0 means that the row has been invalidated, i.e. the row's contents do not agree with what is visible on the screen. */ unsigned enabled_p : 1; - /* Display this line in inverse video? Used for the mode line and - menu bar lines. */ - unsigned inverse_p : 1; - /* 1 means row displays a text line that is truncated on the left or right side. */ unsigned truncated_on_left_p : 1; unsigned truncated_on_right_p : 1; - /* 1 means the overlay arrow is on this line. */ - unsigned overlay_arrow_p : 1; - /* 1 means that this row displays a continued line, i.e. it has a continuation mark at the right side. */ unsigned continued_p : 1; @@ -671,12 +793,12 @@ struct glyph_row of lbearing or rbearing. */ unsigned contains_overlapping_glyphs_p : 1; - /* 1 means this row is a wide as the window it is displayed in, including - scroll bars, bitmap areas, and internal borders. This also + /* 1 means this row is as wide as the window it is displayed in, including + scroll bars, fringes, and internal borders. This also implies that the row doesn't have marginal areas. */ unsigned full_width_p : 1; - /* Non-zero means row is a mode or top-line. */ + /* Non-zero means row is a mode or header-line. */ unsigned mode_line_p : 1; /* 1 in a current row means this row is overlapped by another row. */ @@ -686,10 +808,10 @@ struct glyph_row of more than one glyph. Some glyphs have been put in this row, the rest are put in rows below this one. */ unsigned ends_in_middle_of_char_p : 1; - + /* 1 means this line starts in the middle of a character consisting of more than one glyph. Some glyphs have been put in the - previoius row, the rest are put in this row. */ + previous row, the rest are put in this row. */ unsigned starts_in_middle_of_char_p : 1; /* 1 in a current row means this row overlaps others. */ @@ -698,6 +820,35 @@ struct glyph_row /* 1 means some glyphs in this row are displayed in mouse-face. */ unsigned mouse_face_p : 1; + /* 1 means this row was ended by a newline from a string. */ + unsigned ends_in_newline_from_string_p : 1; + + /* 1 means this row width is exactly the width of the window, and the + final newline character is hidden in the right fringe. */ + unsigned exact_window_width_line_p : 1; + + /* 1 means this row currently shows the cursor in the right fringe. */ + unsigned cursor_in_fringe_p : 1; + + /* 1 means the last glyph in the row is part of an ellipsis. */ + unsigned ends_in_ellipsis_p : 1; + + /* Non-zero means display a bitmap on X frames indicating that this + the first line of the buffer. */ + unsigned indicate_bob_p : 1; + + /* Non-zero means display a bitmap on X frames indicating that this + the top line of the window, but not start of the buffer. */ + unsigned indicate_top_line_p : 1; + + /* Non-zero means display a bitmap on X frames indicating that this + the last line of the buffer. */ + unsigned indicate_eob_p : 1; + + /* Non-zero means display a bitmap on X frames indicating that this + the bottom line of the window, but not end of the buffer. */ + unsigned indicate_bottom_line_p : 1; + /* Continuation lines width at the start of the row. */ int continuation_lines_width; }; @@ -714,13 +865,13 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int)); #define MATRIX_ROW(MATRIX, ROW) ((MATRIX)->rows + (ROW)) #endif -/* Return a pointer to the row reserved for the mode line in MATRIX. +/* Return a pointer to the row reserved for the mode line in MATRIX. Row MATRIX->nrows - 1 is always reserved for the mode line. */ #define MATRIX_MODE_LINE_ROW(MATRIX) \ ((MATRIX)->rows + (MATRIX)->nrows - 1) -/* Return a pointer to the row reserved for the top line in MATRIX. +/* Return a pointer to the row reserved for the header line in MATRIX. This is always the first row in MATRIX because that's the only way that works in frame-based redisplay. */ @@ -739,29 +890,29 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int)); (MATRIX_ROW ((MATRIX), (ROW))->glyphs[TEXT_AREA]) /* Return the number of used glyphs in the text area of a row. */ - + #define MATRIX_ROW_USED(MATRIX, ROW) \ (MATRIX_ROW ((MATRIX), (ROW))->used[TEXT_AREA]) /* Return the character/ byte position at which the display of ROW starts. */ - + #define MATRIX_ROW_START_CHARPOS(ROW) ((ROW)->start.pos.charpos) #define MATRIX_ROW_START_BYTEPOS(ROW) ((ROW)->start.pos.bytepos) -/* Return character/ byte position at which ROW ends. */ - +/* Return the character/ byte position at which ROW ends. */ + #define MATRIX_ROW_END_CHARPOS(ROW) ((ROW)->end.pos.charpos) #define MATRIX_ROW_END_BYTEPOS(ROW) ((ROW)->end.pos.bytepos) /* Return the vertical position of ROW in MATRIX. */ - + #define MATRIX_ROW_VPOS(ROW, MATRIX) ((ROW) - (MATRIX)->rows) /* Return the last glyph row + 1 in MATRIX on window W reserved for text. If W has a mode line, the last row in the matrix is reserved for it. */ - + #define MATRIX_BOTTOM_TEXT_ROW(MATRIX, W) \ ((MATRIX)->rows \ + (MATRIX)->nrows \ @@ -769,46 +920,63 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int)); /* Non-zero if the face of the last glyph in ROW's text area has to be drawn to the end of the text area. */ - + #define MATRIX_ROW_EXTENDS_FACE_P(ROW) ((ROW)->fill_line_p) /* Set and query the enabled_p flag of glyph row ROW in MATRIX. */ - + #define SET_MATRIX_ROW_ENABLED_P(MATRIX, ROW, VALUE) \ (MATRIX_ROW ((MATRIX), (ROW))->enabled_p = (VALUE) != 0) - + #define MATRIX_ROW_ENABLED_P(MATRIX, ROW) \ (MATRIX_ROW ((MATRIX), (ROW))->enabled_p) /* Non-zero if ROW displays text. Value is non-zero if the row is blank but displays a line end. */ - + #define MATRIX_ROW_DISPLAYS_TEXT_P(ROW) ((ROW)->displays_text_p) + +/* Helper macros */ + +#define MR_PARTIALLY_VISIBLE(ROW) \ + ((ROW)->height != (ROW)->visible_height) + +#define MR_PARTIALLY_VISIBLE_AT_TOP(W, ROW) \ + ((ROW)->y < WINDOW_HEADER_LINE_HEIGHT ((W))) + +#define MR_PARTIALLY_VISIBLE_AT_BOTTOM(W, ROW) \ + (((ROW)->y + (ROW)->height - (ROW)->extra_line_spacing) \ + > WINDOW_BOX_HEIGHT_NO_MODE_LINE ((W))) + /* Non-zero if ROW is not completely visible in window W. */ - -#define MATRIX_ROW_PARTIALLY_VISIBLE_P(ROW) \ - ((ROW)->height != (ROW)->visible_height) + +#define MATRIX_ROW_PARTIALLY_VISIBLE_P(W, ROW) \ + (MR_PARTIALLY_VISIBLE ((ROW)) \ + && (MR_PARTIALLY_VISIBLE_AT_TOP ((W), (ROW)) \ + || MR_PARTIALLY_VISIBLE_AT_BOTTOM ((W), (ROW)))) + + /* Non-zero if ROW is partially visible at the top of window W. */ - + #define MATRIX_ROW_PARTIALLY_VISIBLE_AT_TOP_P(W, ROW) \ - (MATRIX_ROW_PARTIALLY_VISIBLE_P ((ROW)) \ - && (ROW)->y < WINDOW_DISPLAY_HEADER_LINE_HEIGHT ((W))) + (MR_PARTIALLY_VISIBLE ((ROW)) \ + && MR_PARTIALLY_VISIBLE_AT_TOP ((W), (ROW))) /* Non-zero if ROW is partially visible at the bottom of window W. */ - -#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P(W, ROW) \ - (MATRIX_ROW_PARTIALLY_VISIBLE_P ((ROW)) \ - && (ROW)->y + (ROW)->height > WINDOW_DISPLAY_HEIGHT_NO_MODE_LINE ((W))) + +#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P(W, ROW) \ + (MR_PARTIALLY_VISIBLE ((ROW)) \ + && MR_PARTIALLY_VISIBLE_AT_BOTTOM ((W), (ROW))) /* Return the bottom Y + 1 of ROW. */ - + #define MATRIX_ROW_BOTTOM_Y(ROW) ((ROW)->y + (ROW)->height) /* Is ROW the last visible one in the display described by the iterator structure pointed to by IT?. */ - + #define MATRIX_ROW_LAST_VISIBLE_P(ROW, IT) \ (MATRIX_ROW_BOTTOM_Y ((ROW)) >= (IT)->last_visible_y) @@ -822,7 +990,7 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int)); or a control char, or an overlay string. */ #define MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P(ROW) \ - ((ROW)->end.dpvec_index >= 0 \ + ((ROW)->end.dpvec_index > 0 \ || (ROW)->end.overlay_string_index >= 0 \ || (ROW)->ends_in_middle_of_char_p) @@ -832,9 +1000,9 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int)); ((ROW)->end.overlay_string_index >= 0) /* Non-zero if ROW starts in the middle of a character. See above. */ - + #define MATRIX_ROW_STARTS_IN_MIDDLE_OF_CHAR_P(ROW) \ - ((ROW)->start.dpvec_index >= 0 \ + ((ROW)->start.dpvec_index > 0 \ || (ROW)->starts_in_middle_of_char_p \ || ((ROW)->start.overlay_string_index >= 0 \ && (ROW)->start.string_pos.charpos > 0)) @@ -901,6 +1069,153 @@ extern int redisplay_performed_directly_p; extern struct glyph_row scratch_glyph_row; + +/************************************************************************ + Glyph Strings + ************************************************************************/ + +/* Enumeration for overriding/changing the face to use for drawing + glyphs in draw_glyphs. */ + +enum draw_glyphs_face +{ + DRAW_NORMAL_TEXT, + DRAW_INVERSE_VIDEO, + DRAW_CURSOR, + DRAW_MOUSE_FACE, + DRAW_IMAGE_RAISED, + DRAW_IMAGE_SUNKEN +}; + +#ifdef HAVE_WINDOW_SYSTEM + +/* A sequence of glyphs to be drawn in the same face. */ + +struct glyph_string +{ + /* X-origin of the string. */ + int x; + + /* Y-origin and y-position of the base line of this string. */ + int y, ybase; + + /* The width of the string, not including a face extension. */ + int width; + + /* The width of the string, including a face extension. */ + int background_width; + + /* The height of this string. This is the height of the line this + string is drawn in, and can be different from the height of the + font the string is drawn in. */ + int height; + + /* Number of pixels this string overwrites in front of its x-origin. + This number is zero if the string has an lbearing >= 0; it is + -lbearing, if the string has an lbearing < 0. */ + int left_overhang; + + /* Number of pixels this string overwrites past its right-most + nominal x-position, i.e. x + width. Zero if the string's + rbearing is <= its nominal width, rbearing - width otherwise. */ + int right_overhang; + + /* The frame on which the glyph string is drawn. */ + struct frame *f; + + /* The window on which the glyph string is drawn. */ + struct window *w; + + /* X display and window for convenience. */ + Display *display; + Window window; + + /* The glyph row for which this string was built. It determines the + y-origin and height of the string. */ + struct glyph_row *row; + + /* The area within row. */ + enum glyph_row_area area; + + /* Characters to be drawn, and number of characters. */ + XChar2b *char2b; + int nchars; + + /* A face-override for drawing cursors, mouse face and similar. */ + enum draw_glyphs_face hl; + + /* Face in which this string is to be drawn. */ + struct face *face; + + /* Font in which this string is to be drawn. */ + XFontStruct *font; + + /* Font info for this string. */ + struct font_info *font_info; + + /* Non-null means this string describes (part of) a composition. + All characters from char2b are drawn composed. */ + struct composition *cmp; + + /* Index of this glyph string's first character in the glyph + definition of CMP. If this is zero, this glyph string describes + the first character of a composition. */ + int gidx; + + /* 1 means this glyph strings face has to be drawn to the right end + of the window's drawing area. */ + unsigned extends_to_end_of_line_p : 1; + + /* 1 means the background of this string has been drawn. */ + unsigned background_filled_p : 1; + + /* 1 means glyph string must be drawn with 16-bit functions. */ + unsigned two_byte_p : 1; + + /* 1 means that the original font determined for drawing this glyph + string could not be loaded. The member `font' has been set to + the frame's default font in this case. */ + unsigned font_not_found_p : 1; + + /* 1 means that the face in which this glyph string is drawn has a + stipple pattern. */ + unsigned stippled_p : 1; + + /* 1 means only the foreground of this glyph string must be drawn, + and we should use the physical height of the line this glyph + string appears in as clip rect. */ + unsigned for_overlaps_p : 1; + + /* The GC to use for drawing this glyph string. */ +#if defined(HAVE_X_WINDOWS) || defined(MAC_OS) + GC gc; +#endif +#if defined(HAVE_NTGUI) + XGCValues *gc; + HDC hdc; +#endif + + /* A pointer to the first glyph in the string. This glyph + corresponds to char2b[0]. Needed to draw rectangles if + font_not_found_p is 1. */ + struct glyph *first_glyph; + + /* Image, if any. */ + struct image *img; + + /* Slice */ + struct glyph_slice slice; + + /* Non-null means the horizontal clipping region starts from the + left edge of *clip_head, and ends with the right edge of + *clip_tail, not including their overhangs. */ + struct glyph_string *clip_head, *clip_tail; + + struct glyph_string *next, *prev; +}; + +#endif /* HAVE_WINDOW_SYSTEM */ + /************************************************************************ Display Dimensions @@ -915,7 +1230,7 @@ extern struct glyph_row scratch_glyph_row; ? MATRIX_MODE_LINE_ROW (MATRIX)->height \ : 0) -/* Return the height of the top line in glyph matrix MATRIX, or zero +/* Return the height of the header line in glyph matrix MATRIX, or zero if not known. This macro is called under circumstances where MATRIX might not have been allocated yet. */ @@ -924,6 +1239,32 @@ extern struct glyph_row scratch_glyph_row; ? MATRIX_HEADER_LINE_ROW (MATRIX)->height \ : 0) +/* Return the desired face id for the mode line of a window, depending + on whether the window is selected or not, or if the window is the + scrolling window for the currently active minibuffer window. + + Due to the way display_mode_lines manipulates with the contents of + selected_window, this macro needs three arguments: SELW which is + compared against the current value of selected_window, MBW which is + compared against minibuf_window (if SELW doesn't match), and SCRW + which is compared against minibuf_selected_window (if MBW matches). */ + +#define CURRENT_MODE_LINE_FACE_ID_3(SELW, MBW, SCRW) \ + ((!mode_line_in_non_selected_windows \ + || (SELW) == XWINDOW (selected_window) \ + || (minibuf_level > 0 \ + && !NILP (minibuf_selected_window) \ + && (MBW) == XWINDOW (minibuf_window) \ + && (SCRW) == XWINDOW (minibuf_selected_window))) \ + ? MODE_LINE_FACE_ID \ + : MODE_LINE_INACTIVE_FACE_ID) + + +/* Return the desired face id for the mode line of window W. */ + +#define CURRENT_MODE_LINE_FACE_ID(W) \ + (CURRENT_MODE_LINE_FACE_ID_3((W), XWINDOW (selected_window), (W))) + /* Return the current height of the mode line of window W. If not known from current_mode_line_height, look at W's current glyph matrix, or return a default based on the height of the font of the @@ -935,9 +1276,9 @@ extern struct glyph_row scratch_glyph_row; : (MATRIX_MODE_LINE_HEIGHT ((W)->current_matrix) \ ? MATRIX_MODE_LINE_HEIGHT ((W)->current_matrix) \ : estimate_mode_line_height (XFRAME ((W)->frame), \ - MODE_LINE_FACE_ID))) + CURRENT_MODE_LINE_FACE_ID (W)))) -/* Return the current height of the top line of window W. If not +/* Return the current height of the header line of window W. If not known from current_header_line_height, look at W's current glyph matrix, or return an estimation based on the height of the font of the face `header-line'. */ @@ -955,184 +1296,71 @@ extern struct glyph_row scratch_glyph_row; #define DESIRED_MODE_LINE_HEIGHT(W) \ MATRIX_MODE_LINE_HEIGHT ((W)->desired_matrix) -/* Return the height of the desired top line of window W. */ +/* Return the height of the desired header line of window W. */ #define DESIRED_HEADER_LINE_HEIGHT(W) \ MATRIX_HEADER_LINE_HEIGHT ((W)->desired_matrix) -/* Like FRAME_INTERNAL_BORDER_WIDTH but checks whether frame F is a - window-system frame. */ - -#define FRAME_INTERNAL_BORDER_WIDTH_SAFE(F) \ - (FRAME_WINDOW_P (F) ? FRAME_INTERNAL_BORDER_WIDTH (F) : 0) - -/* Width of display region of window W. For terminal frames, this - equals the width of W since there are no vertical scroll bars. For - window system frames, the value has to be corrected by the pixel - width of vertical scroll bars, and bitmap areas. */ - -#define WINDOW_DISPLAY_PIXEL_WIDTH(W) \ - (((XFASTINT ((W)->width) \ - - FRAME_SCROLL_BAR_WIDTH (XFRAME (WINDOW_FRAME ((W)))) \ - - FRAME_FLAGS_AREA_COLS (XFRAME (WINDOW_FRAME ((W))))) \ - * CANON_X_UNIT (XFRAME (WINDOW_FRAME ((W)))))) - -/* Height of the display region of W, including a mode line, if any. */ - -#define WINDOW_DISPLAY_PIXEL_HEIGHT(W) \ - (XFASTINT ((W)->height) \ - * CANON_Y_UNIT (XFRAME (WINDOW_FRAME ((W))))) - -/* Height in pixels of the mode line. May be zero if W doesn't have a - mode line. */ - -#define WINDOW_DISPLAY_MODE_LINE_HEIGHT(W) \ - (WINDOW_WANTS_MODELINE_P ((W)) \ - ? CURRENT_MODE_LINE_HEIGHT (W) \ - : 0) - -/* Height in pixels of the top line. Zero if W doesn't have a top - line. */ - -#define WINDOW_DISPLAY_HEADER_LINE_HEIGHT(W) \ - (WINDOW_WANTS_HEADER_LINE_P ((W)) \ - ? CURRENT_HEADER_LINE_HEIGHT (W) \ - : 0) - -/* Pixel height of window W without mode line. */ - -#define WINDOW_DISPLAY_HEIGHT_NO_MODE_LINE(W) \ - (WINDOW_DISPLAY_PIXEL_HEIGHT ((W)) \ - - WINDOW_DISPLAY_MODE_LINE_HEIGHT ((W))) - -/* Pixel height of window W without mode and top line. */ - -#define WINDOW_DISPLAY_TEXT_HEIGHT(W) \ - (WINDOW_DISPLAY_PIXEL_HEIGHT ((W)) \ - - WINDOW_DISPLAY_MODE_LINE_HEIGHT ((W)) \ - - WINDOW_DISPLAY_HEADER_LINE_HEIGHT ((W))) - -/* Left edge of W in pixels relative to its frame. */ - -#define WINDOW_DISPLAY_LEFT_EDGE_PIXEL_X(W) \ - (FRAME_INTERNAL_BORDER_WIDTH_SAFE (XFRAME (WINDOW_FRAME ((W)))) \ - + (WINDOW_LEFT_MARGIN ((W)) \ - * CANON_X_UNIT (XFRAME (WINDOW_FRAME ((W))))) \ - + FRAME_LEFT_FLAGS_AREA_WIDTH (XFRAME (WINDOW_FRAME ((W))))) - -/* Right edge of window W in pixels, relative to its frame. */ - -#define WINDOW_DISPLAY_RIGHT_EDGE_PIXEL_X(W) \ - (WINDOW_DISPLAY_LEFT_EDGE_PIXEL_X ((W)) \ - + WINDOW_DISPLAY_PIXEL_WIDTH ((W))) - -/* Top edge of W in pixels relative to its frame. */ - -#define WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y(W) \ - (FRAME_INTERNAL_BORDER_WIDTH_SAFE (XFRAME (WINDOW_FRAME ((W)))) \ - + (XFASTINT ((W)->top) \ - * CANON_Y_UNIT (XFRAME (WINDOW_FRAME ((W)))))) - -/* Bottom edge of window W relative to its frame. */ - -#define WINDOW_DISPLAY_BOTTOM_EDGE_PIXEL_Y(W) \ - (WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y ((W)) \ - + WINDOW_DISPLAY_PIXEL_HEIGHT ((W))) - -/* Convert window W relative pixel X to frame pixel coordinates. */ - -#define WINDOW_TO_FRAME_PIXEL_X(W, X) \ - ((X) + WINDOW_DISPLAY_LEFT_EDGE_PIXEL_X ((W))) - -/* Convert window W relative pixel Y to frame pixel coordinates. */ - -#define WINDOW_TO_FRAME_PIXEL_Y(W, Y) \ - ((Y) + WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y ((W))) - -/* Convert frame relative pixel X to window relative pixel X. */ - -#define FRAME_TO_WINDOW_PIXEL_X(W, X) \ - ((X) - WINDOW_DISPLAY_LEFT_EDGE_PIXEL_X ((W))) - -/* Convert frame relative pixel X to window relative pixel Y. */ - -#define FRAME_TO_WINDOW_PIXEL_Y(W, Y) \ - ((Y) - WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y ((W))) - -/* Width of left margin area in pixels. */ - -#define WINDOW_DISPLAY_LEFT_AREA_PIXEL_WIDTH(W) \ - (NILP ((W)->left_margin_width) \ - ? 0 \ - : (XINT ((W)->left_margin_width) \ - * CANON_X_UNIT (XFRAME (WINDOW_FRAME ((W)))))) - -/* Width of right marginal area in pixels. */ - -#define WINDOW_DISPLAY_RIGHT_AREA_PIXEL_WIDTH(W) \ - (NILP ((W)->right_margin_width) \ - ? 0 \ - : (XINT ((W)->right_margin_width) \ - * CANON_X_UNIT (XFRAME (WINDOW_FRAME ((W)))))) - -/* Width of text area in pixels. */ - -#define WINDOW_DISPLAY_TEXT_AREA_PIXEL_WIDTH(W) \ - (WINDOW_DISPLAY_PIXEL_WIDTH ((W)) \ - - WINDOW_DISPLAY_LEFT_AREA_PIXEL_WIDTH ((W)) \ - - WINDOW_DISPLAY_RIGHT_AREA_PIXEL_WIDTH ((W))) - -/* Convert a text area relative x-position in window W to frame X - pixel coordinates. */ - -#define WINDOW_TEXT_TO_FRAME_PIXEL_X(W, X) \ - (WINDOW_TO_FRAME_PIXEL_X ((W), (X)) \ - + WINDOW_DISPLAY_LEFT_AREA_PIXEL_WIDTH ((W))) - -/* Translate an x-position relative to AREA in window W to frame pixel - coordinates. */ - -#define WINDOW_AREA_TO_FRAME_PIXEL_X(W, AREA, X) \ - (WINDOW_TO_FRAME_PIXEL_X ((W), (X)) \ - + (((AREA) > LEFT_MARGIN_AREA) \ - ? WINDOW_DISPLAY_LEFT_AREA_PIXEL_WIDTH ((W)) \ - : 0) \ - + (((AREA) > TEXT_AREA) \ - ? WINDOW_DISPLAY_TEXT_AREA_PIXEL_WIDTH ((W)) \ - : 0)) - -/* Return the pixel width of AREA in W. */ - -#define WINDOW_AREA_PIXEL_WIDTH(W, AREA) \ - (((AREA) == TEXT_AREA) \ - ? WINDOW_DISPLAY_TEXT_AREA_PIXEL_WIDTH ((W)) \ - : (((AREA) == LEFT_MARGIN_AREA) \ - ? WINDOW_DISPLAY_LEFT_AREA_PIXEL_WIDTH ((W)) \ - : WINDOW_DISPLAY_RIGHT_AREA_PIXEL_WIDTH ((W)))) - -/* Value is non-zero if window W has a mode line. */ +/* Value is non-zero if window W wants a mode line. */ #define WINDOW_WANTS_MODELINE_P(W) \ - (!MINI_WINDOW_P (W) \ + (!MINI_WINDOW_P ((W)) \ && !(W)->pseudo_window_p \ - && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W))) \ + && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME ((W)))) \ && BUFFERP ((W)->buffer) \ - && !NILP (XBUFFER ((W)->buffer)->mode_line_format)) + && !NILP (XBUFFER ((W)->buffer)->mode_line_format) \ + && WINDOW_TOTAL_LINES (W) > 1) -/* Value is non-zero if window W wants a top line. */ +/* Value is non-zero if window W wants a header line. */ #define WINDOW_WANTS_HEADER_LINE_P(W) \ - (!MINI_WINDOW_P (W) \ + (!MINI_WINDOW_P ((W)) \ && !(W)->pseudo_window_p \ - && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W))) \ + && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME ((W)))) \ && BUFFERP ((W)->buffer) \ - && !NILP (XBUFFER ((W)->buffer)->header_line_format)) + && !NILP (XBUFFER ((W)->buffer)->header_line_format) \ + && WINDOW_TOTAL_LINES (W) > 1 + !NILP (XBUFFER ((W)->buffer)->mode_line_format)) + + +/* Return proper value to be used as baseline offset of font that has + ASCENT and DESCENT to draw characters by the font at the vertical + center of the line of frame F. + + Here, our task is to find the value of BOFF in the following figure; + + -------------------------+-----------+- + -+-+---------+-+ | | + | | | | | | + | | | | F_ASCENT F_HEIGHT + | | | ASCENT | | + HEIGHT | | | | | + | | |-|-+------+-----------|------- baseline + | | | | BOFF | | + | |---------|-+-+ | | + | | | DESCENT | | + -+-+---------+-+ F_DESCENT | + -------------------------+-----------+- + + -BOFF + DESCENT + (F_HEIGHT - HEIGHT) / 2 = F_DESCENT + BOFF = DESCENT + (F_HEIGHT - HEIGHT) / 2 - F_DESCENT + DESCENT = FONT->descent + HEIGHT = FONT_HEIGHT (FONT) + F_DESCENT = (FRAME_FONT (F)->descent + - F->output_data.x->baseline_offset) + F_HEIGHT = FRAME_LINE_HEIGHT (F) +*/ + +#define VCENTER_BASELINE_OFFSET(FONT, F) \ + (FONT_DESCENT (FONT) \ + + (FRAME_LINE_HEIGHT ((F)) - FONT_HEIGHT ((FONT)) \ + + (FRAME_LINE_HEIGHT ((F)) > FONT_HEIGHT ((FONT)))) / 2 \ + - (FONT_DESCENT (FRAME_FONT (F)) - FRAME_BASELINE_OFFSET (F))) - + /*********************************************************************** Faces ***********************************************************************/ - + /* Indices of face attributes in Lisp face vectors. Slot zero is the symbol `face'. */ @@ -1190,11 +1418,11 @@ struct face int id; #ifdef HAVE_WINDOW_SYSTEM - - /* If non-zero, a GC we can use without modification to draw - characters in this face. */ + + /* If non-zero, this is a GC that we can use without modification for + drawing the characters in this face. */ GC gc; - + /* Font used for this face, or null if the font could not be loaded for some reason. This points to a `font' slot of a struct font_info, and we should not call XFreeFont on it because the @@ -1215,7 +1443,7 @@ struct face /* Pixel value of foreground color for X frames. Color index for tty frames. */ unsigned long foreground; - + /* Pixel value or color index of background color. */ unsigned long background; @@ -1243,14 +1471,14 @@ struct face Otherwise, a specific font is loaded from the set of fonts specified by the fontset given by the family attribute of the face. */ int fontset; - + /* Pixmap width and height. */ unsigned int pixmap_w, pixmap_h; - + /* Non-zero means characters in this face have a box that thickness around them. If it is negative, the absolute value indicates the thickness, and the horizontal lines of box (top and bottom) are - drawn inside of characters glyph area. The vartical lines of box + drawn inside of characters glyph area. The vertical lines of box (left and right) are drawn as the same way as the case that this value is positive. */ int box_line_width; @@ -1293,12 +1521,12 @@ struct face unsigned background_defaulted_p : 1; /* 1 means that either no color is specified for underlining or that - the the specified color couldn't be loaded. Use the foreground + the specified color couldn't be loaded. Use the foreground color when drawing in that case. */ - unsigned underline_defaulted_p : 1; + unsigned underline_defaulted_p : 1; /* 1 means that either no color is specified for the corresponding - attribute or that the the specified color couldn't be loaded. + attribute or that the specified color couldn't be loaded. Use the foreground color when drawing in that case. */ unsigned overline_color_defaulted_p : 1; unsigned strike_through_color_defaulted_p : 1; @@ -1314,6 +1542,14 @@ struct face unsigned tty_reverse_p : 1; unsigned tty_blinking_p : 1; + /* 1 means that colors of this face may not be freed because they + have been copied bitwise from a base face (see + realize_x_face). */ + unsigned colors_copied_bitwise_p : 1; + + /* If non-zero, use overstrike (to simulate bold-face). */ + unsigned overstrike : 1; + /* Next and previous face in hash collision list of face cache. */ struct face *next, *prev; @@ -1331,7 +1567,7 @@ struct face #define FACE_TTY_DEFAULT_FG_COLOR ((unsigned long) -2) -/* Color index indicating that face uses an unsigned background color. */ +/* Color index indicating that face uses an unknown background color. */ #define FACE_TTY_DEFAULT_BG_COLOR ((unsigned long) -3) @@ -1347,8 +1583,9 @@ enum face_id { DEFAULT_FACE_ID, MODE_LINE_FACE_ID, + MODE_LINE_INACTIVE_FACE_ID, TOOL_BAR_FACE_ID, - BITMAP_AREA_FACE_ID, + FRINGE_FACE_ID, HEADER_LINE_FACE_ID, SCROLL_BAR_FACE_ID, BORDER_FACE_ID, @@ -1358,6 +1595,7 @@ enum face_id BASIC_FACE_ID_SENTINEL }; +#define MAX_FACE_ID ((1 << FACE_ID_BITS) - 1) /* A cache of realized faces. Each frame has its own cache because Emacs allows different frame-local face definitions. */ @@ -1366,7 +1604,7 @@ struct face_cache { /* Hash table of cached realized faces. */ struct face **buckets; - + /* Back-pointer to the frame this cache belongs to. */ struct frame *f; @@ -1375,6 +1613,10 @@ struct face_cache /* The allocated size, and number of used slots of faces_by_id. */ int size, used; + + /* Flag indicating that attributes of the `menu' face have been + changed. */ + unsigned menu_face_changed_p : 1; }; @@ -1407,7 +1649,7 @@ struct face_cache /* Return the id of the realized face on frame F that is like the face with id ID but is suitable for displaying character CHAR. This macro is only meaningful for multibyte character CHAR. */ - + #define FACE_FOR_CHAR(F, FACE, CHAR) \ (SINGLE_BYTE_CHAR_P (CHAR) \ ? (FACE)->ascii_face->id \ @@ -1427,6 +1669,33 @@ extern int face_change_count; + +/*********************************************************************** + Fringes + ***********************************************************************/ + +/* Structure used to describe where and how to draw a fringe bitmap. + WHICH is the fringe bitmap to draw. WD and H is the (adjusted) + width and height of the bitmap, DH is the height adjustment (if + bitmap is periodic). X and Y are frame coordinates of the area to + display the bitmap, DY is relative offset of the bitmap into that + area. BX, NX, BY, NY specifies the area to clear if the bitmap + does not fill the entire area. FACE is the fringe face. */ + +struct draw_fringe_bitmap_params +{ + int which; /* enum fringe_bitmap_type */ + unsigned short *bits; + int wd, h, dh; + int x, y; + int bx, nx, by, ny; + unsigned cursor_p : 1; + unsigned overlay_p : 1; + struct face *face; +}; + +#define MAX_FRINGE_BITMAPS (1< @@ -1629,6 +1927,7 @@ struct it unsigned multibyte_p : 1; unsigned string_from_display_prop_p : 1; unsigned display_ellipsis_p : 1; + struct it_slice slice; Lisp_Object space_width; short voffset; Lisp_Object font_height; @@ -1637,7 +1936,7 @@ struct it /* Stack pointer. */ int sp; - + /* Setting of buffer-local variable selective-display-ellipsis. */ unsigned selective_display_ellipsis_p : 1; @@ -1662,7 +1961,7 @@ struct it /* Non-null means that the current character is the first in a run of characters with box face. */ unsigned start_of_box_run_p : 1; - + /* Non-zero means that the current character is the last in a run of characters with box face. */ unsigned end_of_box_run_p : 1; @@ -1683,6 +1982,10 @@ struct it skipped due to selective display. */ unsigned face_before_selective_p : 1; + /* If 1, adjust current glyph so it does not increase current row + descent/ascent (line-height property). Reset after this glyph. */ + unsigned constrain_row_ascent_descent_p : 1; + /* The ID of the default face to use. One of DEFAULT_FACE_ID, MODE_LINE_FACE_ID, etc, depending on what we are displaying. */ int base_face_id; @@ -1702,12 +2005,15 @@ struct it /* The character to display, possibly translated to multibyte if unibyte_display_via_language_environment is set. This - is set after x_produce_glyphs has been called. */ + is set after produce_glyphs has been called. */ int char_to_display; /* If what == IT_IMAGE, the id of the image to display. */ int image_id; + /* Values from `slice' property. */ + struct it_slice slice; + /* Value of the `space-width' property, if any; nil if none. */ Lisp_Object space_width; @@ -1719,8 +2025,8 @@ struct it /* Object and position where the current display element came from. Object can be a Lisp string in case the current display element - comes from an overlay string, or it is buffer. Position is - a position in object. */ + comes from an overlay string, or it is buffer. It may also be nil + during mode-line update. Position is a position in object. */ Lisp_Object object; struct text_pos position; @@ -1734,7 +2040,7 @@ struct it short truncation_pixel_width, continuation_pixel_width; /* First and last visible x-position in the display area. If window - is hscrolled by n columns, first_visible_x == n * CANON_X_UNIT + is hscrolled by n columns, first_visible_x == n * FRAME_COLUMN_WIDTH (f), and last_visible_x == pixel width of W + first_visible_x. */ int first_visible_x, last_visible_x; @@ -1742,10 +2048,17 @@ struct it line, if the window has one. */ int last_visible_y; - /* Additional space in pixels between lines (for window systems - only.). */ + /* Default amount of additional space in pixels between lines (for + window systems only.) */ int extra_line_spacing; + /* Max extra line spacing added in this row. */ + int max_extra_line_spacing; + + /* Override font height information for this glyph. + Used if override_ascent >= 0. Cleared after this glyph. */ + int override_ascent, override_descent, override_boff; + /* If non-null, glyphs are produced in glyph_row with each call to produce_glyphs. */ struct glyph_row *glyph_row; @@ -1756,7 +2069,7 @@ struct it /* Number of glyphs needed for the last character requested via produce_glyphs. This is 1 except for tabs. */ int nglyphs; - + /* Width of the display element in pixels. Result of produce_glyphs. */ int pixel_width; @@ -1781,6 +2094,9 @@ struct it glyph_row in move_it_to and display_line. */ int current_y; + /* Vertical matrix position of first text line in window. */ + int first_vpos; + /* Current vertical matrix position, or line number. Automatically incremented by move_it_to and display_line. */ int vpos; @@ -1788,6 +2104,18 @@ struct it /* Horizontal matrix position reached in move_it_in_display_line. Only set there, not in display_line. */ int hpos; + + /* Left fringe bitmap number (enum fringe_bitmap_type). */ + unsigned left_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Right fringe bitmap number (enum fringe_bitmap_type). */ + unsigned right_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Face of the left fringe glyph. */ + unsigned left_user_fringe_face_id : FACE_ID_BITS; + + /* Face of the right fringe glyph. */ + unsigned right_user_fringe_face_id : FACE_ID_BITS; }; @@ -1815,10 +2143,16 @@ struct it /* Call produce_glyphs or produce_glyphs_hook, if set. Shortcut to avoid the function call overhead. */ -#define PRODUCE_GLYPHS(IT) \ - (rif \ - ? rif->produce_glyphs ((IT)) \ - : produce_glyphs ((IT))) +#define PRODUCE_GLYPHS(IT) \ + do { \ + extern int inhibit_free_realized_faces; \ + if (rif != NULL) \ + rif->produce_glyphs ((IT)); \ + else \ + produce_glyphs ((IT)); \ + if ((IT)->glyph_row != NULL) \ + inhibit_free_realized_faces = 1; \ + } while (0) /* Bit-flags indicating what operation move_it_to should perform. */ @@ -1858,15 +2192,23 @@ struct run }; +/* Handlers for setting frame parameters. */ + +typedef void (*frame_parm_handler) P_ ((struct frame *, Lisp_Object, Lisp_Object)); + + /* Structure holding system-dependent interface functions needed for window-based redisplay. */ struct redisplay_interface { + /* Handlers for setting frame parameters. */ + frame_parm_handler *frame_parm_handlers; + /* Produce glyphs/get display metrics for the display element IT is loaded with. */ void (*produce_glyphs) P_ ((struct it *it)); - + /* Write or insert LEN glyphs from STRING at the nominal output position. */ void (*write_glyphs) P_ ((struct glyph *string, int len)); @@ -1875,7 +2217,7 @@ struct redisplay_interface /* Clear from nominal output position to X. X < 0 means clear to right end of display. */ void (*clear_end_of_line) P_ ((int x)); - + /* Function to call to scroll the display as described by RUN on window W. */ void (*scroll_run_hook) P_ ((struct window *w, struct run *run)); @@ -1893,10 +2235,10 @@ struct redisplay_interface redisplay. CURSOR_ON_P non-zero means switch cursor on. MOUSE_FACE_OVERWRITTEN_P non-zero means that some lines in W that contained glyphs in mouse-face were overwritten, so we - have to update the mouse hightlight. */ + have to update the mouse highlight. */ void (*update_window_end_hook) P_ ((struct window *w, int cursor_on_p, int mouse_face_overwritten_p)); - + /* Move cursor to row/column position VPOS/HPOS, pixel coordinates Y/X. HPOS/VPOS are window-relative row and column numbers and X/Y are window-relative pixel positions. */ @@ -1905,8 +2247,13 @@ struct redisplay_interface /* Flush the display of frame F. For X, this is XFlush. */ void (*flush_display) P_ ((struct frame *f)); + /* Flush the display of frame F if non-NULL. This is called + during redisplay, and should be NULL on systems which flushes + automatically before reading input. */ + void (*flush_display_optional) P_ ((struct frame *f)); + /* Clear the mouse hightlight in window W, if there is any. */ - void (*clear_mouse_face) P_ ((struct window *w)); + void (*clear_window_mouse_face) P_ ((struct window *w)); /* Set *LEFT and *RIGHT to the left and right overhang of GLYPH on frame F. */ @@ -1918,17 +2265,71 @@ struct redisplay_interface desired rows have been made current. */ void (*fix_overlapping_area) P_ ((struct window *w, struct glyph_row *row, enum glyph_row_area area)); + +#ifdef HAVE_WINDOW_SYSTEM + + /* Draw a fringe bitmap in window W of row ROW using parameters P. */ + void (*draw_fringe_bitmap) P_ ((struct window *w, struct glyph_row *row, + struct draw_fringe_bitmap_params *p)); + + /* Define and destroy fringe bitmap no. WHICH. */ + void (*define_fringe_bitmap) P_ ((int which, unsigned short *bits, + int h, int wd)); + void (*destroy_fringe_bitmap) P_ ((int which)); + +/* Get metrics of character CHAR2B in FONT of type FONT_TYPE. + Value is null if CHAR2B is not contained in the font. */ + XCharStruct * (*per_char_metric) P_ ((XFontStruct *font, XChar2b *char2b, + int font_type)); + +/* Encode CHAR2B using encoding information from FONT_INFO. CHAR2B is + the two-byte form of C. Encoding is returned in *CHAR2B. If + TWO_BYTE_P is non-null, return non-zero there if font is two-byte. */ + int (*encode_char) P_ ((int c, XChar2b *char2b, + struct font_info *font_into, int *two_byte_p)); + +/* Compute left and right overhang of glyph string S. + A NULL pointer if platform does not support this. */ + void (*compute_glyph_string_overhangs) P_ ((struct glyph_string *s)); + +/* Draw a glyph string S. */ + void (*draw_glyph_string) P_ ((struct glyph_string *s)); + +/* Define cursor CURSOR on frame F. */ + void (*define_frame_cursor) P_ ((struct frame *f, Cursor cursor)); + +/* Clear the area at (X,Y,WIDTH,HEIGHT) of frame F. */ + void (*clear_frame_area) P_ ((struct frame *f, int x, int y, + int width, int height)); + +/* Draw specified cursor CURSOR_TYPE of width CURSOR_WIDTH + at row GLYPH_ROW on window W if ON_P is 1. If ON_P is + 0, don't draw cursor. If ACTIVE_P is 1, system caret + should track this cursor (when applicable). */ + void (*draw_window_cursor) P_ ((struct window *w, + struct glyph_row *glyph_row, + int x, int y, + int cursor_type, int cursor_width, + int on_p, int active_p)); + +/* Draw vertical border for window W from (X,Y0) to (X,Y1). */ + void (*draw_vertical_window_border) P_ ((struct window *w, + int x, int y0, int y1)); + +/* Shift display of frame F to make room for inserted glyphs. + The area at pixel (X,Y) of width WIDTH and height HEIGHT is + shifted right by SHIFT_BY pixels. */ + void (*shift_glyphs_for_insert) P_ ((struct frame *f, + int x, int y, int width, + int height, int shift_by)); + +#endif /* HAVE_WINDOW_SYSTEM */ }; /* The current interface for window-based redisplay. */ extern struct redisplay_interface *rif; -/* Hook to call in estimate_mode_line_height. */ - -extern int (* estimate_mode_line_height_hook) P_ ((struct frame *, - enum face_id)); - /*********************************************************************** Images @@ -1941,7 +2342,7 @@ extern int (* estimate_mode_line_height_hook) P_ ((struct frame *, struct image; -/* Each image format (JPEG, IIFF, ...) supported is described by +/* Each image format (JPEG, TIFF, ...) supported is described by a structure of the type below. */ struct image_type @@ -1982,6 +2383,22 @@ struct image unsigned long *colors; int ncolors; + /* A single `background color' for this image, for the use of anyone that + cares about such a thing. Only valid if the `background_valid' field + is true. This should generally be accessed by calling the accessor + macro `IMAGE_BACKGROUND', which will heuristically calculate a value + if necessary. */ + unsigned long background; + + /* True if this image has a `transparent' background -- that is, is + uses an image mask. The accessor macro for this is + `IMAGE_BACKGROUND_TRANSPARENT'. */ + unsigned background_transparent : 1; + + /* True if the `background' and `background_transparent' fields are + valid, respectively. */ + unsigned background_valid : 1, background_transparent_valid : 1; + /* Width and height of the image. */ int width, height; @@ -1991,7 +2408,7 @@ struct image #define DEFAULT_IMAGE_HEIGHT 30 /* Percent of image height used as ascent. A value of - CENTERED_IMAGE_ASCENT means draw center the image centered on the + CENTERED_IMAGE_ASCENT means draw the image centered on the line. */ int ascent; #define DEFAULT_IMAGE_ASCENT 50 @@ -2125,22 +2542,18 @@ enum tool_bar_item_image TOOL_BAR_IMAGE_DISABLED_DESELECTED }; -/* Non-zero means raise tool-bar buttons when the mouse moves over them. */ - -extern int auto_raise_tool_bar_buttons_p; - /* Margin around tool-bar buttons in pixels. */ extern Lisp_Object Vtool_bar_button_margin; /* Thickness of relief to draw around tool-bar buttons. */ -extern int tool_bar_button_relief; +extern EMACS_INT tool_bar_button_relief; /* Default values of the above variables. */ -#define DEFAULT_TOOL_BAR_BUTTON_MARGIN 1 -#define DEFAULT_TOOL_BAR_BUTTON_RELIEF 3 +#define DEFAULT_TOOL_BAR_BUTTON_MARGIN 4 +#define DEFAULT_TOOL_BAR_BUTTON_RELIEF 1 /* The height in pixels of the default tool-bar images. */ @@ -2148,15 +2561,35 @@ extern int tool_bar_button_relief; /*********************************************************************** - Function Prototypes + Terminal Capabilities + ***********************************************************************/ + +/* Each of these is a bit representing a terminal `capability' (bold, + inverse, etc). They are or'd together to specify the set of + capabilities being queried for when calling `tty_capable_p' (which + returns true if the terminal supports all of them). */ + +#define TTY_CAP_INVERSE 0x01 +#define TTY_CAP_UNDERLINE 0x02 +#define TTY_CAP_BOLD 0x04 +#define TTY_CAP_DIM 0x08 +#define TTY_CAP_BLINK 0x10 +#define TTY_CAP_ALT_CHARSET 0x20 + + +/*********************************************************************** + Function Prototypes ***********************************************************************/ /* Defined in xdisp.c */ +struct glyph_row *row_containing_pos P_ ((struct window *, int, + struct glyph_row *, + struct glyph_row *, int)); int string_buffer_position P_ ((struct window *, Lisp_Object, int)); int line_bottom_y P_ ((struct it *)); int display_prop_intangible_p P_ ((Lisp_Object)); -void resize_echo_area_axactly P_ ((void)); +void resize_echo_area_exactly P_ ((void)); int resize_mini_window P_ ((struct window *, int)); int try_window P_ ((Lisp_Object, struct text_pos)); void window_box P_ ((struct window *, int, int *, int *, int *, int *)); @@ -2164,8 +2597,14 @@ int window_box_height P_ ((struct window *)); int window_text_bottom_y P_ ((struct window *)); int window_box_width P_ ((struct window *, int)); int window_box_left P_ ((struct window *, int)); +int window_box_left_offset P_ ((struct window *, int)); int window_box_right P_ ((struct window *, int)); +int window_box_right_offset P_ ((struct window *, int)); void window_box_edges P_ ((struct window *, int, int *, int *, int *, int *)); +int estimate_mode_line_height P_ ((struct frame *, enum face_id)); +void pixel_to_glyph_coords P_ ((struct frame *, int, int, int *, int *, + NativeRectangle *, int)); +int glyph_to_pixel_coords P_ ((struct window *, int, int, int *, int *)); void mark_window_display_accurate P_ ((Lisp_Object, int)); void redisplay_preserve_echo_area P_ ((int)); void set_cursor_from_row P_ ((struct window *, struct glyph_row *, @@ -2184,17 +2623,133 @@ void move_it_vertically P_ ((struct it *, int)); void move_it_vertically_backward P_ ((struct it *, int)); void move_it_by_lines P_ ((struct it *, int, int)); void move_it_past_eol P_ ((struct it *)); +int in_display_vector_p P_ ((struct it *)); int frame_mode_line_height P_ ((struct frame *)); void highlight_trailing_whitespace P_ ((struct frame *, struct glyph_row *)); -int tool_bar_item_info P_ ((struct frame *, struct glyph *, int *)); extern Lisp_Object Qtool_bar; extern Lisp_Object Vshow_trailing_whitespace; +extern int mode_line_in_non_selected_windows; extern int redisplaying_p; -extern Lisp_Object Vimage_types; extern void add_to_log P_ ((char *, Lisp_Object, Lisp_Object)); extern int help_echo_showing_p; extern int current_mode_line_height, current_header_line_height; -extern int cursor_in_non_selected_windows; +extern Lisp_Object help_echo_string, help_echo_window; +extern Lisp_Object help_echo_object, previous_help_echo_string; +extern int help_echo_pos; +extern struct frame *last_mouse_frame; +extern int last_tool_bar_item; +extern int mouse_autoselect_window; +extern void reseat_at_previous_visible_line_start P_ ((struct it *)); + +extern int calc_pixel_width_or_height P_ ((double *, struct it *, Lisp_Object, + /* XFontStruct */ void *, int, int *)); + +#ifdef HAVE_WINDOW_SYSTEM + +#if GLYPH_DEBUG +extern void dump_glyph_string P_ ((struct glyph_string *)); +#endif + +extern void x_get_glyph_overhangs P_ ((struct glyph *, struct frame *, + int *, int *)); +extern void x_produce_glyphs P_ ((struct it *)); + +extern void x_write_glyphs P_ ((struct glyph *, int)); +extern void x_insert_glyphs P_ ((struct glyph *, int len)); +extern void x_clear_end_of_line P_ ((int)); + +extern int x_stretch_cursor_p; +extern struct cursor_pos output_cursor; + +extern void x_fix_overlapping_area P_ ((struct window *, struct glyph_row *, + enum glyph_row_area)); +extern void draw_phys_cursor_glyph P_ ((struct window *, + struct glyph_row *, + enum draw_glyphs_face)); +extern int get_phys_cursor_geometry P_ ((struct window *, struct glyph_row *, + struct glyph *, int *)); +extern void erase_phys_cursor P_ ((struct window *)); +extern void display_and_set_cursor P_ ((struct window *, + int, int, int, int, int)); + +extern void set_output_cursor P_ ((struct cursor_pos *)); +extern void x_cursor_to P_ ((int, int, int, int)); + +extern void x_update_cursor P_ ((struct frame *, int)); +extern void x_clear_cursor P_ ((struct window *)); +extern void x_draw_vertical_border P_ ((struct window *w)); + +extern void frame_to_window_pixel_xy P_ ((struct window *, int *, int *)); +extern void get_glyph_string_clip_rect P_ ((struct glyph_string *, + NativeRectangle *nr)); +extern Lisp_Object find_hot_spot P_ ((Lisp_Object, int, int)); +extern void note_mouse_highlight P_ ((struct frame *, int, int)); +extern void x_clear_window_mouse_face P_ ((struct window *)); +extern void cancel_mouse_face P_ ((struct frame *)); + +extern void handle_tool_bar_click P_ ((struct frame *, + int, int, int, unsigned int)); + +/* msdos.c defines its own versions of these functions. */ +extern int clear_mouse_face P_ ((Display_Info *)); +extern void show_mouse_face P_ ((Display_Info *, enum draw_glyphs_face)); +extern int cursor_in_mouse_face_p P_ ((struct window *w)); + +extern void expose_frame P_ ((struct frame *, int, int, int, int)); +extern int x_intersect_rectangles P_ ((XRectangle *, XRectangle *, + XRectangle *)); +#endif + +/* Defined in fringe.c */ + +int lookup_fringe_bitmap (Lisp_Object); +void draw_fringe_bitmap P_ ((struct window *, struct glyph_row *, int)); +void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *)); +int draw_window_fringes P_ ((struct window *, int)); +int update_window_fringes P_ ((struct window *, int)); +void compute_fringe_widths P_ ((struct frame *, int)); + +#ifdef WINDOWS_NT +void w32_init_fringe P_ ((void)); +void w32_reset_fringes P_ ((void)); +#endif + +/* Defined in image.c */ + +#ifdef HAVE_WINDOW_SYSTEM + +extern int x_bitmap_height P_ ((struct frame *, int)); +extern int x_bitmap_width P_ ((struct frame *, int)); +extern int x_bitmap_pixmap P_ ((struct frame *, int)); +extern void x_reference_bitmap P_ ((struct frame *, int)); +extern int x_create_bitmap_from_data P_ ((struct frame *, char *, + unsigned int, unsigned int)); +extern int x_create_bitmap_from_file P_ ((struct frame *, Lisp_Object)); +#ifndef x_destroy_bitmap +extern void x_destroy_bitmap P_ ((struct frame *, int)); +#endif +extern void x_destroy_all_bitmaps P_ ((Display_Info *)); +extern int x_create_bitmap_mask P_ ((struct frame * , int)); +extern Lisp_Object x_find_image_file P_ ((Lisp_Object)); + +void x_kill_gs_process P_ ((Pixmap, struct frame *)); +struct image_cache *make_image_cache P_ ((void)); +void free_image_cache P_ ((struct frame *)); +void clear_image_cache P_ ((struct frame *, int)); +void forall_images_in_image_cache P_ ((struct frame *, + void (*) P_ ((struct image *)))); +int valid_image_p P_ ((Lisp_Object)); +void prepare_image_for_display P_ ((struct frame *, struct image *)); +int lookup_image P_ ((struct frame *, Lisp_Object)); + +unsigned long image_background P_ ((struct image *, struct frame *, + XImagePtr_or_DC ximg)); +int image_background_transparent P_ ((struct image *, struct frame *, + XImagePtr_or_DC mask)); + +int image_ascent P_ ((struct image *, struct face *, struct glyph_slice *)); + +#endif /* Defined in sysdep.c */ @@ -2218,15 +2773,15 @@ void clear_face_cache P_ ((int)); unsigned long load_color P_ ((struct frame *, struct face *, Lisp_Object, enum lface_attribute_index)); void unload_color P_ ((struct frame *, unsigned long)); -int frame_update_line_height P_ ((struct frame *)); +int face_font_available_p P_ ((struct frame *, Lisp_Object)); int ascii_face_of_lisp_face P_ ((struct frame *, int)); void prepare_face_for_display P_ ((struct frame *, struct face *)); -int xstricmp P_ ((unsigned char *, unsigned char *)); +int xstricmp P_ ((const unsigned char *, const unsigned char *)); int lookup_face P_ ((struct frame *, Lisp_Object *, int, struct face *)); -int lookup_named_face P_ ((struct frame *, Lisp_Object, int)); +int lookup_named_face P_ ((struct frame *, Lisp_Object, int, int)); int smaller_face P_ ((struct frame *, int, int)); int face_with_height P_ ((struct frame *, int, int)); -int lookup_derived_face P_ ((struct frame *, Lisp_Object, int, int)); +int lookup_derived_face P_ ((struct frame *, Lisp_Object, int, int, int)); void init_frame_faces P_ ((struct frame *)); void free_frame_faces P_ ((struct frame *)); void recompute_basic_faces P_ ((struct frame *)); @@ -2234,6 +2789,7 @@ int face_at_buffer_position P_ ((struct window *, int, int, int, int *, int, int)); int face_at_string_position P_ ((struct window *, Lisp_Object, int, int, int, int, int *, enum face_id, int)); +int merge_faces P_ ((struct frame *, Lisp_Object, int, int)); int compute_char_face P_ ((struct frame *, int, Lisp_Object)); void free_all_realized_faces P_ ((Lisp_Object)); extern Lisp_Object Qforeground_color, Qbackground_color; @@ -2248,28 +2804,42 @@ void gamma_correct P_ ((struct frame *, XColor *)); #ifdef WINDOWSNT void gamma_correct P_ ((struct frame *, COLORREF *)); #endif +#ifdef MAC_OS +void gamma_correct P_ ((struct frame *, unsigned long *)); +#endif #ifdef HAVE_WINDOW_SYSTEM -void x_kill_gs_process P_ ((Pixmap, struct frame *)); int x_screen_planes P_ ((struct frame *)); void x_implicitly_set_name P_ ((struct frame *, Lisp_Object, Lisp_Object)); -struct image_cache *make_image_cache P_ ((void)); -void free_image_cache P_ ((struct frame *)); -void clear_image_cache P_ ((struct frame *, int)); -void forall_images_in_image_cache P_ ((struct frame *, - void (*) P_ ((struct image *)))); -int valid_image_p P_ ((Lisp_Object)); -void prepare_image_for_display P_ ((struct frame *, struct image *)); -int lookup_image P_ ((struct frame *, Lisp_Object)); + extern Lisp_Object tip_frame; extern Window tip_window; EXFUN (Fx_show_tip, 6); EXFUN (Fx_hide_tip, 0); extern void start_hourglass P_ ((void)); extern void cancel_hourglass P_ ((void)); +extern int hourglass_started P_ ((void)); extern int display_hourglass_p; +/* Returns the background color of IMG, calculating one heuristically if + necessary. If non-zero, XIMG is an existing XImage object to use for + the heuristic. */ + +#define IMAGE_BACKGROUND(img, f, ximg) \ + ((img)->background_valid \ + ? (img)->background \ + : image_background (img, f, ximg)) + +/* Returns true if IMG has a `transparent' background, using heuristics + to decide if necessary. If non-zero, MASK is an existing XImage + object to use for the heuristic. */ + +#define IMAGE_BACKGROUND_TRANSPARENT(img, f, mask) \ + ((img)->background_transparent_valid \ + ? (img)->background_transparent \ + : image_background_transparent (img, f, mask)) + #endif /* HAVE_WINDOW_SYSTEM */ @@ -2280,8 +2850,21 @@ int popup_activated P_ ((void)); /* Defined in dispnew.c */ extern int inverse_video; -int estimate_mode_line_height P_ ((struct frame *, enum face_id)); -Lisp_Object mode_line_string P_ ((struct window *, int, int, int, int *)); +extern int required_matrix_width P_ ((struct window *)); +extern int required_matrix_height P_ ((struct window *)); +extern Lisp_Object buffer_posn_from_coords P_ ((struct window *, + int *, int *, + struct display_pos *, + Lisp_Object *, + int *, int *, int *, int *)); +extern Lisp_Object mode_line_string P_ ((struct window *, enum window_part, + int *, int *, int *, + Lisp_Object *, + int *, int *, int *, int *)); +extern Lisp_Object marginal_area_string P_ ((struct window *, enum window_part, + int *, int *, int *, + Lisp_Object *, + int *, int *, int *, int *)); extern void redraw_frame P_ ((struct frame *)); extern void redraw_garbaged_frames P_ ((void)); extern void cancel_line P_ ((int, struct frame *)); @@ -2322,8 +2905,6 @@ int direct_output_forward_char P_ ((int)); int update_frame P_ ((struct frame *, int, int)); void update_single_window P_ ((struct window *, int)); int scrolling P_ ((struct frame *)); -void buffer_posn_from_coords P_ ((struct window *, int *, int *, - Lisp_Object *, struct display_pos *)); void do_pending_window_change P_ ((int)); void change_frame_size P_ ((struct frame *, int, int, int, int, int)); void bitch_at_user P_ ((void)); @@ -2344,7 +2925,6 @@ extern void set_scroll_region P_ ((int, int)); extern void turn_off_insert P_ ((void)); extern void turn_off_highlight P_ ((void)); extern void background_highlight P_ ((void)); -extern void reassert_line_highlight P_ ((int, int)); extern void clear_frame P_ ((void)); extern void clear_end_of_line P_ ((int)); extern void clear_end_of_line_raw P_ ((int)); @@ -2353,10 +2933,12 @@ extern void ins_del_lines P_ ((int, int)); extern int string_cost P_ ((char *)); extern int per_line_cost P_ ((char *)); extern void calculate_costs P_ ((struct frame *)); +extern void set_tty_color_mode P_ ((struct frame *, Lisp_Object)); +extern void tty_setup_colors P_ ((int)); extern void term_init P_ ((char *)); extern void fatal P_ ((/* char *, ... */)); void cursor_to P_ ((int, int)); -void change_line_highlight P_ ((int, int, int, int)); +extern int tty_capable_p P_ ((struct frame *, unsigned, unsigned long, unsigned long)); /* Defined in scroll.c */ @@ -2368,4 +2950,38 @@ extern void do_line_insertion_deletion_costs P_ ((struct frame *, char *, void scrolling_1 P_ ((struct frame *, int, int, int, int *, int *, int *, int *, int)); +/* Defined in frame.c */ + +#ifdef HAVE_WINDOW_SYSTEM + +/* Types we might convert a resource string into. */ +enum resource_types +{ + RES_TYPE_NUMBER, + RES_TYPE_FLOAT, + RES_TYPE_BOOLEAN, + RES_TYPE_STRING, + RES_TYPE_SYMBOL +}; + +extern Lisp_Object x_get_arg P_ ((Display_Info *, Lisp_Object, + Lisp_Object, char *, char *class, + enum resource_types)); +extern Lisp_Object x_frame_get_arg P_ ((struct frame *, Lisp_Object, + Lisp_Object, char *, char *, + enum resource_types)); +extern Lisp_Object x_frame_get_and_record_arg P_ (( + struct frame *, Lisp_Object, + Lisp_Object, char *, char *, + enum resource_types)); +extern Lisp_Object x_default_parameter P_ ((struct frame *, Lisp_Object, + Lisp_Object, Lisp_Object, + char *, char *, + enum resource_types)); + +#endif /* HAVE_WINDOW_SYSTEM */ + #endif /* not DISPEXTERN_H_INCLUDED */ + +/* arch-tag: c65c475f-1c1e-4534-8795-990b8509fd65 + (do not change this comment) */