X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/cc4cb7559c4e91c908e42d35f095c9a02808f1a3..cc2734ee7602101a6dc15e2a69edf1881ba4c6c6:/src/dispextern.h diff --git a/src/dispextern.h b/src/dispextern.h index 33c1d99128..0dd9f3ed42 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 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 HAVE_CARBON #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 8 + + /*********************************************************************** Debugging @@ -99,7 +150,7 @@ extern int trace_redisplay_p; #endif /* GLYPH_DEBUG == 0 */ - + /*********************************************************************** Text positions @@ -108,7 +159,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 +215,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 +262,7 @@ struct display_pos enum glyph_type { /* Glyph describes a character. */ - CHAR_GLYPH, + CHAR_GLYPH, /* Glyph describes a composition sequence. */ COMPOSITE_GLYPH, @@ -224,10 +275,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,12 +304,17 @@ struct glyph int charpos; /* Lisp object source of this glyph. Currently either a buffer or - a string, or 0. */ + 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; /* 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; @@ -281,20 +348,23 @@ struct glyph padding. */ unsigned padding_p : 1; - /* 1 means the actual glyph is not available in the current - system. */ + /* 1 means the actual glyph is not available, draw a box instead. + This can happen when a font couldn't be loaded, or a character + 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 @@ -318,23 +388,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 \ @@ -351,7 +434,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 \ { \ @@ -363,7 +446,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)), \ @@ -372,15 +455,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 @@ -474,12 +557,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. */ @@ -499,10 +584,12 @@ struct glyph_matrix char method[512]; #endif - /* The buffer this matrix displays. Set in redisplay_internal. */ + /* The buffer this matrix displays. Set in + mark_window_display_accurate_1. */ struct buffer *buffer; - /* Values of BEGV and ZV as of last redisplay. */ + /* Values of BEGV and ZV as of last redisplay. Set in + mark_window_display_accurate_1. */ int begv, zv; }; @@ -539,7 +626,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 | +--------------------+-------------+---------------------+ @@ -547,13 +634,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 @@ -570,7 +657,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 @@ -589,7 +676,8 @@ struct glyph_row int x, y; /* Width of the row in pixels without taking face extension at the - end of the row into account. */ + end of the row into account, and without counting truncation + and continuation glyphs at the end of a row on ttys. */ int pixel_width; /* Logical ascent/height of this line. The value of ascent is zero @@ -623,16 +711,39 @@ struct glyph_row position of the next row. */ struct display_pos end; + /* Left fringe bitmap number (enum fringe_bitmap_type). */ + unsigned left_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Face of the left fringe glyph. */ + unsigned left_user_fringe_face_id : FACE_ID_BITS; + + /* Right fringe bitmap number (enum fringe_bitmap_type). */ + unsigned right_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Face of the right fringe glyph. */ + unsigned right_user_fringe_face_id : FACE_ID_BITS; + + /* Left fringe bitmap number (enum fringe_bitmap_type). */ + unsigned left_fringe_bitmap : FRINGE_ID_BITS; + + /* Face of the left fringe glyph. */ + unsigned left_fringe_face_id : FACE_ID_BITS; + + /* Right fringe bitmap number (enum fringe_bitmap_type). */ + unsigned right_fringe_bitmap : FRINGE_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; @@ -640,7 +751,7 @@ struct glyph_row /* 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; @@ -665,12 +776,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. */ @@ -680,10 +791,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. */ @@ -692,6 +803,32 @@ 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; + + /* 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; }; @@ -708,13 +845,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. */ @@ -733,29 +870,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 \ @@ -763,46 +900,46 @@ 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) /* Non-zero if ROW is not completely visible in window W. */ - + #define MATRIX_ROW_PARTIALLY_VISIBLE_P(ROW) \ ((ROW)->height != (ROW)->visible_height) /* 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))) + && (ROW)->y < WINDOW_HEADER_LINE_HEIGHT ((W))) /* 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))) + && (ROW)->y + (ROW)->height > WINDOW_BOX_HEIGHT_NO_MODE_LINE ((W))) /* 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) @@ -826,7 +963,7 @@ 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)->starts_in_middle_of_char_p \ @@ -895,6 +1032,148 @@ 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(HAVE_CARBON) + 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; + + struct glyph_string *next, *prev; +}; + +#endif /* HAVE_WINDOW_SYSTEM */ + /************************************************************************ Display Dimensions @@ -909,7 +1188,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. */ @@ -918,6 +1197,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 @@ -929,9 +1234,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'. */ @@ -949,184 +1254,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'. */ @@ -1147,6 +1339,7 @@ enum lface_attribute_index LFACE_BOX_INDEX, LFACE_FONT_INDEX, LFACE_INHERIT_INDEX, + LFACE_AVGWIDTH_INDEX, LFACE_VECTOR_SIZE }; @@ -1183,19 +1376,20 @@ 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 font may still be used somewhere else. */ XFontStruct *font; - /* Background stipple or bitmap used for this face. */ - Pixmap stipple; + /* Background stipple or bitmap used for this face. This is + an id as returned from load_pixmap. */ + int stipple; #else /* not HAVE_WINDOW_SYSTEM */ @@ -1207,7 +1401,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; @@ -1235,12 +1429,16 @@ 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. */ + 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 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; /* Type of box drawn. A value of FACE_NO_BOX means no box is drawn @@ -1281,12 +1479,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; @@ -1302,6 +1500,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; @@ -1319,7 +1525,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) @@ -1335,8 +1541,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, @@ -1346,6 +1553,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. */ @@ -1354,7 +1562,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; @@ -1363,6 +1571,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; }; @@ -1395,7 +1607,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 \ @@ -1415,6 +1627,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<= 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; @@ -1743,7 +2008,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; @@ -1768,6 +2033,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; @@ -1775,6 +2043,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; + + /* Face of the left fringe glyph. */ + unsigned left_user_fringe_face_id : FACE_ID_BITS; + + /* Right fringe bitmap number (enum fringe_bitmap_type). */ + unsigned right_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Face of the right fringe glyph. */ + unsigned right_user_fringe_face_id : FACE_ID_BITS; }; @@ -1802,10 +2082,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. */ @@ -1845,15 +2131,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)); @@ -1862,7 +2156,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)); @@ -1880,10 +2174,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. */ @@ -1892,8 +2186,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. */ @@ -1905,17 +2204,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 @@ -1928,7 +2281,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 @@ -1969,6 +2322,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; @@ -1978,7 +2347,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 @@ -2112,22 +2481,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. */ @@ -2135,13 +2500,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 *)); @@ -2149,8 +2536,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 *, @@ -2169,17 +2562,130 @@ 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 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 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 valid_fringe_bitmap_id_p (int); +void draw_fringe_bitmap P_ ((struct window *, struct glyph_row *, int)); +void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *)); +void draw_window_fringes P_ ((struct window *)); +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 */ @@ -2192,9 +2698,6 @@ void init_sigio P_ ((int)); /* Defined in xfaces.c */ -#ifdef USE_X_TOOLKIT -void x_set_menu_resources_from_menu_face P_ ((struct frame *, Widget)); -#endif #ifdef HAVE_X_WINDOWS void x_free_colors P_ ((struct frame *, unsigned long *, int)); #endif @@ -2206,10 +2709,10 @@ 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 smaller_face P_ ((struct frame *, int, int)); @@ -2220,8 +2723,8 @@ void free_frame_faces P_ ((struct frame *)); void recompute_basic_faces P_ ((struct frame *)); 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 face_at_string_position P_ ((struct window *, Lisp_Object, int, int, int, + int, int *, enum face_id, 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; @@ -2236,27 +2739,40 @@ 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_busy_cursor P_ ((void)); -extern void cancel_busy_cursor P_ ((void)); -extern int display_busy_cursor_p; +extern void start_hourglass P_ ((void)); +extern void cancel_hourglass 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 */ @@ -2267,8 +2783,22 @@ int popup_activated P_ ((void)); /* Defined in dispnew.c */ -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 inverse_video; +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 *)); @@ -2309,7 +2839,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 *)); -int buffer_posn_from_coords P_ ((struct window *, int *, int *)); 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)); @@ -2330,7 +2859,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)); @@ -2339,10 +2867,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 */ @@ -2354,4 +2884,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) */