(minibuf_selected_window): Renamed from Vminibuf_selected_window.
[bpt/emacs.git] / src / dispextern.h
index 63eb3b8..7777e56 100644 (file)
@@ -1,5 +1,5 @@
 /* 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.
@@ -19,7 +19,7 @@ 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.  */
 
-/* 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
@@ -40,7 +40,7 @@ Boston, MA 02111-1307, USA.  */
 #endif
 
 #ifdef macintosh
-#include "macterm.h"
+#include "macgui.h"
 #endif
 
 /* Structure forward declarations.  Some are here because function
@@ -130,21 +130,27 @@ struct text_pos
 
 /* Increment text position POS.  */
 
-#define INC_TEXT_POS(POS)                      \
+#define INC_TEXT_POS(POS, MULTIBYTE_P)         \
      do                                                \
        {                                       \
         ++(POS).charpos;                       \
-        INC_POS ((POS).bytepos);               \
+         if (MULTIBYTE_P)                      \
+          INC_POS ((POS).bytepos);             \
+        else                                   \
+          ++(POS).bytepos;                     \
        }                                       \
      while (0)
 
 /* Decrement text position POS.  */
 
-#define DEC_TEXT_POS(POS)                      \
+#define DEC_TEXT_POS(POS, MULTIBYTE_P)         \
      do                                                \
        {                                       \
         --(POS).charpos;                       \
-        DEC_POS ((POS).bytepos);               \
+         if (MULTIBYTE_P)                      \
+          DEC_POS ((POS).bytepos);             \
+        else                                   \
+          --(POS).bytepos;                     \
        }                                       \
      while (0)
 
@@ -218,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
 {
@@ -230,7 +242,9 @@ struct glyph
   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.  */
@@ -269,8 +283,21 @@ struct glyph
      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 : 23;
+  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
@@ -306,7 +333,7 @@ struct glyph
 #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                                   \
@@ -315,7 +342,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)->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?  */
 
@@ -347,11 +375,11 @@ 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
-   multibyte character. */
+   multibyte character.  */
      
-#define GLYPH_FROM_CHAR_GLYPH(GLYPH)           \
-  ((GLYPH).u.ch < 256                          \
-   ? ((GLYPH).u.ch | ((GLYPH).face_id << 8))   \
+#define GLYPH_FROM_CHAR_GLYPH(GLYPH)                           \
+  ((GLYPH).u.ch < 256                                          \
+   ? ((GLYPH).u.ch | ((GLYPH).face_id << CHARACTERBITS))       \
    : -1)
 
 /* Is GLYPH a padding glyph?  */
@@ -448,11 +476,13 @@ struct glyph_matrix
   /* 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.  */
@@ -472,10 +502,12 @@ struct glyph_matrix
   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;
 
-  /* 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;
 };
 
@@ -543,7 +575,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
-     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
@@ -562,7 +594,8 @@ struct glyph_row
   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
@@ -602,10 +635,6 @@ struct glyph_row
      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;
@@ -638,20 +667,36 @@ struct glyph_row
      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;
 
-  /* 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 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
+     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;
 
+  /* 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;
 };
@@ -674,7 +719,7 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int));
 #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.  */
 
@@ -703,7 +748,7 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int));
 #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)
@@ -777,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                      \
-      || (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.  */
 
@@ -788,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                    \
+      || (ROW)->starts_in_middle_of_char_p             \
       || ((ROW)->start.overlay_string_index >= 0       \
          && (ROW)->start.string_pos.charpos > 0))
 
@@ -812,6 +859,10 @@ extern int fonts_changed_p;
 
 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.  */
@@ -863,7 +914,7 @@ extern struct glyph_row scratch_glyph_row;
       ? 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.  */
 
@@ -872,30 +923,64 @@ extern struct glyph_row scratch_glyph_row;
       ? 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 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'.  */
+/* Return the desired face id for the mode line of 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))
+#define CURRENT_MODE_LINE_FACE_ID(W)           \
+       (CURRENT_MODE_LINE_FACE_ID_3((W), XWINDOW (selected_window), (W)))
+
+/* 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 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)
@@ -909,12 +994,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 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))))         \
-       - 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.  */
@@ -931,7 +1016,7 @@ extern struct glyph_row scratch_glyph_row;
       ? CURRENT_MODE_LINE_HEIGHT (W)           \
       : 0)
 
-/* Height in pixels of the top line.  Zero if W doesn't have a top
+/* Height in pixels of the header line.  Zero if W doesn't have a header
    line.  */
      
 #define WINDOW_DISPLAY_HEADER_LINE_HEIGHT(W)   \
@@ -945,7 +1030,7 @@ extern struct glyph_row scratch_glyph_row;
      (WINDOW_DISPLAY_PIXEL_HEIGHT ((W))                \
       - WINDOW_DISPLAY_MODE_LINE_HEIGHT ((W)))
 
-/* Pixel height of window W without mode and top line.  */
+/* Pixel height of window W without mode and header line.  */
      
 #define WINDOW_DISPLAY_TEXT_HEIGHT(W)          \
      (WINDOW_DISPLAY_PIXEL_HEIGHT ((W))                \
@@ -958,7 +1043,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_LEFT_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.  */
      
@@ -994,7 +1079,7 @@ extern struct glyph_row scratch_glyph_row;
 #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.  */
+/* Convert frame relative pixel Y to window relative pixel Y.  */
      
 #define FRAME_TO_WINDOW_PIXEL_Y(W, Y) \
      ((Y) - WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y ((W)))
@@ -1050,21 +1135,25 @@ extern struct glyph_row scratch_glyph_row;
         ? 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)                                     \
-     (!MINI_WINDOW_P (W)                                               \
+     (!MINI_WINDOW_P ((W))                                             \
       && !(W)->pseudo_window_p                                         \
-      && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W)))            \
-      && !NILP (XBUFFER ((W)->buffer)->mode_line_format))
+      && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME ((W))))          \
+      && BUFFERP ((W)->buffer)                                         \
+      && !NILP (XBUFFER ((W)->buffer)->mode_line_format)               \
+      && XFASTINT ((W)->height) > 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)                                  \
-     (!MINI_WINDOW_P (W)                                               \
+     (!MINI_WINDOW_P ((W))                                             \
       && !(W)->pseudo_window_p                                         \
-      && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W)))            \
-      && !NILP (XBUFFER ((W)->buffer)->header_line_format))
+      && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME ((W))))          \
+      && BUFFERP ((W)->buffer)                                         \
+      && !NILP (XBUFFER ((W)->buffer)->header_line_format)             \
+      && XFASTINT ((W)->height) > 1 + !NILP (XBUFFER ((W)->buffer)->mode_line_format))
 
 \f     
 /***********************************************************************
@@ -1089,6 +1178,9 @@ enum lface_attribute_index
   LFACE_OVERLINE_INDEX,
   LFACE_STRIKE_THROUGH_INDEX,
   LFACE_BOX_INDEX,
+  LFACE_FONT_INDEX,
+  LFACE_INHERIT_INDEX,
+  LFACE_AVGWIDTH_INDEX,
   LFACE_VECTOR_SIZE
 };
 
@@ -1126,8 +1218,8 @@ struct face
 
 #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;
   
   /* Font used for this face, or null if the font could not be loaded
@@ -1136,8 +1228,9 @@ struct face
      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 */
 
@@ -1166,9 +1259,6 @@ struct face
      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
@@ -1185,7 +1275,11 @@ struct face
   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 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
@@ -1226,12 +1320,12 @@ struct face
   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; 
 
   /* 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;
@@ -1247,8 +1341,17 @@ struct face
   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;
+
+  /* If this face is for ASCII characters, this points this face
+     itself.  Otherwise, this points a face for ASCII characters.  */
+  struct face *ascii_face;
 };
 
 
@@ -1260,7 +1363,7 @@ struct face
 
 #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)
 
@@ -1276,8 +1379,9 @@ enum face_id
 {
   DEFAULT_FACE_ID,
   MODE_LINE_FACE_ID,
+  MODE_LINE_INACTIVE_FACE_ID,
   TOOL_BAR_FACE_ID,
-  BITMAP_AREA_FACE_ID,
+  FRINGE_FACE_ID,
   HEADER_LINE_FACE_ID,
   SCROLL_BAR_FACE_ID,
   BORDER_FACE_ID,
@@ -1304,6 +1408,10 @@ struct face_cache
 
   /* 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;
 };
 
 
@@ -1324,33 +1432,30 @@ struct face_cache
       ? 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
-   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)))
 
-/* The default registry and encoding to use.  */
+#else /* not HAVE_WINDOW_SYSTEM */
+
+#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.  */
@@ -1512,7 +1617,7 @@ struct it
   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
@@ -1523,9 +1628,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
-     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.  */
@@ -1560,6 +1665,7 @@ struct it
     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;
@@ -1601,9 +1707,21 @@ struct it
   /* 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,
-     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
@@ -1624,10 +1742,6 @@ struct it
      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;
 
@@ -1665,10 +1779,9 @@ struct it
      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.  */
@@ -1814,8 +1927,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
-     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
@@ -1825,6 +1942,9 @@ struct redisplay_interface
   /* 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,
@@ -1851,14 +1971,14 @@ extern int (* estimate_mode_line_height_hook) P_ ((struct frame *,
                                Images
  ***********************************************************************/
 
-#ifdef HAVE_X_WINDOWS
+#ifdef HAVE_WINDOW_SYSTEM
 
 /* Structure forward declarations.  */
 
 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
@@ -1899,6 +2019,22 @@ struct image
   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;
 
@@ -1907,9 +2043,12 @@ struct image
 #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 the image centered on the
+     line.  */
   int ascent;
 #define DEFAULT_IMAGE_ASCENT 50
+#define CENTERED_IMAGE_ASCENT -1
 
   /* Lisp specification of this image.  */
   Lisp_Object spec;
@@ -1917,8 +2056,8 @@ struct image
   /* 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;
@@ -1970,11 +2109,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.  */
 
@@ -1987,7 +2121,7 @@ struct image_cache
 
 #define IMAGE_CACHE_BUCKETS_SIZE 1001
 
-#endif /* HAVE_X_WINDOWS */
+#endif /* HAVE_WINDOW_SYSTEM */
 
 
 \f
@@ -2050,12 +2184,20 @@ extern int auto_raise_tool_bar_buttons_p;
 
 /* 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.  */
 
 extern int tool_bar_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
 /***********************************************************************
@@ -2064,7 +2206,13 @@ extern int tool_bar_button_relief;
 
 /* Defined in xdisp.c */
 
-void resize_echo_area_axactly P_ ((void));
+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 *));
@@ -2075,7 +2223,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));
-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,
@@ -2083,20 +2231,27 @@ 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 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 move_it_vertically_backward P_ ((struct it *, 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 tool_bar_item_info P_ ((struct frame *, struct glyph *, int *));
 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 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 */
 
@@ -2109,13 +2264,12 @@ void init_sigio P_ ((int));
 
 /* Defined in xfaces.c */
 
-#ifdef USE_X_TOOLKIT
-void x_set_menu_resources_from_menu_face P_ ((struct frame *, Widget));
+#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));
-char *x_charset_registry P_ ((int));
 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,
@@ -2124,10 +2278,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 face_suitable_for_iso8859_1_p P_ ((struct face *));
 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));
@@ -2137,17 +2289,25 @@ 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));
 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  */
 
-#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));
@@ -2159,16 +2319,41 @@ 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));
-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;
-EXFUN (Fx_show_tip, 4);
+EXFUN (Fx_show_tip, 6);
 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  */
@@ -2177,8 +2362,11 @@ int popup_activated P_ ((void));
 
 /* 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 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 *));
@@ -2200,10 +2388,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 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 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 *));
@@ -2219,13 +2407,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 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));
+extern Lisp_Object Qredisplay_dont_pause;
 
 /* Defined in term.c */
 
@@ -2239,7 +2429,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 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));
@@ -2248,10 +2437,11 @@ 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 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));
-void change_line_highlight P_ ((int, int, int, int));
 
 /* Defined in scroll.c */