X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/ed7d07bdcfa9384e7cc84b9ae13e231a5ddc13f9..54a72868e6b4d3001918d57884c8cf74ec8f9b8b:/src/dispextern.h diff --git a/src/dispextern.h b/src/dispextern.h index 615d1a0267..2dd0d91b11 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -1,6 +1,6 @@ /* Interface definitions for display code. - Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002, 2003 - Free Software Foundation, Inc. + Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002, + 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -16,8 +16,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License 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. */ +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ /* New redisplay written by Gerd Moellmann . */ @@ -50,54 +50,30 @@ typedef struct { #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 HAVE_CARBON +#ifdef MAC_OS #include "macgui.h" typedef struct mac_display_info Display_Info; - -/* Include Carbon.h to define Cursor and Rect. */ -#undef mktime -#undef DEBUG -#undef Z -#undef free -#undef malloc -#undef realloc -/* Macros max and min defined in lisp.h conflict with those in - precompiled header Carbon.h. */ -#undef max -#undef min -#undef init_process -#include -#undef Z -#define Z (current_buffer->text->z) -#undef free -#define free unexec_free -#undef malloc -#define malloc unexec_malloc -#undef realloc -#define realloc unexec_realloc -#undef min -#define min(a, b) ((a) < (b) ? (a) : (b)) -#undef max -#define max(a, b) ((a) > (b) ? (a) : (b)) -#undef init_process -#define init_process emacs_init_process - +/* 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 prototypes below reference structure types before their definition in this file. Some are here because not every file including @@ -123,9 +99,13 @@ enum window_part ON_LEFT_FRINGE, ON_RIGHT_FRINGE, ON_LEFT_MARGIN, - ON_RIGHT_MARGIN + ON_RIGHT_MARGIN, + ON_SCROLL_BAR }; +/* Number of bits allocated to store fringe bitmap numbers. */ +#define FRINGE_ID_BITS 16 + /*********************************************************************** @@ -139,13 +119,24 @@ enum window_part #define GLYPH_DEBUG 0 #endif +/* If XASSERTS is non-zero, additional consistency checks are activated. + Turn it off by defining the macro XASSERTS to zero. */ + +#ifndef XASSERTS +#define XASSERTS 0 +#endif + /* Macros to include code only if GLYPH_DEBUG != 0. */ #if GLYPH_DEBUG #define IF_DEBUG(X) X -#define xassert(X) do {if (!(X)) abort ();} while (0) #else #define IF_DEBUG(X) (void) 0 +#endif + +#if XASSERTS +#define xassert(X) do {if (!(X)) abort ();} while (0) +#else #define xassert(X) (void) 0 #endif @@ -295,6 +286,17 @@ enum glyph_type }; +/* Structure describing how to use partial glyphs (images slicing) */ + +struct glyph_slice +{ + unsigned x : 16; + unsigned y : 16; + unsigned width : 16; + unsigned height : 16; +}; + + /* Glyphs. Be extra careful when changing this structure! Esp. make sure that @@ -321,6 +323,9 @@ struct glyph /* Width in pixels. */ short pixel_width; + /* Ascent and descent in pixels. */ + short ascent, descent; + /* Vertical offset. If < 0, the glyph is displayed raised, if > 0 the glyph is displayed lowered. */ short voffset; @@ -359,8 +364,11 @@ struct glyph doesn't have a glyph in a font. */ unsigned glyph_not_available_p : 1; - /* Face of the glyph. */ - unsigned face_id : 21; +#define FACE_ID_BITS 21 + + /* Face of the glyph. This is a realized face ID, + an index in the face cache of the frame. */ + 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 @@ -368,6 +376,8 @@ struct glyph w32_char_font_type. Otherwise it equals FONT_TYPE_UNKNOWN. */ unsigned font_type : 3; + struct glyph_slice slice; + /* A union of sub-structures for different glyph types. */ union { @@ -406,11 +416,20 @@ struct glyph #define CHAR_GLYPH_SPACE_P(GLYPH) \ (GLYPH_FROM_CHAR_GLYPH ((GLYPH)) == SPACEGLYPH) +/* Are glyph slices of glyphs *X and *Y equal */ + +#define GLYPH_SLICE_EQUAL_P(X, Y) \ + ((X)->slice.x == (Y)->slice.x \ + && (X)->slice.y == (Y)->slice.y \ + && (X)->slice.width == (Y)->slice.width \ + && (X)->slice.height == (Y)->slice.height) + /* Are glyphs *X and *Y displayed equal? */ #define GLYPH_EQUAL_P(X, Y) \ ((X)->type == (Y)->type \ && (X)->u.val == (Y)->u.val \ + && GLYPH_SLICE_EQUAL_P (X, Y) \ && (X)->face_id == (Y)->face_id \ && (X)->padding_p == (Y)->padding_p \ && (X)->left_box_line_p == (Y)->left_box_line_p \ @@ -687,6 +706,10 @@ struct glyph_row frames. It may be < 0 in case of completely invisible rows. */ int visible_height; + /* Extra line spacing added after this row. Do not consider this + in last row when checking if row is fully visible. */ + int extra_line_spacing; + /* Hash code. This hash code is available as soon as the row is constructed, i.e. after a call to display_line. */ unsigned hash; @@ -704,6 +727,38 @@ struct glyph_row position of the next row. */ struct display_pos end; + /* Non-zero means the overlay arrow bitmap is on this line. + -1 means use default overlay arrow bitmap, else + it specifies actual fringe bitmap number. */ + int overlay_arrow_bitmap; + + /* Left fringe bitmap number (enum fringe_bitmap_type). */ + unsigned left_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Right fringe bitmap number (enum fringe_bitmap_type). */ + unsigned right_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Left fringe bitmap number (enum fringe_bitmap_type). */ + unsigned left_fringe_bitmap : FRINGE_ID_BITS; + + /* Right fringe bitmap number (enum fringe_bitmap_type). */ + unsigned right_fringe_bitmap : FRINGE_ID_BITS; + + /* Face of the left fringe glyph. */ + unsigned left_user_fringe_face_id : FACE_ID_BITS; + + /* Face of the right fringe glyph. */ + unsigned right_user_fringe_face_id : FACE_ID_BITS; + + /* Face of the left fringe glyph. */ + unsigned left_fringe_face_id : FACE_ID_BITS; + + /* Face of the right fringe glyph. */ + unsigned right_fringe_face_id : FACE_ID_BITS; + + /* 1 means that we must draw the bitmaps of this row. */ + unsigned redraw_fringe_bitmaps_p : 1; + /* In a desired matrix, 1 means that this row must be updated. In a current matrix, 0 means that the row has been invalidated, i.e. the row's contents do not agree with what is visible on the @@ -715,9 +770,6 @@ struct glyph_row unsigned truncated_on_left_p : 1; unsigned truncated_on_right_p : 1; - /* 1 means the overlay arrow is on this line. */ - unsigned overlay_arrow_p : 1; - /* 1 means that this row displays a continued line, i.e. it has a continuation mark at the right side. */ unsigned continued_p : 1; @@ -772,6 +824,32 @@ struct glyph_row /* 1 means this row was ended by a newline from a string. */ unsigned ends_in_newline_from_string_p : 1; + /* 1 means this row width is exactly the width of the window, and the + final newline character is hidden in the right fringe. */ + unsigned exact_window_width_line_p : 1; + + /* 1 means this row currently shows the cursor in the right fringe. */ + unsigned cursor_in_fringe_p : 1; + + /* 1 means the last glyph in the row is part of an ellipsis. */ + unsigned ends_in_ellipsis_p : 1; + + /* Non-zero means display a bitmap on X frames indicating that this + the first line of the buffer. */ + unsigned indicate_bob_p : 1; + + /* Non-zero means display a bitmap on X frames indicating that this + the top line of the window, but not start of the buffer. */ + unsigned indicate_top_line_p : 1; + + /* Non-zero means display a bitmap on X frames indicating that this + the last line of the buffer. */ + unsigned indicate_eob_p : 1; + + /* Non-zero means display a bitmap on X frames indicating that this + the bottom line of the window, but not end of the buffer. */ + unsigned indicate_bottom_line_p : 1; + /* Continuation lines width at the start of the row. */ int continuation_lines_width; }; @@ -859,22 +937,39 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int)); #define MATRIX_ROW_DISPLAYS_TEXT_P(ROW) ((ROW)->displays_text_p) + +/* Helper macros */ + +#define MR_PARTIALLY_VISIBLE(ROW) \ + ((ROW)->height != (ROW)->visible_height) + +#define MR_PARTIALLY_VISIBLE_AT_TOP(W, ROW) \ + ((ROW)->y < WINDOW_HEADER_LINE_HEIGHT ((W))) + +#define MR_PARTIALLY_VISIBLE_AT_BOTTOM(W, ROW) \ + (((ROW)->y + (ROW)->height - (ROW)->extra_line_spacing) \ + > WINDOW_BOX_HEIGHT_NO_MODE_LINE ((W))) + /* Non-zero if ROW is not completely visible in window W. */ -#define MATRIX_ROW_PARTIALLY_VISIBLE_P(ROW) \ - ((ROW)->height != (ROW)->visible_height) +#define MATRIX_ROW_PARTIALLY_VISIBLE_P(W, ROW) \ + (MR_PARTIALLY_VISIBLE ((ROW)) \ + && (MR_PARTIALLY_VISIBLE_AT_TOP ((W), (ROW)) \ + || MR_PARTIALLY_VISIBLE_AT_BOTTOM ((W), (ROW)))) + + /* Non-zero if ROW is partially visible at the top of window W. */ #define MATRIX_ROW_PARTIALLY_VISIBLE_AT_TOP_P(W, ROW) \ - (MATRIX_ROW_PARTIALLY_VISIBLE_P ((ROW)) \ - && (ROW)->y < WINDOW_HEADER_LINE_HEIGHT ((W))) + (MR_PARTIALLY_VISIBLE ((ROW)) \ + && MR_PARTIALLY_VISIBLE_AT_TOP ((W), (ROW))) /* Non-zero if ROW is partially visible at the bottom of window W. */ -#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P(W, ROW) \ - (MATRIX_ROW_PARTIALLY_VISIBLE_P ((ROW)) \ - && (ROW)->y + (ROW)->height > WINDOW_BOX_HEIGHT_NO_MODE_LINE ((W))) +#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P(W, ROW) \ + (MR_PARTIALLY_VISIBLE ((ROW)) \ + && MR_PARTIALLY_VISIBLE_AT_BOTTOM ((W), (ROW))) /* Return the bottom Y + 1 of ROW. */ @@ -896,7 +991,7 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int)); or a control char, or an overlay string. */ #define MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P(ROW) \ - ((ROW)->end.dpvec_index >= 0 \ + ((ROW)->end.dpvec_index > 0 \ || (ROW)->end.overlay_string_index >= 0 \ || (ROW)->ends_in_middle_of_char_p) @@ -908,7 +1003,7 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int)); /* Non-zero if ROW starts in the middle of a character. See above. */ #define MATRIX_ROW_STARTS_IN_MIDDLE_OF_CHAR_P(ROW) \ - ((ROW)->start.dpvec_index >= 0 \ + ((ROW)->start.dpvec_index > 0 \ || (ROW)->starts_in_middle_of_char_p \ || ((ROW)->start.overlay_string_index >= 0 \ && (ROW)->start.string_pos.charpos > 0)) @@ -1087,13 +1182,21 @@ struct glyph_string 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; +#define OVERLAPS_PRED (1 << 0) +#define OVERLAPS_SUCC (1 << 1) +#define OVERLAPS_BOTH (OVERLAPS_PRED | OVERLAPS_SUCC) +#define OVERLAPS_ERASED_CURSOR (1 << 2) + /* Non-zero 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. If the value is + OVERLAPS_ERASED_CURSOR, the clip rect is restricted to the rect + of the erased cursor. OVERLAPS_PRED and OVERLAPS_SUCC mean we + draw overlaps with the preceding and the succeeding rows, + respectively. */ + unsigned for_overlaps : 3; /* The GC to use for drawing this glyph string. */ -#if defined(HAVE_X_WINDOWS) || defined(HAVE_CARBON) +#if defined(HAVE_X_WINDOWS) || defined(MAC_OS) GC gc; #endif #if defined(HAVE_NTGUI) @@ -1109,6 +1212,14 @@ struct glyph_string /* Image, if any. */ struct image *img; + /* Slice */ + struct glyph_slice slice; + + /* Non-null means the horizontal clipping region starts from the + left edge of *clip_head, and ends with the right edge of + *clip_tail, not including their overhangs. */ + struct glyph_string *clip_head, *clip_tail; + struct glyph_string *next, *prev; }; @@ -1490,9 +1601,11 @@ enum face_id CURSOR_FACE_ID, MOUSE_FACE_ID, MENU_FACE_ID, + VERTICAL_BORDER_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. */ @@ -1571,44 +1684,27 @@ extern int face_change_count; Fringes ***********************************************************************/ -enum fringe_bitmap_type -{ - NO_FRINGE_BITMAP = 0, - LEFT_TRUNCATION_BITMAP, - RIGHT_TRUNCATION_BITMAP, - CONTINUED_LINE_BITMAP, - CONTINUATION_LINE_BITMAP, - OVERLAY_ARROW_BITMAP, - ZV_LINE_BITMAP, - MAX_FRINGE_BITMAPS -}; - -struct fringe_bitmap -{ - int width; - int height; - int period; - unsigned char *bits; -}; - /* Structure used to describe where and how to draw a fringe bitmap. WHICH is the fringe bitmap to draw. WD and H is the (adjusted) width and height of the bitmap, DH is the height adjustment (if bitmap is periodic). X and Y are frame coordinates of the area to display the bitmap, DY is relative offset of the bitmap into that - area. BX, NX, BY, NY specifies the area to clear if the bitmap + area. BX, NX, BY, NY specifies the area to clear if the bitmap does not fill the entire area. FACE is the fringe face. */ struct draw_fringe_bitmap_params { - enum fringe_bitmap_type which; + int 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; }; -extern struct fringe_bitmap fringe_bitmaps[MAX_FRINGE_BITMAPS]; +#define MAX_FRINGE_BITMAPS (1< @@ -1802,21 +1929,47 @@ struct it from what we previously had. */ struct iterator_stack_entry { - int stop_charpos; - int face_id; Lisp_Object string; - struct display_pos pos; - int end_charpos; int string_nchars; + int end_charpos; + int stop_charpos; + int face_id; + + /* Save values specific to a given method. */ + union { + /* method == GET_FROM_IMAGE */ + struct { + Lisp_Object object; + struct it_slice slice; + int image_id; + } image; + /* method == GET_FROM_COMPOSITION */ + struct { + Lisp_Object object; + int c, len; + int cmp_id, cmp_len; + } comp; + /* method == GET_FROM_STRETCH */ + struct { + Lisp_Object object; + } stretch; + } u; + + /* current text and display positions. */ + struct text_pos position; + struct display_pos current; enum glyph_row_area area; + enum it_method method; unsigned multibyte_p : 1; unsigned string_from_display_prop_p : 1; unsigned display_ellipsis_p : 1; + + /* properties from display property that are reset by another display property. */ Lisp_Object space_width; - short voffset; Lisp_Object font_height; + short voffset; } - stack[2]; + stack[IT_STACK_SIZE]; /* Stack pointer. */ int sp; @@ -1853,6 +2006,10 @@ struct it /* 1 means overlay strings at end_charpos have been processed. */ unsigned overlay_strings_at_end_processed_p : 1; + /* 1 means to ignore overlay strings at current pos, as they have + already been processed. */ + unsigned ignore_overlay_strings_at_pos_p : 1; + /* 1 means the actual glyph is not available in the current system. */ unsigned glyph_not_available_p : 1; @@ -1866,6 +2023,10 @@ struct it skipped due to selective display. */ unsigned face_before_selective_p : 1; + /* If 1, adjust current glyph so it does not increase current row + descent/ascent (line-height property). Reset after this glyph. */ + unsigned constrain_row_ascent_descent_p : 1; + /* The ID of the default face to use. One of DEFAULT_FACE_ID, MODE_LINE_FACE_ID, etc, depending on what we are displaying. */ int base_face_id; @@ -1891,6 +2052,9 @@ struct it /* If what == IT_IMAGE, the id of the image to display. */ int image_id; + /* Values from `slice' property. */ + struct it_slice slice; + /* Value of the `space-width' property, if any; nil if none. */ Lisp_Object space_width; @@ -1902,8 +2066,8 @@ struct it /* Object and position where the current display element came from. Object can be a Lisp string in case the current display element - comes from an overlay string, or it is buffer. Position is - a position in object. */ + comes from an overlay string, or it is buffer. It may also be nil + during mode-line update. Position is a position in object. */ Lisp_Object object; struct text_pos position; @@ -1925,10 +2089,17 @@ struct it line, if the window has one. */ int last_visible_y; - /* Additional space in pixels between lines (for window systems - only.) */ + /* Default amount of additional space in pixels between lines (for + window systems only.) */ int extra_line_spacing; + /* Max extra line spacing added in this row. */ + int max_extra_line_spacing; + + /* Override font height information for this glyph. + Used if override_ascent >= 0. Cleared after this glyph. */ + int override_ascent, override_descent, override_boff; + /* If non-null, glyphs are produced in glyph_row with each call to produce_glyphs. */ struct glyph_row *glyph_row; @@ -1974,6 +2145,18 @@ struct it /* Horizontal matrix position reached in move_it_in_display_line. Only set there, not in display_line. */ int hpos; + + /* Left fringe bitmap number (enum fringe_bitmap_type). */ + unsigned left_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Right fringe bitmap number (enum fringe_bitmap_type). */ + unsigned right_user_fringe_bitmap : FRINGE_ID_BITS; + + /* Face of the left fringe glyph. */ + unsigned left_user_fringe_face_id : FACE_ID_BITS; + + /* Face of the right fringe glyph. */ + unsigned right_user_fringe_face_id : FACE_ID_BITS; }; @@ -2122,7 +2305,7 @@ struct redisplay_interface 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)); + enum glyph_row_area area, int)); #ifdef HAVE_WINDOW_SYSTEM @@ -2130,6 +2313,11 @@ struct redisplay_interface 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, @@ -2141,7 +2329,7 @@ struct redisplay_interface 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. +/* 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)); @@ -2169,7 +2357,7 @@ struct redisplay_interface 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. +/* 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, @@ -2260,6 +2448,15 @@ struct image #define DEFAULT_IMAGE_WIDTH 30 #define DEFAULT_IMAGE_HEIGHT 30 + /* Top/left and bottom/right corner pixel of actual image data. + Used by four_corners_best to consider the real image data, + rather than looking at the optional image margin. */ + int corners[4]; +#define TOP_CORNER 0 +#define LEFT_CORNER 1 +#define BOT_CORNER 2 +#define RIGHT_CORNER 3 + /* Percent of image height used as ascent. A value of CENTERED_IMAGE_ASCENT means draw the image centered on the line. */ @@ -2444,22 +2641,26 @@ 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)); +int try_window P_ ((Lisp_Object, struct text_pos, int)); void window_box P_ ((struct window *, int, int *, int *, int *, int *)); 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 remember_mouse_glyph P_ ((struct frame *, int, int, NativeRectangle *)); + void mark_window_display_accurate P_ ((Lisp_Object, int)); void redisplay_preserve_echo_area P_ ((int)); -void set_cursor_from_row P_ ((struct window *, struct glyph_row *, - struct glyph_matrix *, int, int, int, int)); +int 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, int, struct glyph_row *, enum face_id)); void init_iterator_to_row_start P_ ((struct it *, struct window *, @@ -2477,22 +2678,25 @@ 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 *)); -void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *)); -void compute_fringe_widths P_ ((struct frame *, int)); extern Lisp_Object Qtool_bar; extern Lisp_Object Vshow_trailing_whitespace; extern int mode_line_in_non_selected_windows; extern int redisplaying_p; -extern Lisp_Object Vimage_types; extern void add_to_log P_ ((char *, Lisp_Object, Lisp_Object)); extern int help_echo_showing_p; extern int current_mode_line_height, current_header_line_height; extern Lisp_Object help_echo_string, help_echo_window; -extern Lisp_Object help_echo_object, previous_help_echo_string; +extern 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 Lisp_Object Vmouse_autoselect_window; +extern int unibyte_display_via_language_environment; + +extern void reseat_at_previous_visible_line_start P_ ((struct it *)); + +extern int calc_pixel_width_or_height P_ ((double *, struct it *, Lisp_Object, + /* XFontStruct */ void *, int, int *)); #ifdef HAVE_WINDOW_SYSTEM @@ -2512,10 +2716,12 @@ 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)); + enum glyph_row_area, int)); extern void draw_phys_cursor_glyph P_ ((struct window *, struct glyph_row *, enum draw_glyphs_face)); +extern void get_phys_cursor_geometry P_ ((struct window *, struct glyph_row *, + struct glyph *, int *, int *, int *)); extern void erase_phys_cursor P_ ((struct window *)); extern void display_and_set_cursor P_ ((struct window *, int, int, int, int, int)); @@ -2528,8 +2734,11 @@ 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 int get_glyph_string_clip_rects P_ ((struct glyph_string *, + NativeRectangle *, 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 *)); @@ -2547,6 +2756,63 @@ extern int x_intersect_rectangles P_ ((XRectangle *, XRectangle *, XRectangle *)); #endif +/* Defined in fringe.c */ + +int lookup_fringe_bitmap (Lisp_Object); +void draw_fringe_bitmap P_ ((struct window *, struct glyph_row *, int)); +void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *)); +int draw_window_fringes P_ ((struct window *, int)); +int update_window_fringes P_ ((struct window *, int)); +void compute_fringe_widths P_ ((struct frame *, int)); + +#ifdef WINDOWS_NT +void w32_init_fringe P_ ((void)); +void w32_reset_fringes P_ ((void)); +#endif +#ifdef MAC_OS +void mac_init_fringe 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)); +#if defined (HAVE_XPM) && defined (HAVE_X_WINDOWS) +extern int x_create_bitmap_from_xpm_data P_ ((struct frame *f, char **bits)); +#endif +#ifndef x_destroy_bitmap +extern void x_destroy_bitmap P_ ((struct frame *, int)); +#endif +extern void x_destroy_all_bitmaps P_ ((Display_Info *)); +extern int x_create_bitmap_mask P_ ((struct frame * , int)); +extern Lisp_Object x_find_image_file P_ ((Lisp_Object)); + +void x_kill_gs_process P_ ((Pixmap, struct frame *)); +struct image_cache *make_image_cache P_ ((void)); +void free_image_cache P_ ((struct frame *)); +void clear_image_cache P_ ((struct frame *, int)); +void forall_images_in_image_cache P_ ((struct frame *, + void (*) P_ ((struct image *)))); +int valid_image_p P_ ((Lisp_Object)); +void prepare_image_for_display P_ ((struct frame *, struct image *)); +int lookup_image P_ ((struct frame *, Lisp_Object)); + +unsigned long image_background P_ ((struct image *, struct frame *, + XImagePtr_or_DC ximg)); +int image_background_transparent P_ ((struct image *, struct frame *, + XImagePtr_or_DC mask)); + +int image_ascent P_ ((struct image *, struct face *, struct glyph_slice *)); + +#endif + /* Defined in sysdep.c */ void get_frame_size P_ ((int *, int *)); @@ -2569,14 +2835,15 @@ void clear_face_cache P_ ((int)); unsigned long load_color P_ ((struct frame *, struct face *, Lisp_Object, enum lface_attribute_index)); void unload_color P_ ((struct frame *, unsigned long)); +int face_font_available_p P_ ((struct frame *, Lisp_Object)); int ascii_face_of_lisp_face P_ ((struct frame *, int)); void prepare_face_for_display P_ ((struct frame *, struct face *)); int xstricmp P_ ((const unsigned char *, const unsigned char *)); int lookup_face P_ ((struct frame *, Lisp_Object *, int, struct face *)); -int lookup_named_face P_ ((struct frame *, Lisp_Object, int)); +int lookup_named_face P_ ((struct frame *, Lisp_Object, int, int)); int smaller_face P_ ((struct frame *, int, int)); int face_with_height P_ ((struct frame *, int, int)); -int lookup_derived_face P_ ((struct frame *, Lisp_Object, int, int)); +int lookup_derived_face P_ ((struct frame *, Lisp_Object, int, int, int)); void init_frame_faces P_ ((struct frame *)); void free_frame_faces P_ ((struct frame *)); void recompute_basic_faces P_ ((struct frame *)); @@ -2584,9 +2851,11 @@ int face_at_buffer_position P_ ((struct window *, int, int, int, int *, int, int)); int face_at_string_position P_ ((struct window *, Lisp_Object, int, int, int, int, int *, enum face_id, int)); +int merge_faces P_ ((struct frame *, Lisp_Object, int, int)); int compute_char_face P_ ((struct frame *, int, Lisp_Object)); void free_all_realized_faces P_ ((Lisp_Object)); extern Lisp_Object Qforeground_color, Qbackground_color; +extern Lisp_Object Qframe_set_background_mode; extern char unspecified_fg[], unspecified_bg[]; void free_realized_multibyte_face P_ ((struct frame *, int)); @@ -2598,27 +2867,14 @@ void gamma_correct P_ ((struct frame *, XColor *)); #ifdef WINDOWSNT void gamma_correct P_ ((struct frame *, COLORREF *)); #endif +#ifdef MAC_OS +void gamma_correct P_ ((struct frame *, unsigned long *)); +#endif #ifdef HAVE_WINDOW_SYSTEM -void x_kill_gs_process P_ ((Pixmap, struct frame *)); int x_screen_planes P_ ((struct frame *)); void x_implicitly_set_name P_ ((struct frame *, Lisp_Object, Lisp_Object)); -struct image_cache *make_image_cache P_ ((void)); -void free_image_cache P_ ((struct frame *)); -void clear_image_cache P_ ((struct frame *, int)); -void forall_images_in_image_cache P_ ((struct frame *, - void (*) P_ ((struct image *)))); -int valid_image_p P_ ((Lisp_Object)); -void prepare_image_for_display P_ ((struct frame *, struct image *)); -int lookup_image P_ ((struct frame *, Lisp_Object)); - -#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; @@ -2626,6 +2882,7 @@ EXFUN (Fx_show_tip, 6); EXFUN (Fx_hide_tip, 0); extern void start_hourglass P_ ((void)); extern void cancel_hourglass P_ ((void)); +extern int hourglass_started P_ ((void)); extern int display_hourglass_p; /* Returns the background color of IMG, calculating one heuristically if @@ -2658,10 +2915,19 @@ int popup_activated P_ ((void)); extern int inverse_video; extern int required_matrix_width P_ ((struct window *)); extern int required_matrix_height P_ ((struct window *)); -extern Lisp_Object mode_line_string P_ ((struct window *, int, int, - enum window_part, int *)); -extern Lisp_Object marginal_area_string P_ ((struct window *, int, int, - enum window_part, int *)); +extern 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 *)); @@ -2702,15 +2968,13 @@ int direct_output_forward_char P_ ((int)); int update_frame P_ ((struct frame *, int, int)); void update_single_window P_ ((struct window *, int)); int scrolling P_ ((struct frame *)); -void buffer_posn_from_coords P_ ((struct window *, int *, int *, - Lisp_Object *, struct display_pos *)); void do_pending_window_change P_ ((int)); void change_frame_size P_ ((struct frame *, int, int, int, int, int)); void bitch_at_user P_ ((void)); -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; +GLYPH spec_glyph_lookup_face P_ ((struct window *, GLYPH)); /* Defined in term.c */ @@ -2735,7 +2999,6 @@ extern void calculate_costs P_ ((struct frame *)); extern void set_tty_color_mode P_ ((struct frame *, Lisp_Object)); extern void tty_setup_colors P_ ((int)); extern void term_init P_ ((char *)); -extern void fatal P_ ((/* char *, ... */)); void cursor_to P_ ((int, int)); extern int tty_capable_p P_ ((struct frame *, unsigned, unsigned long, unsigned long));