X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/b3b08f03c45f4ed3b1a5eff5b78a4aaea2fa0044..e7427ac187c9d4693ae80c80bfba7c8e3cba80a7:/src/dispextern.h diff --git a/src/dispextern.h b/src/dispextern.h index 1a35408733..dcf37ceded 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -1,5 +1,5 @@ /* Interface definitions for display code. - Copyright (C) 1985,93,94,97,98,99, 2000,01,02,03, 2004 + Copyright (C) 1985,93,94,97,98,99, 2000,01,02,03, 2004, 2005 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -62,7 +62,7 @@ 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; /* Mac equivalent of XImage. */ @@ -119,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 @@ -694,6 +705,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; @@ -711,6 +726,11 @@ 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; @@ -749,9 +769,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; @@ -813,6 +830,9 @@ struct glyph_row /* 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; @@ -916,22 +936,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. */ @@ -953,7 +990,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) @@ -965,7 +1002,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)) @@ -1150,7 +1187,7 @@ struct glyph_string unsigned for_overlaps_p : 1; /* 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) @@ -1169,6 +1206,11 @@ struct glyph_string /* 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; }; @@ -1756,6 +1798,16 @@ struct it_slice Lisp_Object height; }; +enum it_method { + GET_FROM_BUFFER = 0, + GET_FROM_DISPLAY_VECTOR, + GET_FROM_COMPOSITION, + GET_FROM_STRING, + GET_FROM_C_STRING, + GET_FROM_IMAGE, + GET_FROM_STRETCH, + NUM_IT_METHODS +}; struct it { @@ -1766,9 +1818,8 @@ struct it /* The window's frame. */ struct frame *f; - /* Function to call to load this structure with the next display - element. */ - int (* method) P_ ((struct it *it)); + /* Method to use to load this structure with the next display element. */ + enum it_method method; /* The next position at which to check for face changes, invisible text, overlay strings, end of text etc., which see. */ @@ -1804,6 +1855,10 @@ struct it Don't handle some `display' properties in these strings. */ unsigned string_from_display_prop_p : 1; + /* When METHOD == next_element_from_display_vector, + this is 1 if we're doing an ellipsis. Otherwise meaningless. */ + unsigned ellipsis_p : 1; + /* Display table in effect or null for none. */ struct Lisp_Char_Table *dp; @@ -1819,6 +1874,9 @@ struct it means that no such character is involved. */ int dpvec_char_len; + /* Face id to use for all characters in display vector. -1 if unused. */ + int dpvec_face_id; + /* Face id of the iterator saved in case a glyph from dpvec contains a face. The face is restored when all glyphs from dpvec have been delivered. */ @@ -1841,7 +1899,7 @@ struct it /* Vector of overlays to process. Overlay strings are processed OVERLAY_STRING_CHUNK_SIZE at a time. */ -#define OVERLAY_STRING_CHUNK_SIZE 3 +#define OVERLAY_STRING_CHUNK_SIZE 16 Lisp_Object overlay_strings[OVERLAY_STRING_CHUNK_SIZE]; /* Total number of overlay strings to process. This can be > @@ -1967,8 +2025,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; @@ -1990,10 +2048,13 @@ 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; @@ -2578,6 +2639,7 @@ extern int help_echo_pos; extern struct frame *last_mouse_frame; extern int last_tool_bar_item; extern int mouse_autoselect_window; +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 *)); @@ -2604,6 +2666,8 @@ extern void x_fix_overlapping_area P_ ((struct window *, struct glyph_row *, extern void draw_phys_cursor_glyph P_ ((struct window *, struct glyph_row *, enum draw_glyphs_face)); +extern int get_phys_cursor_geometry P_ ((struct window *, struct glyph_row *, + struct glyph *, int *)); extern void erase_phys_cursor P_ ((struct window *)); extern void display_and_set_cursor P_ ((struct window *, int, int, int, int, int)); @@ -2641,7 +2705,7 @@ extern int x_intersect_rectangles P_ ((XRectangle *, XRectangle *, 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 *)); -void draw_window_fringes P_ ((struct window *)); +int draw_window_fringes P_ ((struct window *, int)); int update_window_fringes P_ ((struct window *, int)); void compute_fringe_widths P_ ((struct frame *, int)); @@ -2714,10 +2778,10 @@ 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 *)); @@ -2725,6 +2789,7 @@ 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; @@ -2754,6 +2819,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