(translate_char): Accept list of translation tables.
[bpt/emacs.git] / src / dispextern.h
index 4d81e9e..03eda50 100644 (file)
@@ -1,5 +1,5 @@
 /* Interface definitions for display code.
 /* 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.
      Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -19,30 +19,85 @@ 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., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
-/* New redisplay written by Gerd Moellmann <gerd@acm.org>.  */
+/* New redisplay written by Gerd Moellmann <gerd@gnu.org>.  */
 
 #ifndef DISPEXTERN_H_INCLUDED
 #define DISPEXTERN_H_INCLUDED
 
 #ifdef HAVE_X_WINDOWS
 
 #ifndef DISPEXTERN_H_INCLUDED
 #define DISPEXTERN_H_INCLUDED
 
 #ifdef HAVE_X_WINDOWS
+
 #include <X11/Xlib.h>
 #ifdef USE_X_TOOLKIT
 #include <X11/Intrinsic.h>
 #endif /* USE_X_TOOLKIT */
 #include <X11/Xlib.h>
 #ifdef USE_X_TOOLKIT
 #include <X11/Intrinsic.h>
 #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
 
 #endif /* HAVE_X_WINDOWS */
 
 #ifdef MSDOS
 #include "msdos.h"
 #endif
 
+#ifdef HAVE_X_WINDOWS
+typedef struct x_display_info Display_Info;
+#define NativeRectangle XRectangle
+#endif
+
 #ifdef HAVE_NTGUI
 #include "w32gui.h"
 #ifdef HAVE_NTGUI
 #include "w32gui.h"
+typedef struct w32_display_info Display_Info;
 #endif
 
 #endif
 
-#ifdef macintosh
-#include "macterm.h"
+#ifdef HAVE_CARBON
+#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 <Carbon/Carbon.h>
+#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
+
 #endif
 
 #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
 /* 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
@@ -56,6 +111,22 @@ struct frame;
 struct window;
 
 
 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
+};
+
+
 \f
 /***********************************************************************
                              Debugging
 \f
 /***********************************************************************
                              Debugging
@@ -99,7 +170,7 @@ extern int trace_redisplay_p;
 
 #endif /* GLYPH_DEBUG == 0 */
 
 
 #endif /* GLYPH_DEBUG == 0 */
 
-     
+
 \f
 /***********************************************************************
                            Text positions
 \f
 /***********************************************************************
                            Text positions
@@ -108,7 +179,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.  */
 /* 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.  */
 struct text_pos
 {
   /* Character position.  */
@@ -164,7 +235,7 @@ struct text_pos
 
 #define SET_MARKER_FROM_TEXT_POS(MARKER, POS) \
      set_marker_both ((MARKER), Qnil, CHARPOS ((POS)), BYTEPOS ((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.  */
 
 /* Value is non-zero if character and byte positions of POS1 and POS2
    are equal.  */
 
@@ -211,7 +282,7 @@ struct display_pos
 enum glyph_type
 {
   /* Glyph describes a character.  */
 enum glyph_type
 {
   /* Glyph describes a character.  */
-  CHAR_GLYPH,  
+  CHAR_GLYPH,
 
   /* Glyph describes a composition sequence.  */
   COMPOSITE_GLYPH,
 
   /* Glyph describes a composition sequence.  */
   COMPOSITE_GLYPH,
@@ -224,7 +295,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
 {
 
 struct glyph
 {
@@ -236,7 +313,9 @@ struct glyph
   int charpos;
 
   /* Lisp object source of this glyph.  Currently either a buffer or
   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.  */
   Lisp_Object object;
 
   /* Width in pixels.  */
@@ -275,20 +354,19 @@ struct glyph
      padding. */
   unsigned padding_p : 1;
 
      padding. */
   unsigned padding_p : 1;
 
-  /* 1 means the actual glyph is not available in the current
-     system.  */
+  /* 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;
 
   /* Face of the glyph.  */
   unsigned glyph_not_available_p : 1;
 
   /* Face of the glyph.  */
-  unsigned face_id : 22;
+  unsigned face_id : 21;
 
 
-#ifdef WINDOWSNT
-  /* Type of font used to display the character glyph. Used to
+  /* Type of font used to display the character glyph.  May be used to
      determine which set of functions to use to obtain font metrics
      determine which set of functions to use to obtain font metrics
-     for the glyph. Value should be an enumerator of the type
-     w32_char_font_type. */
-  unsigned w32_font_type : 2;
-#endif
+     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
 
   /* A union of sub-structures for different glyph types.  */
   union
@@ -312,20 +390,24 @@ struct glyph
       unsigned ascent  : 16;
     }
     stretch;
       unsigned ascent  : 16;
     }
     stretch;
-    
+
     /* Used to compare all bit-fields above in one step.  */
     unsigned val;
   } u;
 };
 
 
     /* 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)
 
 /* 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                              \
 #define GLYPH_EQUAL_P(X, Y)                                    \
      ((X)->type == (Y)->type                                   \
       && (X)->u.val == (Y)->u.val                              \
@@ -333,7 +415,8 @@ struct glyph
       && (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)->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?  */
 
 
 /* Are character codes, faces, padding_ps of glyphs *X and *Y equal?  */
 
@@ -344,7 +427,7 @@ struct glyph
 
 /* Fill a character glyph GLYPH.  CODE, FACE_ID, PADDING_P correspond
    to the bits defined for the typedef `GLYPH' in lisp.h.  */
 
 /* 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                                                        \
        {                                               \
 #define SET_CHAR_GLYPH(GLYPH, CODE, FACE_ID, PADDING_P)        \
      do                                                        \
        {                                               \
@@ -356,7 +439,7 @@ struct glyph
 
 /* Fill a character type glyph GLYPH from a glyph typedef FROM as
    defined in lisp.h.  */
 
 /* 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)),                  \
 #define SET_CHAR_GLYPH_FROM_GLYPH(GLYPH, FROM)                 \
      SET_CHAR_GLYPH ((GLYPH),                                  \
                     FAST_GLYPH_CHAR ((FROM)),                  \
@@ -365,15 +448,15 @@ struct glyph
 
 /* 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
 
 /* 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. */
-     
-#define GLYPH_FROM_CHAR_GLYPH(GLYPH)           \
-  ((GLYPH).u.ch < 256                          \
-   ? ((GLYPH).u.ch | ((GLYPH).face_id << 8))   \
+   multibyte character.  */
+
+#define GLYPH_FROM_CHAR_GLYPH(GLYPH)                           \
+  ((GLYPH).u.ch < 256                                          \
+   ? ((GLYPH).u.ch | ((GLYPH).face_id << CHARACTERBITS))       \
    : -1)
 
 /* Is GLYPH a padding glyph?  */
    : -1)
 
 /* Is GLYPH a padding glyph?  */
-     
+
 #define CHAR_GLYPH_PADDING_P(GLYPH) (GLYPH).padding_p
 
 
 #define CHAR_GLYPH_PADDING_P(GLYPH) (GLYPH).padding_p
 
 
@@ -466,11 +549,15 @@ struct glyph_matrix
   /* Width and height of the matrix in columns and rows.  */
   int matrix_w, matrix_h;
 
   /* 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.  */
 
   /* Number of glyphs reserved for left and right marginal areas when
      the matrix was last adjusted.  */
@@ -490,10 +577,12 @@ struct glyph_matrix
   char method[512];
 #endif
 
   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;
 
   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;
 };
 
   int begv, zv;
 };
 
@@ -530,7 +619,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.
 
    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  |
    +--------------------+-------------+---------------------+
    +--------------------+-------------+---------------------+
    |  left margin area  |  text area  |  right margin area  |
    +--------------------+-------------+---------------------+
@@ -538,13 +627,13 @@ enum glyph_row_area
    glyphs[LEFT_MARGIN_AREA]           glyphs[RIGHT_MARGIN_AREA]
                        |                                   |
                        glyphs[TEXT_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 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
    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
@@ -561,7 +650,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
      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
 
      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
@@ -580,7 +669,8 @@ struct glyph_row
   int x, y;
 
   /* Width of the row in pixels without taking face extension at the
   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
   int pixel_width;
 
   /* Logical ascent/height of this line.  The value of ascent is zero
@@ -620,10 +710,6 @@ struct glyph_row
      screen.  */
   unsigned enabled_p : 1;
 
      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;
   /* 1 means row displays a text line that is truncated on the left or
      right side.  */
   unsigned truncated_on_left_p : 1;
@@ -631,7 +717,7 @@ struct glyph_row
 
   /* 1 means the overlay arrow is on this line.  */
   unsigned overlay_arrow_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;
   /* 1 means that this row displays a continued line, i.e. it has a
      continuation mark at the right side.  */
   unsigned continued_p : 1;
@@ -656,12 +742,12 @@ struct glyph_row
      of lbearing or rbearing.  */
   unsigned contains_overlapping_glyphs_p : 1;
 
      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;
 
      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 mode_line_p : 1;
 
   /* 1 in a current row means this row is overlapped by another row.  */
@@ -671,15 +757,21 @@ struct glyph_row
      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;
      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
   /* 1 means this line starts in the middle of a character consisting
      of more than one glyph.  Some glyphs have been put in the
-     previoius row, the rest are put in this row.  */
+     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;
 
   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;
+
   /* Continuation lines width at the start of the row.  */
   int continuation_lines_width;
 };
   /* Continuation lines width at the start of the row.  */
   int continuation_lines_width;
 };
@@ -696,13 +788,13 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int));
 #define MATRIX_ROW(MATRIX, ROW)          ((MATRIX)->rows + (ROW))
 #endif
 
 #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)
 
    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.  */
 
    This is always the first row in MATRIX because that's the only
    way that works in frame-based redisplay.  */
 
@@ -721,29 +813,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.  */
      (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_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)
 
 #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_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_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                                        \
 #define MATRIX_BOTTOM_TEXT_ROW(MATRIX, W)              \
      ((MATRIX)->rows                                   \
       + (MATRIX)->nrows                                        \
@@ -751,46 +843,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.  */
 
 /* 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 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 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_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_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_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))                   \
 #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.  */
 
 /* 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))                                 \
 #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.   */
 
 /* 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_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)
 
 #define MATRIX_ROW_LAST_VISIBLE_P(ROW, IT) \
      (MATRIX_ROW_BOTTOM_Y ((ROW)) >= (IT)->last_visible_y)
 
@@ -814,7 +906,7 @@ 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.  */
      ((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             \
 #define MATRIX_ROW_STARTS_IN_MIDDLE_OF_CHAR_P(ROW)     \
      ((ROW)->start.dpvec_index >= 0                    \
       || (ROW)->starts_in_middle_of_char_p             \
@@ -842,6 +934,10 @@ extern int fonts_changed_p;
 
 extern struct glyph space_glyph;
 
 
 extern struct glyph space_glyph;
 
+/* Frame being updated by update_window/update_frame.  */
+
+extern struct frame *updating_frame;
+
 /* Window being updated by update_window.  This is non-null as long as
    update_window has not finished, and null otherwise.  It's role is
    analogous to updating_frame.  */
 /* Window being updated by update_window.  This is non-null as long as
    update_window has not finished, and null otherwise.  It's role is
    analogous to updating_frame.  */
@@ -880,6 +976,145 @@ extern struct glyph_row scratch_glyph_row;
 
 
 \f
 
 
 \f
+/************************************************************************
+                         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 */
+
+\f
 /************************************************************************
                          Display Dimensions
  ************************************************************************/
 /************************************************************************
                          Display Dimensions
  ************************************************************************/
@@ -893,7 +1128,7 @@ extern struct glyph_row scratch_glyph_row;
       ? MATRIX_MODE_LINE_ROW (MATRIX)->height  \
       : 0)
 
       ? 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.  */
 
    if not known.  This macro is called under circumstances where
    MATRIX might not have been allocated yet.  */
 
@@ -902,207 +1137,128 @@ extern struct glyph_row scratch_glyph_row;
       ? MATRIX_HEADER_LINE_ROW (MATRIX)->height        \
       : 0)
 
       ? 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 desired face id for the mode line of window W.  */
 
 
-/* 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'.  */
+#define CURRENT_MODE_LINE_FACE_ID(W)           \
+       (CURRENT_MODE_LINE_FACE_ID_3((W), XWINDOW (selected_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))
+/* 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 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)
 
 
 #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)                                     \
 
 #define WINDOW_WANTS_MODELINE_P(W)                                     \
-     (!MINI_WINDOW_P (W)                                               \
+     (!MINI_WINDOW_P ((W))                                             \
       && !(W)->pseudo_window_p                                         \
       && !(W)->pseudo_window_p                                         \
-      && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W)))            \
+      && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME ((W))))          \
       && BUFFERP ((W)->buffer)                                         \
       && BUFFERP ((W)->buffer)                                         \
-      && !NILP (XBUFFER ((W)->buffer)->mode_line_format))
+      && !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)                                  \
 
 #define WINDOW_WANTS_HEADER_LINE_P(W)                                  \
-     (!MINI_WINDOW_P (W)                                               \
+     (!MINI_WINDOW_P ((W))                                             \
       && !(W)->pseudo_window_p                                         \
       && !(W)->pseudo_window_p                                         \
-      && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W)))            \
+      && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME ((W))))          \
       && BUFFERP ((W)->buffer)                                         \
       && BUFFERP ((W)->buffer)                                         \
-      && !NILP (XBUFFER ((W)->buffer)->header_line_format))
+      && !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->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)))
 
 
-\f     
+\f
 /***********************************************************************
                                Faces
  ***********************************************************************/
 /***********************************************************************
                                Faces
  ***********************************************************************/
-     
+
 /* Indices of face attributes in Lisp face vectors.  Slot zero is the
    symbol `face'.  */
 
 /* Indices of face attributes in Lisp face vectors.  Slot zero is the
    symbol `face'.  */
 
@@ -1122,6 +1278,9 @@ enum lface_attribute_index
   LFACE_STRIKE_THROUGH_INDEX,
   LFACE_BOX_INDEX,
   LFACE_FONT_INDEX,
   LFACE_STRIKE_THROUGH_INDEX,
   LFACE_BOX_INDEX,
   LFACE_FONT_INDEX,
+  LFACE_INHERIT_INDEX,
+  LFACE_AVGWIDTH_INDEX,
+  LFACE_FONTSET_INDEX,
   LFACE_VECTOR_SIZE
 };
 
   LFACE_VECTOR_SIZE
 };
 
@@ -1158,19 +1317,20 @@ struct face
   int id;
 
 #ifdef HAVE_WINDOW_SYSTEM
   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;
   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;
 
   /* 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 */
 
 
 #else /* not HAVE_WINDOW_SYSTEM */
 
@@ -1182,7 +1342,7 @@ struct face
   /* Pixel value of foreground color for X frames.  Color index
      for tty frames.  */
   unsigned long foreground;
   /* 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;
 
   /* Pixel value or color index of background color.  */
   unsigned long background;
 
@@ -1205,17 +1365,19 @@ struct face
      reallocated.  */
   int font_info_id;
 
      reallocated.  */
   int font_info_id;
 
-  /* Fontset ID if this face uses a fontset, or -1.  This is only >= 0
-     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.  */
+  /* Fontset ID if for this face's fontset.  Non-ASCII faces derived
+     from the same ASCII face have the same fontset.  */
   int fontset;
   int fontset;
-  
+
   /* Pixmap width and height.  */
   unsigned int pixmap_w, pixmap_h;
   /* Pixmap width and height.  */
   unsigned int pixmap_w, pixmap_h;
-  
+
   /* Non-zero means characters in this face have a box that thickness
   /* 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
   int box_line_width;
 
   /* Type of box drawn.  A value of FACE_NO_BOX means no box is drawn
@@ -1236,13 +1398,6 @@ struct face
   /* The hash value of this face.  */
   unsigned hash;
 
   /* The hash value of this 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 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,
      strike-through or have a box drawn around it.  */
   unsigned underline_p : 1;
   /* Non-zero if text in this face should be underlined, overlined,
      strike-through or have a box drawn around it.  */
   unsigned underline_p : 1;
@@ -1256,12 +1411,12 @@ struct face
   unsigned background_defaulted_p : 1;
 
   /* 1 means that either no color is specified for underlining or that
   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. */
      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
 
   /* 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;
      Use the foreground color when drawing in that case. */
   unsigned overline_color_defaulted_p : 1;
   unsigned strike_through_color_defaulted_p : 1;
@@ -1277,11 +1432,20 @@ struct face
   unsigned tty_reverse_p : 1;
   unsigned tty_blinking_p : 1;
 
   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;
 
   /* 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.  */
+  /* If this face is an ASCII face, this points to this face itself.
+     Otherwise, this points to an ASCII face that has the same
+     attributes except the font.  */
   struct face *ascii_face;
 };
 
   struct face *ascii_face;
 };
 
@@ -1294,7 +1458,7 @@ struct face
 
 #define FACE_TTY_DEFAULT_FG_COLOR ((unsigned long) -2)
 
 
 #define FACE_TTY_DEFAULT_FG_COLOR ((unsigned long) -2)
 
-/* Color index indicating that face uses an unsigned background color.  */
+/* Color index indicating that face uses an unknown background color.  */
 
 #define FACE_TTY_DEFAULT_BG_COLOR ((unsigned long) -3)
 
 
 #define FACE_TTY_DEFAULT_BG_COLOR ((unsigned long) -3)
 
@@ -1310,8 +1474,9 @@ enum face_id
 {
   DEFAULT_FACE_ID,
   MODE_LINE_FACE_ID,
 {
   DEFAULT_FACE_ID,
   MODE_LINE_FACE_ID,
+  MODE_LINE_INACTIVE_FACE_ID,
   TOOL_BAR_FACE_ID,
   TOOL_BAR_FACE_ID,
-  BITMAP_AREA_FACE_ID,
+  FRINGE_FACE_ID,
   HEADER_LINE_FACE_ID,
   SCROLL_BAR_FACE_ID,
   BORDER_FACE_ID,
   HEADER_LINE_FACE_ID,
   SCROLL_BAR_FACE_ID,
   BORDER_FACE_ID,
@@ -1329,7 +1494,7 @@ struct face_cache
 {
   /* Hash table of cached realized faces.  */
   struct face **buckets;
 {
   /* Hash table of cached realized faces.  */
   struct face **buckets;
-  
+
   /* Back-pointer to the frame this cache belongs to.  */
   struct frame *f;
 
   /* Back-pointer to the frame this cache belongs to.  */
   struct frame *f;
 
@@ -1338,6 +1503,10 @@ struct face_cache
 
   /* The allocated size, and number of used slots of faces_by_id.  */
   int size, used;
 
   /* 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;
 };
 
 
 };
 
 
@@ -1363,23 +1532,23 @@ struct face_cache
 /* Non-zero if FACE is suitable for displaying character CHAR.  */
 
 #define FACE_SUITABLE_FOR_CHAR_P(FACE, CHAR)   \
 /* Non-zero if FACE is suitable for displaying character CHAR.  */
 
 #define FACE_SUITABLE_FOR_CHAR_P(FACE, CHAR)   \
-  (SINGLE_BYTE_CHAR_P (CHAR)                   \
+  (ASCII_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 character CHAR.
    This macro is only meaningful for multibyte character 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 character CHAR.
    This macro is only meaningful for multibyte character CHAR.  */
-   
-#define FACE_FOR_CHAR(F, FACE, CHAR)   \
-  (SINGLE_BYTE_CHAR_P (CHAR)           \
-   ? (FACE)->ascii_face->id            \
-   : face_for_char ((F), (FACE), (CHAR)))
+
+#define FACE_FOR_CHAR(F, FACE, CHAR, POS, OBJECT)      \
+  (ASCII_CHAR_P (CHAR)                                 \
+   ? (FACE)->ascii_face->id                            \
+   : face_for_char ((F), (FACE), (CHAR), (POS), (OBJECT)))
 
 #else /* not HAVE_WINDOW_SYSTEM */
 
 #define FACE_SUITABLE_FOR_CHAR_P(FACE, CHAR) 1
 
 #else /* not HAVE_WINDOW_SYSTEM */
 
 #define FACE_SUITABLE_FOR_CHAR_P(FACE, CHAR) 1
-#define FACE_FOR_CHAR(F, FACE, CHAR) ((FACE)->id)
+#define FACE_FOR_CHAR(F, FACE, CHAR, POS, OBJECT) ((FACE)->id)
 
 #endif /* not HAVE_WINDOW_SYSTEM */
 
 
 #endif /* not HAVE_WINDOW_SYSTEM */
 
@@ -1391,6 +1560,50 @@ extern int face_change_count;
 
 
 \f
 
 
 \f
+/***********************************************************************
+                              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 
+   does not fill the entire area.  FACE is the fringe face.  */
+
+struct draw_fringe_bitmap_params
+{
+  enum fringe_bitmap_type which;
+  int wd, h, dh;
+  int x, y;
+  int bx, nx, by, ny;
+  struct face *face;
+};
+
+extern struct fringe_bitmap fringe_bitmaps[MAX_FRINGE_BITMAPS];
+
+\f
 /***********************************************************************
                            Display Iterator
  ***********************************************************************/
 /***********************************************************************
                            Display Iterator
  ***********************************************************************/
@@ -1470,6 +1683,7 @@ enum display_element_type
 
 enum prop_idx
 {
 
 enum prop_idx
 {
+  AUTO_COMPOSED_PROP_IDX,
   FONTIFIED_PROP_IDX,
   FACE_PROP_IDX,
   INVISIBLE_PROP_IDX,
   FONTIFIED_PROP_IDX,
   FACE_PROP_IDX,
   INVISIBLE_PROP_IDX,
@@ -1543,7 +1757,7 @@ struct it
   Lisp_Object *dpvec, *dpend;
 
   /* Length in bytes of the char that filled dpvec.  A value of zero
   Lisp_Object *dpvec, *dpend;
 
   /* Length in bytes of the char that filled dpvec.  A value of zero
-     means that no character such character is involved.  */
+     means that no such character is involved.  */
   int dpvec_char_len;
 
   /* Face id of the iterator saved in case a glyph from dpvec contains
   int dpvec_char_len;
 
   /* Face id of the iterator saved in case a glyph from dpvec contains
@@ -1554,9 +1768,9 @@ struct it
   /* Vector of glyphs for control character translation.  The pointer
      dpvec is set to ctl_chars when a control character is translated.
      This vector is also used for incomplete multibyte character
   /* Vector of glyphs for control character translation.  The pointer
      dpvec is set to ctl_chars when a control character is translated.
      This vector is also used for incomplete multibyte character
-     translation (e.g \222\244).  Such a character is at most 3 bytes,
-     thus we need at most 12 bytes here.  */
-  Lisp_Object ctl_chars[12];
+     translation (e.g \222\244).  Such a character is at most 4 bytes,
+     thus we need at most 16 bytes here.  */
+  Lisp_Object ctl_chars[16];
 
   /* Current buffer or string position of the iterator, including
      position in overlay strings etc.  */
 
   /* Current buffer or string position of the iterator, including
      position in overlay strings etc.  */
@@ -1571,10 +1785,6 @@ struct it
      OVERLAY_STRING_CHUNK_SIZE.  */
   int n_overlay_strings;
 
      OVERLAY_STRING_CHUNK_SIZE.  */
   int n_overlay_strings;
 
-  /* If non-zero, an additional overlay start position to take overlay
-     strings from.  */
-  int add_overlay_start;
-
   /* If non-nil, a Lisp string being processed.  If
      current.overlay_string_index >= 0, this is an overlay string from
      pos.  */
   /* If non-nil, a Lisp string being processed.  If
      current.overlay_string_index >= 0, this is an overlay string from
      pos.  */
@@ -1595,6 +1805,7 @@ struct it
     enum glyph_row_area area;
     unsigned multibyte_p : 1;
     unsigned string_from_display_prop_p : 1;
     enum glyph_row_area area;
     unsigned multibyte_p : 1;
     unsigned string_from_display_prop_p : 1;
+    unsigned display_ellipsis_p : 1;
     Lisp_Object space_width;
     short voffset;
     Lisp_Object font_height;
     Lisp_Object space_width;
     short voffset;
     Lisp_Object font_height;
@@ -1603,7 +1814,7 @@ struct it
 
   /* Stack pointer.  */
   int sp;
 
   /* Stack pointer.  */
   int sp;
-  
+
   /* Setting of buffer-local variable selective-display-ellipsis.  */
   unsigned selective_display_ellipsis_p : 1;
 
   /* Setting of buffer-local variable selective-display-ellipsis.  */
   unsigned selective_display_ellipsis_p : 1;
 
@@ -1628,7 +1839,7 @@ struct it
   /* Non-null means that the current character is the first in a run
      of characters with box face.  */
   unsigned start_of_box_run_p : 1;
   /* Non-null means that the current character is the first in a run
      of characters with box face.  */
   unsigned start_of_box_run_p : 1;
-  
+
   /* Non-zero means that the current character is the last in a run
      of characters with box face.  */
   unsigned end_of_box_run_p : 1;
   /* Non-zero means that the current character is the last in a run
      of characters with box face.  */
   unsigned end_of_box_run_p : 1;
@@ -1645,9 +1856,12 @@ struct it
      character have been put on the previous line.  */
   unsigned starts_in_middle_of_char_p : 1;
 
      character have been put on the previous line.  */
   unsigned starts_in_middle_of_char_p : 1;
 
+  /* If 1, saved_face_id contains the id of the face in front of text
+     skipped due to selective display.  */
+  unsigned face_before_selective_p : 1;
+
   /* The ID of the default face to use.  One of DEFAULT_FACE_ID,
   /* The ID of the default face to use.  One of DEFAULT_FACE_ID,
-     MODE_LINE_FACE_ID, or TOOL_BAR_FACE_ID, depending on what we
-     are displaying.  */
+     MODE_LINE_FACE_ID, etc, depending on what we are displaying.  */
   int base_face_id;
 
   /* If what == IT_CHARACTER, character and length in bytes.  This is
   int base_face_id;
 
   /* If what == IT_CHARACTER, character and length in bytes.  This is
@@ -1665,7 +1879,7 @@ struct it
 
   /* The character to display, possibly translated to multibyte
      if unibyte_display_via_language_environment is set.  This
 
   /* The character to display, possibly translated to multibyte
      if unibyte_display_via_language_environment is set.  This
-     is set after x_produce_glyphs has been called.  */
+     is set after produce_glyphs has been called.  */
   int char_to_display;
 
   /* If what == IT_IMAGE, the id of the image to display.  */
   int char_to_display;
 
   /* If what == IT_IMAGE, the id of the image to display.  */
@@ -1697,7 +1911,7 @@ struct it
   short truncation_pixel_width, continuation_pixel_width;
 
   /* First and last visible x-position in the display area.  If window
   short truncation_pixel_width, continuation_pixel_width;
 
   /* First and last visible x-position in the display area.  If window
-     is hscrolled by n columns, first_visible_x == n * CANON_X_UNIT
+     is hscrolled by n columns, first_visible_x == n * FRAME_COLUMN_WIDTH
      (f), and last_visible_x == pixel width of W + first_visible_x.  */
   int first_visible_x, last_visible_x;
 
      (f), and last_visible_x == pixel width of W + first_visible_x.  */
   int first_visible_x, last_visible_x;
 
@@ -1706,7 +1920,7 @@ struct it
   int last_visible_y;
 
   /* Additional space in pixels between lines (for window systems
   int last_visible_y;
 
   /* Additional space in pixels between lines (for window systems
-     only.).  */
+     only.)  */
   int extra_line_spacing;
 
   /* If non-null, glyphs are produced in glyph_row with each call to
   int extra_line_spacing;
 
   /* If non-null, glyphs are produced in glyph_row with each call to
@@ -1719,7 +1933,7 @@ struct it
   /* Number of glyphs needed for the last character requested via
      produce_glyphs.  This is 1 except for tabs.  */
   int nglyphs;
   /* Number of glyphs needed for the last character requested via
      produce_glyphs.  This is 1 except for tabs.  */
   int nglyphs;
-  
+
   /* Width of the display element in pixels.  Result of
      produce_glyphs.  */
   int pixel_width;
   /* Width of the display element in pixels.  Result of
      produce_glyphs.  */
   int pixel_width;
@@ -1778,10 +1992,16 @@ struct it
 /* Call produce_glyphs or produce_glyphs_hook, if set.  Shortcut to
    avoid the function call overhead.  */
 
 /* Call produce_glyphs or produce_glyphs_hook, if set.  Shortcut to
    avoid the function call overhead.  */
 
-#define PRODUCE_GLYPHS(IT)                     \
-     (rif                                      \
-      ? rif->produce_glyphs ((IT))             \
-      : produce_glyphs ((IT)))
+#define PRODUCE_GLYPHS(IT)                     \
+     do {                                      \
+       extern int inhibit_free_realized_faces; \
+       if (rif != NULL)                                \
+        rif->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.  */
 
 
 /* Bit-flags indicating what operation move_it_to should perform.  */
 
@@ -1821,15 +2041,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
 {
 /* 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));
   /* 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));
   /* Write or insert LEN glyphs from STRING at the nominal output
      position.  */
   void (*write_glyphs) P_ ((struct glyph *string, int len));
@@ -1838,7 +2066,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));
   /* 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));
   /* 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));
@@ -1853,9 +2081,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
   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.  */
   /* 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.  */
@@ -1864,6 +2096,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.  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,
   /* 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,
@@ -1874,17 +2114,68 @@ 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));
      desired rows have been made current.  */
   void (*fix_overlapping_area) P_ ((struct window *w, struct glyph_row *row,
                                    enum glyph_row_area area));
+
+#ifdef HAVE_WINDOW_SYSTEM
+
+  /* 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));
+
+/* 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,
+                         struct charset *charset,
+                         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 */
 };
 
 /* The current interface for window-based redisplay.  */
 
 extern struct redisplay_interface *rif;
 
 };
 
 /* The current interface for window-based redisplay.  */
 
 extern struct redisplay_interface *rif;
 
-/* Hook to call in estimate_mode_line_height.  */
-
-extern int (* estimate_mode_line_height_hook) P_ ((struct frame *,
-                                                   enum face_id));
-
 \f
 /***********************************************************************
                                Images
 \f
 /***********************************************************************
                                Images
@@ -1897,7 +2188,7 @@ extern int (* estimate_mode_line_height_hook) P_ ((struct frame *,
 struct image;
 
 
 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
    a structure of the type below.  */
 
 struct image_type
@@ -1938,6 +2229,22 @@ struct image
   unsigned long *colors;
   int ncolors;
 
   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;
 
   /* Width and height of the image.  */
   int width, height;
 
@@ -1947,7 +2254,7 @@ struct image
 #define DEFAULT_IMAGE_HEIGHT 30
 
   /* Percent of image height used as ascent.  A value of
 #define DEFAULT_IMAGE_HEIGHT 30
 
   /* Percent of image height used as ascent.  A value of
-     CENTERED_IMAGE_ASCENT means draw center the image centered on the
+     CENTERED_IMAGE_ASCENT means draw the image centered on the
      line.  */
   int ascent;
 #define DEFAULT_IMAGE_ASCENT 50
      line.  */
   int ascent;
 #define DEFAULT_IMAGE_ASCENT 50
@@ -1959,8 +2266,8 @@ struct image
   /* Relief to draw around the image.  */
   int relief;
 
   /* 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;
 
   /* Reference to the type of the image.  */
   struct image_type *type;
@@ -2081,28 +2388,54 @@ enum tool_bar_item_image
   TOOL_BAR_IMAGE_DISABLED_DESELECTED
 };
 
   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.  */
 
 /* 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.  */
 
 
 /* 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
 
 \f
 /***********************************************************************
 
 \f
 /***********************************************************************
-                        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
+
+\f
+/***********************************************************************
+                         Function Prototypes
  ***********************************************************************/
 
 /* Defined in xdisp.c */
 
  ***********************************************************************/
 
 /* Defined in xdisp.c */
 
+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));
 int display_prop_intangible_p P_ ((Lisp_Object));
-void resize_echo_area_axactly P_ ((void));
+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 *));
 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 *));
@@ -2112,8 +2445,12 @@ int window_box_width P_ ((struct window *, int));
 int window_box_left P_ ((struct window *, int));
 int window_box_right P_ ((struct window *, int));
 void window_box_edges P_ ((struct window *, int, int *, int *, int *, int *));
 int window_box_left P_ ((struct window *, int));
 int window_box_right 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 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,
 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,
@@ -2121,21 +2458,87 @@ 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 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 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_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 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 *));
+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 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 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;
+
+#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 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 sysdep.c */
 
 
 /* Defined in sysdep.c */
 
@@ -2148,9 +2551,6 @@ void init_sigio P_ ((int));
 
 /* Defined in xfaces.c */
 
 
 /* Defined in xfaces.c */
 
-#ifdef USE_X_TOOLKIT
-void x_set_menu_resources_from_menu_face P_ ((struct frame *, Widget));
-#endif
 #ifdef HAVE_X_WINDOWS
 void x_free_colors P_ ((struct frame *, unsigned long *, int));
 #endif
 #ifdef HAVE_X_WINDOWS
 void x_free_colors P_ ((struct frame *, unsigned long *, int));
 #endif
@@ -2162,26 +2562,31 @@ 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));
 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 *));
+char *choose_face_font P_ ((struct frame *, Lisp_Object *, Lisp_Object,
+                           int *));
 int ascii_face_of_lisp_face P_ ((struct frame *, int));
 void prepare_face_for_display P_ ((struct frame *, struct face *));
 int ascii_face_of_lisp_face P_ ((struct frame *, int));
 void prepare_face_for_display P_ ((struct frame *, struct face *));
-int xstricmp P_ ((unsigned char *, unsigned char *));
-int lookup_face P_ ((struct frame *, Lisp_Object *, int, struct face *));
-int lookup_named_face P_ ((struct frame *, Lisp_Object, int));
+int xstricmp P_ ((const unsigned char *, const unsigned char *));
+int lookup_face P_ ((struct frame *, Lisp_Object *));
+int lookup_non_ascii_face P_ ((struct frame *, int, struct face *));
+int lookup_named_face P_ ((struct frame *, Lisp_Object));
 int smaller_face P_ ((struct frame *, int, int));
 int face_with_height P_ ((struct frame *, 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));
 void init_frame_faces P_ ((struct frame *));
 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));
 void init_frame_faces P_ ((struct frame *));
 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));
 int compute_char_face P_ ((struct frame *, int, Lisp_Object));
 void free_all_realized_faces P_ ((Lisp_Object));
+void free_realized_face P_ ((struct frame *, struct face *));
 extern Lisp_Object Qforeground_color, Qbackground_color;
 extern Lisp_Object Qforeground_color, Qbackground_color;
-void free_realized_multibyte_face P_ ((struct frame *, int));
+extern char unspecified_fg[], unspecified_bg[];
+extern Lisp_Object split_font_name_into_vector P_ ((Lisp_Object));
+extern Lisp_Object build_font_name_from_vector P_ ((Lisp_Object));
 
 /* Defined in xfns.c  */
 
 
 /* Defined in xfns.c  */
 
@@ -2205,13 +2610,39 @@ void forall_images_in_image_cache P_ ((struct frame *,
 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));
 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;
+
+#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;
 extern Window tip_window;
-EXFUN (Fx_show_tip, 4);
+EXFUN (Fx_show_tip, 6);
 EXFUN (Fx_hide_tip, 0);
 EXFUN (Fx_hide_tip, 0);
-extern void start_busy_cursor P_ ((void));
-extern void cancel_busy_cursor P_ ((void));
-extern int display_busy_cursor_p;
+extern void start_hourglass P_ ((void));
+extern void cancel_hourglass P_ ((void));
+extern int display_hourglass_p;
+
+/* 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 */
 
 
 #endif /* HAVE_WINDOW_SYSTEM */
 
@@ -2222,8 +2653,13 @@ int popup_activated P_ ((void));
 
 /* Defined in dispnew.c  */
 
 
 /* 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 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 void redraw_frame P_ ((struct frame *));
 extern void redraw_garbaged_frames P_ ((void));
 extern void cancel_line P_ ((int, struct frame *));
 extern void redraw_frame P_ ((struct frame *));
 extern void redraw_garbaged_frames P_ ((void));
 extern void cancel_line P_ ((int, struct frame *));
@@ -2264,13 +2700,15 @@ 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 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 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));
 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 */
 
 
 /* Defined in term.c */
 
@@ -2284,7 +2722,6 @@ 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 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 clear_frame P_ ((void));
 extern void clear_end_of_line P_ ((int));
 extern void clear_end_of_line_raw P_ ((int));
@@ -2293,10 +2730,12 @@ extern void ins_del_lines P_ ((int, int));
 extern int string_cost P_ ((char *));
 extern int per_line_cost P_ ((char *));
 extern void calculate_costs P_ ((struct frame *));
 extern int string_cost P_ ((char *));
 extern int per_line_cost P_ ((char *));
 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 void term_init P_ ((char *));
 extern void fatal P_ ((/* char *, ... */));
 void cursor_to P_ ((int, int));
-void change_line_highlight P_ ((int, int, int, int));
+extern int tty_capable_p P_ ((struct frame *, unsigned, unsigned long, unsigned long));
 
 /* Defined in scroll.c */
 
 
 /* Defined in scroll.c */
 
@@ -2308,4 +2747,35 @@ 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));
 
 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 */
 #endif /* not DISPEXTERN_H_INCLUDED */