X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/5f5c8ee54adcf263da9c3dcc1db243b26724c04d..5180cc015e2cca6f8cb635044ac4643cf83276cb:/src/dispextern.h diff --git a/src/dispextern.h b/src/dispextern.h index f848194d20..102ae84a6e 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 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -19,14 +19,17 @@ 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 -#endif +#ifdef USE_X_TOOLKIT +#include +#endif /* USE_X_TOOLKIT */ +#endif /* HAVE_X_WINDOWS */ #ifdef MSDOS #include "msdos.h" @@ -36,6 +39,9 @@ Boston, MA 02111-1307, USA. */ #include "w32gui.h" #endif +#ifdef macintosh +#include "macgui.h" +#endif /* Structure forward declarations. Some are here because function prototypes below reference structure types before their definition @@ -50,22 +56,6 @@ struct frame; struct window; - -/*********************************************************************** - Configuration - ***********************************************************************/ - -/* If NO_PROMPT_IN_BUFFER is zero or undefined (default), prompts are - inserted into minibuffers as read-only text. Otherwise, the - behavior of Emacs 20.2 is restored. Define this as part of CFLAGS - because dispextern.h is not included in every C source file - containing conditional code for it. */ - -#if 0 -#define NO_PROMPT_IN_BUFFER 1 -#endif - - /*********************************************************************** Debugging @@ -82,7 +72,7 @@ struct window; #if GLYPH_DEBUG #define IF_DEBUG(X) X -#define xassert(X) if (!(X)) abort (); else (void) 0 +#define xassert(X) do {if (!(X)) abort ();} while (0) #else #define IF_DEBUG(X) (void) 0 #define xassert(X) (void) 0 @@ -140,21 +130,27 @@ struct text_pos /* Increment text position POS. */ -#define INC_TEXT_POS(POS) \ +#define INC_TEXT_POS(POS, MULTIBYTE_P) \ do \ { \ ++(POS).charpos; \ - INC_POS ((POS).bytepos); \ + if (MULTIBYTE_P) \ + INC_POS ((POS).bytepos); \ + else \ + ++(POS).bytepos; \ } \ while (0) /* Decrement text position POS. */ -#define DEC_TEXT_POS(POS) \ +#define DEC_TEXT_POS(POS, MULTIBYTE_P) \ do \ { \ --(POS).charpos; \ - DEC_POS ((POS).bytepos); \ + if (MULTIBYTE_P) \ + DEC_POS ((POS).bytepos); \ + else \ + --(POS).bytepos; \ } \ while (0) @@ -217,6 +213,9 @@ enum glyph_type /* Glyph describes a character. */ CHAR_GLYPH, + /* Glyph describes a composition sequence. */ + COMPOSITE_GLYPH, + /* Glyph describes an image. */ IMAGE_GLYPH, @@ -225,7 +224,13 @@ enum glyph_type }; -/* Glyphs. */ +/* Glyphs. + + Be extra careful when changing this structure! Esp. make sure that + functions producing glyphs, like x_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 { @@ -237,7 +242,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. */ @@ -262,51 +269,56 @@ struct glyph unsigned left_box_line_p : 1; unsigned right_box_line_p : 1; + /* Non-zero means this glyph's physical ascent or descent is greater + than its logical ascent/descent, i.e. it may potentially overlap + glyphs above or below it. */ + unsigned overlaps_vertically_p : 1; + + /* 1 means glyph is a padding glyph. Padding glyphs are used for + characters whose visual shape consists of more than one glyph + (e.g. Asian characters). All but the first glyph of such a glyph + sequence have the padding_p flag set. Only used for terminal + frames, and there only to minimize code changes. A better way + would probably be to use the width field of glyphs to express + padding. */ + unsigned padding_p : 1; + + /* 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; + +#ifdef WINDOWSNT + /* Type of font used to display the character glyph. 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 + /* A union of sub-structures for different glyph types. */ union { - /* Sub-structure for character glyphs (type == CHAR_GLYPH). */ - struct - { - /* Character code. */ - unsigned code : 19; - - /* Character's face. */ - unsigned face_id : 11; - - /* 1 means glyph is a padding glyph. Padding glyphs are used - for characters whose visual shape consists of more than one - glyph (e.g. Asian characters). All but the first glyph of - such a glyph sequence have the padding_p flag set. Only used - for terminal frames, and there only to minimize code changes. - A better way would probably be to use the width field of - glyphs to express padding. */ - unsigned padding_p : 1; - } - ch; + /* Character code for character glyphs (type == CHAR_GLYPH). */ + unsigned ch; - /* Sub-structure for image glyphs (type == IMAGE_GLYPH). */ - struct - { - /* Image id. */ - unsigned id : 20; + /* Composition ID for composition glyphs (type == COMPOSITION_GLYPH) */ + unsigned cmp_id; - /* Face under the image. */ - unsigned face_id : 12; - } - img; + /* Image ID for image glyphs (type == IMAGE_GLYPH). */ + unsigned img_id; /* Sub-structure for type == STRETCH_GLYPH. */ struct { /* The height of the glyph. */ - unsigned height : 11; + unsigned height : 16; /* The ascent of the glyph. */ - unsigned ascent : 10; - - /* The face of the stretch glyph. */ - unsigned face_id : 11; + unsigned ascent : 16; } stretch; @@ -321,14 +333,24 @@ struct glyph #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 \ + && (X)->face_id == (Y)->face_id \ + && (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? */ + +#define GLYPH_CHAR_AND_FACE_EQUAL_P(X, Y) \ + ((X)->u.ch == (Y)->u.ch \ + && (X)->face_id == (Y)->face_id \ + && (X)->padding_p == (Y)->padding_p) /* Fill a character glyph GLYPH. CODE, FACE_ID, PADDING_P correspond to the bits defined for the typedef `GLYPH' in lisp.h. */ @@ -336,9 +358,9 @@ struct glyph #define SET_CHAR_GLYPH(GLYPH, CODE, FACE_ID, PADDING_P) \ do \ { \ - (GLYPH).u.ch.code = (CODE); \ - (GLYPH).u.ch.face_id = (FACE_ID); \ - (GLYPH).u.ch.padding_p = (PADDING_P); \ + (GLYPH).u.ch = (CODE); \ + (GLYPH).face_id = (FACE_ID); \ + (GLYPH).padding_p = (PADDING_P); \ } \ while (0) @@ -349,18 +371,20 @@ struct glyph SET_CHAR_GLYPH ((GLYPH), \ FAST_GLYPH_CHAR ((FROM)), \ FAST_GLYPH_FACE ((FROM)), \ - ((FROM) & GLYPH_MASK_PADDING) != 0) + 0) -/* Construct a typedef'd GLYPH value from a character glyph 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.code \ - | ((GLYPH).u.ch.face_id << CHARACTERBITS) \ - | ((GLYPH).u.ch.padding_p ? GLYPH_MASK_PADDING : 0)) + ((GLYPH).u.ch < 256 \ + ? ((GLYPH).u.ch | ((GLYPH).face_id << CHARACTERBITS)) \ + : -1) /* Is GLYPH a padding glyph? */ -#define CHAR_GLYPH_PADDING_P(GLYPH) (GLYPH).u.ch.padding_p +#define CHAR_GLYPH_PADDING_P(GLYPH) (GLYPH).padding_p @@ -452,11 +476,13 @@ 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_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; /* Number of glyphs reserved for left and right marginal areas when the matrix was last adjusted. */ @@ -469,12 +495,20 @@ struct glyph_matrix /* Non-zero means window displayed in this matrix has a top mode line. */ - unsigned top_line_p : 1; + unsigned header_line_p : 1; #ifdef GLYPH_DEBUG /* A string identifying the method used to display the matrix. */ char method[512]; #endif + + /* The buffer this matrix displays. Set in + mark_window_display_accurate_1. */ + struct buffer *buffer; + + /* Values of BEGV and ZV as of last redisplay. Set in + mark_window_display_accurate_1. */ + int begv, zv; }; @@ -560,13 +594,19 @@ 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; - /* Height information. The value of ascent is zero and height is 1 - on terminal frames. */ + /* Logical ascent/height of this line. The value of ascent is zero + and height is 1 on terminal frames. */ int ascent, height; + /* Physical ascent/height of this line. If max_ascent > ascent, + this line overlaps the line above it on the display. Otherwise, + if max_height > height, this line overlaps the line beneath it. */ + int phys_ascent, phys_height; + /* Portion of row that is visible. Partially visible rows may be found at the top and bottom of a window. This is 1 for tty frames. It may be < 0 in case of completely invisible rows. */ @@ -595,10 +635,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; @@ -632,17 +668,35 @@ struct glyph_row 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 + scroll bars, fringes, and internal borders. This also implies that the row doesn't have marginal areas. */ unsigned full_width_p : 1; - /* if non-zero, and full_width_p is also non-zero, don't let - the row draw over the frame's internal border. */ - unsigned internal_border_p : 1; - /* Non-zero means row is a mode or top-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 + previoius 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; }; @@ -669,7 +723,7 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int)); This is always the first row in MATRIX because that's the only way that works in frame-based redisplay. */ -#define MATRIX_TOP_LINE_ROW(MATRIX) (MATRIX)->rows +#define MATRIX_HEADER_LINE_ROW(MATRIX) (MATRIX)->rows /* Return a pointer to first row in MATRIX used for text display. */ @@ -739,7 +793,7 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int)); #define MATRIX_ROW_PARTIALLY_VISIBLE_AT_TOP_P(W, ROW) \ (MATRIX_ROW_PARTIALLY_VISIBLE_P ((ROW)) \ - && (ROW)->y < WINDOW_DISPLAY_TOP_LINE_HEIGHT ((W))) + && (ROW)->y < WINDOW_DISPLAY_HEADER_LINE_HEIGHT ((W))) /* Non-zero if ROW is partially visible at the bottom of window W. */ @@ -768,7 +822,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. */ @@ -779,10 +834,21 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int)); #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)) - +/* Non-zero means ROW overlaps its predecessor. */ + +#define MATRIX_ROW_OVERLAPS_PRED_P(ROW) \ + ((ROW)->phys_ascent > (ROW)->ascent) + +/* Non-zero means ROW overlaps its successor. */ + +#define MATRIX_ROW_OVERLAPS_SUCC_P(ROW) \ + ((ROW)->phys_height - (ROW)->phys_ascent \ + > (ROW)->height - (ROW)->ascent) + /* Non-zero means that fonts have been loaded since the last glyph matrix adjustments. The function redisplay_internal adjusts glyph matrices when this flag is non-zero. */ @@ -793,6 +859,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. */ @@ -848,28 +918,36 @@ extern struct glyph_row scratch_glyph_row; if not known. This macro is called under circumstances where MATRIX might not have been allocated yet. */ -#define MATRIX_TOP_LINE_HEIGHT(MATRIX) \ +#define MATRIX_HEADER_LINE_HEIGHT(MATRIX) \ ((MATRIX) && (MATRIX)->rows \ - ? MATRIX_TOP_LINE_ROW (MATRIX)->height \ + ? 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'. */ - -#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)) + 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), \ + 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'. */ - -#define CURRENT_TOP_LINE_HEIGHT(W) \ - (MATRIX_TOP_LINE_HEIGHT ((W)->current_matrix) \ - ? MATRIX_TOP_LINE_HEIGHT ((W)->current_matrix) \ - : estimate_mode_line_height (XFRAME ((W)->frame), TOP_LINE_FACE_ID)) + 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. */ @@ -878,8 +956,8 @@ extern struct glyph_row scratch_glyph_row; /* Return the height of the desired top line of window W. */ -#define DESIRED_TOP_LINE_HEIGHT(W) \ - MATRIX_TOP_LINE_HEIGHT ((W)->desired_matrix) +#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. */ @@ -890,12 +968,12 @@ extern struct glyph_row scratch_glyph_row; /* 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. */ + width of vertical scroll bars, and fringes. */ #define WINDOW_DISPLAY_PIXEL_WIDTH(W) \ (((XFASTINT ((W)->width) \ - FRAME_SCROLL_BAR_WIDTH (XFRAME (WINDOW_FRAME ((W)))) \ - - 2 * FRAME_FLAGS_AREA_COLS (XFRAME (WINDOW_FRAME ((W))))) \ + - FRAME_FRINGE_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. */ @@ -915,9 +993,9 @@ extern struct glyph_row scratch_glyph_row; /* Height in pixels of the top line. Zero if W doesn't have a top line. */ -#define WINDOW_DISPLAY_TOP_LINE_HEIGHT(W) \ - (WINDOW_WANTS_TOP_LINE_P ((W)) \ - ? CURRENT_TOP_LINE_HEIGHT (W) \ +#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. */ @@ -931,7 +1009,7 @@ extern struct glyph_row scratch_glyph_row; #define WINDOW_DISPLAY_TEXT_HEIGHT(W) \ (WINDOW_DISPLAY_PIXEL_HEIGHT ((W)) \ - WINDOW_DISPLAY_MODE_LINE_HEIGHT ((W)) \ - - WINDOW_DISPLAY_TOP_LINE_HEIGHT ((W))) + - WINDOW_DISPLAY_HEADER_LINE_HEIGHT ((W))) /* Left edge of W in pixels relative to its frame. */ @@ -939,7 +1017,7 @@ extern struct glyph_row scratch_glyph_row; (FRAME_INTERNAL_BORDER_WIDTH_SAFE (XFRAME (WINDOW_FRAME ((W)))) \ + (WINDOW_LEFT_MARGIN ((W)) \ * CANON_X_UNIT (XFRAME (WINDOW_FRAME ((W))))) \ - + FRAME_FLAGS_AREA_WIDTH (XFRAME (WINDOW_FRAME ((W))))) + + FRAME_LEFT_FRINGE_WIDTH (XFRAME (WINDOW_FRAME ((W))))) /* Right edge of window W in pixels, relative to its frame. */ @@ -1037,15 +1115,17 @@ extern struct glyph_row scratch_glyph_row; (!MINI_WINDOW_P (W) \ && !(W)->pseudo_window_p \ && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W))) \ + && BUFFERP ((W)->buffer) \ && !NILP (XBUFFER ((W)->buffer)->mode_line_format)) /* Value is non-zero if window W wants a top line. */ -#define WINDOW_WANTS_TOP_LINE_P(W) \ +#define WINDOW_WANTS_HEADER_LINE_P(W) \ (!MINI_WINDOW_P (W) \ && !(W)->pseudo_window_p \ && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W))) \ - && !NILP (XBUFFER ((W)->buffer)->top_line_format)) + && BUFFERP ((W)->buffer) \ + && !NILP (XBUFFER ((W)->buffer)->header_line_format)) /*********************************************************************** @@ -1070,6 +1150,9 @@ enum lface_attribute_index LFACE_OVERLINE_INDEX, LFACE_STRIKE_THROUGH_INDEX, LFACE_BOX_INDEX, + LFACE_FONT_INDEX, + LFACE_INHERIT_INDEX, + LFACE_AVGWIDTH_INDEX, LFACE_VECTOR_SIZE }; @@ -1117,8 +1200,9 @@ struct face 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 */ @@ -1147,9 +1231,6 @@ struct face must not be freed. */ char *font_name; - /* The X font registry and encoding of font_name. */ - Lisp_Object registry; - /* Font info ID for this face's font. An ID is stored here because pointers to font_info structures may change. The reason is that they are pointers into a font table vector that is itself @@ -1157,8 +1238,8 @@ struct face int font_info_id; /* Fontset ID if this face uses a fontset, or -1. This is only >= 0 - if the face was realized for CHARSET_COMPOSITION. For all other - charsets, a specific font is loaded from the set of fonts + if the face was realized for a composition sequence. + 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; @@ -1166,7 +1247,11 @@ struct face 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 vartical 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 @@ -1188,10 +1273,10 @@ struct face unsigned hash; /* The charset for which this face was realized if it was realized - for use in multibyte text. If fontset >= 0, this is - CHARSET_COMPOSITION. A value of charset < 0 means the face was - realized for use in unibyte text where the idea of Emacs - charsets isn't applicable. */ + for use in multibyte text. If fontset >= 0, this is the charset + of the first character of the composition sequence. A value of + charset < 0 means the face was realized for use in unibyte text + where the idea of Emacs charsets isn't applicable. */ int charset; /* Non-zero if text in this face should be underlined, overlined, @@ -1207,7 +1292,7 @@ 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; @@ -1228,8 +1313,17 @@ 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; + /* Next and previous face in hash collision list of face cache. */ struct face *next, *prev; + + /* If this face is for ASCII characters, this points this face + itself. Otherwise, this points a face for ASCII characters. */ + struct face *ascii_face; }; @@ -1237,6 +1331,14 @@ struct face #define FACE_TTY_DEFAULT_COLOR ((unsigned long) -1) +/* Color index indicating that face uses an unknown foreground color. */ + +#define FACE_TTY_DEFAULT_FG_COLOR ((unsigned long) -2) + +/* Color index indicating that face uses an unsigned background color. */ + +#define FACE_TTY_DEFAULT_BG_COLOR ((unsigned long) -3) + /* Non-zero if FACE was realized for unibyte use. */ #define FACE_UNIBYTE_P(FACE) ((FACE)->charset < 0) @@ -1249,9 +1351,14 @@ enum face_id { DEFAULT_FACE_ID, MODE_LINE_FACE_ID, - TOOLBAR_FACE_ID, - BITMAP_AREA_FACE_ID, - TOP_LINE_FACE_ID, + TOOL_BAR_FACE_ID, + FRINGE_FACE_ID, + HEADER_LINE_FACE_ID, + SCROLL_BAR_FACE_ID, + BORDER_FACE_ID, + CURSOR_FACE_ID, + MOUSE_FACE_ID, + MENU_FACE_ID, BASIC_FACE_ID_SENTINEL }; @@ -1272,6 +1379,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; }; @@ -1288,37 +1399,34 @@ struct face_cache face doesn't exist. */ #define FACE_FROM_ID(F, ID) \ - (((ID) >= 0 && (ID) < FRAME_FACE_CACHE (F)->used) \ + (((unsigned) (ID) < FRAME_FACE_CACHE (F)->used) \ ? FRAME_FACE_CACHE (F)->faces_by_id[ID] \ : NULL) -/* Non-zero if FACE is suitable for displaying characters of CHARSET. - CHARSET < 0 means unibyte text. */ - -#define FACE_SUITABLE_FOR_CHARSET_P(FACE, CHARSET) \ - (((CHARSET) < 0 \ - ? (EQ ((FACE)->registry, Vface_default_registry) \ - || !NILP (Fequal ((FACE)->registry, Vface_default_registry))) \ - : ((FACE)->charset == (CHARSET) \ - || ((FACE)->charset == CHARSET_ASCII \ - && (CHARSET) == charset_latin_iso8859_1 \ - && face_suitable_for_iso8859_1_p ((FACE))) \ - || ((FACE)->charset == charset_latin_iso8859_1 \ - && (CHARSET) == CHARSET_ASCII)))) - +#ifdef HAVE_WINDOW_SYSTEM + +/* Non-zero if FACE is suitable for displaying character CHAR. */ + +#define FACE_SUITABLE_FOR_CHAR_P(FACE, CHAR) \ + (SINGLE_BYTE_CHAR_P (CHAR) \ + ? (FACE) == (FACE)->ascii_face \ + : face_suitable_for_char_p ((FACE), (CHAR))) + /* Return the id of the realized face on frame F that is like the face - with id ID but is suitable for displaying characters of CHARSET. - This macro is only meaningful for CHARSET >= 0, i.e. multibyte - text. */ + with id ID but is suitable for displaying character CHAR. + This macro is only meaningful for multibyte character CHAR. */ -#define FACE_FOR_CHARSET(F, ID, CHARSET) \ - (FACE_SUITABLE_FOR_CHARSET_P (FACE_FROM_ID ((F), (ID)), (CHARSET)) \ - ? (ID) \ - : lookup_face ((F), FACE_FROM_ID ((F), (ID))->lface, (CHARSET))) +#define FACE_FOR_CHAR(F, FACE, CHAR) \ + (SINGLE_BYTE_CHAR_P (CHAR) \ + ? (FACE)->ascii_face->id \ + : face_for_char ((F), (FACE), (CHAR))) -/* The default registry and encoding to use. */ +#else /* not HAVE_WINDOW_SYSTEM */ -extern Lisp_Object Vface_default_registry; +#define FACE_SUITABLE_FOR_CHAR_P(FACE, CHAR) 1 +#define FACE_FOR_CHAR(F, FACE, CHAR) ((FACE)->id) + +#endif /* not HAVE_WINDOW_SYSTEM */ /* Non-zero means face attributes have been changed since the last redisplay. Used in redisplay_internal. */ @@ -1380,6 +1488,9 @@ enum display_element_type /* A normal character. */ IT_CHARACTER, + /* A composition sequence. */ + IT_COMPOSITION, + /* An image. */ IT_IMAGE, @@ -1408,6 +1519,7 @@ enum prop_idx FACE_PROP_IDX, INVISIBLE_PROP_IDX, DISPLAY_PROP_IDX, + COMPOSITION_PROP_IDX, /* Not a property. Used to indicate changes in overlays. */ OVERLAY_PROP_IDX, @@ -1457,11 +1569,8 @@ struct it /* 1 means multibyte characters are enabled. */ unsigned multibyte_p : 1; - /* 1 means highlight trailing whitespace. */ - unsigned show_trailing_whitespace_p : 1; - /* 1 means window has a mode line at its top. */ - unsigned top_line_p : 1; + unsigned header_line_p : 1; /* 1 means `string' is the value of a `display' property. Don't handle some `display' properties in these strings. */ @@ -1488,8 +1597,11 @@ struct it int saved_face_id; /* Vector of glyphs for control character translation. The pointer - dpvec is set to ctl_chars when a control character is translated. */ - Lisp_Object ctl_chars[4]; + 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 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. */ @@ -1524,6 +1636,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; @@ -1565,26 +1678,41 @@ struct it /* 1 means overlay strings at end_charpos have been processed. */ unsigned overlay_strings_at_end_processed_p : 1; + /* 1 means the actual glyph is not available in the current + system. */ + 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 TOOLBAR_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 a character from a buffer or string. It may be different from the character displayed in case that - unibyte_display_via_language_environment is set. */ + unibyte_display_via_language_environment is set. + + If what == IT_COMPOSITION, the first component of a composition + and length in bytes of the composition. */ int c, len; + /* If what == IT_COMPOSITION, identification number and length in + chars of a composition. */ + int cmp_id, cmp_len; + /* 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. */ int char_to_display; - /* Charset for which face_id was computed. This is the charset - of char_to_display after x_produce_glyphs has been called. */ - int charset; - /* If what == IT_IMAGE, the id of the image to display. */ int image_id; @@ -1622,10 +1750,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. */ @@ -1642,9 +1769,10 @@ struct it produce_glyphs. */ int pixel_width; - /* Current and maximum line height information. Result of - produce_glyphs. */ + /* Current, maximum logical, and maximum physical line height + information. Result of produce_glyphs. */ int ascent, descent, max_ascent, max_descent; + int phys_ascent, phys_descent, max_phys_ascent, max_phys_descent; /* Current x pixel position within the display line. This value does not include the width of continuation lines in front of the @@ -1770,8 +1898,12 @@ 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 hightlight. */ + 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 @@ -1781,10 +1913,19 @@ struct redisplay_interface /* Flush the display of frame F. For X, this is XFlush. */ void (*flush_display) P_ ((struct frame *f)); + /* Clear the mouse hightlight in window W, if there is any. */ + void (*clear_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, int *left, int *right)); + + /* Fix the display of AREA of ROW in window W for overlapping rows. + This function is called from redraw_overlapping_rows after + desired rows have been made current. */ + void (*fix_overlapping_area) P_ ((struct window *w, struct glyph_row *row, + enum glyph_row_area area)); }; /* The current interface for window-based redisplay. */ @@ -1801,7 +1942,7 @@ extern int (* estimate_mode_line_height_hook) P_ ((struct frame *, Images ***********************************************************************/ -#ifdef HAVE_X_WINDOWS +#ifdef HAVE_WINDOW_SYSTEM /* Structure forward declarations. */ @@ -1849,6 +1990,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; @@ -1857,9 +2014,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 center 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; @@ -1867,12 +2027,15 @@ 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; + /* 1 means that loading the image failed. Don't try again. */ + unsigned load_failed_p; + /* A place for image types to store additional data. The member data.lisp_val is marked during GC, so it's safe to store Lisp data there. Image types should free this data when their `free' @@ -1917,11 +2080,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. */ @@ -1934,75 +2092,83 @@ struct image_cache #define IMAGE_CACHE_BUCKETS_SIZE 1001 -#endif /* HAVE_X_WINDOWS */ +#endif /* HAVE_WINDOW_SYSTEM */ /*********************************************************************** - Toolbars + Tool-bars ***********************************************************************/ -/* Enumeration defining where to find toolbar item information in - toolbar items vectors stored with frames. Each toolbar item - occupies TOOLBAR_ITEM_NSLOTS elements in such a vector. */ +/* Enumeration defining where to find tool-bar item information in + tool-bar items vectors stored with frames. Each tool-bar item + occupies TOOL_BAR_ITEM_NSLOTS elements in such a vector. */ -enum toolbar_item_idx +enum tool_bar_item_idx { - /* The key of the toolbar item. Used to remove items when a binding + /* The key of the tool-bar item. Used to remove items when a binding for `undefined' is found. */ - TOOLBAR_ITEM_KEY, + TOOL_BAR_ITEM_KEY, /* Non-nil if item is enabled. */ - TOOLBAR_ITEM_ENABLED_P, + TOOL_BAR_ITEM_ENABLED_P, /* Non-nil if item is selected (pressed). */ - TOOLBAR_ITEM_SELECTED_P, + TOOL_BAR_ITEM_SELECTED_P, /* Caption. */ - TOOLBAR_ITEM_CAPTION, + TOOL_BAR_ITEM_CAPTION, /* Image(s) to display. This is either a single image specification or a vector of specifications. */ - TOOLBAR_ITEM_IMAGES, + TOOL_BAR_ITEM_IMAGES, /* The binding. */ - TOOLBAR_ITEM_BINDING, + TOOL_BAR_ITEM_BINDING, /* Button type. One of nil, `:radio' or `:toggle'. */ - TOOLBAR_ITEM_TYPE, + TOOL_BAR_ITEM_TYPE, /* Help string. */ - TOOLBAR_ITEM_HELP, + TOOL_BAR_ITEM_HELP, - /* Sentinel = number of slots in toolbar_items occupied by one - toolbar item. */ - TOOLBAR_ITEM_NSLOTS + /* Sentinel = number of slots in tool_bar_items occupied by one + tool-bar item. */ + TOOL_BAR_ITEM_NSLOTS }; /* An enumeration for the different images that can be specified - for a toolbar item. */ + for a tool-bar item. */ -enum toolbar_item_image +enum tool_bar_item_image { - TOOLBAR_IMAGE_ENABLED_SELECTED, - TOOLBAR_IMAGE_ENABLED_DESELECTED, - TOOLBAR_IMAGE_DISABLED_SELECTED, - TOOLBAR_IMAGE_DISABLED_DESELECTED + TOOL_BAR_IMAGE_ENABLED_SELECTED, + TOOL_BAR_IMAGE_ENABLED_DESELECTED, + TOOL_BAR_IMAGE_DISABLED_SELECTED, + TOOL_BAR_IMAGE_DISABLED_DESELECTED }; -/* Non-zero means raise toolbar buttons when the mouse moves over them. */ +/* 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 auto_raise_toolbar_buttons_p; +extern Lisp_Object Vtool_bar_button_margin; -/* Margin around toolbar buttons in pixels. */ +/* Thickness of relief to draw around tool-bar buttons. */ -extern int toolbar_button_margin; +extern int tool_bar_button_relief; -/* Thickness of relief to draw around toolbar buttons. */ +/* Default values of the above variables. */ -extern int toolbar_button_relief; +#define DEFAULT_TOOL_BAR_BUTTON_MARGIN 1 +#define DEFAULT_TOOL_BAR_BUTTON_RELIEF 3 +/* The height in pixels of the default tool-bar images. */ + +#define DEFAULT_TOOL_BAR_IMAGE_HEIGHT 24 /*********************************************************************** @@ -2011,6 +2177,14 @@ extern int toolbar_button_relief; /* 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_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 *)); int window_box_height P_ ((struct window *)); @@ -2020,7 +2194,7 @@ 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 *)); 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, @@ -2028,18 +2202,26 @@ 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 frame_mode_line_height P_ ((struct frame *)); void highlight_trailing_whitespace P_ ((struct frame *, struct glyph_row *)); -int toolbar_item_info P_ ((struct frame *, struct glyph *, int *)); -extern Lisp_Object Qtoolbar; +int tool_bar_item_info P_ ((struct frame *, struct glyph *, int *)); +extern Lisp_Object Qtool_bar; +extern Lisp_Object Vshow_trailing_whitespace; 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; /* Defined in sysdep.c */ @@ -2050,36 +2232,53 @@ int tabs_safe_p P_ ((void)); void init_baud_rate P_ ((void)); void init_sigio P_ ((int)); -/* Defined in xface.c */ +/* Defined in xfaces.c */ + +#ifdef HAVE_X_WINDOWS +void x_free_colors P_ ((struct frame *, unsigned long *, int)); +#endif -char *x_charset_registry P_ ((int)); +void update_face_from_frame_parameter P_ ((struct frame *, Lisp_Object, + Lisp_Object)); +Lisp_Object tty_color_name P_ ((struct frame *, int)); 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 face_suitable_for_iso8859_1_p P_ ((struct face *)); int xstricmp P_ ((unsigned char *, unsigned char *)); -int lookup_face P_ ((struct frame *, Lisp_Object *, int)); -int face_suitable_for_charset_p P_ ((struct face *, int)); +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)); int face_with_height P_ ((struct frame *, int, int)); +int lookup_derived_face P_ ((struct frame *, Lisp_Object, int, int)); void init_frame_faces P_ ((struct frame *)); 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 */ -#ifdef HAVE_X_WINDOWS +#ifdef HAVE_X_WINDOWS +void gamma_correct P_ ((struct frame *, XColor *)); +#endif +#ifdef WINDOWSNT +void gamma_correct P_ ((struct frame *, COLORREF *)); +#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)); @@ -2090,25 +2289,54 @@ 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); -EXFUN (Fx_show_busy_cursor, 0); -EXFUN (Fx_hide_busy_cursor, 1); -extern int inhibit_busy_cursor; -extern int display_busy_cursor_p; +extern void start_hourglass P_ ((void)); +extern void cancel_hourglass P_ ((void)); +extern int display_hourglass_p; -#endif /* HAVE_X_WINDOWS */ +/* 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 */ /* Defined in xmenu.c */ int popup_activated P_ ((void)); -/* Defined in dispnw.c */ +/* Defined in dispnew.c */ -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 int estimate_mode_line_height P_ ((struct frame *, enum face_id)); +extern Lisp_Object mode_line_string P_ ((struct window *, 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 *)); @@ -2118,8 +2346,6 @@ extern int direct_output_for_insert P_ ((int)); extern int direct_output_forward_char P_ ((int)); extern int update_frame P_ ((struct frame *, int, int)); extern int scrolling P_ ((struct frame *)); -extern void do_pending_window_change P_ ((void)); -extern void change_frame_size P_ ((struct frame *, int, int, int, int)); extern void bitch_at_user P_ ((void)); void adjust_glyphs P_ ((struct frame *)); void free_glyphs P_ ((struct frame *)); @@ -2132,10 +2358,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 *)); @@ -2151,13 +2377,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 do_pending_window_change P_ ((void)); -void change_frame_size P_ ((struct frame *, int, int, 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 */ @@ -2171,7 +2399,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)); @@ -2183,7 +2410,6 @@ extern void calculate_costs P_ ((struct frame *)); 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)); /* Defined in scroll.c */