X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/8801a864d2f7d9b6a77dfffa606f27f338127582..463f5630a5e7cbe7f042bc1175d1fa1c4e98860f:/src/dispextern.h diff --git a/src/dispextern.h b/src/dispextern.h index 2665cf38d3..3fc33f55a6 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 + Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -19,30 +19,85 @@ along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* New redisplay written by Gerd Moellmann . */ +/* New redisplay written by Gerd Moellmann . */ #ifndef DISPEXTERN_H_INCLUDED #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; +#define NativeRectangle XRectangle +#endif + #ifdef HAVE_NTGUI #include "w32gui.h" +typedef struct w32_display_info Display_Info; #endif -#ifdef macintosh -#include "macterm.h" +#ifdef HAVE_CARBON +#include "macgui.h" +typedef struct mac_display_info Display_Info; + +/* Include Carbon.h to define Cursor and Rect. */ +#undef mktime +#undef DEBUG +#undef Z +#undef free +#undef malloc +#undef realloc +/* Macros max and min defined in lisp.h conflict with those in + precompiled header Carbon.h. */ +#undef max +#undef min +#undef init_process +#include +#undef Z +#define Z (current_buffer->text->z) +#undef free +#define free unexec_free +#undef malloc +#define malloc unexec_malloc +#undef realloc +#define realloc unexec_realloc +#undef min +#define min(a, b) ((a) < (b) ? (a) : (b)) +#undef max +#define max(a, b) ((a) > (b) ? (a) : (b)) +#undef init_process +#define init_process emacs_init_process + #endif + +#ifndef NativeRectangle +#define NativeRectangle int +#endif + + /* Structure forward declarations. Some are here because function prototypes below reference structure types before their definition in this file. Some are here because not every file including @@ -56,6 +111,22 @@ 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 +}; + + /*********************************************************************** Debugging @@ -99,7 +170,7 @@ extern int trace_redisplay_p; #endif /* GLYPH_DEBUG == 0 */ - + /*********************************************************************** Text positions @@ -108,7 +179,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 +235,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 +282,7 @@ struct display_pos enum glyph_type { /* Glyph describes a character. */ - CHAR_GLYPH, + CHAR_GLYPH, /* Glyph describes a composition sequence. */ COMPOSITE_GLYPH, @@ -224,7 +295,13 @@ enum glyph_type }; -/* Glyphs. */ +/* Glyphs. + + Be extra careful when changing this structure! Esp. make sure that + 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). */ struct glyph { @@ -236,7 +313,9 @@ 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. */ @@ -275,12 +354,19 @@ 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; /* Face of the glyph. */ - unsigned face_id : 22; + unsigned face_id : 21; + + /* 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. On W32, value should be an enumerator of the type + w32_char_font_type. Otherwise it equals FONT_TYPE_UNKNOWN. */ + unsigned font_type : 3; /* A union of sub-structures for different glyph types. */ union @@ -304,20 +390,24 @@ 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 glyphs *X and *Y equal? */ - +/* Are glyphs *X and *Y displayed equal? */ + #define GLYPH_EQUAL_P(X, Y) \ ((X)->type == (Y)->type \ && (X)->u.val == (Y)->u.val \ @@ -325,7 +415,8 @@ struct glyph && (X)->padding_p == (Y)->padding_p \ && (X)->left_box_line_p == (Y)->left_box_line_p \ && (X)->right_box_line_p == (Y)->right_box_line_p \ - && (X)->voffset == (Y)->voffset) + && (X)->voffset == (Y)->voffset \ + && (X)->pixel_width == (Y)->pixel_width) /* Are character codes, faces, padding_ps of glyphs *X and *Y equal? */ @@ -336,7 +427,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 \ { \ @@ -348,7 +439,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)), \ @@ -357,15 +448,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. */ - -#define GLYPH_FROM_CHAR_GLYPH(GLYPH) \ - ((GLYPH).u.ch < 256 \ - ? ((GLYPH).u.ch | ((GLYPH).face_id << 8)) \ + 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 @@ -458,11 +549,15 @@ struct glyph_matrix /* Width and height of the matrix in columns and rows. */ int matrix_w, matrix_h; - /* If this structure describes a window matrix, window_top_y is the - top-most y-position and window_height is the height of the - window, and window_vscroll is the vscroll at the time the matrix - was last adjusted. Only set for window-based redisplay. */ - int window_top_y, window_height, window_width, window_vscroll; + /* If this structure describes a window matrix of window W, + 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. */ @@ -482,10 +577,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; }; @@ -522,7 +619,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 | +--------------------+-------------+---------------------+ @@ -530,13 +627,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 @@ -553,7 +650,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 @@ -572,7 +669,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 @@ -612,10 +710,6 @@ struct glyph_row 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; @@ -623,7 +717,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; @@ -648,20 +742,36 @@ 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. */ unsigned overlapped_p : 1; + /* 1 means this line ends in the middle of a character consisting + 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 + 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. */ unsigned overlapping_p : 1; + /* 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; + /* Continuation lines width at the start of the row. */ int continuation_lines_width; }; @@ -678,13 +788,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. */ @@ -703,29 +813,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 \ @@ -733,46 +843,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) @@ -787,7 +897,8 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int)); #define MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P(ROW) \ ((ROW)->end.dpvec_index >= 0 \ - || (ROW)->end.overlay_string_index >= 0) + || (ROW)->end.overlay_string_index >= 0 \ + || (ROW)->ends_in_middle_of_char_p) /* Non-zero if ROW ends in the middle of an overlay string. */ @@ -795,9 +906,10 @@ 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 \ || ((ROW)->start.overlay_string_index >= 0 \ && (ROW)->start.string_pos.charpos > 0)) @@ -822,6 +934,10 @@ extern int fonts_changed_p; extern struct glyph space_glyph; +/* Frame being updated by update_window/update_frame. */ + +extern struct frame *updating_frame; + /* Window being updated by update_window. This is non-null as long as update_window has not finished, and null otherwise. It's role is analogous to updating_frame. */ @@ -860,6 +976,145 @@ 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; + + struct glyph_string *next, *prev; +}; + +#endif /* HAVE_WINDOW_SYSTEM */ + + /************************************************************************ Display Dimensions ************************************************************************/ @@ -873,7 +1128,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. */ @@ -882,207 +1137,128 @@ extern struct glyph_row scratch_glyph_row; ? MATRIX_HEADER_LINE_ROW (MATRIX)->height \ : 0) -/* Return the current height of the mode line of window W. If not - known from W's current glyph matrix, return a default based on the - height of the font of the face `modeline'. */ +/* 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) -#define CURRENT_MODE_LINE_HEIGHT(W) \ - (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)) -/* Return the current height of the top line of window W. If not - known from W's current glyph matrix, return an estimation based on - the height of the font of the face `top-line'. */ +/* Return the desired face id for the mode line of window W. */ -#define CURRENT_HEADER_LINE_HEIGHT(W) \ - (MATRIX_HEADER_LINE_HEIGHT ((W)->current_matrix) \ - ? MATRIX_HEADER_LINE_HEIGHT ((W)->current_matrix) \ - : estimate_mode_line_height (XFRAME ((W)->frame), HEADER_LINE_FACE_ID)) +#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 + face `mode-line'. */ + +#define CURRENT_MODE_LINE_HEIGHT(W) \ + (current_mode_line_height >= 0 \ + ? current_mode_line_height \ + : (MATRIX_MODE_LINE_HEIGHT ((W)->current_matrix) \ + ? MATRIX_MODE_LINE_HEIGHT ((W)->current_matrix) \ + : estimate_mode_line_height (XFRAME ((W)->frame), \ + CURRENT_MODE_LINE_FACE_ID (W)))) + +/* 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'. */ + +#define CURRENT_HEADER_LINE_HEIGHT(W) \ + (current_header_line_height >= 0 \ + ? current_header_line_height \ + : (MATRIX_HEADER_LINE_HEIGHT ((W)->current_matrix) \ + ? MATRIX_HEADER_LINE_HEIGHT ((W)->current_matrix) \ + : estimate_mode_line_height (XFRAME ((W)->frame), \ + HEADER_LINE_FACE_ID))) /* Return the height of the desired mode line of window W. */ #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'. */ @@ -1102,6 +1278,8 @@ enum lface_attribute_index LFACE_STRIKE_THROUGH_INDEX, LFACE_BOX_INDEX, LFACE_FONT_INDEX, + LFACE_INHERIT_INDEX, + LFACE_AVGWIDTH_INDEX, LFACE_VECTOR_SIZE }; @@ -1138,19 +1316,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 */ @@ -1162,7 +1341,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; @@ -1190,12 +1369,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 @@ -1236,12 +1419,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; @@ -1257,6 +1440,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; @@ -1274,7 +1465,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) @@ -1290,8 +1481,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, @@ -1309,7 +1501,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; @@ -1318,6 +1510,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; }; @@ -1350,7 +1546,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 \ @@ -1371,6 +1567,50 @@ extern int face_change_count; +/*********************************************************************** + Fringes + ***********************************************************************/ + +enum fringe_bitmap_type +{ + NO_FRINGE_BITMAP = 0, + LEFT_TRUNCATION_BITMAP, + RIGHT_TRUNCATION_BITMAP, + CONTINUED_LINE_BITMAP, + CONTINUATION_LINE_BITMAP, + OVERLAY_ARROW_BITMAP, + ZV_LINE_BITMAP, + MAX_FRINGE_BITMAPS +}; + +struct fringe_bitmap +{ + int width; + int height; + int period; + unsigned char *bits; +}; + +/* 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 +{ + enum fringe_bitmap_type which; + int wd, h, dh; + int x, y; + int bx, nx, by, ny; + struct face *face; +}; + +extern struct fringe_bitmap fringe_bitmaps[MAX_FRINGE_BITMAPS]; + + /*********************************************************************** Display Iterator ***********************************************************************/ @@ -1523,7 +1763,7 @@ struct it Lisp_Object *dpvec, *dpend; /* Length in bytes of the char that filled dpvec. A value of zero - means that no character such character is involved. */ + means that no such character is involved. */ int dpvec_char_len; /* Face id of the iterator saved in case a glyph from dpvec contains @@ -1534,9 +1774,9 @@ struct it /* Vector of glyphs for control character translation. The pointer dpvec is set to ctl_chars when a control character is translated. This vector is also used for incomplete multibyte character - translation (e.g \222\244). Such a character is at most 3 bytes, - thus we need at most 12 bytes here. */ - Lisp_Object ctl_chars[12]; + translation (e.g \222\244). Such a character is at most 4 bytes, + thus we need at most 16 bytes here. */ + Lisp_Object ctl_chars[16]; /* Current buffer or string position of the iterator, including position in overlay strings etc. */ @@ -1571,6 +1811,7 @@ struct it enum glyph_row_area area; unsigned multibyte_p : 1; unsigned string_from_display_prop_p : 1; + unsigned display_ellipsis_p : 1; Lisp_Object space_width; short voffset; Lisp_Object font_height; @@ -1579,7 +1820,7 @@ struct it /* Stack pointer. */ int sp; - + /* Setting of buffer-local variable selective-display-ellipsis. */ unsigned selective_display_ellipsis_p : 1; @@ -1604,7 +1845,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; @@ -1614,11 +1855,19 @@ struct it /* 1 means the actual glyph is not available in the current system. */ - unsigned glyph_not_available_p : 1; + unsigned glyph_not_available_p : 1; + + /* 1 means the next line in display_line continues a character + consisting of more than one glyph, and some glyphs of this + character have been put on the previous line. */ + unsigned starts_in_middle_of_char_p : 1; + + /* If 1, saved_face_id contains the id of the face in front of text + skipped due to selective display. */ + unsigned face_before_selective_p : 1; /* The ID of the default face to use. One of DEFAULT_FACE_ID, - MODE_LINE_FACE_ID, or TOOL_BAR_FACE_ID, depending on what we - are displaying. */ + MODE_LINE_FACE_ID, etc, depending on what we are displaying. */ int base_face_id; /* If what == IT_CHARACTER, character and length in bytes. This is @@ -1636,7 +1885,7 @@ 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. */ @@ -1668,7 +1917,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; @@ -1676,10 +1925,9 @@ struct it line, if the window has one. */ int last_visible_y; - /* Width of a prompt in front of the line. Used to perform tab - calculations. The x on which tab calculations are based is - current_x - prompt_width + continuation_lines_width. */ - int prompt_width; + /* Additional space in pixels between lines (for window systems + only.) */ + int extra_line_spacing; /* If non-null, glyphs are produced in glyph_row with each call to produce_glyphs. */ @@ -1691,7 +1939,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; @@ -1750,10 +1998,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. */ @@ -1793,15 +2047,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)); @@ -1810,7 +2072,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)); @@ -1825,9 +2087,13 @@ struct redisplay_interface void (*update_window_begin_hook) P_ ((struct window *w)); /* Function to call after window W has been updated in window-based - redisplay. CURSOR_ON_P non-zero means switch cursor on. */ - void (*update_window_end_hook) P_ ((struct window *w, int cursor_on_p)); - + 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 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. */ @@ -1836,6 +2102,14 @@ 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_window_mouse_face) P_ ((struct window *w)); + /* Set *LEFT and *RIGHT to the left and right overhang of GLYPH on frame F. */ void (*get_glyph_overhangs) P_ ((struct glyph *glyph, struct frame *f, @@ -1846,17 +2120,66 @@ 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)); + +/* 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 @@ -1869,7 +2192,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 @@ -1910,6 +2233,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; @@ -1918,9 +2257,12 @@ struct image #define DEFAULT_IMAGE_WIDTH 30 #define DEFAULT_IMAGE_HEIGHT 30 - /* Percent of image height used as ascent. */ + /* Percent of image height used as ascent. A value of + CENTERED_IMAGE_ASCENT means draw the image centered on the + line. */ int ascent; #define DEFAULT_IMAGE_ASCENT 50 +#define CENTERED_IMAGE_ASCENT -1 /* Lisp specification of this image. */ Lisp_Object spec; @@ -1928,8 +2270,8 @@ struct image /* Relief to draw around the image. */ int relief; - /* Optional margin around the image. This includes the relief. */ - int margin; + /* Optional margins around the image. This includes the relief. */ + int hmargin, vmargin; /* Reference to the type of the image. */ struct image_type *type; @@ -1981,11 +2323,6 @@ struct image_cache }; -/* Value is the ascent of image IMG. */ - -#define IMAGE_ASCENT(IMG) \ - (((IMG)->height + (IMG)->margin) * (IMG)->ascent / 100.0) - /* Value is a pointer to the image with id ID on frame F, or null if no image with that id exists. */ @@ -2055,27 +2392,54 @@ 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 int tool_bar_button_margin; +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 4 +#define DEFAULT_TOOL_BAR_BUTTON_RELIEF 1 +/* The height in pixels of the default tool-bar images. */ + +#define DEFAULT_TOOL_BAR_IMAGE_HEIGHT 24 /*********************************************************************** - 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 */ -void resize_echo_area_axactly P_ ((void)); +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_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 *)); @@ -2085,8 +2449,12 @@ int window_box_width P_ ((struct window *, int)); int window_box_left P_ ((struct window *, int)); int window_box_right 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_ ((void)); +void redisplay_preserve_echo_area P_ ((int)); void set_cursor_from_row P_ ((struct window *, struct glyph_row *, struct glyph_matrix *, int, int, int, int)); void init_iterator P_ ((struct it *, struct window *, int, @@ -2094,20 +2462,87 @@ void init_iterator P_ ((struct it *, struct window *, int, void init_iterator_to_row_start P_ ((struct it *, struct window *, struct glyph_row *)); int get_next_display_element P_ ((struct it *)); -void set_iterator_to_next P_ ((struct it *)); +void set_iterator_to_next P_ ((struct it *, int)); void produce_glyphs P_ ((struct it *)); void produce_special_glyphs P_ ((struct it *, enum display_element_type)); void start_display P_ ((struct it *, struct window *, struct text_pos)); void move_it_to P_ ((struct it *, int, int, int, int, int)); 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 *)); +void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *)); +void compute_fringe_widths P_ ((struct frame *, 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 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; + +#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 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 sysdep.c */ @@ -2120,9 +2555,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 @@ -2134,10 +2566,9 @@ 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 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)); @@ -2148,11 +2579,12 @@ 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; +extern char unspecified_fg[], unspecified_bg[]; void free_realized_multibyte_face P_ ((struct frame *, int)); /* Defined in xfns.c */ @@ -2177,13 +2609,39 @@ void forall_images_in_image_cache P_ ((struct frame *, 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 struct frame *tip_frame; + +#ifdef HAVE_X_WINDOWS +unsigned long image_background P_ ((struct image *, struct frame *, + XImage *ximg)); +int image_background_transparent P_ ((struct image *, struct frame *, + XImage *mask)); +#endif /* HAVE_X_WINDOWS */ + +extern Lisp_Object tip_frame; extern Window tip_window; -EXFUN (Fx_show_tip, 4); +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 */ @@ -2194,8 +2652,13 @@ 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 mode_line_string P_ ((struct window *, int, int, + enum window_part, int *)); +extern Lisp_Object marginal_area_string P_ ((struct window *, int, int, + enum window_part, int *)); extern void redraw_frame P_ ((struct frame *)); extern void redraw_garbaged_frames P_ ((void)); extern void cancel_line P_ ((int, struct frame *)); @@ -2217,10 +2680,10 @@ void clear_desired_matrices P_ ((struct frame *)); void shift_glyph_matrix P_ ((struct window *, struct glyph_matrix *, int, int, int)); void rotate_matrix P_ ((struct glyph_matrix *, int, int, int)); -void increment_glyph_matrix_buffer_positions P_ ((struct glyph_matrix *, - int, int, int, int)); +void increment_matrix_positions P_ ((struct glyph_matrix *, + int, int, int, int)); void blank_row P_ ((struct window *, struct glyph_row *, int)); -void increment_glyph_row_buffer_positions P_ ((struct glyph_row *, int, int)); +void increment_row_positions P_ ((struct glyph_row *, int, int)); void enable_glyph_matrix_rows P_ ((struct glyph_matrix *, int, int, int)); void clear_glyph_row P_ ((struct glyph_row *)); void prepare_desired_row P_ ((struct glyph_row *)); @@ -2236,13 +2699,15 @@ 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 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)); Lisp_Object sit_for P_ ((int, int, int, int, int)); void init_display P_ ((void)); void syms_of_display P_ ((void)); +extern Lisp_Object Qredisplay_dont_pause; /* Defined in term.c */ @@ -2256,7 +2721,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)); @@ -2265,10 +2729,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 */ @@ -2280,4 +2746,35 @@ 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 */