(minibuf_selected_window): Renamed from Vminibuf_selected_window.
[bpt/emacs.git] / src / dispextern.h
index 7485e6f..7777e56 100644 (file)
@@ -1,5 +1,5 @@
 /* Interface definitions for display code.
-   Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000
+   Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001
      Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -242,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.  */
@@ -281,8 +283,9 @@ struct glyph
      padding. */
   unsigned padding_p : 1;
 
-  /* 1 means the actual glyph is not available in the current
-     system.  */
+  /* 1 means the actual glyph is not available, draw a box instead.
+     This can happen when a font couldn't be loaded, or a character
+     doesn't have a glyph in a font.  */
   unsigned glyph_not_available_p : 1;
 
   /* Face of the glyph.  */
@@ -292,7 +295,7 @@ struct glyph
   /* 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. */
+     w32_char_font_type.  */
   unsigned w32_font_type : 2;
 #endif
 
@@ -372,7 +375,7 @@ 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                                          \
@@ -499,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;
 };
 
@@ -570,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
@@ -589,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
@@ -629,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;
@@ -665,12 +667,12 @@ 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.  */
@@ -683,7 +685,7 @@ struct glyph_row
   
   /* 1 means this line starts in the middle of a character consisting
      of more than one glyph.  Some glyphs have been put in the
-     previoius row, the rest are put in this row.  */
+     previous row, the rest are put in this row.  */
   unsigned starts_in_middle_of_char_p : 1;
 
   /* 1 in a current row means this row overlaps others.  */
@@ -692,6 +694,9 @@ struct glyph_row
   /* 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;
 };
@@ -714,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.  */
 
@@ -743,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)
@@ -909,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.  */
 
@@ -918,6 +923,32 @@ extern struct glyph_row scratch_glyph_row;
       ? MATRIX_HEADER_LINE_ROW (MATRIX)->height        \
       : 0)
 
+/* 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)
+
+
+/* Return the desired face id for the mode line of window W.  */
+
+#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
@@ -929,9 +960,9 @@ extern struct glyph_row scratch_glyph_row;
       : (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)))
+                                     CURRENT_MODE_LINE_FACE_ID (W))))
 
-/* Return the current height of the top line of window W.  If not
+/* 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'.  */
@@ -949,7 +980,7 @@ extern struct glyph_row scratch_glyph_row;
 #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)
@@ -963,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.  */
@@ -985,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)   \
@@ -999,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))                \
@@ -1012,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.  */
      
@@ -1048,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)))
@@ -1104,23 +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)))            \
+      && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME ((W))))          \
       && BUFFERP ((W)->buffer)                                         \
-      && !NILP (XBUFFER ((W)->buffer)->mode_line_format))
+      && !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)))            \
+      && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME ((W))))          \
       && BUFFERP ((W)->buffer)                                         \
-      && !NILP (XBUFFER ((W)->buffer)->header_line_format))
+      && !NILP (XBUFFER ((W)->buffer)->header_line_format)             \
+      && XFASTINT ((W)->height) > 1 + !NILP (XBUFFER ((W)->buffer)->mode_line_format))
 
 \f     
 /***********************************************************************
@@ -1147,6 +1180,7 @@ enum lface_attribute_index
   LFACE_BOX_INDEX,
   LFACE_FONT_INDEX,
   LFACE_INHERIT_INDEX,
+  LFACE_AVGWIDTH_INDEX,
   LFACE_VECTOR_SIZE
 };
 
@@ -1184,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
@@ -1194,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 */
 
@@ -1240,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
@@ -1281,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;
@@ -1302,6 +1341,11 @@ 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;
 
@@ -1319,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)
 
@@ -1335,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,
@@ -1363,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;
 };
 
 
@@ -1568,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
@@ -1579,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.  */
@@ -1616,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;
@@ -1730,7 +1780,7 @@ struct it
   int last_visible_y;
 
   /* Additional space in pixels between lines (for window systems
-     only.).  */
+     only.)  */
   int extra_line_spacing;
 
   /* If non-null, glyphs are produced in glyph_row with each call to
@@ -1880,7 +1930,7 @@ struct redisplay_interface
      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.  */
+     have to update the mouse highlight.  */
   void (*update_window_end_hook) P_ ((struct window *w, int cursor_on_p,
                                      int mouse_face_overwritten_p));
   
@@ -1928,7 +1978,7 @@ extern int (* estimate_mode_line_height_hook) P_ ((struct frame *,
 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
@@ -1969,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;
 
@@ -1978,7 +2044,7 @@ struct image
 #define DEFAULT_IMAGE_HEIGHT 30
 
   /* Percent of image height used as ascent.  A value of
-     CENTERED_IMAGE_ASCENT means draw center the image centered on the
+     CENTERED_IMAGE_ASCENT means draw the image centered on the
      line.  */
   int ascent;
 #define DEFAULT_IMAGE_ASCENT 50
@@ -1990,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;
@@ -2118,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
 /***********************************************************************
@@ -2132,8 +2206,13 @@ extern int tool_bar_button_relief;
 
 /* 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_axactly P_ ((void));
+void resize_echo_area_exactly P_ ((void));
 int resize_mini_window P_ ((struct window *, int));
 int try_window P_ ((Lisp_Object, struct text_pos));
 void window_box P_ ((struct window *, int, int *, int *, int *, int *));
@@ -2144,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,
@@ -2166,6 +2245,7 @@ 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));
@@ -2184,9 +2264,6 @@ 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));
-#endif
 #ifdef HAVE_X_WINDOWS
 void x_free_colors P_ ((struct frame *, unsigned long *, int));
 #endif
@@ -2212,8 +2289,8 @@ 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;
@@ -2242,13 +2319,39 @@ void forall_images_in_image_cache P_ ((struct frame *,
 int valid_image_p P_ ((Lisp_Object));
 void prepare_image_for_display P_ ((struct frame *, struct image *));
 int lookup_image P_ ((struct frame *, Lisp_Object));
+
+#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, 6);
 EXFUN (Fx_hide_tip, 0);
-extern void start_busy_cursor P_ ((void));
-extern void cancel_busy_cursor P_ ((void));
-extern int display_busy_cursor_p;
+extern void start_hourglass P_ ((void));
+extern void cancel_hourglass P_ ((void));
+extern int display_hourglass_p;
+
+/* Returns the background color of IMG, calculating one heuristically if
+   necessary.  If non-zero, XIMG is an existing XImage object to use for
+   the heuristic.  */
+
+#define IMAGE_BACKGROUND(img, f, ximg)                                       \
+   ((img)->background_valid                                                  \
+    ? (img)->background                                                              \
+    : image_background (img, f, ximg))
+
+/* Returns true if IMG has a `transparent' background, using heuristics
+   to decide if necessary.  If non-zero, MASK is an existing XImage
+   object to use for the heuristic.  */
+
+#define IMAGE_BACKGROUND_TRANSPARENT(img, f, mask)                           \
+   ((img)->background_transparent_valid                                              \
+    ? (img)->background_transparent                                          \
+    : image_background_transparent (img, f, mask))
 
 #endif /* HAVE_WINDOW_SYSTEM */
 
@@ -2259,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 *));
@@ -2301,7 +2407,8 @@ 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));
@@ -2322,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));
@@ -2331,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 */