]> code.delx.au - gnu-emacs/blobdiff - src/dispextern.h
(Version, mh-version): Update for release 8.0.
[gnu-emacs] / src / dispextern.h
index 10754a4c01d6d1ba23209118e37c4f15bb5002dc..43655ab9a1990664fa6bdf25219bbfb407eaccc1 100644 (file)
@@ -1,6 +1,6 @@
 /* Interface definitions for display code.
-   Copyright (C) 1985,93,94,97,98,99, 2000,01,02,03, 2004
-     Free Software Foundation, Inc.
+   Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
+                 2003, 2004, 2005, 2006 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 <gerd@gnu.org>.  */
 
@@ -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.  */
@@ -99,11 +99,12 @@ 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  8
+#define FRINGE_ID_BITS  16
 
 
 \f
@@ -118,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
 
@@ -354,7 +366,8 @@ struct glyph
 
 #define FACE_ID_BITS   21
 
-  /* Face of the glyph.  */
+  /* 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
@@ -693,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;
@@ -710,27 +727,32 @@ 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;
 
-  /* 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 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;
 
@@ -748,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;
@@ -812,6 +831,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;
@@ -915,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.   */
 
@@ -952,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)
 
@@ -964,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))
@@ -1143,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)
@@ -1168,6 +1215,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;
 };
 
@@ -1549,6 +1601,7 @@ enum face_id
   CURSOR_FACE_ID,
   MOUSE_FACE_ID,
   MENU_FACE_ID,
+  VERTICAL_BORDER_FACE_ID,
   BASIC_FACE_ID_SENTINEL
 };
 
@@ -1755,6 +1808,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
 {
@@ -1765,9 +1828,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.  */
@@ -1803,6 +1865,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;
 
@@ -1818,6 +1884,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.  */
@@ -1840,7 +1909,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 >
@@ -1910,6 +1979,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;
@@ -1966,8 +2039,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;
 
@@ -1989,10 +2062,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;
@@ -2046,12 +2122,12 @@ struct it
   /* 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 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;
 };
@@ -2202,7 +2278,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
 
@@ -2345,6 +2421,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.  */
@@ -2529,7 +2614,7 @@ 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 *));
@@ -2543,6 +2628,8 @@ 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 *,
@@ -2577,6 +2664,9 @@ extern int help_echo_pos;
 extern struct frame *last_mouse_frame;
 extern int last_tool_bar_item;
 extern int mouse_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 *));
@@ -2599,10 +2689,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 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));
@@ -2615,6 +2707,8 @@ 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));
@@ -2637,10 +2731,10 @@ extern int x_intersect_rectangles P_ ((XRectangle *, XRectangle *,
 
 /* Defined in fringe.c */
 
-int valid_fringe_bitmap_id_p (int);
+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));
 
@@ -2648,6 +2742,9 @@ void compute_fringe_widths P_ ((struct frame *, int));
 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 */
 
@@ -2713,10 +2810,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 *));
@@ -2724,9 +2821,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));
 
@@ -2753,6 +2852,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
@@ -2845,6 +2945,7 @@ 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 */
 
@@ -2869,7 +2970,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));