]> code.delx.au - gnu-emacs/blobdiff - src/dispextern.h
(diacritic-composition-pattern): New constant.
[gnu-emacs] / src / dispextern.h
index a1432ee937da785d29eceebbb96fb37cc7be535e..102ae84a6eecad526613f5c160269c3e313a1824 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
      Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
      Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -19,14 +19,17 @@ 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
 #include <X11/Xlib.h>
 
 #ifndef DISPEXTERN_H_INCLUDED
 #define DISPEXTERN_H_INCLUDED
 
 #ifdef HAVE_X_WINDOWS
 #include <X11/Xlib.h>
-#endif
+#ifdef USE_X_TOOLKIT
+#include <X11/Intrinsic.h>
+#endif /* USE_X_TOOLKIT */
+#endif /* HAVE_X_WINDOWS */
 
 #ifdef MSDOS
 #include "msdos.h"
 
 #ifdef MSDOS
 #include "msdos.h"
@@ -36,6 +39,9 @@ Boston, MA 02111-1307, USA.  */
 #include "w32gui.h"
 #endif
 
 #include "w32gui.h"
 #endif
 
+#ifdef macintosh
+#include "macgui.h"
+#endif
 
 /* Structure forward declarations.  Some are here because function
    prototypes below reference structure types before their definition
 
 /* Structure forward declarations.  Some are here because function
    prototypes below reference structure types before their definition
@@ -50,22 +56,6 @@ struct frame;
 struct window;
 
 
 struct window;
 
 
-\f
-/***********************************************************************
-                             Configuration
- ***********************************************************************/
-
-/* If NO_PROMPT_IN_BUFFER is zero or undefined (default), prompts are
-   inserted into minibuffers as read-only text.  Otherwise, the
-   behavior of Emacs 20.2 is restored.  Define this as part of CFLAGS
-   because dispextern.h is not included in every C source file
-   containing conditional code for it.  */
-
-#if 0
-#define NO_PROMPT_IN_BUFFER 1
-#endif
-
-
 \f
 /***********************************************************************
                              Debugging
 \f
 /***********************************************************************
                              Debugging
@@ -82,7 +72,7 @@ struct window;
 
 #if GLYPH_DEBUG
 #define IF_DEBUG(X)    X
 
 #if GLYPH_DEBUG
 #define IF_DEBUG(X)    X
-#define xassert(X)     if (!(X)) abort (); else (void) 0
+#define xassert(X)     do {if (!(X)) abort ();} while (0)
 #else
 #define IF_DEBUG(X)    (void) 0
 #define xassert(X)     (void) 0
 #else
 #define IF_DEBUG(X)    (void) 0
 #define xassert(X)     (void) 0
@@ -140,21 +130,27 @@ struct text_pos
 
 /* Increment text position POS.  */
 
 
 /* Increment text position POS.  */
 
-#define INC_TEXT_POS(POS)                      \
+#define INC_TEXT_POS(POS, MULTIBYTE_P)         \
      do                                                \
        {                                       \
         ++(POS).charpos;                       \
      do                                                \
        {                                       \
         ++(POS).charpos;                       \
-        INC_POS ((POS).bytepos);               \
+         if (MULTIBYTE_P)                      \
+          INC_POS ((POS).bytepos);             \
+        else                                   \
+          ++(POS).bytepos;                     \
        }                                       \
      while (0)
 
 /* Decrement text position POS.  */
 
        }                                       \
      while (0)
 
 /* Decrement text position POS.  */
 
-#define DEC_TEXT_POS(POS)                      \
+#define DEC_TEXT_POS(POS, MULTIBYTE_P)         \
      do                                                \
        {                                       \
         --(POS).charpos;                       \
      do                                                \
        {                                       \
         --(POS).charpos;                       \
-        DEC_POS ((POS).bytepos);               \
+         if (MULTIBYTE_P)                      \
+          DEC_POS ((POS).bytepos);             \
+        else                                   \
+          --(POS).bytepos;                     \
        }                                       \
      while (0)
 
        }                                       \
      while (0)
 
@@ -217,6 +213,9 @@ enum glyph_type
   /* Glyph describes a character.  */
   CHAR_GLYPH,  
 
   /* Glyph describes a character.  */
   CHAR_GLYPH,  
 
+  /* Glyph describes a composition sequence.  */
+  COMPOSITE_GLYPH,
+
   /* Glyph describes an image.  */
   IMAGE_GLYPH,
 
   /* Glyph describes an image.  */
   IMAGE_GLYPH,
 
@@ -225,7 +224,13 @@ enum glyph_type
 };
 
 
 };
 
 
-/* Glyphs.  */
+/* Glyphs.
+
+   Be extra careful when changing this structure!  Esp. make sure that
+   functions producing glyphs, like x_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
 {
@@ -237,7 +242,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.  */
@@ -267,51 +274,51 @@ struct glyph
      glyphs above or below it.  */
   unsigned overlaps_vertically_p : 1;
 
      glyphs above or below it.  */
   unsigned overlaps_vertically_p : 1;
 
+  /* 1 means glyph is a padding glyph.  Padding glyphs are used for
+     characters whose visual shape consists of more than one glyph
+     (e.g. Asian characters).  All but the first glyph of such a glyph
+     sequence have the padding_p flag set.  Only used for terminal
+     frames, and there only to minimize code changes.  A better way
+     would probably be to use the width field of glyphs to express
+     padding. */
+  unsigned padding_p : 1;
+
+  /* 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 face_id : 22;
+
+#ifdef WINDOWSNT
+  /* Type of font used to display the character glyph. Used to
+     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
+
   /* A union of sub-structures for different glyph types.  */
   union
   {
   /* A union of sub-structures for different glyph types.  */
   union
   {
-    /* Sub-structure for character glyphs (type == CHAR_GLYPH).  */
-    struct 
-    {
-      /* Character code.  */
-      unsigned code : 19;
-
-      /* Character's face.  */
-      unsigned face_id : 11;
-
-      /* 1 means glyph is a padding glyph.  Padding glyphs are used
-        for characters whose visual shape consists of more than one
-        glyph (e.g. Asian characters).  All but the first glyph of
-        such a glyph sequence have the padding_p flag set.  Only used
-        for terminal frames, and there only to minimize code changes.
-        A better way would probably be to use the width field of
-        glyphs to express padding.  */
-      unsigned padding_p : 1;
-    }
-    ch;
+    /* Character code for character glyphs (type == CHAR_GLYPH).  */
+    unsigned ch;
 
 
-    /* Sub-structure for image glyphs (type == IMAGE_GLYPH).  */
-    struct
-    {
-      /* Image id.  */
-      unsigned id : 20;
+    /* Composition ID for composition glyphs (type == COMPOSITION_GLYPH)  */
+    unsigned cmp_id;
 
 
-      /* Face under the image.  */
-      unsigned face_id : 12;
-    }
-    img;
+    /* Image ID for image glyphs (type == IMAGE_GLYPH).  */
+    unsigned img_id;
 
     /* Sub-structure for type == STRETCH_GLYPH.  */
     struct
     {
       /* The height of the glyph.  */
 
     /* Sub-structure for type == STRETCH_GLYPH.  */
     struct
     {
       /* The height of the glyph.  */
-      unsigned height  : 11;
+      unsigned height  : 16;
 
       /* The ascent of the glyph.  */
 
       /* The ascent of the glyph.  */
-      unsigned ascent  : 10;
-
-      /* The face of the stretch glyph.  */
-      unsigned face_id : 11;
+      unsigned ascent  : 16;
     }
     stretch;
     
     }
     stretch;
     
@@ -326,14 +333,24 @@ struct glyph
 #define CHAR_GLYPH_SPACE_P(GLYPH) \
      (GLYPH_FROM_CHAR_GLYPH ((GLYPH)) == SPACEGLYPH)
 
 #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                              \
+      && (X)->face_id == (Y)->face_id                          \
+      && (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)->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?  */
+
+#define GLYPH_CHAR_AND_FACE_EQUAL_P(X, Y)      \
+  ((X)->u.ch == (Y)->u.ch                      \
+   && (X)->face_id == (Y)->face_id             \
+   && (X)->padding_p == (Y)->padding_p)
 
 /* 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.  */
@@ -341,9 +358,9 @@ struct glyph
 #define SET_CHAR_GLYPH(GLYPH, CODE, FACE_ID, PADDING_P)        \
      do                                                        \
        {                                               \
 #define SET_CHAR_GLYPH(GLYPH, CODE, FACE_ID, PADDING_P)        \
      do                                                        \
        {                                               \
-         (GLYPH).u.ch.code = (CODE);                   \
-         (GLYPH).u.ch.face_id = (FACE_ID);             \
-         (GLYPH).u.ch.padding_p = (PADDING_P);         \
+         (GLYPH).u.ch = (CODE);                                \
+         (GLYPH).face_id = (FACE_ID);                  \
+         (GLYPH).padding_p = (PADDING_P);              \
        }                                               \
      while (0)
 
        }                                               \
      while (0)
 
@@ -354,18 +371,20 @@ struct glyph
      SET_CHAR_GLYPH ((GLYPH),                                  \
                     FAST_GLYPH_CHAR ((FROM)),                  \
                     FAST_GLYPH_FACE ((FROM)),                  \
      SET_CHAR_GLYPH ((GLYPH),                                  \
                     FAST_GLYPH_CHAR ((FROM)),                  \
                     FAST_GLYPH_FACE ((FROM)),                  \
-                    ((FROM) & GLYPH_MASK_PADDING) != 0)
+                    0)
 
 
-/* Construct a typedef'd GLYPH value from a character glyph 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
+   multibyte character. */
      
 #define GLYPH_FROM_CHAR_GLYPH(GLYPH)                           \
      
 #define GLYPH_FROM_CHAR_GLYPH(GLYPH)                           \
-     ((GLYPH).u.ch.code                                                \
-       | ((GLYPH).u.ch.face_id << CHARACTERBITS)               \
-       | ((GLYPH).u.ch.padding_p ? GLYPH_MASK_PADDING : 0))
+  ((GLYPH).u.ch < 256                                          \
+   ? ((GLYPH).u.ch | ((GLYPH).face_id << CHARACTERBITS))       \
+   : -1)
 
 /* Is GLYPH a padding glyph?  */
      
 
 /* Is GLYPH a padding glyph?  */
      
-#define CHAR_GLYPH_PADDING_P(GLYPH) (GLYPH).u.ch.padding_p
+#define CHAR_GLYPH_PADDING_P(GLYPH) (GLYPH).padding_p
 
 
 
 
 
 
@@ -457,11 +476,13 @@ 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_x is the value of W->left, window_top_y the value of
+     W->top, 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_x, window_top_y, window_height, window_width, 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.  */
@@ -474,12 +495,20 @@ struct glyph_matrix
 
   /* Non-zero means window displayed in this matrix has a top mode
      line.  */
 
   /* Non-zero means window displayed in this matrix has a top mode
      line.  */
-  unsigned top_line_p : 1;
+  unsigned header_line_p : 1;
 
 #ifdef GLYPH_DEBUG
   /* A string identifying the method used to display the matrix.  */
   char method[512];
 #endif
 
 #ifdef GLYPH_DEBUG
   /* A string identifying the method used to display the matrix.  */
   char method[512];
 #endif
+
+  /* The buffer this matrix displays.  Set in
+     mark_window_display_accurate_1.  */
+  struct buffer *buffer;
+
+  /* Values of BEGV and ZV as of last redisplay.  Set in
+     mark_window_display_accurate_1.  */
+  int begv, zv;
 };
 
 
 };
 
 
@@ -565,7 +594,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
@@ -605,10 +635,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;
@@ -642,7 +668,7 @@ struct glyph_row
   unsigned contains_overlapping_glyphs_p : 1;
 
   /* 1 means this row is a wide as the window it is displayed in, including
   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
+     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;
 
@@ -652,9 +678,25 @@ struct glyph_row
   /* 1 in a current row means this row is overlapped by another row.  */
   unsigned overlapped_p : 1;
 
   /* 1 in a current row means this row is overlapped by another row.  */
   unsigned overlapped_p : 1;
 
+  /* 1 means this line ends in the middle of a character consisting
+     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
+     previoius 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;
 
   /* 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;
 };
@@ -681,7 +723,7 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int));
    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.  */
 
-#define MATRIX_TOP_LINE_ROW(MATRIX) (MATRIX)->rows
+#define MATRIX_HEADER_LINE_ROW(MATRIX) (MATRIX)->rows
 
 /* Return a pointer to first row in MATRIX used for text display.  */
 
 
 /* Return a pointer to first row in MATRIX used for text display.  */
 
@@ -751,7 +793,7 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int));
      
 #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_TOP_LINE_HEIGHT ((W)))
+      && (ROW)->y < WINDOW_DISPLAY_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.  */
      
@@ -780,7 +822,8 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int));
 
 #define MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P(ROW)       \
      ((ROW)->end.dpvec_index >= 0                      \
 
 #define MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P(ROW)       \
      ((ROW)->end.dpvec_index >= 0                      \
-      || (ROW)->end.overlay_string_index >= 0)
+      || (ROW)->end.overlay_string_index >= 0          \
+      || (ROW)->ends_in_middle_of_char_p)
 
 /* Non-zero if ROW ends in the middle of an overlay string.  */
 
 
 /* Non-zero if ROW ends in the middle of an overlay string.  */
 
@@ -791,6 +834,7 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int));
      
 #define MATRIX_ROW_STARTS_IN_MIDDLE_OF_CHAR_P(ROW)     \
      ((ROW)->start.dpvec_index >= 0                    \
      
 #define MATRIX_ROW_STARTS_IN_MIDDLE_OF_CHAR_P(ROW)     \
      ((ROW)->start.dpvec_index >= 0                    \
+      || (ROW)->starts_in_middle_of_char_p             \
       || ((ROW)->start.overlay_string_index >= 0       \
          && (ROW)->start.string_pos.charpos > 0))
 
       || ((ROW)->start.overlay_string_index >= 0       \
          && (ROW)->start.string_pos.charpos > 0))
 
@@ -815,6 +859,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.  */
@@ -870,28 +918,36 @@ extern struct glyph_row scratch_glyph_row;
    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.  */
 
-#define MATRIX_TOP_LINE_HEIGHT(MATRIX)         \
+#define MATRIX_HEADER_LINE_HEIGHT(MATRIX)      \
      ((MATRIX) && (MATRIX)->rows               \
      ((MATRIX) && (MATRIX)->rows               \
-      ? MATRIX_TOP_LINE_ROW (MATRIX)->height   \
+      ? MATRIX_HEADER_LINE_ROW (MATRIX)->height        \
       : 0)
 
 /* Return the current height of the mode line of window W.  If not
       : 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'.  */
-
-#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))
+   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),      \
+                                     MODE_LINE_FACE_ID)))
 
 /* Return the current height of the top line of window W.  If not
 
 /* 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_TOP_LINE_HEIGHT(W)                                        \
-      (MATRIX_TOP_LINE_HEIGHT ((W)->current_matrix)                       \
-      ? MATRIX_TOP_LINE_HEIGHT ((W)->current_matrix)                      \
-      : estimate_mode_line_height (XFRAME ((W)->frame), TOP_LINE_FACE_ID))
+   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.  */
 
 
 /* Return the height of the desired mode line of window W.  */
 
@@ -900,8 +956,8 @@ extern struct glyph_row scratch_glyph_row;
 
 /* Return the height of the desired top line of window W.  */
 
 
 /* Return the height of the desired top line of window W.  */
 
-#define DESIRED_TOP_LINE_HEIGHT(W) \
-     MATRIX_TOP_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.  */
 
 /* Like FRAME_INTERNAL_BORDER_WIDTH but checks whether frame F is a
    window-system frame.  */
@@ -912,12 +968,12 @@ extern struct glyph_row scratch_glyph_row;
 /* 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 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.  */
+   width of vertical scroll bars, and fringes.  */
 
 #define WINDOW_DISPLAY_PIXEL_WIDTH(W)                                  \
      (((XFASTINT ((W)->width)                                          \
         - FRAME_SCROLL_BAR_WIDTH (XFRAME (WINDOW_FRAME ((W))))         \
 
 #define WINDOW_DISPLAY_PIXEL_WIDTH(W)                                  \
      (((XFASTINT ((W)->width)                                          \
         - FRAME_SCROLL_BAR_WIDTH (XFRAME (WINDOW_FRAME ((W))))         \
-       - 2 * FRAME_FLAGS_AREA_COLS (XFRAME (WINDOW_FRAME ((W)))))      \
+       - FRAME_FRINGE_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.  */
        * CANON_X_UNIT (XFRAME (WINDOW_FRAME ((W))))))
 
 /* Height of the display region of W, including a mode line, if any.  */
@@ -937,9 +993,9 @@ extern struct glyph_row scratch_glyph_row;
 /* Height in pixels of the top line.  Zero if W doesn't have a top
    line.  */
      
 /* Height in pixels of the top line.  Zero if W doesn't have a top
    line.  */
      
-#define WINDOW_DISPLAY_TOP_LINE_HEIGHT(W)      \
-     (WINDOW_WANTS_TOP_LINE_P ((W))            \
-      ? CURRENT_TOP_LINE_HEIGHT (W)            \
+#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.  */
       : 0)
 
 /* Pixel height of window W without mode line.  */
@@ -953,7 +1009,7 @@ extern struct glyph_row scratch_glyph_row;
 #define WINDOW_DISPLAY_TEXT_HEIGHT(W)          \
      (WINDOW_DISPLAY_PIXEL_HEIGHT ((W))                \
       - WINDOW_DISPLAY_MODE_LINE_HEIGHT ((W))  \
 #define WINDOW_DISPLAY_TEXT_HEIGHT(W)          \
      (WINDOW_DISPLAY_PIXEL_HEIGHT ((W))                \
       - WINDOW_DISPLAY_MODE_LINE_HEIGHT ((W))  \
-      - WINDOW_DISPLAY_TOP_LINE_HEIGHT ((W)))
+      - WINDOW_DISPLAY_HEADER_LINE_HEIGHT ((W)))
 
 /* Left edge of W in pixels relative to its frame.  */
      
 
 /* Left edge of W in pixels relative to its frame.  */
      
@@ -961,7 +1017,7 @@ extern struct glyph_row scratch_glyph_row;
      (FRAME_INTERNAL_BORDER_WIDTH_SAFE (XFRAME (WINDOW_FRAME ((W))))   \
       + (WINDOW_LEFT_MARGIN ((W))                                      \
          * CANON_X_UNIT (XFRAME (WINDOW_FRAME ((W)))))                 \
      (FRAME_INTERNAL_BORDER_WIDTH_SAFE (XFRAME (WINDOW_FRAME ((W))))   \
       + (WINDOW_LEFT_MARGIN ((W))                                      \
          * CANON_X_UNIT (XFRAME (WINDOW_FRAME ((W)))))                 \
-      + FRAME_FLAGS_AREA_WIDTH (XFRAME (WINDOW_FRAME ((W)))))
+      + FRAME_LEFT_FRINGE_WIDTH (XFRAME (WINDOW_FRAME ((W)))))
 
 /* Right edge of window W in pixels, relative to its frame.  */
      
 
 /* Right edge of window W in pixels, relative to its frame.  */
      
@@ -1059,15 +1115,17 @@ extern struct glyph_row scratch_glyph_row;
      (!MINI_WINDOW_P (W)                                               \
       && !(W)->pseudo_window_p                                         \
       && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W)))            \
      (!MINI_WINDOW_P (W)                                               \
       && !(W)->pseudo_window_p                                         \
       && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W)))            \
+      && BUFFERP ((W)->buffer)                                         \
       && !NILP (XBUFFER ((W)->buffer)->mode_line_format))
 
 /* Value is non-zero if window W wants a top line.  */
 
       && !NILP (XBUFFER ((W)->buffer)->mode_line_format))
 
 /* Value is non-zero if window W wants a top line.  */
 
-#define WINDOW_WANTS_TOP_LINE_P(W)                                     \
+#define WINDOW_WANTS_HEADER_LINE_P(W)                                  \
      (!MINI_WINDOW_P (W)                                               \
       && !(W)->pseudo_window_p                                         \
       && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W)))            \
      (!MINI_WINDOW_P (W)                                               \
       && !(W)->pseudo_window_p                                         \
       && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W)))            \
-      && !NILP (XBUFFER ((W)->buffer)->top_line_format))
+      && BUFFERP ((W)->buffer)                                         \
+      && !NILP (XBUFFER ((W)->buffer)->header_line_format))
 
 \f     
 /***********************************************************************
 
 \f     
 /***********************************************************************
@@ -1092,6 +1150,9 @@ enum lface_attribute_index
   LFACE_OVERLINE_INDEX,
   LFACE_STRIKE_THROUGH_INDEX,
   LFACE_BOX_INDEX,
   LFACE_OVERLINE_INDEX,
   LFACE_STRIKE_THROUGH_INDEX,
   LFACE_BOX_INDEX,
+  LFACE_FONT_INDEX,
+  LFACE_INHERIT_INDEX,
+  LFACE_AVGWIDTH_INDEX,
   LFACE_VECTOR_SIZE
 };
 
   LFACE_VECTOR_SIZE
 };
 
@@ -1139,8 +1200,9 @@ struct face
      font may still be used somewhere else.  */
   XFontStruct *font;
 
      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 */
 
@@ -1169,9 +1231,6 @@ struct face
      must not be freed.  */
   char *font_name;
 
      must not be freed.  */
   char *font_name;
 
-  /* The X font registry and encoding of font_name.  */
-  Lisp_Object registry;
-
   /* Font info ID for this face's font.  An ID is stored here because
      pointers to font_info structures may change.  The reason is that
      they are pointers into a font table vector that is itself
   /* Font info ID for this face's font.  An ID is stored here because
      pointers to font_info structures may change.  The reason is that
      they are pointers into a font table vector that is itself
@@ -1179,8 +1238,8 @@ struct face
   int font_info_id;
 
   /* Fontset ID if this face uses a fontset, or -1.  This is only >= 0
   int font_info_id;
 
   /* Fontset ID if this face uses a fontset, or -1.  This is only >= 0
-     if the face was realized for CHARSET_COMPOSITION.  For all other
-     charsets, a specific font is loaded from the set of fonts
+     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.  */
   int fontset;
   
      specified by the fontset given by the family attribute of the face.  */
   int fontset;
   
@@ -1188,7 +1247,11 @@ struct face
   unsigned int pixmap_w, pixmap_h;
   
   /* Non-zero means characters in this face have a box that thickness
   unsigned int pixmap_w, pixmap_h;
   
   /* 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 vartical 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
@@ -1210,10 +1273,10 @@ struct face
   unsigned hash;
 
   /* The charset for which this face was realized if it was realized
   unsigned hash;
 
   /* The charset for which this face was realized if it was realized
-     for use in multibyte text.  If fontset >= 0, this is
-     CHARSET_COMPOSITION.  A value of charset < 0 means the face was
-     realized for use in unibyte text where the idea of Emacs
-     charsets isn't applicable.  */
+     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,
   int charset;
 
   /* Non-zero if text in this face should be underlined, overlined,
@@ -1229,7 +1292,7 @@ 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. */
   unsigned underline_defaulted_p : 1; 
 
      color when drawing in that case. */
   unsigned underline_defaulted_p : 1; 
 
@@ -1250,8 +1313,17 @@ 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;
+
   /* 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.  */
+  struct face *ascii_face;
 };
 
 
 };
 
 
@@ -1259,6 +1331,14 @@ struct face
 
 #define FACE_TTY_DEFAULT_COLOR ((unsigned long) -1)
 
 
 #define FACE_TTY_DEFAULT_COLOR ((unsigned long) -1)
 
+/* Color index indicating that face uses an unknown foreground color.  */
+
+#define FACE_TTY_DEFAULT_FG_COLOR ((unsigned long) -2)
+
+/* Color index indicating that face uses an unsigned background color.  */
+
+#define FACE_TTY_DEFAULT_BG_COLOR ((unsigned long) -3)
+
 /* Non-zero if FACE was realized for unibyte use.  */
 
 #define FACE_UNIBYTE_P(FACE) ((FACE)->charset < 0)
 /* Non-zero if FACE was realized for unibyte use.  */
 
 #define FACE_UNIBYTE_P(FACE) ((FACE)->charset < 0)
@@ -1271,9 +1351,14 @@ enum face_id
 {
   DEFAULT_FACE_ID,
   MODE_LINE_FACE_ID,
 {
   DEFAULT_FACE_ID,
   MODE_LINE_FACE_ID,
-  TOOLBAR_FACE_ID,
-  BITMAP_AREA_FACE_ID,
-  TOP_LINE_FACE_ID,
+  TOOL_BAR_FACE_ID,
+  FRINGE_FACE_ID,
+  HEADER_LINE_FACE_ID,
+  SCROLL_BAR_FACE_ID,
+  BORDER_FACE_ID,
+  CURSOR_FACE_ID,
+  MOUSE_FACE_ID,
+  MENU_FACE_ID,
   BASIC_FACE_ID_SENTINEL
 };
 
   BASIC_FACE_ID_SENTINEL
 };
 
@@ -1294,6 +1379,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;
 };
 
 
 };
 
 
@@ -1310,37 +1399,34 @@ struct face_cache
    face doesn't exist.  */
 
 #define FACE_FROM_ID(F, ID)                            \
    face doesn't exist.  */
 
 #define FACE_FROM_ID(F, ID)                            \
-     (((ID) >= 0 && (ID) < FRAME_FACE_CACHE (F)->used) \
+     (((unsigned) (ID) < FRAME_FACE_CACHE (F)->used)   \
       ? FRAME_FACE_CACHE (F)->faces_by_id[ID]          \
       : NULL)
 
       ? FRAME_FACE_CACHE (F)->faces_by_id[ID]          \
       : NULL)
 
-/* Non-zero if FACE is suitable for displaying characters of CHARSET.
-   CHARSET < 0 means unibyte text.  */
-
-#define FACE_SUITABLE_FOR_CHARSET_P(FACE, CHARSET)                     \
-     (((CHARSET) < 0                                                   \
-       ? (EQ ((FACE)->registry, Vface_default_registry)                        \
-         || !NILP (Fequal ((FACE)->registry, Vface_default_registry))) \
-       : ((FACE)->charset == (CHARSET)                                 \
-         || ((FACE)->charset == CHARSET_ASCII                          \
-             && (CHARSET) == charset_latin_iso8859_1                   \
-             && face_suitable_for_iso8859_1_p ((FACE)))                \
-         || ((FACE)->charset == charset_latin_iso8859_1                \
-             && (CHARSET) == CHARSET_ASCII))))
-     
+#ifdef HAVE_WINDOW_SYSTEM
+
+/* Non-zero if FACE is suitable for displaying character CHAR.  */
+
+#define FACE_SUITABLE_FOR_CHAR_P(FACE, CHAR)   \
+  (SINGLE_BYTE_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
 /* Return the id of the realized face on frame F that is like the face
-   with id ID but is suitable for displaying characters of CHARSET.
-   This macro is only meaningful for CHARSET >= 0, i.e. multibyte
-   text.  */
+   with id ID but is suitable for displaying character CHAR.
+   This macro is only meaningful for multibyte character CHAR.  */
    
    
-#define FACE_FOR_CHARSET(F, ID, CHARSET)                               \
-     (FACE_SUITABLE_FOR_CHARSET_P (FACE_FROM_ID ((F), (ID)), (CHARSET))        \
-      ? (ID)                                                           \
-      : lookup_face ((F), FACE_FROM_ID ((F), (ID))->lface, (CHARSET)))
+#define FACE_FOR_CHAR(F, FACE, CHAR)   \
+  (SINGLE_BYTE_CHAR_P (CHAR)           \
+   ? (FACE)->ascii_face->id            \
+   : face_for_char ((F), (FACE), (CHAR)))
+
+#else /* not HAVE_WINDOW_SYSTEM */
 
 
-/* The default registry and encoding to use.  */
+#define FACE_SUITABLE_FOR_CHAR_P(FACE, CHAR) 1
+#define FACE_FOR_CHAR(F, FACE, CHAR) ((FACE)->id)
 
 
-extern Lisp_Object Vface_default_registry;
+#endif /* not HAVE_WINDOW_SYSTEM */
 
 /* Non-zero means face attributes have been changed since the last
    redisplay.  Used in redisplay_internal.  */
 
 /* Non-zero means face attributes have been changed since the last
    redisplay.  Used in redisplay_internal.  */
@@ -1402,6 +1488,9 @@ enum display_element_type
   /* A normal character.  */
   IT_CHARACTER,
 
   /* A normal character.  */
   IT_CHARACTER,
 
+  /* A composition sequence.  */
+  IT_COMPOSITION,
+
   /* An image.  */
   IT_IMAGE,
 
   /* An image.  */
   IT_IMAGE,
 
@@ -1430,6 +1519,7 @@ enum prop_idx
   FACE_PROP_IDX,
   INVISIBLE_PROP_IDX,
   DISPLAY_PROP_IDX,
   FACE_PROP_IDX,
   INVISIBLE_PROP_IDX,
   DISPLAY_PROP_IDX,
+  COMPOSITION_PROP_IDX,
 
   /* Not a property.  Used to indicate changes in overlays.  */
   OVERLAY_PROP_IDX,
 
   /* Not a property.  Used to indicate changes in overlays.  */
   OVERLAY_PROP_IDX,
@@ -1480,7 +1570,7 @@ struct it
   unsigned multibyte_p : 1;
 
   /* 1 means window has a mode line at its top.  */
   unsigned multibyte_p : 1;
 
   /* 1 means window has a mode line at its top.  */
-  unsigned top_line_p : 1;
+  unsigned header_line_p : 1;
 
   /* 1 means `string' is the value of a `display' property.
      Don't handle some `display' properties in these strings.  */
 
   /* 1 means `string' is the value of a `display' property.
      Don't handle some `display' properties in these strings.  */
@@ -1507,8 +1597,11 @@ struct it
   int saved_face_id;
 
   /* Vector of glyphs for control character translation.  The pointer
   int saved_face_id;
 
   /* Vector of glyphs for control character translation.  The pointer
-     dpvec is set to ctl_chars when a control character is translated.  */
-  Lisp_Object ctl_chars[4];
+     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 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.  */
@@ -1543,6 +1636,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;
@@ -1584,26 +1678,41 @@ struct it
   /* 1 means overlay strings at end_charpos have been processed.  */
   unsigned overlay_strings_at_end_processed_p : 1;
 
   /* 1 means overlay strings at end_charpos have been processed.  */
   unsigned overlay_strings_at_end_processed_p : 1;
 
+  /* 1 means the actual glyph is not available in the current
+     system.  */
+  unsigned glyph_not_available_p : 1;
+
+  /* 1 means the next line in display_line continues a character
+     consisting of more than one glyph, and some glyphs of this
+     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 TOOLBAR_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
      a character from a buffer or string.  It may be different from
      the character displayed in case that
   int base_face_id;
 
   /* If what == IT_CHARACTER, character and length in bytes.  This is
      a character from a buffer or string.  It may be different from
      the character displayed in case that
-     unibyte_display_via_language_environment is set.  */
+     unibyte_display_via_language_environment is set.
+
+     If what == IT_COMPOSITION, the first component of a composition
+     and length in bytes of the composition.  */
   int c, len;
 
   int c, len;
 
+  /* If what == IT_COMPOSITION, identification number and length in
+     chars of a composition.  */
+  int cmp_id, cmp_len;
+
   /* 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.  */
   int char_to_display;
 
   /* 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.  */
   int char_to_display;
 
-  /* Charset for which face_id was computed.  This is the charset
-     of char_to_display after x_produce_glyphs has been called.  */
-  int charset;
-
   /* If what == IT_IMAGE, the id of the image to display.  */
   int image_id;
 
   /* If what == IT_IMAGE, the id of the image to display.  */
   int image_id;
 
@@ -1641,10 +1750,9 @@ struct it
      line, if the window has one.  */
   int last_visible_y;
 
      line, if the window has one.  */
   int last_visible_y;
 
-  /* Width of a prompt in front of the line.  Used to perform tab
-     calculations.  The x on which tab calculations are based is
-     current_x - prompt_width + continuation_lines_width.  */
-  int prompt_width;
+  /* Additional space in pixels between lines (for window systems
+     only.).  */
+  int extra_line_spacing;
 
   /* If non-null, glyphs are produced in glyph_row with each call to
      produce_glyphs.  */
 
   /* If non-null, glyphs are produced in glyph_row with each call to
      produce_glyphs.  */
@@ -1790,8 +1898,12 @@ 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 hightlight.  */
+  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
   
   /* Move cursor to row/column position VPOS/HPOS, pixel coordinates
      Y/X. HPOS/VPOS are window-relative row and column numbers and X/Y
@@ -1801,6 +1913,9 @@ 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));
 
+  /* Clear the mouse hightlight in window W, if there is any.  */
+  void (*clear_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,
@@ -1827,7 +1942,7 @@ extern int (* estimate_mode_line_height_hook) P_ ((struct frame *,
                                Images
  ***********************************************************************/
 
                                Images
  ***********************************************************************/
 
-#ifdef HAVE_X_WINDOWS
+#ifdef HAVE_WINDOW_SYSTEM
 
 /* Structure forward declarations.  */
 
 
 /* Structure forward declarations.  */
 
@@ -1875,6 +1990,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;
 
@@ -1883,9 +2014,12 @@ struct image
 #define DEFAULT_IMAGE_WIDTH 30
 #define DEFAULT_IMAGE_HEIGHT 30
 
 #define DEFAULT_IMAGE_WIDTH 30
 #define DEFAULT_IMAGE_HEIGHT 30
 
-  /* Percent of image height used as ascent.  */
+  /* Percent of image height used as ascent.  A value of
+     CENTERED_IMAGE_ASCENT means draw center the image centered on the
+     line.  */
   int ascent;
 #define DEFAULT_IMAGE_ASCENT 50
   int ascent;
 #define DEFAULT_IMAGE_ASCENT 50
+#define CENTERED_IMAGE_ASCENT -1
 
   /* Lisp specification of this image.  */
   Lisp_Object spec;
 
   /* Lisp specification of this image.  */
   Lisp_Object spec;
@@ -1893,12 +2027,15 @@ 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;
 
+  /* 1 means that loading the image failed.  Don't try again.  */
+  unsigned load_failed_p;
+
   /* A place for image types to store additional data.  The member
      data.lisp_val is marked during GC, so it's safe to store Lisp data
      there.  Image types should free this data when their `free'
   /* A place for image types to store additional data.  The member
      data.lisp_val is marked during GC, so it's safe to store Lisp data
      there.  Image types should free this data when their `free'
@@ -1943,11 +2080,6 @@ struct image_cache
 };
 
 
 };
 
 
-/* Value is the ascent of image IMG.  */
-
-#define IMAGE_ASCENT(IMG) \
-     (((IMG)->height + (IMG)->margin) * (IMG)->ascent / 100.0)
-
 /* Value is a pointer to the image with id ID on frame F, or null if
    no image with that id exists.  */
 
 /* Value is a pointer to the image with id ID on frame F, or null if
    no image with that id exists.  */
 
@@ -1960,75 +2092,83 @@ struct image_cache
 
 #define IMAGE_CACHE_BUCKETS_SIZE 1001
 
 
 #define IMAGE_CACHE_BUCKETS_SIZE 1001
 
-#endif /* HAVE_X_WINDOWS */
+#endif /* HAVE_WINDOW_SYSTEM */
 
 
 \f
 /***********************************************************************
 
 
 \f
 /***********************************************************************
-                              Toolbars
+                              Tool-bars
  ***********************************************************************/
 
  ***********************************************************************/
 
-/* Enumeration defining where to find toolbar item information in
-   toolbar items vectors stored with frames.  Each toolbar item
-   occupies TOOLBAR_ITEM_NSLOTS elements in such a vector.  */
+/* Enumeration defining where to find tool-bar item information in
+   tool-bar items vectors stored with frames.  Each tool-bar item
+   occupies TOOL_BAR_ITEM_NSLOTS elements in such a vector.  */
 
 
-enum toolbar_item_idx
+enum tool_bar_item_idx
 {
 {
-  /* The key of the toolbar item.  Used to remove items when a binding
+  /* The key of the tool-bar item.  Used to remove items when a binding
      for `undefined' is found.  */
      for `undefined' is found.  */
-  TOOLBAR_ITEM_KEY,
+  TOOL_BAR_ITEM_KEY,
 
   /* Non-nil if item is enabled.  */
 
   /* Non-nil if item is enabled.  */
-  TOOLBAR_ITEM_ENABLED_P,
+  TOOL_BAR_ITEM_ENABLED_P,
 
   /* Non-nil if item is selected (pressed).  */
 
   /* Non-nil if item is selected (pressed).  */
-  TOOLBAR_ITEM_SELECTED_P,
+  TOOL_BAR_ITEM_SELECTED_P,
 
   /* Caption.  */
 
   /* Caption.  */
-  TOOLBAR_ITEM_CAPTION,
+  TOOL_BAR_ITEM_CAPTION,
 
   /* Image(s) to display.  This is either a single image specification
      or a vector of specifications.  */
 
   /* Image(s) to display.  This is either a single image specification
      or a vector of specifications.  */
-  TOOLBAR_ITEM_IMAGES,
+  TOOL_BAR_ITEM_IMAGES,
 
   /* The binding.  */
 
   /* The binding.  */
-  TOOLBAR_ITEM_BINDING,
+  TOOL_BAR_ITEM_BINDING,
 
   /* Button type.  One of nil, `:radio' or `:toggle'.  */
 
   /* Button type.  One of nil, `:radio' or `:toggle'.  */
-  TOOLBAR_ITEM_TYPE,
+  TOOL_BAR_ITEM_TYPE,
 
   /* Help string.  */
 
   /* Help string.  */
-  TOOLBAR_ITEM_HELP,
+  TOOL_BAR_ITEM_HELP,
 
 
-  /* Sentinel = number of slots in toolbar_items occupied by one
-     toolbar item.  */
-  TOOLBAR_ITEM_NSLOTS
+  /* Sentinel = number of slots in tool_bar_items occupied by one
+     tool-bar item.  */
+  TOOL_BAR_ITEM_NSLOTS
 };
 
 
 /* An enumeration for the different images that can be specified
 };
 
 
 /* An enumeration for the different images that can be specified
-   for a toolbar item.  */
+   for a tool-bar item.  */
 
 
-enum toolbar_item_image
+enum tool_bar_item_image
 {
 {
-  TOOLBAR_IMAGE_ENABLED_SELECTED,
-  TOOLBAR_IMAGE_ENABLED_DESELECTED,
-  TOOLBAR_IMAGE_DISABLED_SELECTED,
-  TOOLBAR_IMAGE_DISABLED_DESELECTED
+  TOOL_BAR_IMAGE_ENABLED_SELECTED,
+  TOOL_BAR_IMAGE_ENABLED_DESELECTED,
+  TOOL_BAR_IMAGE_DISABLED_SELECTED,
+  TOOL_BAR_IMAGE_DISABLED_DESELECTED
 };
 
 };
 
-/* Non-zero means raise toolbar buttons when the mouse moves over them.  */
+/* Non-zero means raise tool-bar buttons when the mouse moves over them.  */
+
+extern int auto_raise_tool_bar_buttons_p;
 
 
-extern int auto_raise_toolbar_buttons_p;
+/* Margin around tool-bar buttons in pixels.  */
 
 
-/* Margin around toolbar buttons in pixels.  */
+extern Lisp_Object Vtool_bar_button_margin;
 
 
-extern int toolbar_button_margin;
+/* Thickness of relief to draw around tool-bar buttons.  */
 
 
-/* Thickness of relief to draw around toolbar buttons.  */
+extern int tool_bar_button_relief;
 
 
-extern int toolbar_button_relief;
+/* Default values of the above variables.  */
 
 
+#define DEFAULT_TOOL_BAR_BUTTON_MARGIN 1
+#define DEFAULT_TOOL_BAR_BUTTON_RELIEF 3
+
+/* The height in pixels of the default tool-bar images.  */
+
+#define DEFAULT_TOOL_BAR_IMAGE_HEIGHT 24
 
 \f
 /***********************************************************************
 
 \f
 /***********************************************************************
@@ -2037,6 +2177,14 @@ extern int toolbar_button_relief;
 
 /* 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));
+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 window_box_height P_ ((struct window *));
 int try_window P_ ((Lisp_Object, struct text_pos));
 void window_box P_ ((struct window *, int, int *, int *, int *, int *));
 int window_box_height P_ ((struct window *));
@@ -2046,7 +2194,7 @@ 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 *));
 void mark_window_display_accurate P_ ((Lisp_Object, int));
 int window_box_right P_ ((struct window *, int));
 void window_box_edges P_ ((struct window *, int, int *, int *, int *, 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,
@@ -2054,19 +2202,26 @@ 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 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 toolbar_item_info P_ ((struct frame *, struct glyph *, int *));
-extern Lisp_Object Qtoolbar;
+int tool_bar_item_info P_ ((struct frame *, struct glyph *, int *));
+extern Lisp_Object Qtool_bar;
 extern Lisp_Object Vshow_trailing_whitespace;
 extern int redisplaying_p;
 extern Lisp_Object Vshow_trailing_whitespace;
 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 int cursor_in_non_selected_windows;
 
 /* Defined in sysdep.c */
 
 
 /* Defined in sysdep.c */
 
@@ -2077,9 +2232,15 @@ int tabs_safe_p P_ ((void));
 void init_baud_rate P_ ((void));
 void init_sigio P_ ((int));
 
 void init_baud_rate P_ ((void));
 void init_sigio P_ ((int));
 
-/* Defined in xface.c */
+/* Defined in xfaces.c */
 
 
-char *x_charset_registry P_ ((int));
+#ifdef HAVE_X_WINDOWS
+void x_free_colors P_ ((struct frame *, unsigned long *, int));
+#endif
+
+void update_face_from_frame_parameter P_ ((struct frame *, Lisp_Object,
+                                          Lisp_Object));
+Lisp_Object tty_color_name P_ ((struct frame *, int));
 void clear_face_cache P_ ((int));
 unsigned long load_color P_ ((struct frame *, struct face *, Lisp_Object,
                              enum lface_attribute_index));
 void clear_face_cache P_ ((int));
 unsigned long load_color P_ ((struct frame *, struct face *, Lisp_Object,
                              enum lface_attribute_index));
@@ -2087,10 +2248,8 @@ void unload_color P_ ((struct frame *, unsigned long));
 int frame_update_line_height P_ ((struct frame *));
 int ascii_face_of_lisp_face P_ ((struct frame *, int));
 void prepare_face_for_display P_ ((struct frame *, struct face *));
 int frame_update_line_height P_ ((struct frame *));
 int ascii_face_of_lisp_face P_ ((struct frame *, int));
 void prepare_face_for_display P_ ((struct frame *, struct face *));
-int face_suitable_for_iso8859_1_p P_ ((struct face *));
 int xstricmp P_ ((unsigned char *, unsigned char *));
 int xstricmp P_ ((unsigned char *, unsigned char *));
-int lookup_face P_ ((struct frame *, Lisp_Object *, int));
-int face_suitable_for_charset_p P_ ((struct face *, int));
+int lookup_face P_ ((struct frame *, Lisp_Object *, int, struct face *));
 int lookup_named_face P_ ((struct frame *, Lisp_Object, int));
 int smaller_face P_ ((struct frame *, int, int));
 int face_with_height P_ ((struct frame *, int, int));
 int lookup_named_face P_ ((struct frame *, Lisp_Object, int));
 int smaller_face P_ ((struct frame *, int, int));
 int face_with_height P_ ((struct frame *, int, int));
@@ -2100,16 +2259,26 @@ 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 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));
 extern Lisp_Object Qforeground_color, Qbackground_color;
 int compute_char_face P_ ((struct frame *, int, Lisp_Object));
 void free_all_realized_faces P_ ((Lisp_Object));
 extern Lisp_Object Qforeground_color, Qbackground_color;
+extern char unspecified_fg[], unspecified_bg[];
+void free_realized_multibyte_face P_ ((struct frame *, int));
 
 /* Defined in xfns.c  */
 
 
 /* Defined in xfns.c  */
 
-#ifdef HAVE_X_WINDOWS 
+#ifdef HAVE_X_WINDOWS
+void gamma_correct P_ ((struct frame *, XColor *));
+#endif
+#ifdef WINDOWSNT
+void gamma_correct P_ ((struct frame *, COLORREF *));
+#endif
+
+#ifdef HAVE_WINDOW_SYSTEM
 
 
+void x_kill_gs_process P_ ((Pixmap, struct frame *));
 int x_screen_planes P_ ((struct frame *));
 void x_implicitly_set_name P_ ((struct frame *, Lisp_Object, Lisp_Object));
 struct image_cache *make_image_cache P_ ((void));
 int x_screen_planes P_ ((struct frame *));
 void x_implicitly_set_name P_ ((struct frame *, Lisp_Object, Lisp_Object));
 struct image_cache *make_image_cache P_ ((void));
@@ -2120,25 +2289,54 @@ 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);
-EXFUN (Fx_show_busy_cursor, 0);
-EXFUN (Fx_hide_busy_cursor, 1);
-extern int inhibit_busy_cursor;
-extern int display_busy_cursor_p;
+extern void start_hourglass P_ ((void));
+extern void cancel_hourglass P_ ((void));
+extern int display_hourglass_p;
 
 
-#endif /* HAVE_X_WINDOWS */
+/* 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 */
 
 
 /* Defined in xmenu.c  */
 
 int popup_activated P_ ((void));
 
 
 
 /* Defined in xmenu.c  */
 
 int popup_activated P_ ((void));
 
-/* Defined in dispnw.c  */
+/* Defined in dispnew.c  */
 
 
-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 int estimate_mode_line_height P_ ((struct frame *, enum face_id));
+extern Lisp_Object mode_line_string P_ ((struct window *, int, int, int, int *));
 extern void redraw_frame P_ ((struct frame *));
 extern void redraw_garbaged_frames P_ ((void));
 extern void cancel_line P_ ((int, struct frame *));
 extern void redraw_frame P_ ((struct frame *));
 extern void redraw_garbaged_frames P_ ((void));
 extern void cancel_line P_ ((int, struct frame *));
@@ -2148,8 +2346,6 @@ extern int direct_output_for_insert P_ ((int));
 extern int direct_output_forward_char P_ ((int));
 extern int update_frame P_ ((struct frame *, int, int));
 extern int scrolling P_ ((struct frame *));
 extern int direct_output_forward_char P_ ((int));
 extern int update_frame P_ ((struct frame *, int, int));
 extern int scrolling P_ ((struct frame *));
-extern void do_pending_window_change P_ ((void));
-extern void change_frame_size P_ ((struct frame *, int, int, int, int));
 extern void bitch_at_user P_ ((void));
 void adjust_glyphs P_ ((struct frame *));
 void free_glyphs P_ ((struct frame *));
 extern void bitch_at_user P_ ((void));
 void adjust_glyphs P_ ((struct frame *));
 void free_glyphs P_ ((struct frame *));
@@ -2162,10 +2358,10 @@ void clear_desired_matrices P_ ((struct frame *));
 void shift_glyph_matrix P_ ((struct window *, struct glyph_matrix *,
                             int, int, int));
 void rotate_matrix P_ ((struct glyph_matrix *, int, int, int));
 void shift_glyph_matrix P_ ((struct window *, struct glyph_matrix *,
                             int, int, int));
 void rotate_matrix P_ ((struct glyph_matrix *, int, int, int));
-void increment_glyph_matrix_buffer_positions P_ ((struct glyph_matrix *,
-                                                 int, int, int, int));
+void increment_matrix_positions P_ ((struct glyph_matrix *,
+                                    int, int, int, int));
 void blank_row P_ ((struct window *, struct glyph_row *, int));
 void blank_row P_ ((struct window *, struct glyph_row *, int));
-void increment_glyph_row_buffer_positions P_ ((struct glyph_row *, int, int));
+void increment_row_positions P_ ((struct glyph_row *, int, int));
 void enable_glyph_matrix_rows P_ ((struct glyph_matrix *, int, int, int));
 void clear_glyph_row P_ ((struct glyph_row *));
 void prepare_desired_row P_ ((struct glyph_row *));
 void enable_glyph_matrix_rows P_ ((struct glyph_matrix *, int, int, int));
 void clear_glyph_row P_ ((struct glyph_row *));
 void prepare_desired_row P_ ((struct glyph_row *));
@@ -2181,13 +2377,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 do_pending_window_change P_ ((void));
-void change_frame_size P_ ((struct frame *, int, int, 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 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 */
 
@@ -2201,7 +2399,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));
@@ -2213,7 +2410,6 @@ extern void calculate_costs P_ ((struct frame *));
 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));
 
 /* Defined in scroll.c */
 
 
 /* Defined in scroll.c */