diff src/redisplay.h @ 428:3ecd8885ac67 r21-2-22

Import from CVS: tag r21-2-22
author cvs
date Mon, 13 Aug 2007 11:28:15 +0200
parents
children a5df635868b2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/redisplay.h	Mon Aug 13 11:28:15 2007 +0200
@@ -0,0 +1,780 @@
+/* Redisplay data structures.
+   Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
+   Copyright (C) 1996 Chuck Thompson.
+   Copyright (C) 1995, 1996 Ben Wing.
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Not in FSF. */
+
+#ifndef _XEMACS_REDISPLAY_H_
+#define _XEMACS_REDISPLAY_H_
+
+/* Redisplay DASSERT types */
+#define DB_DISP_POS		1
+#define DB_DISP_TEXT_LAYOUT	2
+#define DB_DISP_REDISPLAY	4
+
+/* These are the possible return values from pixel_to_glyph_translation. */
+#define OVER_MODELINE		0
+#define OVER_TEXT		1
+#define OVER_OUTSIDE		2
+#define OVER_NOTHING		3
+#define OVER_BORDER		4
+#define OVER_TOOLBAR		5
+#define OVER_V_DIVIDER		6
+
+#define NO_BLOCK	-1
+
+/* Imagine that the text in the buffer is displayed on a piece of paper
+   the width of the frame and very very tall.  The line start cache is
+   an array of struct line_start_cache's, describing the start and
+   end buffer positions for a contiguous set of lines on that piece
+   of paper. */
+
+typedef struct line_start_cache line_start_cache;
+struct line_start_cache
+{
+  Bufpos start, end;
+  int height;
+};
+
+typedef struct
+{
+  Dynarr_declare (line_start_cache);
+} line_start_cache_dynarr;
+
+/* The possible types of runes.
+
+   #### The Lisp_Glyph type is broken.  There should instead be a pixmap
+   type.  Currently the device-specific output routines have to worry
+   about whether the glyph is textual or not, etc.  For Mule this is
+   a big problem because you might need multiple fonts to display the
+   text.  It also eliminates optimizations that could come from glumping
+   the text of multiple text glyphs together -- this makes displaying
+   binary files (with lots of control chars, etc.) very very slow. */
+
+#define RUNE_BLANK	0
+#define RUNE_CHAR	1
+#define RUNE_DGLYPH	2
+#define RUNE_HLINE	3
+#define RUNE_VLINE	4
+
+#define CURSOR_ON	0
+#define CURSOR_OFF	1
+#define NO_CURSOR	2
+#define NEXT_CURSOR	3
+#define IGNORE_CURSOR	4
+
+#define DEFAULT_INDEX	(face_index) 0
+#define MODELINE_INDEX	(face_index) 1
+
+/* A rune is a single display element, such as a printable character
+   or pixmap.  Any single character in a buffer has one or more runes
+   (or zero, if the character is invisible) corresponding to it.
+   (Printable characters typically have one rune associated with them,
+   but control characters have two -- a ^ and a letter -- and other
+   non-printing characters (those displayed in octal) have four. */
+
+/* WARNING! In compare_runes (one of the most heavily used functions)
+   two runes are compared. So please be careful with changes to this
+   structure. See comments in compare_runes.
+
+   #### This should really be made smaller.
+*/
+   
+typedef struct rune rune;
+struct rune
+{
+  face_index findex;		/* face rune is displayed with.  The
+				   face_index is an index into a
+				   window-specific array of face cache
+				   elements.  Each face cache element
+				   corresponds to one "merged face"
+				   (the result of merging all the
+				   faces that overlap the rune) and
+				   contains the instance values for
+				   each of the face properties in this
+				   particular window. */
+
+  Bufpos bufpos;		/* buffer position this rune is displaying;
+				   for the modeline, the value here is a
+				   Charcount, but who's looking? */
+  Bufpos endpos;		/* if set this rune covers a range of pos */
+ 				/* #### Chuck, what does it mean for a rune
+				   to cover a range of pos?  I don't get
+				   this. */
+                                /* #### This isn't used as an rvalue anywhere!
+                                   remove! */
+                                   
+  
+  short xpos;			/* horizontal starting position in pixels */
+  short width;			/* pixel width of rune */
+       
+  
+  unsigned char cursor_type;	/* is this rune covered by the cursor? */
+  unsigned char type;		/* type of rune object */
+                                /* We used to do bitfields here, but if I
+                                   (JV) count correctly that doesn't matter
+                                   for the size of the structure. All the bit
+                                   fiddling _does_ slow down redisplay by
+                                   about 10%. So don't do that */
+
+  union				/* Information specific to the type of rune */
+  {
+    /* #### GLyps are are. Is it really necessary to waste 8 bytes on every
+       rune for that?! */
+    /* DGLYPH */
+    struct
+    {
+      Lisp_Object glyph;
+      Lisp_Object extent;	/* extent rune is attached to, if any.
+                                   If this is a rune in the modeline
+                                   then this might be nil. */
+
+      int xoffset;		/* Number of pixels that need to be
+				   chopped off the left of the glyph.
+				   This has the effect of shifting the
+				   glyph to the left while still clipping
+				   at XPOS. */
+    } dglyph;
+
+    /* CHAR */
+    struct
+    {
+      Emchar ch;		/* Character of this rune. */
+    } chr;
+
+    /* HLINE */
+    struct
+    {
+      short thickness;	/* how thick to make hline */
+      short yoffset;	/* how far down from top of line to put top */
+    } hline;
+  } object;			/* actual rune object */
+};
+
+typedef struct
+{
+  Dynarr_declare (rune);
+} rune_dynarr;
+
+/* These must have distinct values.  Note that the ordering actually
+   represents priority levels.  TEXT has the lowest priority level. */
+enum display_type
+{
+  TEXT,
+  LEFT_OUTSIDE_MARGIN,
+  LEFT_INSIDE_MARGIN,
+  RIGHT_INSIDE_MARGIN,
+  RIGHT_OUTSIDE_MARGIN,
+  OVERWRITE
+};
+
+/* A display block represents a run of text on a single line.
+   Apparently there is only one display block per line for each
+   of the types listed in `enum display_type'.
+
+   A display block consists mostly of an array of runes, one per
+   atomic display element (printable character, pixmap, etc.). */
+
+/* #### Yuckity yuckity yuck yuck yuck yuck yuck!!
+
+   Chuck, I think you should redo this.  It should not be the
+   responsibility of the device-specific code to worry about
+   the different faces.  The generic stuff in redisplay-output.c
+   should glump things up into sub-blocks, each of which
+   corresponds to a single pixmap or a single run of text in
+   the same font.
+
+   It might still make sense for the device-specific output routine
+   to get passed an entire display line.  That way, it can make
+   calls to XDrawText() (which draws multiple runs of single-font
+   data) instead of XDrawString().  The reason for this is to
+   reduce the amount of X traffic, which will help things significantly
+   on a slow line. */
+
+typedef struct display_block display_block;
+struct display_block
+{
+  enum display_type type;	/* type of display block */
+
+  int start_pos;		/* starting pixel position of block */
+  int end_pos;			/* ending pixel position of block */
+
+  rune_dynarr *runes;		/* Dynamic array of runes */
+};
+
+typedef struct
+{
+  Dynarr_declare (display_block);
+} display_block_dynarr;
+
+typedef struct layout_bounds_type
+{
+  int left_out;
+  int left_in;
+  int left_white;
+  int right_white;
+  int right_in;
+  int right_out;
+} layout_bounds;
+
+typedef struct glyph_block glyph_block;
+struct glyph_block
+{
+  Lisp_Object glyph;
+  Lisp_Object extent;
+  /* The rest are only used by margin routines. */
+  face_index findex;
+  int active;
+  int width;
+};
+
+typedef struct
+{
+  Dynarr_declare (glyph_block);
+} glyph_block_dynarr;
+
+/*************************************************************************/
+/*                              display lines                             */
+/*************************************************************************/
+
+/*  Modeline commentary: IMO the modeline is handled very badly, we
+  special case virtually *everything* in the redisplay routines for
+  the modeline. The fact that dl->bufpos can be either a buffer
+  position or a char count highlights this. There is no abstraction at
+  all that I can find and it means that the code is made very ugly as
+  a result. Either we should treat the modeline *entirely* separately,
+  or we should abstract to something that applies equally well to the
+  modeline and to buffer text, the things are not enormously different
+  after all and handling them identically at some level would
+  eliminate some bugs that still exist (mainly to do with modeline
+  handling). This problem doesn't help trying to implement gutters
+  which are somewhere in between buffer text and modeline text.
+
+  Redisplay commentary: Everything in redisplay is tied very tightly
+  to the things that are being displayed, and the context,
+  e.g. buffers and windows. According to Chuck this is so that we can
+  get speed, which seems fine to me, however this usage is extended
+  too far down the redispay routines IMO. At some level there should
+  be functions that know how to display strings with extents and
+  faces, regardless of buffer etc. After all the window system does
+  not care. <andy@xemacs.org> */
+
+typedef struct display_line display_line;
+struct display_line
+{
+  short ypos;				/* vertical position in pixels
+					   of the baseline for this line. */
+  unsigned short ascent, descent;	/* maximum values for this line.
+					   The ascent is the number of
+					   pixels above the baseline, and
+					   the descent is the number of
+					   pixels below the baseline.
+					   The descent includes the baseline
+					   pixel-row itself, I think. */
+  unsigned short clip;			/* amount of bottom of line to clip
+					   in pixels.*/
+  unsigned short top_clip;		/* amount of top of line to clip
+					   in pixels.*/
+  Bufpos bufpos;			/* first buffer position on line */
+  Bufpos end_bufpos;			/* last buffer position on line */
+  Charcount offset;			/* adjustment to bufpos vals */
+  Charcount num_chars;			/* # of chars on line
+					   including expansion of tabs
+					   and control chars */
+  int cursor_elt;			/* rune block of TEXT display
+					   block cursor is at or -1 */
+  char used_prop_data;			/* can't incrementally update if line
+					   used propagation data */
+
+  layout_bounds bounds;			/* line boundary positions */
+
+  char modeline;			/* t if this line is a modeline */
+
+  /* Dynamic array of display blocks */
+  display_block_dynarr *display_blocks;
+
+  /* Dynamic arrays of left and right glyph blocks */
+  glyph_block_dynarr *left_glyphs;
+  glyph_block_dynarr *right_glyphs;
+
+  face_index	left_margin_findex;
+  face_index	right_margin_findex;
+  face_index	default_findex;
+};
+
+#define DISPLAY_LINE_HEIGHT(dl) \
+(dl->ascent + dl->descent - (dl->clip + dl->top_clip))
+#define DISPLAY_LINE_YPOS(dl) \
+(dl->ypos - (dl->ascent - dl->top_clip))
+#define DISPLAY_LINE_YEND(dl) \
+((dl->ypos + dl->descent) - dl->clip)
+
+typedef struct
+{
+  Dynarr_declare (display_line);
+} display_line_dynarr;
+
+/* The following two structures are used to represent an area to
+displayed and where to display it. Using these two structures all
+combinations of clipping and position can be accommodated.  */
+
+/* This represents an area to be displayed into. */
+typedef struct display_box display_box;
+struct display_box
+{
+  int xpos;		/* absolute horizontal position of area */
+  int ypos;		/* absolute vertical position of area */
+  int width, height;
+};
+
+/* This represents the area from a glyph to be displayed. */
+typedef struct display_glyph_area display_glyph_area;
+struct display_glyph_area
+{
+  int xoffset;		/* horizontal offset of the glyph, +ve means
+			   display the glyph with x offset by xoffset,
+			   -ve means display starting xoffset into the
+			   glyph. */
+  int yoffset;		/* vertical offset of the glyph, +ve means
+			   display the glyph with y offset by yoffset,
+			   -ve means display starting xoffset into the
+			   glyph. */
+  int width, height;	/* width and height of glyph to display. */
+};
+
+/* It could be argued that the following two structs belong in
+   extents.h, but they're only used by redisplay and it simplifies
+   the header files to put them here. */
+
+typedef struct
+{
+  Dynarr_declare (EXTENT);
+} EXTENT_dynarr;
+
+struct font_metric_info
+{
+  int width;
+  int height;			/* always ascent + descent; for convenience */
+  int ascent;
+  int descent;
+
+  int proportional_p;
+};
+
+/* NOTE NOTE NOTE: Currently the positions in an extent fragment
+   structure are Bytind's, not Bufpos's.  This could change. */
+
+struct extent_fragment
+{
+  Lisp_Object object; /* buffer or string */
+  struct frame *frm;
+  Bytind pos, end;
+  EXTENT_dynarr *extents;
+  glyph_block_dynarr *begin_glyphs, *end_glyphs;
+  unsigned int invisible:1;
+  unsigned int invisible_ellipses:1;
+  unsigned int previously_invisible:1;
+  unsigned int invisible_ellipses_already_displayed:1;
+};
+
+#define EDGE_TOP 1
+#define EDGE_LEFT 2
+#define EDGE_BOTTOM 4
+#define EDGE_RIGHT 8
+#define EDGE_ALL (EDGE_TOP | EDGE_LEFT | EDGE_BOTTOM | EDGE_RIGHT)
+
+
+/*************************************************************************/
+/*                              change flags                             */
+/*************************************************************************/
+
+/* Quick flags to signal redisplay.  redisplay() sets them all to 0
+   when it finishes.  If none of them are set when it starts, it
+   assumes that nothing needs to be done.  Functions that make a change
+   that is (potentially) visible on the screen should set the
+   appropriate flag.
+
+   If any of these flags are set, redisplay will look more carefully
+   to see if anything has really changed. */
+
+/* non-nil if the contents of a buffer have changed since the last time
+   redisplay completed */
+extern int buffers_changed;
+extern int buffers_changed_set;
+
+/* Nonzero if head_clip or tail_clip of a buffer has changed
+ since last redisplay that finished */
+extern int clip_changed;
+extern int clip_changed_set;
+
+/* non-nil if any extent has changed since the last time redisplay completed */
+extern int extents_changed;
+extern int extents_changed_set;
+
+/* non-nil if any face has changed since the last time redisplay completed */
+extern int faces_changed;
+
+/* Nonzero means one or more frames have been marked as garbaged */
+extern int frame_changed;
+
+/* True if any of the builtin display glyphs (continuation,
+   hscroll, control-arrow, etc) is in need of updating
+   somewhere. */
+extern int glyphs_changed;
+extern int glyphs_changed_set;
+
+/* True if any displayed subwindow is in need of updating
+   somewhere. */
+extern int subwindows_changed;
+extern int subwindows_changed_set;
+
+/* True if any displayed subwindow is in need of updating
+   somewhere. */
+extern int subwindows_state_changed;
+extern int subwindows_state_changed_set;
+
+/* True if an icon is in need of updating somewhere. */
+extern int icon_changed;
+extern int icon_changed_set;
+
+/* True if a menubar is in need of updating somewhere. */
+extern int menubar_changed;
+extern int menubar_changed_set;
+
+/* true iff we should redraw the modelines on the next redisplay */
+extern int modeline_changed;
+extern int modeline_changed_set;
+
+/* non-nil if point has changed in some buffer since the last time
+   redisplay completed */
+extern int point_changed;
+extern int point_changed_set;
+
+/* non-nil if some frame has changed its size */
+extern int size_changed;
+
+/* non-nil if some device has signaled that it wants to change size */
+extern int asynch_device_change_pending;
+
+/* non-nil if any toolbar has changed */
+extern int toolbar_changed;
+extern int toolbar_changed_set;
+
+/* non-nil if any gutter has changed */
+extern int gutter_changed;
+extern int gutter_changed_set;
+
+/* non-nil if any window has changed since the last time redisplay completed */
+extern int windows_changed;
+
+/* non-nil if any frame's window structure has changed since the last
+   time redisplay completed */
+extern int windows_structure_changed;
+
+/* These macros can be relatively expensive.  Since they are often
+   called numerous times between each call to redisplay, we keep track
+   if each has already been called and don't bother doing most of the
+   work if it is currently set. */
+
+#define MARK_TYPE_CHANGED(object) do {				\
+  if (!object##_changed_set) {					\
+    Lisp_Object MTC_devcons, MTC_concons;			\
+    DEVICE_LOOP_NO_BREAK (MTC_devcons, MTC_concons)		\
+      {								\
+        Lisp_Object MTC_frmcons;				\
+        struct device *MTC_d = XDEVICE (XCAR (MTC_devcons));	\
+        DEVICE_FRAME_LOOP (MTC_frmcons, MTC_d)			\
+	  {							\
+	    struct frame *MTC_f = XFRAME (XCAR (MTC_frmcons));	\
+            MTC_f->object##_changed = 1;			\
+	    MTC_f->modiff++;					\
+	  }							\
+        MTC_d->object##_changed = 1;				\
+      }								\
+    object##_changed = 1;					\
+    object##_changed_set = 1; }					\
+  }  while (0)
+
+#define MARK_BUFFERS_CHANGED MARK_TYPE_CHANGED (buffers)
+#define MARK_CLIP_CHANGED MARK_TYPE_CHANGED (clip)
+#define MARK_EXTENTS_CHANGED MARK_TYPE_CHANGED (extents)
+#define MARK_ICON_CHANGED MARK_TYPE_CHANGED (icon)
+#define MARK_MENUBAR_CHANGED MARK_TYPE_CHANGED (menubar)
+#define MARK_MODELINE_CHANGED MARK_TYPE_CHANGED (modeline)
+#define MARK_POINT_CHANGED MARK_TYPE_CHANGED (point)
+#define MARK_TOOLBAR_CHANGED MARK_TYPE_CHANGED (toolbar)
+#define MARK_GUTTER_CHANGED MARK_TYPE_CHANGED (gutter)
+#define MARK_GLYPHS_CHANGED MARK_TYPE_CHANGED (glyphs)
+#define MARK_SUBWINDOWS_CHANGED MARK_TYPE_CHANGED (subwindows)
+#define MARK_SUBWINDOWS_STATE_CHANGED MARK_TYPE_CHANGED (subwindows_state)
+
+
+#define CLASS_RESET_CHANGED_FLAGS(p) do {	\
+  (p)->buffers_changed = 0;			\
+  (p)->clip_changed = 0;			\
+  (p)->extents_changed = 0;			\
+  (p)->faces_changed = 0;			\
+  (p)->frame_changed = 0;			\
+  (p)->icon_changed = 0;			\
+  (p)->menubar_changed = 0;			\
+  (p)->modeline_changed = 0;			\
+  (p)->point_changed = 0;			\
+  (p)->toolbar_changed = 0;			\
+  (p)->gutter_changed = 0;			\
+  (p)->glyphs_changed = 0;			\
+  (p)->subwindows_changed = 0;			\
+  (p)->subwindows_state_changed = 0;		\
+  (p)->windows_changed = 0;			\
+  (p)->windows_structure_changed = 0;		\
+} while (0)
+
+#define GLOBAL_RESET_CHANGED_FLAGS do {		\
+  buffers_changed = 0;				\
+  clip_changed = 0;				\
+  extents_changed = 0;				\
+  faces_changed = 0;				\
+  frame_changed = 0;				\
+  icon_changed = 0;				\
+  menubar_changed = 0;				\
+  modeline_changed = 0;				\
+  point_changed = 0;				\
+  toolbar_changed = 0;				\
+  gutter_changed = 0;				\
+  glyphs_changed = 0;				\
+  subwindows_changed = 0;			\
+  subwindows_state_changed = 0;			\
+  windows_changed = 0;				\
+  windows_structure_changed = 0;		\
+} while (0)
+
+#define CLASS_REDISPLAY_FLAGS_CHANGEDP(p)	\
+  ( (p)->buffers_changed ||			\
+    (p)->clip_changed ||			\
+    (p)->extents_changed ||			\
+    (p)->faces_changed ||			\
+    (p)->frame_changed ||			\
+    (p)->icon_changed ||			\
+    (p)->menubar_changed ||			\
+    (p)->modeline_changed ||			\
+    (p)->point_changed ||			\
+    (p)->toolbar_changed ||			\
+    (p)->gutter_changed ||			\
+    (p)->glyphs_changed ||			\
+    (p)->subwindows_changed ||			\
+    (p)->subwindows_state_changed ||		\
+    (p)->windows_changed ||			\
+    (p)->windows_structure_changed )
+
+#define GLOBAL_REDISPLAY_FLAGS_CHANGEDP		\
+  ( buffers_changed ||				\
+    clip_changed ||				\
+    extents_changed ||				\
+    faces_changed ||				\
+    frame_changed ||				\
+    icon_changed ||				\
+    menubar_changed ||				\
+    modeline_changed ||				\
+    point_changed ||				\
+    toolbar_changed ||				\
+    gutter_changed ||				\
+    glyphs_changed ||				\
+    subwindows_changed ||			\
+    subwindows_state_changed ||			\
+    windows_changed ||				\
+    windows_structure_changed )
+
+
+/* Anytime a console, device or frame is added or deleted we need to reset
+   these flags. */
+#define RESET_CHANGED_SET_FLAGS do {	\
+  buffers_changed_set = 0;		\
+  clip_changed_set = 0;			\
+  extents_changed_set = 0;		\
+  icon_changed_set = 0;			\
+  menubar_changed_set = 0;		\
+  modeline_changed_set = 0;		\
+  point_changed_set = 0;		\
+  toolbar_changed_set = 0;		\
+  gutter_changed_set = 0;		\
+  glyphs_changed_set = 0;		\
+  subwindows_changed_set = 0;		\
+  subwindows_state_changed_set = 0;	\
+} while (0)
+
+
+/*************************************************************************/
+/*                       redisplay global variables                      */
+/*************************************************************************/
+
+/* redisplay structure used by various utility routines. */
+extern display_line_dynarr *cmotion_display_lines;
+
+/* Nonzero means truncate lines in all windows less wide than the frame. */
+extern int truncate_partial_width_windows;
+
+/* Nonzero if we're in a display critical section. */
+extern int in_display;
+
+/* Nonzero means no need to redraw the entire frame on resuming
+   a suspended Emacs.  This is useful on terminals with multiple pages,
+   where one page is used for Emacs and another for all else. */
+extern int no_redraw_on_reenter;
+
+/* Nonzero means flash the frame instead of ringing the bell.  */
+extern int visible_bell;
+
+/* Thickness of shadow border around 3D modelines. */
+extern Lisp_Object Vmodeline_shadow_thickness;
+
+/* Scroll if point lands on the bottom line and that line is partially
+   clipped. */
+extern int scroll_on_clipped_lines;
+
+extern Lisp_Object Vglobal_mode_string;
+
+/* The following two variables are defined in emacs.c and are used
+   to convey information discovered on the command line way early
+   (before *anything* is initialized). */
+
+/* If non-zero, a window-system was specified on the command line.
+   Defined in emacs.c. */
+extern int display_arg;
+
+/* Type of display specified.  Defined in emacs.c. */
+extern CONST char *display_use;
+
+/* Nonzero means reading single-character input with prompt
+   so put cursor on minibuffer after the prompt.  */
+
+extern int cursor_in_echo_area;
+
+extern Lisp_Object Qbar_cursor, Qcursor_in_echo_area, Vwindow_system;
+
+
+/*************************************************************************/
+/*                     redisplay exported functions                      */
+/*************************************************************************/
+EXFUN (Fredraw_frame, 2);
+
+int redisplay_text_width_string (struct window *w, int findex,
+				 Bufbyte *nonreloc, Lisp_Object reloc,
+				 Bytecount offset, Bytecount len);
+int redisplay_frame_text_width_string (struct frame *f,
+				       Lisp_Object face,
+				       Bufbyte *nonreloc,
+				       Lisp_Object reloc,
+				       Bytecount offset, Bytecount len);
+void redisplay (void);
+struct display_block *get_display_block_from_line (struct display_line *dl,
+						   enum display_type type);
+layout_bounds calculate_display_line_boundaries (struct window *w,
+						 int modeline);
+Bufpos point_at_center (struct window *w, int type, Bufpos start,
+			Bufpos point);
+int line_at_center (struct window *w, int type, Bufpos start, Bufpos point);
+int window_half_pixpos (struct window *w);
+void redisplay_echo_area (void);
+void free_display_structs (struct window_mirror *mir);
+void free_display_lines (display_line_dynarr *dla);
+Bufbyte *generate_formatted_string (struct window *w, Lisp_Object format_str,
+                                    Lisp_Object result_str, face_index findex,
+                                    int type);
+void generate_displayable_area (struct window *w, Lisp_Object disp_string,
+				int xpos, int ypos, int width, int height,
+				display_line_dynarr* dl,
+				Bufpos start_pos, face_index default_face);
+int real_current_modeline_height (struct window *w);
+int pixel_to_glyph_translation (struct frame *f, int x_coord,
+				int y_coord, int *col, int *row,
+				int *obj_x, int *obj_y,
+				struct window **w, Bufpos *bufpos,
+				Bufpos *closest, Charcount *modeline_closest,
+				Lisp_Object *obj1, Lisp_Object *obj2);
+void glyph_to_pixel_translation (struct window *w, int char_x,
+				 int char_y, int *pix_x, int *pix_y);
+void mark_redisplay (void);
+int point_in_line_start_cache (struct window *w, Bufpos point,
+			       int min_past);
+int point_would_be_visible (struct window *w, Bufpos startp,
+		    Bufpos point);
+Bufpos start_of_last_line (struct window *w, Bufpos startp);
+Bufpos end_of_last_line (struct window *w, Bufpos startp);
+Bufpos start_with_line_at_pixpos (struct window *w, Bufpos point,
+				  int pixpos);
+Bufpos start_with_point_on_display_line (struct window *w, Bufpos point,
+					 int line);
+int redisplay_variable_changed (Lisp_Object sym, Lisp_Object *val,
+				Lisp_Object in_object, int flags);
+void redisplay_glyph_changed (Lisp_Object glyph, Lisp_Object property,
+			      Lisp_Object locale);
+
+#ifdef MEMORY_USAGE_STATS
+int compute_display_line_dynarr_usage (display_line_dynarr *dyn,
+				       struct overhead_stats *ovstats);
+int compute_line_start_cache_dynarr_usage (line_start_cache_dynarr *dyn,
+					   struct overhead_stats *ovstats);
+#endif
+
+
+/* defined in redisplay-output.c */
+int get_next_display_block (layout_bounds bounds,
+			    display_block_dynarr *dba, int start_pos,
+			    int *next_start);
+void redisplay_output_layout (struct window *w,
+			      Lisp_Object image_instance,
+			      struct display_box* db, struct display_glyph_area* dga,
+			      face_index findex, int cursor_start, int cursor_width,
+			      int cursor_height);
+void redisplay_output_subwindow (struct window *w,
+				 Lisp_Object image_instance,
+				 struct display_box* db, struct display_glyph_area* dga,
+				 face_index findex, int cursor_start, int cursor_width,
+				 int cursor_height);
+void redisplay_unmap_subwindows_maybe (struct frame* f, int x, int y, int width, int height);
+void redisplay_output_pixmap (struct window *w,
+			      Lisp_Object image_instance,
+			      struct display_box* db, struct display_glyph_area* dga,
+			      face_index findex, int cursor_start, int cursor_width,
+			      int cursor_height, int offset_bitmap);
+int redisplay_calculate_display_boxes (struct display_line *dl, int xpos,
+				       int xoffset, int start_pixpos, int width,
+				       struct display_box* dest,
+				       struct display_glyph_area* src);
+int redisplay_normalize_glyph_area (struct display_box* dest,
+				    struct display_glyph_area* glyphsrc);
+void redisplay_clear_to_window_end (struct window *w, int ypos1, int ypos2);
+void redisplay_clear_region (Lisp_Object window, face_index findex, int x,
+			     int y, int width, int height);
+void redisplay_clear_bottom_of_window (struct window *w,
+				       display_line_dynarr *ddla,
+				       int min_start, int max_end);
+void redisplay_update_line (struct window *w, int first_line,
+			    int last_line, int update_values);
+void redisplay_output_window (struct window *w);
+void bevel_modeline (struct window *w, struct display_line *dl);
+int redisplay_move_cursor (struct window *w, Bufpos new_point,
+			   int no_output_end);
+void redisplay_redraw_cursor (struct frame *f, int run_begin_end_meths);
+void output_display_line (struct window *w, display_line_dynarr *cdla,
+			  display_line_dynarr *ddla, int line,
+			  int force_start, int force_end);
+
+#endif /* _XEMACS_REDISPLAY_H_ */