X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/c99f60805759ad9930bd39fb8861e406de7c7bdc..385ed61f9d0bffef8a3f037e8cdc85d0de71bf15:/src/dispextern.h diff --git a/src/dispextern.h b/src/dispextern.h index 1545770372..3b71002a30 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,25 +19,59 @@ 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 */ + +#else /* !HAVE_X_WINDOWS */ + +/* X-related stuff used by non-X gui code. */ + +typedef struct { + unsigned long pixel; + unsigned short red, green, blue; + char flags; + char pad; +} XColor; + +#endif /* HAVE_X_WINDOWS */ #ifdef MSDOS #include "msdos.h" #endif +#ifdef HAVE_X_WINDOWS +typedef struct x_display_info Display_Info; +typedef XImage * XImagePtr; +typedef XImagePtr XImagePtr_or_DC; +#define NativeRectangle XRectangle +#endif + #ifdef HAVE_NTGUI #include "w32gui.h" +typedef struct w32_display_info Display_Info; +typedef XImage *XImagePtr; +typedef HDC XImagePtr_or_DC; #endif -#ifdef macintosh -#include "macterm.h" +#ifdef HAVE_CARBON +#include "macgui.h" +typedef struct mac_display_info Display_Info; +/* Mac equivalent of XImage. */ +typedef Pixmap XImagePtr; +typedef XImagePtr XImagePtr_or_DC; +#endif + +#ifndef NativeRectangle +#define NativeRectangle int #endif /* Structure forward declarations. Some are here because function @@ -53,6 +87,25 @@ 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 +}; + +/* Number of bits allocated to store fringe bitmap numbers. */ +#define FRINGE_ID_BITS 8 + + /*********************************************************************** Debugging @@ -69,7 +122,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 @@ -96,7 +149,7 @@ extern int trace_redisplay_p; #endif /* GLYPH_DEBUG == 0 */ - + /*********************************************************************** Text positions @@ -105,7 +158,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. */ @@ -127,21 +180,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) @@ -155,7 +214,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. */ @@ -202,7 +261,10 @@ struct display_pos enum glyph_type { /* Glyph describes a character. */ - CHAR_GLYPH, + CHAR_GLYPH, + + /* Glyph describes a composition sequence. */ + COMPOSITE_GLYPH, /* Glyph describes an image. */ IMAGE_GLYPH, @@ -212,7 +274,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 { @@ -224,12 +292,17 @@ struct glyph int charpos; /* Lisp object source of this glyph. Currently either a buffer or - a string, or 0. */ + a string, if the glyph was produced from characters which came from + a buffer or a string; or 0 if the glyph was inserted by redisplay + for its own purposes such as padding. */ Lisp_Object object; /* Width in pixels. */ short pixel_width; + /* Ascent and descent in pixels. */ + short ascent, descent; + /* Vertical offset. If < 0, the glyph is displayed raised, if > 0 the glyph is displayed lowered. */ short voffset; @@ -254,105 +327,121 @@ struct glyph 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; + +#define FACE_ID_BITS 21 + + /* Face of the glyph. */ + unsigned face_id : FACE_ID_BITS; + + /* 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 { - /* 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; - + /* 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 \ + && (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. */ - + #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) /* 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)), \ FAST_GLYPH_FACE ((FROM)), \ - ((FROM) & GLYPH_MASK_PADDING) != 0) + 0) + +/* 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. */ -/* Construct a typedef'd GLYPH value from a character glyph GLYPH. */ - #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 @@ -444,11 +533,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. */ @@ -468,10 +561,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; }; @@ -508,7 +603,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 | +--------------------+-------------+---------------------+ @@ -516,13 +611,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 @@ -539,7 +634,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 @@ -558,7 +653,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 @@ -592,16 +688,39 @@ struct glyph_row position of the next row. */ struct display_pos end; + /* Left fringe bitmap number (enum fringe_bitmap_type). */ + unsigned left_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Face of the left fringe glyph. */ + unsigned left_user_fringe_face_id : FACE_ID_BITS; + + /* Right fringe bitmap number (enum fringe_bitmap_type). */ + unsigned right_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Face of the right fringe glyph. */ + unsigned right_user_fringe_face_id : FACE_ID_BITS; + + /* Left fringe bitmap number (enum fringe_bitmap_type). */ + unsigned left_fringe_bitmap : FRINGE_ID_BITS; + + /* Face of the left fringe glyph. */ + unsigned left_fringe_face_id : FACE_ID_BITS; + + /* Right fringe bitmap number (enum fringe_bitmap_type). */ + unsigned right_fringe_bitmap : FRINGE_ID_BITS; + + /* Face of the right fringe glyph. */ + unsigned right_fringe_face_id : FACE_ID_BITS; + + /* 1 means that we must draw the bitmaps of this row. */ + unsigned redraw_fringe_bitmaps_p : 1; + /* In a desired matrix, 1 means that this row must be updated. In a current matrix, 0 means that the row has been invalidated, i.e. the row's contents do not agree with what is visible on the screen. */ unsigned enabled_p : 1; - /* Display this line in inverse video? Used for the mode line and - menu bar lines. */ - unsigned inverse_p : 1; - /* 1 means row displays a text line that is truncated on the left or right side. */ unsigned truncated_on_left_p : 1; @@ -609,7 +728,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; @@ -634,20 +753,59 @@ 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; + + /* 1 means this row width is exactly the width of the window, and the + final newline character is hidden in the right fringe. */ + unsigned exact_window_width_line_p : 1; + + /* 1 means this row currently shows the cursor in the right fringe. */ + unsigned cursor_in_fringe_p : 1; + + /* Non-zero means display a bitmap on X frames indicating that this + the first line of the buffer. */ + unsigned indicate_bob_p : 1; + + /* Non-zero means display a bitmap on X frames indicating that this + the top line of the window, but not start of the buffer. */ + unsigned indicate_top_line_p : 1; + + /* Non-zero means display a bitmap on X frames indicating that this + the last line of the buffer. */ + unsigned indicate_eob_p : 1; + + /* Non-zero means display a bitmap on X frames indicating that this + the bottom line of the window, but not end of the buffer. */ + unsigned indicate_bottom_line_p : 1; + /* Continuation lines width at the start of the row. */ int continuation_lines_width; }; @@ -664,13 +822,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. */ @@ -689,29 +847,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 \ @@ -719,46 +877,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) @@ -773,7 +931,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. */ @@ -781,9 +940,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)) @@ -846,6 +1006,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 ************************************************************************/ @@ -859,7 +1158,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. */ @@ -868,205 +1167,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))) \ - && !NILP (XBUFFER ((W)->buffer)->mode_line_format)) + && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME ((W)))) \ + && BUFFERP ((W)->buffer) \ + && !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))) \ - && !NILP (XBUFFER ((W)->buffer)->header_line_format)) + && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME ((W)))) \ + && BUFFERP ((W)->buffer) \ + && !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->device->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'. */ @@ -1085,6 +1307,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 }; @@ -1121,19 +1346,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 */ @@ -1145,7 +1371,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; @@ -1162,9 +1388,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 @@ -1172,16 +1395,20 @@ 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; - + /* 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 @@ -1203,10 +1430,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, @@ -1222,12 +1449,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; @@ -1243,8 +1470,20 @@ 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; + + /* If this face is for ASCII characters, this points this face + itself. Otherwise, this points a face for ASCII characters. */ + struct face *ascii_face; }; @@ -1252,6 +1491,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 unknown 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) @@ -1264,16 +1511,19 @@ 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, CURSOR_FACE_ID, MOUSE_FACE_ID, + MENU_FACE_ID, BASIC_FACE_ID_SENTINEL }; +#define MAX_FACE_ID ((1 << FACE_ID_BITS) - 1) /* A cache of realized faces. Each frame has its own cache because Emacs allows different frame-local face definitions. */ @@ -1282,7 +1532,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; @@ -1291,6 +1541,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; }; @@ -1307,37 +1561,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. */ - -#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))) + with id ID but is suitable for displaying character CHAR. + This macro is only meaningful for multibyte character CHAR. */ -/* The default registry and encoding to use. */ +#define FACE_FOR_CHAR(F, FACE, CHAR) \ + (SINGLE_BYTE_CHAR_P (CHAR) \ + ? (FACE)->ascii_face->id \ + : face_for_char ((F), (FACE), (CHAR))) -extern Lisp_Object Vface_default_registry; +#else /* not HAVE_WINDOW_SYSTEM */ + +#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. */ @@ -1347,6 +1598,33 @@ extern int face_change_count; +/*********************************************************************** + Fringes + ***********************************************************************/ + +/* Structure used to describe where and how to draw a fringe bitmap. + WHICH is the fringe bitmap to draw. WD and H is the (adjusted) + width and height of the bitmap, DH is the height adjustment (if + bitmap is periodic). X and Y are frame coordinates of the area to + display the bitmap, DY is relative offset of the bitmap into that + area. BX, NX, BY, NY specifies the area to clear if the bitmap + does not fill the entire area. FACE is the fringe face. */ + +struct draw_fringe_bitmap_params +{ + int which; /* enum fringe_bitmap_type */ + unsigned short *bits; + int wd, h, dh; + int x, y; + int bx, nx, by, ny; + unsigned cursor_p : 1; + unsigned overlay_p : 1; + struct face *face; +}; + +#define MAX_FRINGE_BITMAPS (1<produce_glyphs ((IT)) \ - : produce_glyphs ((IT))) +#define PRODUCE_GLYPHS(IT) \ + do { \ + extern int inhibit_free_realized_faces; \ + if (FRAME_RIF ((IT)->f) != NULL) \ + FRAME_RIF ((IT)->f)->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. */ @@ -1758,15 +2080,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)); @@ -1775,7 +2105,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)); @@ -1790,9 +2120,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. */ @@ -1801,6 +2135,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, @@ -1811,30 +2153,80 @@ 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)); -}; - -/* The current interface for window-based redisplay. */ -extern struct redisplay_interface *rif; - -/* Hook to call in estimate_mode_line_height. */ +#ifdef HAVE_WINDOW_SYSTEM -extern int (* estimate_mode_line_height_hook) P_ ((struct frame *, - enum face_id)); + /* Draw a fringe bitmap in window W of row ROW using parameters P. */ + void (*draw_fringe_bitmap) P_ ((struct window *w, struct glyph_row *row, + struct draw_fringe_bitmap_params *p)); + + /* Define and destroy fringe bitmap no. WHICH. */ + void (*define_fringe_bitmap) P_ ((int which, unsigned short *bits, + int h, int wd)); + void (*destroy_fringe_bitmap) P_ ((int which)); + +/* Get metrics of character CHAR2B in FONT of type FONT_TYPE. + Value is null if CHAR2B is not contained in the font. */ + XCharStruct * (*per_char_metric) P_ ((XFontStruct *font, XChar2b *char2b, + int font_type)); + +/* Encode CHAR2B using encoding information from FONT_INFO. CHAR2B is + the two-byte form of C. Encoding is returned in *CHAR2B. If + TWO_BYTE_P is non-null, return non-zero there if font is two-byte. */ + int (*encode_char) P_ ((int c, XChar2b *char2b, + struct font_info *font_into, int *two_byte_p)); + +/* Compute left and right overhang of glyph string S. + A NULL pointer if platform does not support this. */ + void (*compute_glyph_string_overhangs) P_ ((struct glyph_string *s)); + +/* Draw a glyph string S. */ + void (*draw_glyph_string) P_ ((struct glyph_string *s)); + +/* Define cursor CURSOR on frame F. */ + void (*define_frame_cursor) P_ ((struct frame *f, Cursor cursor)); + +/* Clear the area at (X,Y,WIDTH,HEIGHT) of frame F. */ + void (*clear_frame_area) P_ ((struct frame *f, int x, int y, + int width, int height)); + +/* Draw specified cursor CURSOR_TYPE of width CURSOR_WIDTH + at row GLYPH_ROW on window W if ON_P is 1. If ON_P is + 0, don't draw cursor. If ACTIVE_P is 1, system caret + should track this cursor (when applicable). */ + void (*draw_window_cursor) P_ ((struct window *w, + struct glyph_row *glyph_row, + int x, int y, + int cursor_type, int cursor_width, + int on_p, int active_p)); + +/* Draw vertical border for window W from (X,Y0) to (X,Y1). */ + void (*draw_vertical_window_border) P_ ((struct window *w, + int x, int y0, int y1)); + +/* Shift display of frame F to make room for inserted glyphs. + The area at pixel (X,Y) of width WIDTH and height HEIGHT is + shifted right by SHIFT_BY pixels. */ + void (*shift_glyphs_for_insert) P_ ((struct frame *f, + int x, int y, int width, + int height, int shift_by)); + +#endif /* HAVE_WINDOW_SYSTEM */ +}; /*********************************************************************** Images ***********************************************************************/ -#ifdef HAVE_X_WINDOWS +#ifdef HAVE_WINDOW_SYSTEM /* Structure forward declarations. */ 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 @@ -1875,6 +2267,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; @@ -1883,9 +2291,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; @@ -1893,12 +2304,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' @@ -1943,11 +2357,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. */ @@ -1960,7 +2369,7 @@ struct image_cache #define IMAGE_CACHE_BUCKETS_SIZE 1001 -#endif /* HAVE_X_WINDOWS */ +#endif /* HAVE_WINDOW_SYSTEM */ @@ -2017,27 +2426,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 *)); @@ -2045,10 +2481,16 @@ int window_box_height P_ ((struct window *)); int window_text_bottom_y P_ ((struct window *)); int window_box_width P_ ((struct window *, int)); int window_box_left P_ ((struct window *, int)); +int window_box_left_offset P_ ((struct window *, int)); int window_box_right P_ ((struct window *, int)); +int window_box_right_offset P_ ((struct window *, int)); void window_box_edges P_ ((struct window *, int, int *, int *, int *, int *)); +int estimate_mode_line_height P_ ((struct frame *, enum face_id)); +void pixel_to_glyph_coords P_ ((struct frame *, int, int, int *, int *, + NativeRectangle *, int)); +int glyph_to_pixel_coords P_ ((struct window *, int, int, int *, int *)); void mark_window_display_accurate P_ ((Lisp_Object, int)); -void redisplay_preserve_echo_area P_ ((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, @@ -2056,45 +2498,166 @@ 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 *)); 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; + +extern int calc_pixel_width_or_height P_ ((double *, struct it *, Lisp_Object, + /* XFontStruct */ void *, int, int *)); + +#ifdef HAVE_WINDOW_SYSTEM + +#if GLYPH_DEBUG +extern void dump_glyph_string P_ ((struct glyph_string *)); +#endif + +extern void x_get_glyph_overhangs P_ ((struct glyph *, struct frame *, + int *, int *)); +extern void x_produce_glyphs P_ ((struct it *)); + +extern void x_write_glyphs P_ ((struct glyph *, int)); +extern void x_insert_glyphs P_ ((struct glyph *, int len)); +extern void x_clear_end_of_line P_ ((int)); + +extern int x_stretch_cursor_p; +extern struct cursor_pos output_cursor; + +extern void x_fix_overlapping_area P_ ((struct window *, struct glyph_row *, + enum glyph_row_area)); +extern void draw_phys_cursor_glyph P_ ((struct window *, + struct glyph_row *, + enum draw_glyphs_face)); +extern void erase_phys_cursor P_ ((struct window *)); +extern void display_and_set_cursor P_ ((struct window *, + int, int, int, int, int)); + +extern void set_output_cursor P_ ((struct cursor_pos *)); +extern void x_cursor_to P_ ((int, int, int, int)); + +extern void x_update_cursor P_ ((struct frame *, int)); +extern void x_clear_cursor P_ ((struct window *)); +extern void x_draw_vertical_border P_ ((struct window *w)); + +extern void frame_to_window_pixel_xy P_ ((struct window *, int *, int *)); +extern void get_glyph_string_clip_rect P_ ((struct glyph_string *, + NativeRectangle *nr)); +extern Lisp_Object find_hot_spot P_ ((Lisp_Object, int, int)); +extern void note_mouse_highlight P_ ((struct frame *, int, int)); +extern void x_clear_window_mouse_face P_ ((struct window *)); +extern void cancel_mouse_face P_ ((struct frame *)); + +extern void handle_tool_bar_click P_ ((struct frame *, + int, int, int, unsigned int)); + +/* msdos.c defines its own versions of these functions. */ +extern int clear_mouse_face P_ ((Display_Info *)); +extern void show_mouse_face P_ ((Display_Info *, enum draw_glyphs_face)); +extern int cursor_in_mouse_face_p P_ ((struct window *w)); + +extern void expose_frame P_ ((struct frame *, int, int, int, int)); +extern int x_intersect_rectangles P_ ((XRectangle *, XRectangle *, + XRectangle *)); +#endif + +/* Defined in fringe.c */ + +int valid_fringe_bitmap_id_p (int); +void draw_fringe_bitmap P_ ((struct window *, struct glyph_row *, int)); +void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *)); +void draw_window_fringes P_ ((struct window *)); +int update_window_fringes P_ ((struct window *, int)); +void compute_fringe_widths P_ ((struct frame *, int)); + +#ifdef WINDOWS_NT +void w32_init_fringe P_ ((void)); +void w32_reset_fringes P_ ((void)); +#endif + +/* Defined in image.c */ + +#ifdef HAVE_WINDOW_SYSTEM + +extern int x_bitmap_height P_ ((struct frame *, int)); +extern int x_bitmap_width P_ ((struct frame *, int)); +extern int x_bitmap_pixmap P_ ((struct frame *, int)); +extern void x_reference_bitmap P_ ((struct frame *, int)); +extern int x_create_bitmap_from_data P_ ((struct frame *, char *, + unsigned int, unsigned int)); +extern int x_create_bitmap_from_file P_ ((struct frame *, Lisp_Object)); +#ifndef x_destroy_bitmap +extern void x_destroy_bitmap P_ ((struct frame *, int)); +#endif +extern void x_destroy_all_bitmaps P_ ((Display_Info *)); +extern int x_create_bitmap_mask P_ ((struct frame * , int)); +extern Lisp_Object x_find_image_file P_ ((Lisp_Object)); + +void x_kill_gs_process P_ ((Pixmap, struct frame *)); +struct image_cache *make_image_cache P_ ((void)); +void free_image_cache P_ ((struct frame *)); +void clear_image_cache P_ ((struct frame *, int)); +void forall_images_in_image_cache P_ ((struct frame *, + void (*) P_ ((struct image *)))); +int valid_image_p P_ ((Lisp_Object)); +void prepare_image_for_display P_ ((struct frame *, struct image *)); +int lookup_image P_ ((struct frame *, Lisp_Object)); + +unsigned long image_background P_ ((struct image *, struct frame *, + XImagePtr_or_DC ximg)); +int image_background_transparent P_ ((struct image *, struct frame *, + XImagePtr_or_DC mask)); + +#endif /* Defined in sysdep.c */ -void get_frame_size P_ ((int *, int *)); +void get_tty_size P_ ((int, int *, int *)); void request_sigio P_ ((void)); void unrequest_sigio P_ ((void)); -int tabs_safe_p P_ ((void)); -void init_baud_rate P_ ((void)); +int tabs_safe_p P_ ((int)); +void init_baud_rate P_ ((int)); 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 void update_face_from_frame_parameter P_ ((struct frame *, Lisp_Object, Lisp_Object)); -char *x_charset_registry P_ ((int)); +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 face_font_available_p P_ ((struct frame *, Lisp_Object)); int ascii_face_of_lisp_face P_ ((struct frame *, int)); void prepare_face_for_display P_ ((struct frame *, struct face *)); -int 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 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)); int face_with_height P_ ((struct frame *, int, int)); @@ -2104,36 +2667,58 @@ 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 MAC_OS +void gamma_correct P_ ((struct frame *, unsigned long *)); +#endif + +#ifdef HAVE_WINDOW_SYSTEM int x_screen_planes P_ ((struct frame *)); void x_implicitly_set_name P_ ((struct frame *, Lisp_Object, Lisp_Object)); -struct image_cache *make_image_cache P_ ((void)); -void free_image_cache P_ ((struct frame *)); -void clear_image_cache P_ ((struct frame *, int)); -void forall_images_in_image_cache P_ ((struct frame *, - void (*) P_ ((struct image *)))); -int valid_image_p P_ ((Lisp_Object)); -void prepare_image_for_display P_ ((struct frame *, struct image *)); -int lookup_image P_ ((struct frame *, Lisp_Object)); -extern struct frame *tip_frame; + +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 */ @@ -2142,8 +2727,22 @@ int popup_activated P_ ((void)); /* Defined in dispnew.c */ -int estimate_mode_line_height P_ ((struct frame *, enum face_id)); -Lisp_Object mode_line_string P_ ((struct window *, int, int, int, int *)); +extern int inverse_video; +extern int required_matrix_width P_ ((struct window *)); +extern int required_matrix_height P_ ((struct window *)); +extern Lisp_Object buffer_posn_from_coords P_ ((struct window *, + int *, int *, + struct display_pos *, + Lisp_Object *, + int *, int *, int *, int *)); +extern Lisp_Object mode_line_string P_ ((struct window *, enum window_part, + int *, int *, int *, + Lisp_Object *, + int *, int *, int *, int *)); +extern Lisp_Object marginal_area_string P_ ((struct window *, enum window_part, + int *, int *, int *, + Lisp_Object *, + int *, int *, int *, int *)); extern void redraw_frame P_ ((struct frame *)); extern void redraw_garbaged_frames P_ ((void)); extern void cancel_line P_ ((int, struct frame *)); @@ -2165,17 +2764,17 @@ 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 *)); int line_hash_code P_ ((struct glyph_row *)); void set_window_update_flags P_ ((struct window *, int)); -void write_glyphs P_ ((struct glyph *, int)); -void insert_glyphs P_ ((struct glyph *, int)); +void write_glyphs P_ ((struct frame *, struct glyph *, int)); +void insert_glyphs P_ ((struct frame *, struct glyph *, int)); void redraw_frame P_ ((struct frame *)); void redraw_garbaged_frames P_ ((void)); int scroll_cost P_ ((struct frame *, int, int, int)); @@ -2184,39 +2783,47 @@ int direct_output_forward_char P_ ((int)); int update_frame P_ ((struct frame *, int, int)); void update_single_window P_ ((struct window *, int)); int scrolling P_ ((struct frame *)); -int buffer_posn_from_coords P_ ((struct window *, int *, int *)); void do_pending_window_change P_ ((int)); void change_frame_size P_ ((struct frame *, int, int, int, int, int)); void bitch_at_user P_ ((void)); 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 */ -extern void ring_bell P_ ((void)); -extern void set_terminal_modes P_ ((void)); -extern void reset_terminal_modes P_ ((void)); +extern void ring_bell P_ ((struct frame *)); extern void update_begin P_ ((struct frame *)); extern void update_end P_ ((struct frame *)); -extern void set_terminal_window P_ ((int)); -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)); -extern void delete_glyphs P_ ((int)); -extern void ins_del_lines P_ ((int, int)); +extern void set_terminal_window P_ ((struct frame *, int)); +extern void set_scroll_region P_ ((struct frame *, int, int)); +extern void turn_off_insert P_ ((struct tty_display_info *)); +extern void turn_off_highlight P_ ((struct tty_display_info *)); +extern void background_highlight P_ ((struct tty_display_info *)); +extern void clear_frame P_ ((struct frame *)); +extern void clear_end_of_line P_ ((struct frame *, int)); +extern void clear_end_of_line_raw P_ ((struct frame *, int)); +extern void tty_clear_end_of_line P_ ((struct frame *, int)); +extern void delete_glyphs P_ ((struct frame *, int)); +extern void ins_del_lines P_ ((struct frame *, int, int)); extern int string_cost P_ ((char *)); extern int per_line_cost P_ ((char *)); extern void calculate_costs P_ ((struct frame *)); -extern void term_init P_ ((char *)); +extern void set_tty_color_mode P_ ((struct frame *, Lisp_Object)); +extern void tty_setup_colors P_ ((struct tty_display_info *, int)); +extern struct display *get_named_tty_display P_ ((char *)); +extern Lisp_Object Fframe_tty_type P_ ((Lisp_Object)); +extern struct display *init_initial_display P_ ((void)); +extern struct display *term_init P_ ((char *, char *, int)); +extern void delete_tty P_ ((struct display *)); extern void fatal P_ ((/* char *, ... */)); -void cursor_to P_ ((int, int)); -void change_line_highlight P_ ((int, int, int, int)); +extern void cursor_to P_ ((struct frame *, int, int)); +extern int tty_capable_p P_ ((struct tty_display_info *, unsigned, unsigned long, unsigned long)); +extern void tty_set_terminal_modes P_ ((struct display *)); +extern void tty_reset_terminal_modes P_ ((struct display *)); +extern void create_tty_output P_ ((struct frame *)); + /* Defined in scroll.c */ @@ -2228,4 +2835,38 @@ extern void do_line_insertion_deletion_costs P_ ((struct frame *, char *, void scrolling_1 P_ ((struct frame *, int, int, int, int *, int *, int *, int *, int)); +/* Defined in frame.c */ + +#ifdef HAVE_WINDOW_SYSTEM + +/* Types we might convert a resource string into. */ +enum resource_types +{ + RES_TYPE_NUMBER, + RES_TYPE_FLOAT, + RES_TYPE_BOOLEAN, + RES_TYPE_STRING, + RES_TYPE_SYMBOL +}; + +extern Lisp_Object x_get_arg P_ ((Display_Info *, Lisp_Object, + Lisp_Object, char *, char *class, + enum resource_types)); +extern Lisp_Object x_frame_get_arg P_ ((struct frame *, Lisp_Object, + Lisp_Object, char *, char *, + enum resource_types)); +extern Lisp_Object x_frame_get_and_record_arg P_ (( + struct frame *, Lisp_Object, + Lisp_Object, char *, char *, + enum resource_types)); +extern Lisp_Object x_default_parameter P_ ((struct frame *, Lisp_Object, + Lisp_Object, Lisp_Object, + char *, char *, + enum resource_types)); + +#endif /* HAVE_WINDOW_SYSTEM */ + #endif /* not DISPEXTERN_H_INCLUDED */ + +/* arch-tag: c65c475f-1c1e-4534-8795-990b8509fd65 + (do not change this comment) */