]> code.delx.au - gnu-emacs/blobdiff - src/dispextern.h
* xdisp.c (move_it_to): When stopping at a charpos, check if that's a
[gnu-emacs] / src / dispextern.h
index 63425e58039c1b99e7568c98a0e5c35e697c11f6..ce989e6173cf22cf3cc02b3f1a582315d52819b7 100644 (file)
@@ -1,12 +1,13 @@
 /* Interface definitions for display code.
-   Copyright (C) 1985,93,94,97,98,99, 2000,01,02,03, 2004, 2005
-     Free Software Foundation, Inc.
+   Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
+                 2003, 2004, 2005, 2006, 2007, 2008
+                 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -16,8 +17,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>.  */
 
@@ -1182,10 +1183,18 @@ 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(MAC_OS)
@@ -1593,6 +1602,7 @@ enum face_id
   CURSOR_FACE_ID,
   MOUSE_FACE_ID,
   MENU_FACE_ID,
+  VERTICAL_BORDER_FACE_ID,
   BASIC_FACE_ID_SENTINEL
 };
 
@@ -1799,6 +1809,9 @@ struct it_slice
   Lisp_Object height;
 };
 
+/* Input sources for fetching characters or data to display.
+   The input source is found in the `method' field.  */
+
 enum it_method {
   GET_FROM_BUFFER = 0,
   GET_FROM_DISPLAY_VECTOR,
@@ -1810,6 +1823,8 @@ enum it_method {
   NUM_IT_METHODS
 };
 
+#define IT_STACK_SIZE 4
+
 struct it
 {
   /* The window in which we iterate over current_buffer (or a string).  */
@@ -1898,53 +1913,79 @@ struct it
      position in overlay strings etc.  */
   struct display_pos current;
 
+  /* Total number of overlay strings to process.  This can be >
+     OVERLAY_STRING_CHUNK_SIZE.  */
+  int n_overlay_strings;
+
   /* Vector of overlays to process.  Overlay strings are processed
      OVERLAY_STRING_CHUNK_SIZE at a time.  */
 #define OVERLAY_STRING_CHUNK_SIZE 16
   Lisp_Object overlay_strings[OVERLAY_STRING_CHUNK_SIZE];
 
-  /* Total number of overlay strings to process.  This can be >
-     OVERLAY_STRING_CHUNK_SIZE.  */
-  int n_overlay_strings;
+  /* For each overlay string, the overlay it came from.  */
+  Lisp_Object string_overlays[OVERLAY_STRING_CHUNK_SIZE];
 
   /* If non-nil, a Lisp string being processed.  If
      current.overlay_string_index >= 0, this is an overlay string from
      pos.  */
   Lisp_Object string;
 
+  /* If non-nil, we are processing a string that came
+     from a `display' property given by an overlay.  */
+  Lisp_Object from_overlay;
+
   /* Stack of saved values.  New entries are pushed when we begin to
      process an overlay string or a string from a `glyph' property.
      Entries are popped when we return to deliver display elements
      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;
+    Lisp_Object from_overlay;
     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;
-    struct it_slice slice;
+
+    /* 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;
 
-  /* Setting of buffer-local variable selective-display-ellipsis.  */
-  unsigned selective_display_ellipsis_p : 1;
-
-  /* 1 means control characters are translated into the form `^C'
-     where the `^' can be replaced by a display table entry.  */
-  unsigned ctl_arrow_p : 1;
-
   /* -1 means selective display hides everything between a \r and the
      next newline; > 0 means hide lines indented more than that value.  */
   int selective;
@@ -1956,6 +1997,16 @@ struct it
   /* Face to use.  */
   int face_id;
 
+  /* Setting of buffer-local variable selective-display-ellipsis.  */
+  unsigned selective_display_ellipsis_p : 1;
+
+  /* 1 means control characters are translated into the form `^C'
+     where the `^' can be replaced by a display table entry.  */
+  unsigned ctl_arrow_p : 1;
+
+  /* 1 means lines are truncated.  */
+  unsigned truncate_lines_p : 1;
+
   /* Non-zero means that the current face has a box.  */
   unsigned face_box_p : 1;
 
@@ -1970,6 +2021,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;
@@ -2031,9 +2086,6 @@ struct it
   Lisp_Object object;
   struct text_pos position;
 
-  /* 1 means lines are truncated.  */
-  unsigned truncate_lines_p : 1;
-
   /* Number of columns per \t.  */
   short tab_width;
 
@@ -2265,7 +2317,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
 
@@ -2391,6 +2443,10 @@ struct image
      if necessary.  */
   unsigned long background;
 
+  /* Foreground and background colors of the frame on which the image
+     is created.  */
+  unsigned long frame_foreground, frame_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'.  */
@@ -2408,6 +2464,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.  */
@@ -2526,6 +2591,9 @@ enum tool_bar_item_idx
   /* Help string.  */
   TOOL_BAR_ITEM_HELP,
 
+  /* Icon file name of right to left image when an RTL locale is used.  */
+  TOOL_BAR_ITEM_RTL_IMAGE,
+
   /* Sentinel = number of slots in tool_bar_items occupied by one
      tool-bar item.  */
   TOOL_BAR_ITEM_NSLOTS
@@ -2592,7 +2660,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 *));
@@ -2606,10 +2674,12 @@ 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 *,
@@ -2639,7 +2709,9 @@ 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,
@@ -2663,12 +2735,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 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));
@@ -2681,6 +2753,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));
@@ -2714,6 +2788,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 */
 
@@ -2726,6 +2803,9 @@ 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
@@ -2788,12 +2868,16 @@ 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_for_overlay_string P_ ((struct window *, int, int,
+                                int, int *,
+                                int, int, Lisp_Object));
 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));
 
@@ -2909,7 +2993,6 @@ int scrolling P_ ((struct frame *));
 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;
@@ -2938,7 +3021,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));