changeset 4895:65ad2cd9f2ff

Automated merge with http://hg.debian.org/hg/xemacs/xemacs
author Ben Wing <ben@xemacs.org>
date Fri, 29 Jan 2010 15:06:36 -0600
parents 03ab78e48ef6 (current diff) eab9498ecc0e (diff)
children 9a6c3653f58e
files src/ChangeLog
diffstat 5 files changed, 2625 insertions(+), 3701 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Thu Jan 28 12:59:48 2010 -0700
+++ b/src/ChangeLog	Fri Jan 29 15:06:36 2010 -0600
@@ -21,6 +21,58 @@
 
 2010-01-18  Ben Wing  <ben@xemacs.org>
 
+	* redisplay-gtk.c:
+	* redisplay-gtk.c (gtk_bevel_area):
+	* redisplay-x.c:
+	* redisplay-x.c (THIS_IS_X):
+	* redisplay-xlike-inc.c:
+	* redisplay-xlike-inc.c (XLIKE_text_width_single_run):
+	* redisplay-xlike-inc.c (XLIKE_text_width):
+	* redisplay-xlike-inc.c (XLIKE_output_display_block):
+	* redisplay-xlike-inc.c (XLIKE_get_gc):
+	* redisplay-xlike-inc.c (XLIKE_output_string):
+	* redisplay-xlike-inc.c (XLIKE_OUTPUT_XLIKE_PIXMAP):
+	* redisplay-xlike-inc.c (XLIKE_output_pixmap):
+	* redisplay-xlike-inc.c (XLIKE_output_vertical_divider):
+	* redisplay-xlike-inc.c (XLIKE_output_blank):
+	* redisplay-xlike-inc.c (XLIKE_output_horizontal_line):
+	* redisplay-xlike-inc.c (XLIKE_clear_region):
+	* redisplay-xlike-inc.c (XLIKE_output_eol_cursor):
+	* redisplay-xlike-inc.c (XLIKE_clear_frame_window):
+	* redisplay-xlike-inc.c (XLIKE_clear_frame):
+	* redisplay-xlike-inc.c (XLIKE_flash):
+	* redisplay-xlike-inc.c (console_type_create_redisplay_XLIKE):
+	Move lots more code into redisplay-xlike-inc.c.  Use macros to
+	isolate the code that differs among X vs. GTK, to reduce the need
+	for ifdefs in the middle of the code.  Now, redisplay-x.c and
+	redisplay-gtk.c only contain a few functions whose implementation
+	is completely different from one to the other, or which are not
+	present at all in one of them.
+
+	GTK code not currently tested, but it has bitrotted somewhat
+	any.  Doing this will help keep it less bitrotty.
+
+	* depend: Regenerate.
+
+2010-01-18  Ben Wing  <ben@xemacs.org>
+
+	* redisplay-xlike-inc.c:
+	* redisplay-xlike-inc.c (separate_textual_runs_nomule):
+	* redisplay-xlike-inc.c (separate_textual_runs_xft_nomule):
+	* redisplay-xlike-inc.c (separate_textual_runs_xft_mule):
+	* redisplay-xlike-inc.c (separate_textual_runs_mule):
+	Break separate_textual_runs_* functions from redisplay-x.c.
+	(Code in redisplay-gtk.c should have been identical but was
+	bit-rotted.)
+	
+	* redisplay-gtk.c:
+	* redisplay-x.c:
+	Delete code, replace with include statement.
+
+	* depend: Regenerate.
+
+2010-01-18  Ben Wing  <ben@xemacs.org>
+
 	* lisp.h:
 	* print.c:
 	New variable `in_debug_print'.
--- a/src/depend	Thu Jan 28 12:59:48 2010 -0700
+++ b/src/depend	Fri Jan 29 15:06:36 2010 -0600
@@ -33,6 +33,7 @@
 #if defined(HAVE_XLIKE)
 event-xlike-inc.o: 
 objects-xlike-inc.o: 
+redisplay-xlike-inc.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console-x-impl.h console-x.h console.h debug.h device-impl.h device.h devslots.h dumper.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h gccache-gtk.h general-slots.h glyphs-gtk.h glyphs-x.h glyphs.h gutter.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h mule-ccl.h number-gmp.h number-mp.h number.h objects-gtk-impl.h objects-gtk.h objects-impl.h objects-x-impl.h objects-x.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysproc.h syssignal.h systime.h text.h vdb.h window-impl.h window.h winslots.h xgccache.h xintrinsic.h xintrinsicp.h xmotif.h xmprimitivep.h
 #endif
 #if defined(HAVE_X_WINDOWS)
 EmacsFrame.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h EmacsManager.h charset.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h faces.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-x.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-x.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h text.h toolbar.h vdb.h window-impl.h window.h winslots.h xintrinsic.h xintrinsicp.h xmotif.h xmprimitivep.h
@@ -42,23 +43,23 @@
 balloon-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h balloon_help.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h specifier.h symeval.h symsinit.h text.h vdb.h xintrinsic.h
 balloon_help.o: $(CONFIG_H) balloon_help.h compiler.h xintrinsic.h
 console-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h elhash.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h process.h redisplay.h specifier.h symeval.h symsinit.h text.h vdb.h xintrinsic.h
-device-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h elhash.h events.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-x.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-x.h objects.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysdll.h sysfile.h systime.h text.h vdb.h window-impl.h window.h winslots.h xgccache.h xintrinsic.h xintrinsicp.h
+device-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h elhash.h events.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-x.h glyphs.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-x.h objects.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysdll.h sysfile.h systime.h syswindows.h text.h vdb.h window-impl.h window.h winslots.h xgccache.h xintrinsic.h xintrinsicp.h
 dialog-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h dumper.h events.h frame-impl.h frame.h frameslots.h gc.h general-slots.h gui.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h text.h vdb.h window.h xintrinsic.h
 frame-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h EmacsManager.h EmacsShell.h ExternalShell.h buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dragdrop.h dumper.h events.h extents.h faces.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-x.h glyphs.h gutter.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-impl.h objects-x-impl.h objects-x.h objects.h redisplay.h scrollbar-x.h scrollbar.h specifier.h symeval.h symsinit.h systime.h text.h vdb.h window-impl.h window.h winslots.h xintrinsic.h xintrinsicp.h xmotif.h xmprimitivep.h
-glyphs-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h bitmaps.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-x.h glyphs.h gui.h imgproc.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h objects-impl.h objects-x-impl.h objects-x.h objects.h opaque.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h sysproc.h syssignal.h systime.h text.h vdb.h window-impl.h window.h winslots.h xintrinsic.h xmotif.h
+glyphs-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h bitmaps.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-x.h glyphs.h gui.h imgproc.h insdel.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h objects-impl.h objects-x-impl.h objects-x.h objects.h opaque.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h sysproc.h syssignal.h systime.h syswindows.h text.h vdb.h window-impl.h window.h winslots.h xintrinsic.h xmotif.h
 gui-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h events.h frame.h gc.h general-slots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h menubar.h number-gmp.h number-mp.h number.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h text.h vdb.h window-impl.h window.h winslots.h xintrinsic.h xmotif.h
 intl-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h compiler.h console-x.h console.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h xintrinsic.h
 menubar-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h events.h frame-impl.h frame.h frameslots.h gc.h general-slots.h gui.h keymap.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h menubar.h number-gmp.h number-mp.h number.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h text.h vdb.h window-impl.h window.h winslots.h xintrinsic.h
 objects-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h charset.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h elhash.h font-mgr.h gc.h general-slots.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-impl.h objects-x-impl.h objects-x.h objects-xlike-inc.c objects.h specifier.h symeval.h symsinit.h text.h vdb.h xintrinsic.h
-redisplay-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h debug.h device-impl.h device.h devslots.h dumper.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-x.h glyphs.h gutter.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h mule-ccl.h number-gmp.h number-mp.h number.h objects-impl.h objects-x-impl.h objects-x.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysproc.h syssignal.h systime.h text.h vdb.h window-impl.h window.h winslots.h xgccache.h xintrinsic.h xintrinsicp.h xmotif.h xmprimitivep.h
+redisplay-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console-x-impl.h console-x.h console.h debug.h device-impl.h device.h devslots.h dumper.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h gccache-gtk.h general-slots.h glyphs-gtk.h glyphs-x.h glyphs.h gutter.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h mule-ccl.h number-gmp.h number-mp.h number.h objects-gtk-impl.h objects-gtk.h objects-impl.h objects-x-impl.h objects-x.h objects.h redisplay-xlike-inc.c redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysproc.h syssignal.h systime.h text.h vdb.h window-impl.h window.h winslots.h xgccache.h xintrinsic.h xintrinsicp.h xmotif.h xmprimitivep.h
 scrollbar-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-x.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar-x.h scrollbar.h specifier.h symeval.h symsinit.h text.h vdb.h window-impl.h window.h winslots.h xintrinsic.h
 select-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h charset.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h frame-impl.h frame.h frameslots.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-x.h objects.h opaque.h redisplay.h select-common.h select.h specifier.h symeval.h symsinit.h systime.h text.h vdb.h xintrinsic.h xmotif.h
 toolbar-x.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h charset.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h dumper.h faces.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-x.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-x.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h text.h toolbar-common.h toolbar.h vdb.h window-impl.h window.h winslots.h xintrinsic.h xintrinsicp.h xmotif.h xmprimitivep.h
 xgccache.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h hash.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h xgccache.h
 #endif
 #if defined(HAVE_TTY)
-console-tty.o: $(CONFIG_H) $(LISP_H) charset.h coding-system-slots.h compiler.h conslots.h console-impl.h console-stream.h console-tty-impl.h console-tty.h console.h dumper.h elhash.h faces.h file-coding.h frame.h gc.h general-slots.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h systty.h text.h vdb.h window-impl.h window.h winslots.h
-device-tty.o: $(CONFIG_H) $(LISP_H) charset.h compiler.h conslots.h console-impl.h console-stream.h console-tty-impl.h console-tty.h console.h device-impl.h device.h devslots.h dumper.h events.h faces.h frame.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h systime.h systty.h text.h vdb.h
+console-tty.o: $(CONFIG_H) $(LISP_H) charset.h coding-system-slots.h compiler.h conslots.h console-impl.h console-stream.h console-tty-impl.h console-tty.h console.h dumper.h elhash.h faces.h file-coding.h frame.h gc.h general-slots.h glyphs.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h systty.h syswindows.h text.h vdb.h window-impl.h window.h winslots.h
+device-tty.o: $(CONFIG_H) $(LISP_H) charset.h compiler.h conslots.h console-impl.h console-stream.h console-tty-impl.h console-tty.h console.h device-impl.h device.h devslots.h dumper.h events.h faces.h frame.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h systime.h systty.h syswindows.h text.h vdb.h
 event-tty.o: $(CONFIG_H) $(LISP_H) compiler.h conslots.h console-impl.h console-tty-impl.h console-tty.h console.h device.h dumper.h events.h frame.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h process.h redisplay.h specifier.h symeval.h symsinit.h sysproc.h syssignal.h systime.h systty.h syswait.h text.h vdb.h
 frame-tty.o: $(CONFIG_H) $(LISP_H) compiler.h conslots.h console-impl.h console-tty-impl.h console-tty.h console.h device-impl.h device.h devslots.h dumper.h events.h frame-impl.h frame.h frameslots.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h specifier.h symeval.h symsinit.h systime.h systty.h text.h vdb.h
 objects-tty.o: $(CONFIG_H) $(LISP_H) charset.h compiler.h conslots.h console-impl.h console-tty-impl.h console-tty.h console.h device.h dumper.h gc.h general-slots.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-impl.h objects-tty-impl.h objects-tty.h objects.h specifier.h symeval.h symsinit.h systty.h text.h vdb.h
@@ -66,7 +67,7 @@
 #endif
 #if defined(HAVE_GTK)
 console-gtk.o: $(CONFIG_H) $(LISP_H) charset.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h dumper.h elhash.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h process.h redisplay.h specifier.h symeval.h symsinit.h text.h vdb.h
-device-gtk.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h elhash.h events.h faces.h frame-impl.h frame.h frameslots.h gc.h gccache-gtk.h general-slots.h glyphs-gtk.h glyphs.h gtk-xemacs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-gtk.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h systime.h text.h vdb.h window-impl.h window.h winslots.h
+device-gtk.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h elhash.h events.h faces.h frame-impl.h frame.h frameslots.h gc.h gccache-gtk.h general-slots.h glyphs-gtk.h glyphs.h gtk-xemacs.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-gtk.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h systime.h syswindows.h text.h vdb.h window-impl.h window.h winslots.h
 dialog-gtk.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h dumper.h events.h frame.h gc.h general-slots.h gui.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h text.h vdb.h window.h
 emacs-marshals.o: hash.h
 emacs-widget-accessors.o: 
@@ -74,14 +75,14 @@
 frame-gtk.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h device-impl.h device.h devslots.h dragdrop.h dumper.h elhash.h events.h extents.h faces.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-gtk.h glyphs.h gtk-xemacs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-gtk-impl.h objects-gtk.h objects-impl.h objects.h redisplay.h scrollbar-gtk.h scrollbar.h specifier.h symeval.h symsinit.h sysdll.h systime.h text.h ui-gtk.h vdb.h window-impl.h window.h winslots.h
 gccache-gtk.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h gccache-gtk.h general-slots.h hash.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 glade.o: bytecode.h
-glyphs-gtk.o: $(CONFIG_H) $(LISP_H) bitmaps.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h elhash.h events.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-gtk.h glyphs.h gui.h imgproc.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h objects-gtk-impl.h objects-gtk.h objects-impl.h objects.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdll.h sysfile.h systime.h text.h ui-gtk.h vdb.h window-impl.h window.h winslots.h
+glyphs-gtk.o: $(CONFIG_H) $(LISP_H) bitmaps.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h elhash.h events.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-gtk.h glyphs.h gui.h imgproc.h insdel.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h objects-gtk-impl.h objects-gtk.h objects-impl.h objects.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdll.h sysfile.h systime.h syswindows.h text.h ui-gtk.h vdb.h window-impl.h window.h winslots.h
 gtk-glue.o: objects-gtk-impl.h objects-gtk.h objects-impl.h objects.h specifier.h
 gtk-xemacs.o: $(CONFIG_H) $(LISP_H) charset.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h event-gtk.h faces.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h gtk-xemacs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-gtk.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h text.h vdb.h window-impl.h window.h winslots.h
 gui-gtk.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h frame.h gc.h general-slots.h gui.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h redisplay.h specifier.h symeval.h symsinit.h text.h vdb.h
 menubar-gtk.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h events.h frame-impl.h frame.h frameslots.h gc.h general-slots.h gui.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h menubar.h number-gmp.h number-mp.h number.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdll.h systime.h text.h ui-gtk.h vdb.h window-impl.h window.h winslots.h
 native-gtk-toolbar.o: $(CONFIG_H) $(LISP_H) charset.h compiler.h console-gtk.h console.h dumper.h faces.h frame.h gc.h general-slots.h glyphs-gtk.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-gtk.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h text.h toolbar.h vdb.h window-impl.h window.h winslots.h
 objects-gtk.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h gc.h general-slots.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-gtk-impl.h objects-gtk.h objects-impl.h objects-xlike-inc.c objects.h specifier.h symeval.h symsinit.h text.h vdb.h
-redisplay-gtk.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h debug.h device-impl.h device.h devslots.h dumper.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h gccache-gtk.h general-slots.h glyphs-gtk.h glyphs.h gutter.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h mule-ccl.h number-gmp.h number-mp.h number.h objects-gtk-impl.h objects-gtk.h objects-impl.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysproc.h syssignal.h systime.h text.h vdb.h window-impl.h window.h winslots.h
+redisplay-gtk.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console-x-impl.h console-x.h console.h debug.h device-impl.h device.h devslots.h dumper.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h gccache-gtk.h general-slots.h glyphs-gtk.h glyphs-x.h glyphs.h gutter.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h mule-ccl.h number-gmp.h number-mp.h number.h objects-gtk-impl.h objects-gtk.h objects-impl.h objects-x-impl.h objects-x.h objects.h redisplay-xlike-inc.c redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysproc.h syssignal.h systime.h text.h vdb.h window-impl.h window.h winslots.h xgccache.h xintrinsic.h xintrinsicp.h xmotif.h xmprimitivep.h
 scrollbar-gtk.o: $(CONFIG_H) $(LISP_H) compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h dumper.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs-gtk.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar-gtk.h scrollbar.h specifier.h symeval.h symsinit.h text.h vdb.h window-impl.h window.h winslots.h
 select-gtk.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h events.h frame.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h redisplay.h select-common.h select.h specifier.h symeval.h symsinit.h systime.h text.h vdb.h
 toolbar-gtk.o: $(CONFIG_H) $(LISP_H) compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h dumper.h frame.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h specifier.h symeval.h symsinit.h text.h toolbar-common.h vdb.h
@@ -89,7 +90,7 @@
 ui-gtk.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h compiler.h conslots.h console-gtk-impl.h console-gtk.h console-impl.h console.h device.h dumper.h elhash.h emacs-marshals.c emacs-widget-accessors.c event-gtk.h events.h faces.h gc.h general-slots.h glade.c glyphs-gtk.h glyphs.h gtk-glue.c gui.h hash.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-gtk-impl.h objects-gtk.h objects-impl.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdll.h systime.h text.h ui-byhand.c ui-gtk.h vdb.h window-impl.h window.h winslots.h
 #endif
 #if defined(HAVE_DATABASE)
-database.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h database.h dumper.h file-coding.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfile.h text.h vdb.h
+database.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h database.h dumper.h file-coding.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h
 #endif
 #if defined(MULE)
 mule-ccl.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h dumper.h elhash.h file-coding.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h mule-ccl.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
@@ -105,9 +106,9 @@
 extw-Xt.o: $(CONFIG_H) compiler.h extw-Xlib.h extw-Xt.h
 #endif
 abbrev.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h dumper.h gc.h general-slots.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h symeval.h symsinit.h syntax.h text.h vdb.h window.h
-alloc.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-impl.h console-stream.h console.h device.h dumper.h elhash.h events.h extents-impl.h extents.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h process.h profile.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h systime.h text.h vdb.h window-impl.h window.h winslots.h
+alloc.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-impl.h console-stream.h console.h device.h dumper.h elhash.h events.h extents-impl.h extents.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h process.h profile.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h systime.h syswindows.h text.h vdb.h window-impl.h window.h winslots.h
 alloca.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
-alsaplay.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysfile.h text.h vdb.h
+alsaplay.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h
 blocktype.o: $(CONFIG_H) $(LISP_H) blocktype.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 buffer.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h commands.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h elhash.h extents.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h insdel.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h ndir.h number-gmp.h number-mp.h number.h process.h redisplay.h scrollbar.h select.h specifier.h symeval.h symsinit.h syntax.h sysdir.h sysfile.h syswindows.h text.h vdb.h window.h
 bytecode.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h redisplay.h scrollbar.h symeval.h symsinit.h syntax.h text.h vdb.h window.h
@@ -118,49 +119,49 @@
 cm.o: $(CONFIG_H) $(LISP_H) compiler.h conslots.h console-impl.h console-tty-impl.h console-tty.h console.h device.h dumper.h frame.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h specifier.h symeval.h symsinit.h systty.h text.h vdb.h
 cmdloop.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h conslots.h console-impl.h console-msw.h console.h device.h dumper.h events.h frame.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h syswindows.h text.h vdb.h window.h
 cmds.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h dumper.h extents.h gc.h general-slots.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h syntax.h text.h vdb.h
-console-stream.o: $(CONFIG_H) $(LISP_H) compiler.h conslots.h console-impl.h console-stream-impl.h console-stream.h console-tty.h console.h device-impl.h device.h devslots.h dumper.h events.h frame-impl.h frame.h frameslots.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h systime.h systty.h text.h vdb.h window.h
+console-stream.o: $(CONFIG_H) $(LISP_H) compiler.h conslots.h console-impl.h console-stream-impl.h console-stream.h console-tty.h console.h device-impl.h device.h devslots.h dumper.h events.h frame-impl.h frame.h frameslots.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h systime.h systty.h syswindows.h text.h vdb.h window.h
 console.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console-stream-impl.h console-stream.h console-tty-impl.h console-tty.h console.h device-impl.h device.h devslots.h dumper.h events.h frame-impl.h frame.h frameslots.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h systime.h systty.h text.h vdb.h window.h
 data.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfloat.h syssignal.h text.h vdb.h
 debug.o: $(CONFIG_H) $(LISP_H) bytecode.h compiler.h debug.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 device.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h elhash.h events.h faces.h frame-impl.h frame.h frameslots.h gc.h general-slots.h keymap.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syssignal.h systime.h text.h toolbar.h vdb.h window.h
 dialog.o: $(CONFIG_H) $(LISP_H) compiler.h conslots.h console-impl.h console.h dumper.h frame-impl.h frame.h frameslots.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h specifier.h symeval.h symsinit.h text.h vdb.h
 dired.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h dumper.h elhash.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h ndir.h number-gmp.h number-mp.h number.h opaque.h regex.h symeval.h symsinit.h syntax.h sysdep.h sysdir.h sysfile.h syspwd.h systime.h syswindows.h text.h vdb.h
-doc.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h dumper.h file-coding.h gc.h general-slots.h insdel.h keymap.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfile.h text.h vdb.h
+doc.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h dumper.h file-coding.h gc.h general-slots.h insdel.h intl-auto-encap-win32.h keymap.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h
 doprnt.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 dragdrop.o: $(CONFIG_H) $(LISP_H) compiler.h dragdrop.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 dump-data.o: $(CONFIG_H) $(LISP_H) compiler.h dump-data.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 dumper.o: $(CONFIG_H) $(LISP_H) coding-system-slots.h compiler.h console-stream.h console.h dump-data.h dumper.h elhash.h file-coding.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h specifier.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h
 dynarr.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 ecrt0.o: $(CONFIG_H)
-editfns.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h console.h device.h dumper.h events.h frame.h gc.h general-slots.h insdel.h line-number.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h ndir.h number-gmp.h number-mp.h number.h process.h redisplay.h scrollbar.h symeval.h symsinit.h sysdep.h sysdir.h sysfile.h sysproc.h syspwd.h syssignal.h systime.h text.h vdb.h window.h
+editfns.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h console.h device.h dumper.h events.h frame.h gc.h general-slots.h insdel.h intl-auto-encap-win32.h line-number.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h ndir.h number-gmp.h number-mp.h number.h process.h redisplay.h scrollbar.h symeval.h symsinit.h sysdep.h sysdir.h sysfile.h sysproc.h syspwd.h syssignal.h systime.h syswindows.h text.h vdb.h window.h
 elhash.o: $(CONFIG_H) $(LISP_H) bytecode.h compiler.h dumper.h elhash.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h symeval.h symsinit.h text.h vdb.h
 emacs.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h console-msw.h console.h dump-data.h dumper.h frame.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h paths.h process.h redisplay.h symeval.h symsinit.h sysdep.h sysdll.h sysfile.h sysproc.h syssignal.h systime.h systty.h syswindows.h text.h vdb.h
 emodules.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h console.h dumper.h emodules.h file-coding.h frame.h gc.h general-slots.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h symeval.h symsinit.h sysdep.h sysdll.h text.h vdb.h window.h
-esd.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h miscplay.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysfile.h text.h vdb.h
+esd.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h miscplay.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h
 eval.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h commands.h compiler.h conslots.h console-impl.h console.h device.h dumper.h frame.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h profile.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h text.h vdb.h window.h
 event-Xt.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h Emacs.ad.h EmacsFrame.h blocktype.h charset.h coding-system-slots.h compiler.h conslots.h console-impl.h console-tty.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dragdrop.h dumper.h elhash.h event-xlike-inc.c events.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h objects-x.h objects.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysproc.h syssignal.h systime.h systty.h text.h vdb.h window-impl.h window.h winslots.h xintrinsic.h xintrinsicp.h xmotif.h
-event-stream.o: $(CONFIG_H) $(LISP_H) backtrace.h blocktype.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h commands.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h elhash.h events.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h gui.h insdel.h keymap.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h macros.h mc-alloc.h menubar.h number-gmp.h number-mp.h number.h process.h profile.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h systime.h text.h vdb.h window-impl.h window.h winslots.h
-event-unixoid.o: $(CONFIG_H) $(LISP_H) compiler.h conslots.h console-impl.h console-stream-impl.h console-stream.h console-tty-impl.h console-tty.h console.h device-impl.h device.h devslots.h dumper.h events.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h process.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h sysproc.h syssignal.h systime.h systty.h text.h vdb.h
+event-stream.o: $(CONFIG_H) $(LISP_H) backtrace.h blocktype.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h commands.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h elhash.h events.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h gui.h insdel.h intl-auto-encap-win32.h keymap.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h macros.h mc-alloc.h menubar.h number-gmp.h number-mp.h number.h process.h profile.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h systime.h syswindows.h text.h vdb.h window-impl.h window.h winslots.h
+event-unixoid.o: $(CONFIG_H) $(LISP_H) compiler.h conslots.h console-impl.h console-stream-impl.h console-stream.h console-tty-impl.h console-tty.h console.h device-impl.h device.h devslots.h dumper.h events.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h process.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h sysproc.h syssignal.h systime.h systty.h syswindows.h text.h vdb.h
 events.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console-tty-impl.h console-tty.h console.h device.h dumper.h events.h extents.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h keymap.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h systty.h text.h toolbar.h vdb.h window-impl.h window.h winslots.h
 extents.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h console.h debug.h device.h dumper.h elhash.h extents-impl.h extents.h faces.h frame.h gc.h general-slots.h glyphs.h gutter.h insdel.h keymap.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h process.h profile.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h text.h vdb.h window-impl.h window.h winslots.h
 faces.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h elhash.h extents-impl.h extents.h faces.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-impl.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h text.h vdb.h window-impl.h window.h winslots.h
 file-coding.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h dumper.h elhash.h extents.h file-coding.h gc.h general-slots.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h rangetab.h symeval.h symsinit.h text.h vdb.h
 fileio.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h console.h device.h dumper.h events.h file-coding.h frame.h gc.h general-slots.h insdel.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h ndir.h number-gmp.h number-mp.h number.h process.h profile.h redisplay.h scrollbar.h symeval.h symsinit.h sysdep.h sysdir.h sysfile.h sysproc.h syspwd.h syssignal.h systime.h syswindows.h text.h vdb.h window-impl.h window.h winslots.h
-filelock.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h ndir.h number-gmp.h number-mp.h number.h paths.h symeval.h symsinit.h sysdir.h sysfile.h sysproc.h syspwd.h syssignal.h systime.h text.h vdb.h
-filemode.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfile.h text.h vdb.h
+filelock.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h ndir.h number-gmp.h number-mp.h number.h paths.h symeval.h symsinit.h sysdir.h sysfile.h sysproc.h syspwd.h syssignal.h systime.h syswindows.h text.h vdb.h
+filemode.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h
 floatfns.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfloat.h syssignal.h text.h vdb.h
-fns.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h compiler.h console.h device.h dumper.h events.h extents.h frame.h gc.h general-slots.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h process.h redisplay.h symeval.h symsinit.h sysfile.h sysproc.h syssignal.h systime.h text.h vdb.h
+fns.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h compiler.h console.h device.h dumper.h events.h extents.h frame.h gc.h general-slots.h insdel.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h process.h redisplay.h symeval.h symsinit.h sysfile.h sysproc.h syssignal.h systime.h syswindows.h text.h vdb.h
 font-lock.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h syntax.h text.h vdb.h
 font-mgr.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h font-mgr.h gc.h general-slots.h hash.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-impl.h objects-x-impl.h objects-x.h objects.h specifier.h symeval.h symsinit.h text.h vdb.h xintrinsic.h
 frame.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h events.h extents.h faces.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h gui.h gutter.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h menubar.h number-gmp.h number-mp.h number.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h text.h toolbar.h vdb.h window-impl.h window.h winslots.h
 free-hook.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h hash.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
-gc.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-impl.h console-stream.h console.h device.h dumper.h elhash.h events.h extents-impl.h extents.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h process.h profile.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h systime.h text.h vdb.h window-impl.h window.h winslots.h
+gc.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-impl.h console-stream.h console.h device.h dumper.h elhash.h events.h extents-impl.h extents.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h process.h profile.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h systime.h syswindows.h text.h vdb.h window-impl.h window.h winslots.h
 general.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
-getloadavg.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfile.h text.h vdb.h
-glyphs-eimage.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h faces.h file-coding.h frame.h gc.h general-slots.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h objects-impl.h objects.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h text.h vdb.h window-impl.h window.h winslots.h
-glyphs-shared.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h console.h dumper.h elhash.h faces.h frame.h gc.h general-slots.h glyphs.h imgproc.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h text.h vdb.h window-impl.h window.h winslots.h
+getloadavg.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h
+glyphs-eimage.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h faces.h file-coding.h frame.h gc.h general-slots.h glyphs.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h objects-impl.h objects.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h window-impl.h window.h winslots.h
+glyphs-shared.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h console.h dumper.h elhash.h faces.h frame.h gc.h general-slots.h glyphs.h imgproc.h insdel.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syswindows.h text.h vdb.h window-impl.h window.h winslots.h
 glyphs-widget.o: $(CONFIG_H) $(LISP_H) bytecode.h charset.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h faces.h frame.h gc.h general-slots.h glyphs.h gui.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h objects.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h text.h vdb.h window-impl.h window.h winslots.h
-glyphs.o: $(CONFIG_H) $(LISP_H) blocktype.h buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h elhash.h faces.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h gui.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-impl.h objects.h opaque.h rangetab.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h text.h vdb.h window-impl.h window.h winslots.h
+glyphs.o: $(CONFIG_H) $(LISP_H) blocktype.h buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h elhash.h faces.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h gui.h insdel.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects-impl.h objects.h opaque.h rangetab.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h window-impl.h window.h winslots.h
 gmalloc.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h getpagesize.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysdep.h text.h vdb.h
 gpmevent.o: $(CONFIG_H) $(LISP_H) commands.h compiler.h conslots.h console-impl.h console-tty-impl.h console-tty.h console.h device-impl.h device.h devslots.h dumper.h events.h frame.h gc.h general-slots.h gpmevent.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h process.h redisplay.h specifier.h symeval.h symsinit.h sysdep.h sysproc.h syssignal.h systime.h systty.h text.h vdb.h
 gui.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h compiler.h dumper.h elhash.h gc.h general-slots.h gui.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h menubar.h number-gmp.h number-mp.h number.h redisplay.h symeval.h symsinit.h text.h vdb.h
@@ -180,18 +181,18 @@
 keymap.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console.h dumper.h elhash.h events.h extents.h frame.h gc.h general-slots.h insdel.h keymap.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h text.h vdb.h window.h
 lastfile.o: $(CONFIG_H)
 libinterface.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h libinterface.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
-libsst.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h libsst.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysfile.h text.h vdb.h
+libsst.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h libsst.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h
 line-number.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h line-number.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
-linuxplay.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h miscplay.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysfile.h syssignal.h systty.h text.h vdb.h
+linuxplay.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h miscplay.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysfile.h syssignal.h systty.h syswindows.h text.h vdb.h
 lread.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h dumper.h elhash.h file-coding.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h profile.h symeval.h symsinit.h sysfile.h sysfloat.h syswindows.h text.h vdb.h
-lstream.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfile.h text.h vdb.h
+lstream.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h insdel.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h
 macros.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h conslots.h console-impl.h console.h device.h dumper.h events.h frame.h gc.h general-slots.h keymap.h lisp-disunion.h lisp-union.h lisp.h lrecord.h macros.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h text.h vdb.h window.h
 marker.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 mc-alloc.o: $(CONFIG_H) $(LISP_H) blocktype.h compiler.h dumper.h gc.h general-slots.h getpagesize.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 md5.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h dumper.h file-coding.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 menubar.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h frame-impl.h frame.h frameslots.h gc.h general-slots.h gui.h keymap.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h menubar.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h text.h vdb.h window-impl.h window.h winslots.h
 minibuf.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h conslots.h console-impl.h console-stream.h console.h dumper.h events.h frame-impl.h frame.h frameslots.h gc.h general-slots.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h text.h vdb.h window-impl.h window.h winslots.h
-miscplay.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h miscplay.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysfile.h syssignal.h text.h vdb.h
+miscplay.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h miscplay.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysfile.h syssignal.h syswindows.h text.h vdb.h
 nas.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysdep.h syssignal.h text.h vdb.h
 nt.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h ndir.h number-gmp.h number-mp.h number.h process.h symeval.h symsinit.h sysdir.h sysfile.h sysproc.h syspwd.h syssignal.h systime.h syswindows.h text.h vdb.h
 ntheap.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysdep.h syswindows.h text.h vdb.h
@@ -203,26 +204,26 @@
 opaque.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h symeval.h symsinit.h text.h vdb.h
 print.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console-msw.h console-stream-impl.h console-stream.h console-tty-impl.h console-tty.h console.h device-impl.h device.h devslots.h dumper.h extents.h frame.h gc.h general-slots.h insdel.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h redisplay.h specifier.h symeval.h symsinit.h sysfile.h systty.h syswindows.h text.h vdb.h
 process-nt.o: $(CONFIG_H) $(LISP_H) compiler.h console-msw.h console.h dumper.h events.h gc.h general-slots.h hash.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h process-slots.h process.h procimpl.h symeval.h symsinit.h sysfile.h sysproc.h syssignal.h systime.h syswindows.h text.h vdb.h
-process-unix.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h console.h dumper.h events.h file-coding.h frame.h gc.h general-slots.h hash.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h ndir.h number-gmp.h number-mp.h number.h opaque.h process-slots.h process.h procimpl.h redisplay.h scrollbar.h symeval.h symsinit.h sysdep.h sysdir.h sysfile.h sysproc.h syssignal.h systime.h systty.h syswait.h text.h vdb.h window.h
+process-unix.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h console.h dumper.h events.h file-coding.h frame.h gc.h general-slots.h hash.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h ndir.h number-gmp.h number-mp.h number.h opaque.h process-slots.h process.h procimpl.h redisplay.h scrollbar.h symeval.h symsinit.h sysdep.h sysdir.h sysfile.h sysproc.h syssignal.h systime.h systty.h syswait.h syswindows.h text.h vdb.h window.h
 process.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h commands.h compiler.h console.h device.h dumper.h events.h file-coding.h frame.h gc.h general-slots.h hash.h insdel.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h lstream.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h process-slots.h process.h procimpl.h redisplay.h scrollbar.h symeval.h symsinit.h sysdep.h sysfile.h sysproc.h syssignal.h systime.h systty.h syswait.h syswindows.h text.h vdb.h window.h
 profile.o: $(CONFIG_H) $(LISP_H) backtrace.h bytecode.h compiler.h dumper.h elhash.h gc.h general-slots.h hash.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h profile.h symeval.h symsinit.h syssignal.h systime.h text.h vdb.h
 ralloc.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h getpagesize.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 rangetab.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h rangetab.h symeval.h symsinit.h text.h vdb.h
 realpath.o: $(CONFIG_H) $(LISP_H) backtrace.h compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h ndir.h number-gmp.h number-mp.h number.h profile.h symeval.h symsinit.h sysdir.h sysfile.h syswindows.h text.h vdb.h
 redisplay-output.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h faces.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h gutter.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h text.h vdb.h window-impl.h window.h winslots.h
-redisplay.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h commands.h compiler.h conslots.h console-impl.h console-tty.h console.h debug.h device-impl.h device.h devslots.h dumper.h elhash.h events.h extents-impl.h extents.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h gui.h gutter.h insdel.h line-number.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h menubar.h number-gmp.h number-mp.h number.h objects-impl.h objects.h opaque.h process.h profile.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h systime.h systty.h text.h toolbar.h vdb.h window-impl.h window.h winslots.h
+redisplay.o: $(CONFIG_H) $(LISP_H) backtrace.h buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h commands.h compiler.h conslots.h console-impl.h console-tty.h console.h debug.h device-impl.h device.h devslots.h dumper.h elhash.h events.h extents-impl.h extents.h faces.h file-coding.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h gui.h gutter.h insdel.h intl-auto-encap-win32.h line-number.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h menubar.h number-gmp.h number-mp.h number.h objects-impl.h objects.h opaque.h process.h profile.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h systime.h systty.h syswindows.h text.h toolbar.h vdb.h window-impl.h window.h winslots.h
 regex.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h regex.h symeval.h symsinit.h syntax.h text.h vdb.h
 scrollbar.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h commands.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h frame-impl.h frame.h frameslots.h gc.h general-slots.h glyphs.h gutter.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h text.h vdb.h window-impl.h window.h winslots.h
 search.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h insdel.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h regex.h symeval.h symsinit.h syntax.h text.h vdb.h
 select.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h extents.h frame.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h objects.h opaque.h redisplay.h select.h specifier.h symeval.h symsinit.h text.h vdb.h
-sgiplay.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h libst.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysfile.h sysproc.h syssignal.h systime.h text.h vdb.h
-sheap.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h sheap-adjust.h symeval.h symsinit.h sysfile.h text.h vdb.h
-signal.o: $(CONFIG_H) $(LISP_H) compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h events.h frame-impl.h frame.h frameslots.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h process.h redisplay.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h systime.h text.h vdb.h
+sgiplay.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h libst.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysfile.h sysproc.h syssignal.h systime.h syswindows.h text.h vdb.h
+sheap.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h sheap-adjust.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h
+signal.o: $(CONFIG_H) $(LISP_H) compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h events.h frame-impl.h frame.h frameslots.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h process.h redisplay.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h systime.h syswindows.h text.h vdb.h
 sound.o: $(CONFIG_H) $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console-x-impl.h console-x.h console.h device-impl.h device.h devslots.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h redisplay.h sound.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h sysproc.h syssignal.h systime.h syswindows.h text.h vdb.h xintrinsic.h
 specifier.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console.h device-impl.h device.h devslots.h dumper.h frame.h gc.h general-slots.h glyphs.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h rangetab.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h text.h vdb.h window-impl.h window.h winslots.h
 strcat.o: $(CONFIG_H)
 strftime.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
-sunplay.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h text.h vdb.h
+sunplay.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h sound.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h syswindows.h text.h vdb.h
 sunpro.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 symbols.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h conslots.h console-impl.h console.h dumper.h elhash.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h specifier.h symeval.h symsinit.h text.h vdb.h
 syntax.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h compiler.h dumper.h extents.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h syntax.h text.h vdb.h
@@ -245,7 +246,7 @@
 unexhp9k800.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 unexnt.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h
 unexsol2-6.o: compiler.h
-unicode.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h dumper.h extents.h file-coding.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h rangetab.h symeval.h symsinit.h sysfile.h text.h vdb.h
+unicode.o: $(CONFIG_H) $(LISP_H) buffer.h bufslots.h casetab.h charset.h chartab.h coding-system-slots.h compiler.h dumper.h extents.h file-coding.h gc.h general-slots.h intl-auto-encap-win32.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h opaque.h rangetab.h symeval.h symsinit.h sysfile.h syswindows.h text.h vdb.h
 vdb-fake.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 vdb-mach.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
 vdb-posix.o: $(CONFIG_H) $(LISP_H) compiler.h dumper.h gc.h general-slots.h lisp-disunion.h lisp-union.h lisp.h lrecord.h mc-alloc.h number-gmp.h number-mp.h number.h symeval.h symsinit.h text.h vdb.h
--- a/src/redisplay-gtk.c	Thu Jan 28 12:59:48 2010 -0700
+++ b/src/redisplay-gtk.c	Fri Jan 29 15:06:36 2010 -0600
@@ -23,491 +23,7 @@
 
 /* Synched up with:  Not in FSF. */
 
-/* Author: Chuck Thompson */
-/* Gtk flavor by William Perry */
-
-/* Lots of work done by Ben Wing for Mule */
-
-#include <config.h>
-#include "lisp.h"
-
-#include "buffer.h"
-#include "debug.h"
-#include "device-impl.h"
-#include "faces.h"
-#include "file-coding.h"
-#include "frame-impl.h"
-#include "gutter.h"
-#include "redisplay.h"
-#include "sysdep.h"
-#include "window.h"
-
-#include "console-gtk-impl.h"
-#include "gccache-gtk.h"
-#include "glyphs-gtk.h"
-#include "objects-gtk-impl.h"
-
-#include "sysproc.h" /* for select() */
-
-#ifdef MULE
-#include "mule-ccl.h"
-#endif
-
-#define CONST const
-
-#define EOL_CURSOR_WIDTH	5
-
-static void gtk_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 bgpixmap);
-static void gtk_output_vertical_divider (struct window *w, int clear);
-static void gtk_output_blank (struct window *w, struct display_line *dl,
-			      struct rune *rb, int start_pixpos,
-			      int cursor_start, int cursor_width);
-static void gtk_output_horizontal_line (struct window *w,
-					struct display_line *dl,
-					struct rune *rb);
-static void gtk_clear_region (Lisp_Object locale, struct device* d, struct frame* f,
-			      face_index findex, int x, int y,
-			      int width, int height, Lisp_Object fcolor, Lisp_Object bcolor,
-			      Lisp_Object background_pixmap);
-static void gtk_output_eol_cursor (struct window *w, struct display_line *dl,
-				   int xpos, face_index findex);
-static void gtk_clear_frame (struct frame *f);
-static void gtk_clear_frame_windows (Lisp_Object window);
-static void gtk_bevel_modeline (struct window *w, struct display_line *dl);
-
-#if 0
-static void __describe_gc (GdkGC *);
-#endif
-
-struct textual_run
-{
-  Lisp_Object charset;
-  unsigned char *ptr;
-  int len;
-  int dimension;
-};
-
-/* Separate out the text in DYN into a series of textual runs of a
-   particular charset.  Also convert the characters as necessary into
-   the format needed by XDrawImageString(), XDrawImageString16(), et
-   al.  (This means converting to one or two byte format, possibly
-   tweaking the high bits, and possibly running a CCL program.) You
-   must pre-allocate the space used and pass it in. (This is done so
-   you can ALLOCA () the space.)  You need to allocate (2 * len) bytes
-   of TEXT_STORAGE and (len * sizeof (struct textual_run)) bytes of
-   RUN_STORAGE, where LEN is the length of the dynarr.
-
-   Returns the number of runs actually used. */
-
-static int
-separate_textual_runs (unsigned char *text_storage,
-		       struct textual_run *run_storage,
-		       CONST Ichar *str, Charcount len)
-{
-  Lisp_Object prev_charset = Qunbound; /* not Qnil because that is a
-					  possible valid charset when
-					  MULE is not defined */
-  int runs_so_far = 0;
-  int i;
-#ifdef MULE
-  struct ccl_program char_converter;
-  int need_ccl_conversion = 0;
-#endif
-
-  for (i = 0; i < len; i++)
-    {
-      Ichar ch = str[i];
-      Lisp_Object charset;
-      int byte1, byte2;
-      int dimension;
-      int graphic;
-
-      BREAKUP_ICHAR (ch, charset, byte1, byte2);
-      dimension = XCHARSET_DIMENSION (charset);
-      graphic   = XCHARSET_GRAPHIC   (charset);
-
-      if (!EQ (charset, prev_charset))
-	{
-	  run_storage[runs_so_far].ptr       = text_storage;
-	  run_storage[runs_so_far].charset   = charset;
-	  run_storage[runs_so_far].dimension = dimension;
-
-	  if (runs_so_far)
-	    {
-	      run_storage[runs_so_far - 1].len =
-		text_storage - run_storage[runs_so_far - 1].ptr;
-	      if (run_storage[runs_so_far - 1].dimension == 2)
-		run_storage[runs_so_far - 1].len >>= 1;
-	    }
-	  runs_so_far++;
-	  prev_charset = charset;
-#ifdef MULE
-	  {
-	    Lisp_Object ccl_prog = XCHARSET_CCL_PROGRAM (charset);
-	    need_ccl_conversion = !NILP (ccl_prog);
-	    if (need_ccl_conversion)
-	      setup_ccl_program (&char_converter, ccl_prog);
-	  }
-#endif
-	}
-
-      if (graphic == 0)
-	{
-	  byte1 &= 0x7F;
-	  byte2 &= 0x7F;
-	}
-      else if (graphic == 1)
-	{
-	  byte1 |= 0x80;
-	  byte2 |= 0x80;
-	}
-#ifdef MULE
-      if (need_ccl_conversion)
-	{
-	  char_converter.reg[0] = XCHARSET_ID (charset);
-	  char_converter.reg[1] = byte1;
-	  char_converter.reg[2] = byte2;
-	  ccl_driver (&char_converter, 0, 0, 0, 0, CCL_MODE_ENCODING);
-	  byte1 = char_converter.reg[1];
-	  byte2 = char_converter.reg[2];
-	}
-#endif
-      *text_storage++ = (unsigned char) byte1;
-      if (dimension == 2)
-	*text_storage++ = (unsigned char) byte2;
-    }
-
-  if (runs_so_far)
-    {
-      run_storage[runs_so_far - 1].len =
-	text_storage - run_storage[runs_so_far - 1].ptr;
-      if (run_storage[runs_so_far - 1].dimension == 2)
-	run_storage[runs_so_far - 1].len >>= 1;
-    }
-
-  return runs_so_far;
-}
-
-/****************************************************************************/
-/*                                                                          */
-/*                          Gtk output routines                             */
-/*                                                                          */
-/****************************************************************************/
-
-static int
-gtk_text_width_single_run (struct face_cachel *cachel, struct textual_run *run)
-{
-  Lisp_Object font_inst = FACE_CACHEL_FONT (cachel, run->charset);
-  struct Lisp_Font_Instance *fi = XFONT_INSTANCE (font_inst);
-
-  if (!fi->proportional_p)
-  {
-    return fi->width * run->len;
-  }
-  else
-    {
-      if (run->dimension == 2)
-	{
-	  stderr_out ("Measuring wide characters\n");
-	  return gdk_text_width_wc (FONT_INSTANCE_GTK_FONT (fi),
-				    (GdkWChar *) run->ptr, run->len);
-	}
-      else
-	{
-	  return gdk_text_width (FONT_INSTANCE_GTK_FONT (fi),
-				 (char *) run->ptr, run->len);
-	}
-    }
-}
-
-/*
-   gtk_text_width
-
-   Given a string and a face, return the string's length in pixels when
-   displayed in the font associated with the face.
-   */
-
-static int
-gtk_text_width (struct frame *UNUSED (f), struct face_cachel *cachel,
-		CONST Ichar *str, Charcount len)
-{
-  /* !!#### */
-  int width_so_far = 0;
-  unsigned char *text_storage = (unsigned char *) ALLOCA (2 * len);
-  struct textual_run *runs = alloca_array (struct textual_run, len);
-  int nruns;
-  int i;
-
-  nruns = separate_textual_runs (text_storage, runs, str, len);
-
-  for (i = 0; i < nruns; i++)
-    width_so_far += gtk_text_width_single_run (cachel, runs + i);
-
-  return width_so_far;
-}
-
-/*****************************************************************************
- gtk_divider_height
-
- Return the height of the horizontal divider.  This is a function because
- divider_height is a device method.
-
- #### If we add etched horizontal divider lines this will have to get
- smarter.
- ****************************************************************************/
-static int
-gtk_divider_height (void)
-{
-  return 2;
-}
-
-/*****************************************************************************
- gtk_eol_cursor_width
-
- Return the width of the end-of-line cursor.  This is a function
- because eol_cursor_width is a device method.
- ****************************************************************************/
-static int
-gtk_eol_cursor_width (void)
-{
-  return EOL_CURSOR_WIDTH;
-}
-
-/*****************************************************************************
- gtk_output_display_block
-
- Given a display line, a block number for that start line, output all
- runes between start and end in the specified display block.
- ****************************************************************************/
-static void
-gtk_output_display_block (struct window *w, struct display_line *dl, int block,
-			  int start, int end, int start_pixpos, int cursor_start,
-			  int cursor_width, int cursor_height)
-{
-  struct frame *f = XFRAME (w->frame);
-  Ichar_dynarr *buf;
-  Lisp_Object window;
-
-  struct display_block *db = Dynarr_atp (dl->display_blocks, block);
-  rune_dynarr *rba = db->runes;
-  struct rune *rb;
-
-  int elt = start;
-  face_index findex;
-  int xpos, width;
-  Lisp_Object charset = Qunbound; /* Qnil is a valid charset when
-				     MULE is not defined */
-
-  window = wrap_window (w);
-  rb = Dynarr_atp (rba, start);
-
-  if (!rb)
-    {
-      /* Nothing to do so don't do anything. */
-      return;
-    }
-  else
-    {
-      findex = rb->findex;
-      xpos = rb->xpos;
-      width = 0;
-      if (rb->type == RUNE_CHAR)
-	charset = ichar_charset (rb->object.chr.ch);
-    }
-
-  if (end < 0)
-    end = Dynarr_length (rba);
-  buf = Dynarr_new (Ichar);
-
-  while (elt < end)
-    {
-      rb = Dynarr_atp (rba, elt);
-
-      if (rb->findex == findex && rb->type == RUNE_CHAR
-	  && rb->object.chr.ch != '\n' && rb->cursor_type != CURSOR_ON
-	  && EQ (charset, ichar_charset (rb->object.chr.ch)))
-	{
-	  Dynarr_add (buf, rb->object.chr.ch);
-	  width += rb->width;
-	  elt++;
-	}
-      else
-	{
-	  if (Dynarr_length (buf))
-	    {
-	      gtk_output_string (w, dl, buf, xpos, 0, start_pixpos, width,
-				 findex, 0, cursor_start, cursor_width,
-				 cursor_height);
-	      xpos = rb->xpos;
-	      width = 0;
-	    }
-	  Dynarr_reset (buf);
-	  width = 0;
-
-	  if (rb->type == RUNE_CHAR)
-	    {
-	      findex = rb->findex;
-	      xpos = rb->xpos;
-	      charset = ichar_charset (rb->object.chr.ch);
-
-	      if (rb->cursor_type == CURSOR_ON)
-		{
-		  if (rb->object.chr.ch == '\n')
-		    {
-		      gtk_output_eol_cursor (w, dl, xpos, findex);
-		    }
-		  else
-		    {
-		      Dynarr_add (buf, rb->object.chr.ch);
-		      gtk_output_string (w, dl, buf, xpos, 0, start_pixpos,
-					 rb->width, findex, 1,
-					 cursor_start, cursor_width,
-					 cursor_height);
-		      Dynarr_reset (buf);
-		    }
-
-		  xpos += rb->width;
-		  elt++;
-		}
-	      else if (rb->object.chr.ch == '\n')
-		{
-		  /* Clear in case a cursor was formerly here. */
-		  int height = dl->ascent + dl->descent - dl->clip;
-
-		  redisplay_clear_region (window, findex, xpos, dl->ypos - dl->ascent,
-					  rb->width, height);
-		  elt++;
-		}
-	    }
-	  else if (rb->type == RUNE_BLANK || rb->type == RUNE_HLINE)
-	    {
-	      if (rb->type == RUNE_BLANK)
-		gtk_output_blank (w, dl, rb, start_pixpos, cursor_start,
-				  cursor_width);
-	      else
-		{
-		  /* #### Our flagging of when we need to redraw the
-                     modeline shadows sucks.  Since RUNE_HLINE is only used
-                     by the modeline at the moment it is a good bet
-                     that if it gets redrawn then we should also
-                     redraw the shadows.  This won't be true forever.
-                     We borrow the shadow_thickness_changed flag for
-                     now. */
-		  w->shadow_thickness_changed = 1;
-		  gtk_output_horizontal_line (w, dl, rb);
-		}
-
-	      elt++;
-	      if (elt < end)
-		{
-		  rb = Dynarr_atp (rba, elt);
-
-		  findex = rb->findex;
-		  xpos = rb->xpos;
-		}
-	    }
-	  else if (rb->type == RUNE_DGLYPH)
-	    {
-	      Lisp_Object instance;
-	      struct display_box dbox;
-	      struct display_glyph_area dga;
-	      redisplay_calculate_display_boxes (dl, rb->xpos, rb->object.dglyph.xoffset,
-						 rb->object.dglyph.yoffset ,start_pixpos,
-                                                 rb->width, &dbox, &dga);
-
-	      window = wrap_window (w);
-	      instance = glyph_image_instance (rb->object.dglyph.glyph,
-					       window, ERROR_ME_DEBUG_WARN, 1);
-	      findex = rb->findex;
-
-	      if (IMAGE_INSTANCEP (instance))
-		switch (XIMAGE_INSTANCE_TYPE (instance))
-		  {
-		  case IMAGE_TEXT:
-		    {
-		      /* #### This is way losing.  See the comment in
-			 add_glyph_rune(). */
-		      Lisp_Object string =
-			XIMAGE_INSTANCE_TEXT_STRING (instance);
-		      convert_ibyte_string_into_ichar_dynarr
-			(XSTRING_DATA (string), XSTRING_LENGTH (string), buf);
-
-		      gtk_output_string (w, dl, buf, xpos,
-					 rb->object.dglyph.xoffset,
-					 start_pixpos, -1, findex,
-					 (rb->cursor_type == CURSOR_ON),
-					 cursor_start, cursor_width,
-					 cursor_height);
-		      Dynarr_reset (buf);
-		    }
-		    break;
-
-		  case IMAGE_MONO_PIXMAP:
-		  case IMAGE_COLOR_PIXMAP:
-		    redisplay_output_pixmap (w, instance, &dbox, &dga,
-					     findex,cursor_start,
-					     cursor_width, cursor_height, 0);
-		    break;
-
-		  case IMAGE_POINTER:
-		    ABORT ();
-
-		  case IMAGE_WIDGET:
-		      if (EQ (XIMAGE_INSTANCE_WIDGET_TYPE (instance),
-			      Qlayout))
-			{
-			  redisplay_output_layout (window, instance, &dbox,
-						   &dga, findex,
-						   cursor_start, cursor_width,
-						   cursor_height);
-			  break;
-			}
-
-		  case IMAGE_SUBWINDOW:
-		    redisplay_output_subwindow (w, instance, &dbox, &dga,
-						findex, cursor_start,
-						cursor_width, cursor_height);
-		    break;
-
-		  case IMAGE_NOTHING:
-		    /* nothing is as nothing does */
-		    break;
-
-		  default:
-		    ABORT ();
-		  }
-
-	      xpos += rb->width;
-	      elt++;
-	    }
-	  else
-	    ABORT ();
-	}
-    }
-
-  if (Dynarr_length (buf))
-    gtk_output_string (w, dl, buf, xpos, 0, start_pixpos, width, findex,
-		       0, cursor_start, cursor_width, cursor_height);
-
-  /* #### This is really conditionalized well for optimized
-     performance. */
-  if (dl->modeline
-      && !EQ (Qzero, w->modeline_shadow_thickness)
-      && (f->clear
-	  || f->windows_structure_changed
-	  || w->shadow_thickness_changed))
-    gtk_bevel_modeline (w, dl);
-
-  Dynarr_free (buf);
-}
+#include "redisplay-xlike-inc.c"
 
 /*****************************************************************************
  gtk_bevel_modeline
@@ -530,866 +46,6 @@
 }
 
 /*****************************************************************************
- gtk_get_gc
-
- Given a number of parameters return a GC with those properties.
- ****************************************************************************/
-GdkGC *
-gtk_get_gc (struct device *d, Lisp_Object font, Lisp_Object fg, Lisp_Object bg,
-	    Lisp_Object bg_pmap, Lisp_Object lwidth)
-{
-  GdkGCValues gcv;
-  unsigned long mask;
-
-  memset (&gcv, ~0, sizeof (gcv));
-  gcv.graphics_exposures = FALSE;
-  /* Make absolutely sure that we don't pick up a clipping region in
-     the GC returned by this function. */
-  gcv.clip_mask = 0;
-  gcv.clip_x_origin = 0;
-  gcv.clip_y_origin = 0;
-  gcv.fill = GDK_SOLID;
-  mask = GDK_GC_EXPOSURES | GDK_GC_CLIP_MASK | GDK_GC_CLIP_X_ORIGIN | GDK_GC_CLIP_Y_ORIGIN;
-  mask |= GDK_GC_FILL;
-
-  if (!NILP (font))
-    {
-      gcv.font = FONT_INSTANCE_GTK_FONT (XFONT_INSTANCE (font));
-      mask |= GDK_GC_FONT;
-    }
-
-  /* evil kludge! */
-  if (!NILP (fg) && !COLOR_INSTANCEP (fg) && !INTP (fg))
-    {
-      /* #### I fixed once case where this was getting it.  It was a
-         bad macro expansion (compiler bug). */
-      fprintf (stderr, "Help! gtk_get_gc got a bogus fg value! fg = ");
-      debug_print (fg);
-      fg = Qnil;
-    }
-
-  if (!NILP (fg))
-    {
-      if (COLOR_INSTANCEP (fg))
-	gcv.foreground = * COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (fg));
-      else
-	gcv.foreground.pixel = XINT (fg);
-      mask |= GDK_GC_FOREGROUND;
-    }
-
-  if (!NILP (bg))
-    {
-      if (COLOR_INSTANCEP (bg))
-	gcv.background = * COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (bg));
-      else
-	gcv.background.pixel = XINT (fg);
-      mask |= GDK_GC_BACKGROUND;
-    }
-
-  if (IMAGE_INSTANCEP (bg_pmap)
-      && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
-    {
-      if (XIMAGE_INSTANCE_PIXMAP_DEPTH (bg_pmap) == 0)
-	{
-	  gcv.fill = GDK_OPAQUE_STIPPLED;
-	  gcv.stipple = XIMAGE_INSTANCE_GTK_PIXMAP (bg_pmap);
-	  mask |= (GDK_GC_STIPPLE | GDK_GC_FILL);
-	}
-      else
-	{
-	  gcv.fill = GDK_TILED;
-	  gcv.tile = XIMAGE_INSTANCE_GTK_PIXMAP (bg_pmap);
-	  mask |= (GDK_GC_TILE | GDK_GC_FILL);
-	}
-    }
-
-  if (!NILP (lwidth))
-    {
-      gcv.line_width = XINT (lwidth);
-      mask |= GDK_GC_LINE_WIDTH;
-    }
-
-  return gc_cache_lookup (DEVICE_GTK_GC_CACHE (d), &gcv, (GdkGCValuesMask) mask);
-}
-
-/*****************************************************************************
- gtk_output_string
-
- Given a string and a starting position, output that string in the
- given face.  If cursor is true, draw a cursor around the string.
- Correctly handles multiple charsets in the string.
-
- The meaning of the parameters is something like this:
-
- W		Window that the text is to be displayed in.
- DL		Display line that this text is on.  The values in the
- 		structure are used to determine the vertical position and
-		clipping range of the text.
- BUF		Dynamic array of Ichars specifying what is actually to be
-		drawn.
- XPOS		X position in pixels where the text should start being drawn.
- XOFFSET	Number of pixels to be chopped off the left side of the
- 		text.  The effect is as if the text were shifted to the
-		left this many pixels and clipped at XPOS.
- CLIP_START	Clip everything left of this X position.
- WIDTH		Clip everything right of XPOS + WIDTH.
- FINDEX		Index for the face cache element describing how to display
- 		the text.
- CURSOR		#### I don't understand this.  There's something
- 		strange and overcomplexified with this variable.
-		Chuck, explain please?
- CURSOR_START	Starting X position of cursor.
- CURSOR_WIDTH	Width of cursor in pixels.
- CURSOR_HEIGHT	Height of cursor in pixels.
-
- Starting Y position of cursor is the top of the text line.
- The cursor is drawn sometimes whether or not CURSOR is set. ???
- ****************************************************************************/
-static
-void gdk_draw_text_image (GdkDrawable *drawable,
-			  GdkFont     *font,
-			  GdkGC       *gc,
-			  gint         x,
-			  gint         y,
-			  const gchar *text,
-			  gint         text_length);
-
-void
-gtk_output_string (struct window *w, struct display_line *dl,
-		   Ichar_dynarr *buf, int xpos, int xoffset, int clip_start,
-		   int width, face_index findex, int cursor,
-		   int cursor_start, int cursor_width, int cursor_height)
-{
-  /* !!#### Needs review */
-  /* General variables */
-  struct frame *f = XFRAME (w->frame);
-  struct device *d = XDEVICE (f->device);
-  Lisp_Object device;
-  Lisp_Object window;
-  GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
-
-  int clip_end;
-
-  /* Cursor-related variables */
-  int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
-  int cursor_clip;
-  Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
-							 WINDOW_BUFFER (w));
-  struct face_cachel *cursor_cachel = 0;
-
-  /* Text-related variables */
-  Lisp_Object bg_pmap;
-  GdkGC *bgc, *gc;
-  int height;
-  int len = Dynarr_length (buf);
-  unsigned char *text_storage = (unsigned char *) ALLOCA (2 * len);
-  struct textual_run *runs = alloca_array (struct textual_run, len);
-  int nruns;
-  int i;
-  struct face_cachel *cachel = WINDOW_FACE_CACHEL (w, findex);
-
-  device = wrap_device (d);
-  window = wrap_window (w);
-
-  if (width < 0)
-    width = gtk_text_width (f, cachel, Dynarr_atp (buf, 0), Dynarr_length (buf));
-  height = dl->ascent + dl->descent - dl->clip;
-
-  /* Regularize the variables passed in. */
-
-  if (clip_start < xpos)
-    clip_start = xpos;
-  clip_end = xpos + width;
-  if (clip_start >= clip_end)
-    /* It's all clipped out. */
-    return;
-
-  xpos -= xoffset;
-
-  nruns = separate_textual_runs (text_storage, runs, Dynarr_atp (buf, 0),
-				 Dynarr_length (buf));
-
-  cursor_clip = (cursor_start >= clip_start &&
-		 cursor_start < clip_end);
-
-  /* This cursor code is really a mess. */
-  if (!NILP (w->text_cursor_visible_p)
-      && (cursor
-	  || cursor_clip
-	  || (cursor_width
-	      && (cursor_start + cursor_width >= clip_start)
-	      && !NILP (bar_cursor_value))))
-    {
-      /* These have to be in separate statements in order to avoid a
-         compiler bug. */
-      face_index sucks = get_builtin_face_cache_index (w, Vtext_cursor_face);
-      cursor_cachel = WINDOW_FACE_CACHEL (w, sucks);
-
-      /* We have to reset this since any call to WINDOW_FACE_CACHEL
-         may cause the cache to resize and any pointers to it to
-         become invalid. */
-      cachel = WINDOW_FACE_CACHEL (w, findex);
-    }
-
-  bg_pmap = cachel->background_pixmap;
-  if (!IMAGE_INSTANCEP (bg_pmap)
-      || !IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
-    bg_pmap = Qnil;
-
-  if ((cursor && focus && NILP (bar_cursor_value)
-       && !NILP (w->text_cursor_visible_p)) || NILP (bg_pmap))
-    bgc = 0;
-  else
-    bgc = gtk_get_gc (d, Qnil, cachel->foreground, cachel->background,
-		      bg_pmap, Qnil);
-
-  if (bgc)
-    gdk_draw_rectangle (GDK_DRAWABLE (x_win), bgc, TRUE, clip_start,
-			dl->ypos - dl->ascent, clip_end - clip_start,
-			height);
-
-  for (i = 0; i < nruns; i++)
-    {
-      Lisp_Object font = FACE_CACHEL_FONT (cachel, runs[i].charset);
-      struct Lisp_Font_Instance *fi = XFONT_INSTANCE (font);
-      GdkFont *gdk_font = FONT_INSTANCE_GTK_FONT (fi);
-      int this_width;
-      int need_clipping;
-
-      if (EQ (font, Vthe_null_font_instance))
-	continue;
-
-      this_width = gtk_text_width_single_run (cachel, runs + i);
-      need_clipping = (dl->clip || clip_start > xpos ||
-		       clip_end < xpos + this_width);
-
-      /* XDrawImageString only clears the area equal to the height of
-	 the given font.  It is possible that a font is being displayed
-	 on a line taller than it is, so this would cause us to fail to
-	 clear some areas. */
-      if ((int) fi->height < (int) (height + dl->clip))
-	{
-	  int clear_start = max (xpos, clip_start);
-	  int clear_end = min (xpos + this_width, clip_end);
-
-	  if (cursor)
-	    {
-	      int ypos1_line, ypos1_string, ypos2_line, ypos2_string;
-
-	      ypos1_string = dl->ypos - fi->ascent;
-	      ypos2_string = dl->ypos + fi->descent;
-	      ypos1_line = dl->ypos - dl->ascent;
-	      ypos2_line = dl->ypos + dl->descent - dl->clip;
-
-	      /* Make sure we don't clear below the real bottom of the
-		 line. */
-	      if (ypos1_string > ypos2_line)
-		ypos1_string = ypos2_line;
-	      if (ypos2_string > ypos2_line)
-		ypos2_string = ypos2_line;
-
-	      if (ypos1_line < ypos1_string)
-		{
-		  redisplay_clear_region (window, findex, clear_start, ypos1_line,
-				    clear_end - clear_start,
-				    ypos1_string - ypos1_line);
-		}
-
-	      if (ypos2_line > ypos2_string)
-		{
-		  redisplay_clear_region (window, findex, clear_start, ypos2_string,
-					  clear_end - clear_start,
-					  ypos2_line - ypos2_string);
-		}
-	    }
-	  else
-	    {
-	      redisplay_clear_region (window, findex, clear_start,
-				      dl->ypos - dl->ascent, clear_end - clear_start,
-				      height);
-	    }
-	}
-
-      if (cursor && cursor_cachel && focus && NILP (bar_cursor_value))
-      {
-	gc = gtk_get_gc (d, font, cursor_cachel->foreground,
-			 cursor_cachel->background, Qnil, Qnil);
-      }
-      else
-      {
-	gc = gtk_get_gc (d, font, cachel->foreground, cachel->background,
-			 Qnil, Qnil);
-      }
-
-      if (need_clipping)
-	{
-	  GdkRectangle clip_box;
-
-	  clip_box.x = 0;
-	  clip_box.y = 0;
-	  clip_box.width = clip_end - clip_start;
-	  clip_box.height = height;
-
-	  gdk_gc_set_clip_rectangle (gc, &clip_box);
-	  gdk_gc_set_clip_origin (gc, clip_start, dl->ypos - dl->ascent);
-	}
-
-      /* The X specific called different functions (XDraw*String
-         vs. XDraw*String16), but apparently gdk_draw_text takes care
-         of that for us.
-
-	 BUT, gdk_draw_text also does too much, by dividing the length
-	 by 2.  So we fake them out my multiplying the length by the
-	 dimension of the text.  This will do the right thing for
-	 single-dimension runs as well of course.
-      */
-      (bgc ? gdk_draw_text : gdk_draw_text_image) (GDK_DRAWABLE (x_win), gdk_font, gc, xpos,
-						   dl->ypos, (char *) runs[i].ptr,
-						   runs[i].len * runs[i].dimension);
-
-      /* We draw underlines in the same color as the text. */
-      if (cachel->underline)
-	{
-	  int upos, uthick;
-
-	  /* Cannot get at font properties in Gtk, so we resort to
-             guessing */
-	  upos = dl->descent / 2;
-	  uthick = 1;
-
-	  if ((dl->ypos + upos) < (dl->ypos + dl->descent - dl->clip))
-	    {
-	      if (dl->ypos + upos + uthick > dl->ypos + dl->descent - dl->clip)
-		uthick = dl->descent - dl->clip - upos;
-
-	      if (uthick == 1)
-		{
-		  gdk_draw_line (GDK_DRAWABLE (x_win), gc, xpos, dl->ypos + upos,
-			     xpos + this_width, dl->ypos + upos);
-		}
-	      else if (uthick > 1)
-		{
-		    gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, xpos,
-					dl->ypos + upos, this_width, uthick);
-		}
-	    }
-	}
-
-      if (cachel->strikethru) {
-	gint ascent,descent,upos, uthick;
-	GdkFont *gfont = FONT_INSTANCE_GTK_FONT (XFONT_INSTANCE (font));
-
-	/* Cannot get at font properties in Gtk, so we resort to
-           guessing */
-
-	ascent = gfont->ascent;
-	descent = gfont->descent;
-	uthick = 1;
-
-	upos = ascent - ((ascent + descent) / 2) + 1;
-
-	/* Generally, upos will be positive (above the baseline),so subtract */
-	if (dl->ypos - upos < dl->ypos + dl->descent - dl->clip)
-	  {
-	    if (dl->ypos - upos + uthick > dl->ypos + dl->descent - dl->clip)
-	      uthick = dl->descent - dl->clip + upos;
-
-	    if (uthick == 1)
-	      {
-		  gdk_draw_line (GDK_DRAWABLE (x_win), gc, xpos, dl->ypos - upos,
-				 xpos + this_width, dl->ypos - upos);
-	      }
-	    else if (uthick > 1)
-	      {
-		  gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, xpos, dl->ypos + upos,
-				      this_width, uthick);
-	      }
-	  }
-      }
-
-      /* Restore the GC */
-      if (need_clipping)
-	{
-	    gdk_gc_set_clip_rectangle (gc, NULL);
-	    gdk_gc_set_clip_origin (gc, 0, 0);
-	}
-
-      /* If we are actually superimposing the cursor then redraw with just
-	 the appropriate section highlighted. */
-      if (cursor_clip && !cursor && focus && cursor_cachel)
-	{
-	  GdkGC *cgc;
-	  GdkRectangle clip_box;
-
-	  cgc = gtk_get_gc (d, font, cursor_cachel->foreground,
-			    cursor_cachel->background, Qnil, Qnil);
-
-	  clip_box.x = 0;
-	  clip_box.y = 0;
-	  clip_box.width = cursor_width;
-	  clip_box.height = height;
-
-	  gdk_gc_set_clip_rectangle (cgc, &clip_box);
-	  gdk_gc_set_clip_origin (cgc, cursor_start, dl->ypos - dl->ascent);
-
-	  /* The X specific called different functions (XDraw*String
-	     vs. XDraw*String16), but apparently gdk_draw_text takes care
-	     of that for us.
-
-	     BUT, gdk_draw_text also does too much, by dividing the
-	     length by 2.  So we fake them out my multiplying the
-	     length by the dimension of the text.  This will do the
-	     right thing for single-dimension runs as well of course.
-	  */
-	  gdk_draw_text_image (GDK_DRAWABLE (x_win), gdk_font, cgc, xpos,
-			       dl->ypos, (char *) runs[i].ptr,
-			       runs[i].len * runs[i].dimension);
-
-	  gdk_gc_set_clip_rectangle (cgc, NULL);
-	  gdk_gc_set_clip_origin (cgc, 0, 0);
-	}
-
-      xpos += this_width;
-    }
-
-  /* Draw the non-focus box or bar-cursor as needed. */
-  /* Can't this logic be simplified? */
-  if (cursor_cachel
-      && ((cursor && !focus && NILP (bar_cursor_value))
-	  || (cursor_width
-	      && (cursor_start + cursor_width >= clip_start)
-	      && !NILP (bar_cursor_value))))
-    {
-      int tmp_height, tmp_y;
-      int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2;
-      int need_clipping = (cursor_start < clip_start
-			   || clip_end < cursor_start + cursor_width);
-
-      /* #### This value is correct (as far as I know) because
-	 all of the times we need to draw this cursor, we will
-	 be called with exactly one character, so we know we
-	 can always use runs[0].
-
-	 This is bogus as all hell, however.  The cursor handling in
-	 this function is way bogus and desperately needs to be
-	 cleaned up. (In particular, the drawing of the cursor should
-	 really really be separated out of this function.  This may be
-	 a bit tricky now because this function itself does way too
-	 much stuff, a lot of which needs to be moved into
-	 redisplay.c) This is the only way to be able to easily add
-	 new cursor types or (e.g.) make the bar cursor be able to
-	 span two characters instead of overlaying just one. */
-      int bogusly_obtained_ascent_value =
-	XFONT_INSTANCE (FACE_CACHEL_FONT (cachel, runs[0].charset))->ascent;
-
-      if (!NILP (bar_cursor_value))
-	{
-	  gc = gtk_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil,
-			   make_int (bar_width));
-	}
-      else
-	{
-	  gc = gtk_get_gc (d, Qnil, cursor_cachel->background,
-			   Qnil, Qnil, Qnil);
-	}
-
-      tmp_y = dl->ypos - bogusly_obtained_ascent_value;
-      tmp_height = cursor_height;
-      if (tmp_y + tmp_height > (int) (dl->ypos - dl->ascent + height))
-	{
-	  tmp_y = dl->ypos - dl->ascent + height - tmp_height;
-	  if (tmp_y < (int) (dl->ypos - dl->ascent))
-	    tmp_y = dl->ypos - dl->ascent;
-	  tmp_height = dl->ypos - dl->ascent + height - tmp_y;
-	}
-
-      if (need_clipping)
-	{
-	  GdkRectangle clip_box;
-	  clip_box.x = 0;
-	  clip_box.y = 0;
-	  clip_box.width = clip_end - clip_start;
-	  clip_box.height = tmp_height;
-
-	  gdk_gc_set_clip_rectangle (gc, &clip_box);
-	  gdk_gc_set_clip_origin (gc, clip_start, tmp_y);
-	}
-
-      if (!focus && NILP (bar_cursor_value))
-	{
-	    gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, FALSE,
-				cursor_start, tmp_y,
-				cursor_width - 1, tmp_height - 1);
-	}
-      else if (focus && !NILP (bar_cursor_value))
-	{
-	    gdk_draw_line (GDK_DRAWABLE (x_win), gc,
-			   cursor_start + bar_width - 1, tmp_y,
-			   cursor_start + bar_width - 1, tmp_y + tmp_height - 1);
-	}
-
-      /* Restore the GC */
-      if (need_clipping)
-	{
-	    gdk_gc_set_clip_rectangle (gc, NULL);
-	    gdk_gc_set_clip_origin (gc, 0, 0);
-	}
-    }
-}
-
-static void
-our_draw_bitmap (GdkDrawable *drawable,
-		 GdkGC       *gc,
-		 GdkPixmap   *src,
-		 gint         xsrc,
-		 gint         ysrc,
-		 gint         xdest,
-		 gint         ydest,
-		 gint         width,
-		 gint         height);
-
-static void
-gtk_output_gdk_pixmap (struct frame *f, struct Lisp_Image_Instance *p, int x,
-		       int y, int xoffset, int yoffset,
-		       int width, int height, 
-		       GdkColor *fg, GdkColor *bg, GdkGC *override_gc)
-{
-  struct device *d = XDEVICE (f->device);
-  GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
-
-  GdkGC *gc;
-  GdkGCValues gcv;
-  unsigned long pixmap_mask;
-
-  if (!override_gc)
-    {
-      memset (&gcv, ~0, sizeof (gcv));
-      gcv.graphics_exposures = FALSE;
-      gcv.foreground = *fg;
-      gcv.background = *bg;
-      pixmap_mask = GDK_GC_FOREGROUND | GDK_GC_BACKGROUND | GDK_GC_EXPOSURES;
-
-      if (IMAGE_INSTANCE_GTK_MASK (p))
-	{
-	  gcv.function = GDK_COPY;
-	  gcv.clip_mask = IMAGE_INSTANCE_GTK_MASK (p);
-	  gcv.clip_x_origin = x - xoffset;
-	  gcv.clip_y_origin = y - yoffset;
-	  pixmap_mask |= (GDK_GC_FUNCTION | GDK_GC_CLIP_MASK | GDK_GC_CLIP_X_ORIGIN |
-			  GDK_GC_CLIP_Y_ORIGIN);
-	  /* Can't set a clip rectangle below because we already have a mask.
-	     We could conceivably create a new clipmask by zeroing out
-	     everything outside the clip region.  Is it worth it?
-	     Is it possible to get an equivalent effect by changing the
-	     args to XCopyArea below rather than messing with a clip box?
-	     - dkindred@cs.cmu.edu
-	     Yes. We don't clip at all now - andy@xemacs.org
-          */
-	}
-
-      gc = gc_cache_lookup (DEVICE_GTK_GC_CACHE (d), &gcv, pixmap_mask);
-    }
-  else
-    {
-      gc = override_gc;
-      /* override_gc might have a mask already--we don't want to nuke it.
-	 Maybe we can insist that override_gc have no mask, or use
-	 one of the suggestions above. */
-    }
-
-  if (IMAGE_INSTANCE_PIXMAP_DEPTH (p) > 0)
-    {
-      gdk_draw_pixmap (GDK_DRAWABLE (x_win), gc,
-		       IMAGE_INSTANCE_GTK_PIXMAP (p),
-		       xoffset, yoffset, x, y, width, height);
-    }
-  else
-    {
-      our_draw_bitmap (GDK_DRAWABLE (x_win), gc,
-		       IMAGE_INSTANCE_GTK_PIXMAP (p),
-		       xoffset, yoffset, x, y, width, height);
-    }
-}
-
-static void
-gtk_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 UNUSED (bg_pixmap))
-{
-  struct frame *f = XFRAME (w->frame);
-  struct device *d = XDEVICE (f->device);
-  struct Lisp_Image_Instance *p = XIMAGE_INSTANCE (image_instance);
-  Lisp_Object window;
-
-  GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
-
-  window = wrap_window (w);
-
-  /* Output the pixmap. */
-  {
-    Lisp_Object tmp_pixel;
-    GdkColor *tmp_bcolor, *tmp_fcolor;
-
-    tmp_pixel = WINDOW_FACE_CACHEL_FOREGROUND (w, findex);
-    tmp_fcolor = COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (tmp_pixel));
-    tmp_pixel = WINDOW_FACE_CACHEL_BACKGROUND (w, findex);
-    tmp_bcolor = COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (tmp_pixel));
-
-    gtk_output_gdk_pixmap (f, p, db->xpos, db->ypos,
-			   dga->xoffset, dga->yoffset,
-			   dga->width, dga->height,
-			   tmp_fcolor, tmp_bcolor, NULL);
-  }
-
-  /* Draw a cursor over top of the pixmap. */
-  if (cursor_width && cursor_height && (cursor_start >= db->xpos)
-      && !NILP (w->text_cursor_visible_p)
-      && (cursor_start < (db->xpos + dga->width)))
-    {
-      GdkGC *gc;
-      int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
-      struct face_cachel *cursor_cachel =
-	WINDOW_FACE_CACHEL (w,
-			    get_builtin_face_cache_index
-			    (w, Vtext_cursor_face));
-
-      gc = gtk_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil, Qnil);
-
-      if (cursor_width > db->xpos + dga->width - cursor_start)
-	cursor_width = db->xpos + dga->width - cursor_start;
-
-      gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, focus ? TRUE : FALSE,
-			  cursor_start, db->ypos, cursor_width,
-			  cursor_height);
-    }
-}
-
-/*****************************************************************************
- gtk_output_vertical_divider
-
- Draw a vertical divider down the right side of the given window.
- ****************************************************************************/
-static void
-gtk_output_vertical_divider (struct window *w, int UNUSED(clear))
-{
-  struct frame *f = XFRAME (w->frame);
-  struct device *d = XDEVICE (f->device);
-  GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
-  GdkGC *background_gc;
-  Lisp_Object tmp_pixel;
-  GdkGCValues gcv;
-  unsigned long mask;
-  int x, y1, y2, width, shadow_thickness, spacing, line_width;
-  face_index div_face = get_builtin_face_cache_index (w, Vvertical_divider_face);
-  
-  width = window_divider_width (w);
-  shadow_thickness = XINT (w->vertical_divider_shadow_thickness);
-  spacing = XINT (w->vertical_divider_spacing);
-  line_width = XINT (w->vertical_divider_line_width);
-  x = WINDOW_RIGHT (w) - width;
-  y1 = WINDOW_TOP (w);
-  y2 = WINDOW_BOTTOM (w);
-  
-  memset (&gcv, ~0, sizeof (gcv));
-  
-  tmp_pixel = WINDOW_FACE_CACHEL_BACKGROUND (w, div_face);
-  
-  gcv.background = * COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (tmp_pixel));
-  gcv.foreground = gcv.background;
-  gcv.graphics_exposures = FALSE;
-  mask = GDK_GC_FOREGROUND | GDK_GC_BACKGROUND | GDK_GC_EXPOSURES;
-
-  background_gc = gc_cache_lookup (DEVICE_GTK_GC_CACHE (d), &gcv, mask);
-
-  /* Clear the divider area first.  This needs to be done when a
-     window split occurs. */
-  /* if (clear) */
-  gdk_draw_rectangle (GDK_DRAWABLE (x_win), background_gc, TRUE,
-		      x, y1, width, y2 - y1);
-
-#if 0
-  /* Draw the divider line. */
-  gdk_draw_rectangle (GDK_DRAWABLE (x_win), background_gc, TRUE,
-		      x + spacing + shadow_thickness, y1,
-		      line_width, y2 - y1);
-#endif
-  
-  /* Draw the shadows around the divider line */
-  gtk_output_shadows (f, x + spacing, y1, 
-		      width - 2 * spacing, y2 - y1,
-		      shadow_thickness);
-}
-
-/*****************************************************************************
- gtk_output_blank
-
- Output a blank by clearing the area it covers in the foreground color
- of its face.
- ****************************************************************************/
-static void
-gtk_output_blank (struct window *w, struct display_line *dl, struct rune *rb,
-		  int start_pixpos, int cursor_start, int cursor_width)
-{
-  struct frame *f = XFRAME (w->frame);
-  struct device *d = XDEVICE (f->device);
-
-  GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
-  GdkGC *gc;
-  struct face_cachel *cursor_cachel =
-    WINDOW_FACE_CACHEL (w,
-			get_builtin_face_cache_index
-			(w, Vtext_cursor_face));
-  Lisp_Object bg_pmap;
-  Lisp_Object buffer = WINDOW_BUFFER (w);
-  Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
-							 buffer);
-
-  int x = rb->xpos;
-  int y = dl->ypos - dl->ascent;
-  int width = rb->width;
-  int height = dl->ascent + dl->descent - dl->clip;
-
-  if (start_pixpos > x)
-    {
-      if (start_pixpos >= (x + width))
-	return;
-      else
-	{
-	  width -= (start_pixpos - x);
-	  x = start_pixpos;
-	}
-    }
-
-  bg_pmap = WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP (w, rb->findex);
-  if (!IMAGE_INSTANCEP (bg_pmap)
-      || !IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
-    bg_pmap = Qnil;
-
-  if (NILP (bg_pmap))
-    gc = gtk_get_gc (d, Qnil, WINDOW_FACE_CACHEL_BACKGROUND (w, rb->findex),
-		     Qnil, Qnil, Qnil);
-  else
-    gc = gtk_get_gc (d, Qnil, WINDOW_FACE_CACHEL_FOREGROUND (w, rb->findex),
-		     WINDOW_FACE_CACHEL_BACKGROUND (w, rb->findex), bg_pmap,
-		     Qnil);
-
-  gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, x, y, width, height);
-
-  /* If this rune is marked as having the cursor, then it is actually
-     representing a tab. */
-  if (!NILP (w->text_cursor_visible_p)
-      && (rb->cursor_type == CURSOR_ON
-	  || (cursor_width
-	      && (cursor_start + cursor_width > x)
-	      && cursor_start < (x + width))))
-    {
-      int cursor_height, cursor_y;
-      int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
-      struct Lisp_Font_Instance *fi;
-
-      fi = XFONT_INSTANCE (FACE_CACHEL_FONT
-			   (WINDOW_FACE_CACHEL (w, rb->findex),
-			    Vcharset_ascii));
-
-      gc = gtk_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil, Qnil);
-
-      cursor_y = dl->ypos - fi->ascent;
-      cursor_height = fi->height;
-      if (cursor_y + cursor_height > y + height)
-	cursor_height = y + height - cursor_y;
-
-      if (focus)
-	{
-	  if (NILP (bar_cursor_value))
-	    {
-		gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE,
-				    cursor_start, cursor_y,
-				    fi->width, cursor_height);
-	    }
-	  else
-	    {
-	      int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2;
-
-	      gc = gtk_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil,
-			       make_int (bar_width));
-	      gdk_draw_line (GDK_DRAWABLE (x_win), gc, cursor_start + bar_width - 1,
-			     cursor_y, cursor_start + bar_width - 1,
-			     cursor_y + cursor_height - 1);
-	    }
-	}
-      else if (NILP (bar_cursor_value))
-	{
-	    gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, FALSE,
-				cursor_start, cursor_y,
-				fi->width - 1, cursor_height - 1);
-	}
-    }
-}
-
-/*****************************************************************************
- gtk_output_horizontal_line
-
- Output a horizontal line in the foreground of its face.
- ****************************************************************************/
-static void
-gtk_output_horizontal_line (struct window *w,
-			    struct display_line *dl,
-			    struct rune *rb)
-{
-  struct frame *f = XFRAME (w->frame);
-  struct device *d = XDEVICE (f->device);
-  GtkStyle *style = FRAME_GTK_TEXT_WIDGET (f)->style;
-
-  GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
-  GdkGC *gc;
-
-  int x = rb->xpos;
-  int width = rb->width;
-  int height = dl->ascent + dl->descent - dl->clip;
-
-  int ypos1, ypos2, ypos3, ypos4;
-
-  ypos1 = dl->ypos - dl->ascent;
-  ypos2 = ypos1 + rb->object.hline.yoffset;
-  ypos3 = ypos2 + rb->object.hline.thickness;
-  ypos4 = dl->ypos + dl->descent - dl->clip;
-
-  /* First clear the area not covered by the line. */
-  if (height - rb->object.hline.thickness > 0)
-    {
-      gc = gtk_get_gc (d, Qnil, WINDOW_FACE_CACHEL_FOREGROUND (w, rb->findex),
-		     Qnil, Qnil, Qnil);
-
-      if (ypos2 - ypos1 > 0)
-	  gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, x, ypos1, width, ypos2 - ypos1);
-      if (ypos4 - ypos3 > 0)
-	  gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, x, ypos1, width, ypos2 - ypos1);
-    }
-
-  gtk_paint_hline (style, x_win, GTK_STATE_NORMAL, NULL, FRAME_GTK_TEXT_WIDGET (f),
-		   "hline", x, x + width, ypos2);
-#if 0
-  /* Now draw the line. */
-  gc = gtk_get_gc (d, Qnil, WINDOW_FACE_CACHEL_BACKGROUND (w, rb->findex),
-		   Qnil, Qnil, Qnil);
-
-  if (ypos2 < ypos1)
-    ypos2 = ypos1;
-  if (ypos3 > ypos4)
-    ypos3 = ypos4;
-
-  if (ypos3 - ypos2 > 0)
-      gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, x, ypos2, width, ypos3 - ypos2);
-#endif
-}
-
-/*****************************************************************************
  gtk_output_shadows
 
  Draw a shadow around the given area using the standard theme engine routines.
@@ -1419,271 +75,6 @@
 		    x, y, width, height);
 }
 
-/*****************************************************************************
- gtk_clear_to_window_end
-
- Clear the area between ypos1 and ypos2.  Each margin area and the
- text area is handled separately since they may each have their own
- background color.
- ****************************************************************************/
-static void
-gtk_clear_to_window_end (struct window *w, int ypos1, int ypos2)
-{
-  int height = ypos2 - ypos1;
-
-  if (height)
-    {
-      struct frame *f = XFRAME (w->frame);
-      Lisp_Object window;
-      int bflag = (window_needs_vertical_divider (w) ? 0 : 1);
-      layout_bounds bounds;
-
-      bounds = calculate_display_line_boundaries (w, bflag);
-      window = wrap_window (w);
-
-      if (window_is_leftmost (w))
-	redisplay_clear_region (window, DEFAULT_INDEX, FRAME_LEFT_BORDER_START (f),
-				ypos1, FRAME_BORDER_WIDTH (f), height);
-
-      if (bounds.left_in - bounds.left_out > 0)
-	redisplay_clear_region (window,
-				get_builtin_face_cache_index (w, Vleft_margin_face),
-				bounds.left_out, ypos1,
-				bounds.left_in - bounds.left_out, height);
-
-      if (bounds.right_in - bounds.left_in > 0)
-	redisplay_clear_region (window, DEFAULT_INDEX, bounds.left_in, ypos1,
-				bounds.right_in - bounds.left_in, height);
-
-      if (bounds.right_out - bounds.right_in > 0)
-	redisplay_clear_region (window,
-				get_builtin_face_cache_index (w, Vright_margin_face),
-				bounds.right_in, ypos1,
-				bounds.right_out - bounds.right_in, height);
-
-      if (window_is_rightmost (w))
-	redisplay_clear_region (window, DEFAULT_INDEX, FRAME_RIGHT_BORDER_START (f),
-				ypos1, FRAME_BORDER_WIDTH (f), height);
-    }
-}
-
-/****************************************************************************
- gtk_clear_region
-
- Clear the area in the box defined by the given parameters using the
- given face.
- ****************************************************************************/
-static void
-gtk_clear_region (Lisp_Object UNUSED (locale), struct device* d,
-		  struct frame* f, face_index UNUSED (findex), int x, int y,
-		  int width, int height, Lisp_Object fcolor, Lisp_Object bcolor,
-		  Lisp_Object background_pixmap)
-{
-  GdkWindow *x_win;
-  GdkGC *gc = NULL;
-
-  x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
-
-  if (!UNBOUNDP (background_pixmap))
-    {
-      gc = gtk_get_gc (d, Qnil, fcolor, bcolor, background_pixmap, Qnil);
-    }
-
-  if (gc)
-    {
-      gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc,TRUE,
-			  x, y, width, height);
-    }
-  else
-    {
-      gdk_window_clear_area (x_win, x, y, width, height);
-    }
-}
-
-/*****************************************************************************
- gtk_output_eol_cursor
-
- Draw a cursor at the end of a line.  The end-of-line cursor is
- narrower than the normal cursor.
- ****************************************************************************/
-static void
-gtk_output_eol_cursor (struct window *w, struct display_line *dl, int xpos,
-		       face_index findex)
-{
-  struct frame *f = XFRAME (w->frame);
-  struct device *d = XDEVICE (f->device);
-  Lisp_Object window;
-
-  GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
-  GdkGC *gc;
-  face_index elt = get_builtin_face_cache_index (w, Vtext_cursor_face);
-  struct face_cachel *cursor_cachel = WINDOW_FACE_CACHEL (w, elt);
-
-  int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
-  Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
-							 WINDOW_BUFFER (w));
-
-  int x = xpos;
-  int y = dl->ypos - dl->ascent;
-  int width = EOL_CURSOR_WIDTH;
-  int height = dl->ascent + dl->descent - dl->clip;
-  int cursor_height, cursor_y;
-  int defheight, defascent;
-
-  window = wrap_window (w);
-  redisplay_clear_region (window, findex, x, y, width, height);
-
-  if (NILP (w->text_cursor_visible_p))
-    return;
-
-  gc = gtk_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil, Qnil);
-
-  default_face_font_info (window, &defascent, 0, &defheight, 0, 0);
-
-  /* make sure the cursor is entirely contained between y and y+height */
-  cursor_height = min (defheight, height);
-  cursor_y = max (y, min (y + height - cursor_height,
-			  dl->ypos - defascent));
-
-  if (focus)
-    {
-      if (NILP (bar_cursor_value))
-	{
-	    gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, x, cursor_y, width, cursor_height);
-	}
-      else
-	{
-	  int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2;
-
-	  gc = gtk_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil,
-			   make_int (bar_width));
-	  gdk_draw_line (GDK_DRAWABLE (x_win), gc, x + bar_width - 1, cursor_y,
-			 x + bar_width - 1, cursor_y + cursor_height - 1);
-	}
-    }
-  else if (NILP (bar_cursor_value))
-    {
-	gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, FALSE, x, cursor_y, width - 1,
-			    cursor_height - 1);
-    }
-}
-
-static void
-gtk_clear_frame_window (Lisp_Object window)
-{
-  struct window *w = XWINDOW (window);
-
-  if (!NILP (w->vchild))
-    {
-      gtk_clear_frame_windows (w->vchild);
-      return;
-    }
-
-  if (!NILP (w->hchild))
-    {
-      gtk_clear_frame_windows (w->hchild);
-      return;
-    }
-
-  gtk_clear_to_window_end (w, WINDOW_TEXT_TOP (w), WINDOW_TEXT_BOTTOM (w));
-}
-
-static void
-gtk_clear_frame_windows (Lisp_Object window)
-{
-  for (; !NILP (window); window = XWINDOW (window)->next)
-    gtk_clear_frame_window (window);
-}
-
-static void
-gtk_clear_frame (struct frame *f)
-{
-  GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
-  int x, y, width, height;
-  Lisp_Object frame;
-
-  x = FRAME_LEFT_BORDER_START (f);
-  width = (FRAME_PIXWIDTH (f) - FRAME_REAL_LEFT_TOOLBAR_WIDTH (f) -
-	   FRAME_REAL_RIGHT_TOOLBAR_WIDTH (f) -
-	   2 * FRAME_REAL_LEFT_TOOLBAR_BORDER_WIDTH (f) -
-	   2 * FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH (f));
-  /* #### This adjustment by 1 should be being done in the macros.
-     There is some small differences between when the menubar is on
-     and off that we still need to deal with. */
-  y = FRAME_TOP_BORDER_START (f) - 1;
-  height = (FRAME_PIXHEIGHT (f) - FRAME_REAL_TOP_TOOLBAR_HEIGHT (f) -
-	    FRAME_REAL_BOTTOM_TOOLBAR_HEIGHT (f) -
-	    2 * FRAME_REAL_TOP_TOOLBAR_BORDER_WIDTH (f) -
-	    2 * FRAME_REAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f)) + 1;
-
-  gdk_window_clear_area (x_win, x, y, width, height);
-
-  frame = wrap_frame (f);
-
-  if (!UNBOUNDP (FACE_BACKGROUND_PIXMAP (Vdefault_face, frame))
-      || !UNBOUNDP (FACE_BACKGROUND_PIXMAP (Vleft_margin_face, frame))
-      || !UNBOUNDP (FACE_BACKGROUND_PIXMAP (Vright_margin_face, frame)))
-    {
-      gtk_clear_frame_windows (f->root_window);
-    }
-}
-
-static int
-gtk_flash (struct device *d)
-{
-  GdkGCValues gcv;
-  GdkGC *gc;
-  GdkColor tmp_fcolor, tmp_bcolor;
-  Lisp_Object tmp_pixel, frame;
-  struct frame *f = device_selected_frame (d);
-  struct window *w = XWINDOW (FRAME_ROOT_WINDOW (f));
-
-  frame = wrap_frame (f);
-
-  tmp_pixel = FACE_FOREGROUND (Vdefault_face, frame);
-  tmp_fcolor = * (COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (tmp_pixel)));
-  tmp_pixel = FACE_BACKGROUND (Vdefault_face, frame);
-  tmp_bcolor = * (COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (tmp_pixel)));
-
-  memset (&gcv, ~0, sizeof (gcv)); /* initialize all slots to ~0 */
-  gcv.foreground.pixel  = (tmp_fcolor.pixel ^ tmp_bcolor.pixel);
-  gcv.function = GDK_XOR;
-  gcv.graphics_exposures = FALSE;
-  gc = gc_cache_lookup (DEVICE_GTK_GC_CACHE (XDEVICE (f->device)), &gcv,
-			GDK_GC_FOREGROUND | GDK_GC_FUNCTION | GDK_GC_EXPOSURES);
-
-  gdk_draw_rectangle (GDK_DRAWABLE (GET_GTK_WIDGET_WINDOW (FRAME_GTK_SHELL_WIDGET (f))),
-		      gc, TRUE, w->pixel_left, w->pixel_top,
-		      w->pixel_width, w->pixel_height);
-
-  gdk_flush ();
-
-#ifdef HAVE_SELECT
-  {
-    int usecs = 100000;
-    struct timeval tv;
-    tv.tv_sec  = usecs / 1000000L;
-    tv.tv_usec = usecs % 1000000L;
-    /* I'm sure someone is going to complain about this... */
-    select (0, 0, 0, 0, &tv);
-  }
-#else
-#ifdef HAVE_POLL
-  poll (0, 0, 100);
-#else
-  bite me
-#endif
-#endif
-
-  gdk_draw_rectangle (GDK_DRAWABLE (GET_GTK_WIDGET_WINDOW (FRAME_GTK_SHELL_WIDGET (f))),
-		      gc, TRUE, w->pixel_left, w->pixel_top,
-		      w->pixel_width, w->pixel_height);
-
-  gdk_flush ();
-
-  return 1;
-}
-
 static void
 gtk_bevel_area (struct window *w, face_index UNUSED (findex),
 		int x, int y, int width, int height,
@@ -1710,29 +101,6 @@
 }
 
 
-/************************************************************************/
-/*                            initialization                            */
-/************************************************************************/
-
-void
-console_type_create_redisplay_gtk (void)
-{
-  /* redisplay methods */
-  CONSOLE_HAS_METHOD (gtk, text_width);
-  CONSOLE_HAS_METHOD (gtk, output_display_block);
-  CONSOLE_HAS_METHOD (gtk, divider_height);
-  CONSOLE_HAS_METHOD (gtk, eol_cursor_width);
-  CONSOLE_HAS_METHOD (gtk, output_vertical_divider);
-  CONSOLE_HAS_METHOD (gtk, clear_to_window_end);
-  CONSOLE_HAS_METHOD (gtk, clear_region);
-  CONSOLE_HAS_METHOD (gtk, clear_frame);
-  CONSOLE_HAS_METHOD (gtk, flash);
-  CONSOLE_HAS_METHOD (gtk, ring_bell);
-  CONSOLE_HAS_METHOD (gtk, bevel_area);
-  CONSOLE_HAS_METHOD (gtk, output_string);
-  CONSOLE_HAS_METHOD (gtk, output_pixmap);
-}
-
 /* This makes me feel incredibly dirty... but there is no other way to
    get this done right other than calling clear_area before every
    single $#!%@ing piece of text, which I do NOT want to do. */
--- a/src/redisplay-x.c	Thu Jan 28 12:59:48 2010 -0700
+++ b/src/redisplay-x.c	Fri Jan 29 15:06:36 2010 -0600
@@ -27,485 +27,13 @@
 
 /* Lots of work done by Ben Wing for Mule */
 
-#include <config.h>
-#include "lisp.h"
-
-#include "buffer.h"
-#include "debug.h"
-#include "device-impl.h"
-#include "faces.h"
-#include "file-coding.h"
-#include "frame-impl.h"
-#include "gutter.h"
-#include "redisplay.h"
-#include "sysdep.h"
-#include "window.h"
-
-#include "mule-ccl.h"
-#include "charset.h"
-
-#include "console-x-impl.h"
-#include "glyphs-x.h"
-#include "objects-x-impl.h"
-#include "xgccache.h"
-
-#include "EmacsFrame.h"
-#include "EmacsFrameP.h"
-
-#include "sysproc.h" /* for select() */
-
-#include <X11/bitmaps/gray>
 
 /* Number of pixels below each line. */
 int x_interline_space; /* #### this needs to be implemented, but per-font */
 
-#define EOL_CURSOR_WIDTH	5
-
-static void x_output_vertical_divider (struct window *w, int clear);
-static void x_output_blank (struct window *w, struct display_line *dl,
-			    struct rune *rb, int start_pixpos,
-			    int cursor_start, int cursor_width);
-static void x_output_hline (struct window *w, struct display_line *dl,
-			    struct rune *rb);
-static void x_output_eol_cursor (struct window *w, struct display_line *dl,
-				 int xpos, face_index findex);
-static void x_clear_frame (struct frame *f);
-static void x_clear_frame_windows (Lisp_Object window);
-
-#ifdef USE_XFT
-#define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \
-		   ? ((unsigned long) (x)) : ((unsigned long) (y)))
-#endif /* USE_XFT */
-
-
-     /* Note: We do not use the Xmb*() functions and XFontSets, nor the
-	Motif XFontLists and CompoundStrings.
-	Those functions are generally losing for a number of reasons.
-	Most important, they only support one locale (e.g. you could
-	display Japanese and ASCII text, but not mixed Japanese/Chinese
-	text).  You could maybe call setlocale() frequently to try to deal
-	with this, but that would generally fail because an XFontSet is
-	tied to one locale and won't have the other character sets in it.
-
-	fontconfig (the font database for Xft) has some specifier-like
-	properties, but it's not sufficient (witness the existence of
-	Pango).  Pango might do the trick, but it's not a cross-platform
-	solution; it would need significant advantages to be worth the
-	effort.
-     */
-
-/* #### Break me out into a separate header */
-struct textual_run
-{
-  Lisp_Object charset;
-  unsigned char *ptr;
-  int len;
-  int dimension;
-};
-
-/* Separate out the text in DYN into a series of textual runs of a
-   particular charset.  Also convert the characters as necessary into
-   the format needed by XDrawImageString(), XDrawImageString16(), et
-   al.  This means converting to one or two byte format, possibly
-   tweaking the high bits, and possibly running a CCL program. You
-   must pre-allocate the space used and pass it in. (This is done so
-   you can ALLOCA () the space.)  (sizeof(bufchar) * len) bytes must be
-   allocated for TEXT_STORAGE and (len * sizeof (struct textual_run))
-   bytes of RUN_STORAGE, where LEN is the length of the dynarr.
-
-   bufchar might not be fixed width (in the case of UTF-8).
-
-   Returns the number of runs actually used. */
-
-/* Notes on Xft implementation
-
-   - With Unicode, we're no longer going to have repertoires reified as
-   charsets.  (Not that we ever really did, what with corporate variants,
-   and so on.)  So we really should be querying the face for the desired
-   font, rather than the character for the charset, and that's what would
-   determine the separation into runs.
-   - The widechar versions of fontconfig (and therefore Xft) functions
-   seem to be just bigendian Unicode.  So there's actually no need to use
-   the 8-bit versions in computing runs and runes, it would seem.
-*/
-
-#if !defined(USE_XFT) && !defined(MULE)
-static int
-separate_textual_runs_nomule (unsigned char *text_storage,
-			      struct textual_run *run_storage,
-			      const Ichar *str, Charcount len,
-			      struct face_cachel *UNUSED(cachel))
-{
-  if (!len)
-    return 0;
-
-  run_storage[0].ptr = text_storage;
-  run_storage[0].len = len;
-  run_storage[0].dimension = 1;
-  run_storage[0].charset = Qnil;
-
-  while (len--)
-    *text_storage++ = *str++;
-  return 1;
-}
-#endif
-
-#if defined(USE_XFT) && !defined(MULE)
-/*
-  Note that in this configuration the "Croatian hack" of using an 8-bit,
-  non-Latin-1 font to get localized display without Mule simply isn't
-  available.  That's by design -- Unicode does not aid or abet that kind
-  of punning.
-  This means that the cast to XftChar16 gives the correct "conversion" to
-  UCS-2.
-  #### Is there an alignment issue with text_storage?
-*/
-static int
-separate_textual_runs_xft_nomule (unsigned char *text_storage,
-				  struct textual_run *run_storage,
-				  const Ichar *str, Charcount len,
-				  struct face_cachel *UNUSED(cachel))
-{
-  int i;
-  if (!len)
-    return 0;
-
-  run_storage[0].ptr = text_storage;
-  run_storage[0].len = len;
-  run_storage[0].dimension = 2;
-  run_storage[0].charset = Qnil;
-
-  for (i = 0; i < len; i++)
-    {
-      *(XftChar16 *)text_storage = str[i];
-      text_storage += sizeof(XftChar16);
-    }
-  return 1;
-}
-#endif
-
-#if defined(USE_XFT) && defined(MULE)
-static int
-separate_textual_runs_xft_mule (unsigned char *text_storage,
-				struct textual_run *run_storage,
-				const Ichar *str, Charcount len,
-				struct face_cachel *UNUSED(cachel))
-{
-  Lisp_Object prev_charset = Qunbound;
-  int runs_so_far = 0, i;
-
-  run_storage[0].ptr = text_storage;
-  run_storage[0].len = len;
-  run_storage[0].dimension = 2;
-  run_storage[0].charset = Qnil;
-
-  for (i = 0; i < len; i++)
-    {
-      Ichar ch = str[i];
-      Lisp_Object charset = ichar_charset(ch);
-      int ucs = ichar_to_unicode(ch);
-
-      /* If UCS is less than zero or greater than 0xFFFF, set ucs2 to
-	 REPLACMENT CHARACTER. */
-      /* That means we can't handle characters outside of the BMP for now */
-      ucs = (ucs & ~0xFFFF) ? 0xFFFD : ucs;
-
-      if (!EQ (charset, prev_charset))
-	{
-	  if (runs_so_far)
-	    run_storage[runs_so_far-1].len = (text_storage - run_storage[runs_so_far-1].ptr) >> 1;
-	  run_storage[runs_so_far].ptr = text_storage;
-	  run_storage[runs_so_far].dimension = 2;
-	  run_storage[runs_so_far].charset = charset;
-	  prev_charset = charset;
-	  runs_so_far++;
-	}
-
-      *(XftChar16 *)text_storage = ucs;
-      text_storage += sizeof(XftChar16);
-    }
-
-  if (runs_so_far)
-    run_storage[runs_so_far-1].len = (text_storage - run_storage[runs_so_far-1].ptr) >> 1;
-  return runs_so_far;
-}
-#endif
-
-#if !defined(USE_XFT) && defined(MULE)
-/*
-  This is the most complex function of this group, due to the various
-  indexing schemes used by different fonts.  For our purposes, they
-  fall into three classes.  Some fonts are indexed compatibly with ISO
-  2022; those fonts just use the Mule internal representation directly
-  (typically the high bit must be reset; this is determined by the `graphic'
-  flag).  Some fonts are indexed by Unicode, specifically by UCS-2.  These
-  are all translated using `ichar_to_unicode'.  Finally some fonts have
-  irregular indexes, and must be translated ad hoc.  In XEmacs ad hoc
-  translations are accomplished with CCL programs. */
-static int
-separate_textual_runs_mule (unsigned char *text_storage,
-			    struct textual_run *run_storage,
-			    const Ichar *str, Charcount len,
-			    struct face_cachel *cachel)
-{
-  Lisp_Object prev_charset = Qunbound;
-  int runs_so_far = 0, i;
-  Ibyte charset_leading_byte = LEADING_BYTE_ASCII;
-  int dimension = 1, graphic = 0, need_ccl_conversion = 0;
-  Lisp_Object ccl_prog;
-  struct ccl_program char_converter;
-
-  int translate_to_ucs_2 = 0;
-
-  for (i = 0; i < len; i++)
-    {
-      Ichar ch = str[i];
-      Lisp_Object charset;
-      int byte1, byte2;		/* BREAKUP_ICHAR dereferences the addresses
-				   of its arguments as pointer to int. */
-      BREAKUP_ICHAR (ch, charset, byte1, byte2);
-
-      if (!EQ (charset, prev_charset))
-	{
-	  /* At this point, dimension' and `prev_charset' refer to just-
-	     completed run.  `runs_so_far' and `text_storage' refer to the
-	     run about to start. */
-	  if (runs_so_far)
-	    {
-	      /* Update metadata for previous run. */
-	      run_storage[runs_so_far - 1].len =
-		text_storage - run_storage[runs_so_far - 1].ptr;
-	      if (2 == dimension) run_storage[runs_so_far - 1].len >>= 1;
-	    }
+#define THIS_IS_X
 
-	  /* Compute metadata for current run.
-	     First, classify font.
-	     If the font is indexed by UCS-2, set `translate_to_ucs_2'.
-	     Else if the charset has a CCL program, set `need_ccl_conversion'.
-	     Else if the font is indexed by an ISO 2022 "graphic register",
-	         set `graphic'.
-	     These flags are almost mutually exclusive, but we're sloppy
-	     about resetting "shadowed" flags.  So the flags must be checked
-	     in the proper order in computing byte1 and byte2, below. */
-	  charset_leading_byte = XCHARSET_LEADING_BYTE(charset);
-	  translate_to_ucs_2 =
-	    bit_vector_bit (FACE_CACHEL_FONT_FINAL_STAGE (cachel),
-			    charset_leading_byte - MIN_LEADING_BYTE);
-	  if (translate_to_ucs_2)
-	    {
-	      dimension = 2;
-	    }
-	  else
-	    {
-	      dimension = XCHARSET_DIMENSION (charset);
-
-	      /* Check for CCL charset.
-		 If setup_ccl_program fails, we'll get a garbaged display.
-		 This should never happen, and even if it does, it should
-		 be harmless (unless the X server has buggy handling of
-		 characters undefined in the font).  It may be marginally
-		 more useful to users and debuggers than substituting a
-		 fixed replacement character. */
-	      ccl_prog = XCHARSET_CCL_PROGRAM (charset);
-	      if ((!NILP (ccl_prog))
-		  && (setup_ccl_program (&char_converter, ccl_prog) >= 0))
-		{
-		  need_ccl_conversion = 1;
-		}
-	      else 
-		{
-		  /* The charset must have an ISO 2022-compatible font index.
-		     There are 2 "registers" (what such fonts use as index).
-		     GL (graphic == 0) has the high bit of each octet reset,
-		     GR (graphic == 1) has it set. */
-		  graphic   = XCHARSET_GRAPHIC (charset);
-		  need_ccl_conversion = 0;
-		}
-	    }
-
-	  /* Initialize metadata for current run. */
-	  run_storage[runs_so_far].ptr       = text_storage;
-	  run_storage[runs_so_far].charset   = charset;
-	  run_storage[runs_so_far].dimension = dimension;
-
-	  /* Update loop variables. */
-	  prev_charset = charset;
-	  runs_so_far++;
-	} 
-
-      /* Must check flags in this order.  See comment above. */
-      if (translate_to_ucs_2)
-	{
-	  int ucs = ichar_to_unicode(ch);
-	  /* If UCS is less than zero or greater than 0xFFFF, set ucs2 to
-	     REPLACMENT CHARACTER. */
-	  ucs = (ucs & ~0xFFFF) ? 0xFFFD : ucs;
-
-	  byte1 = ucs >> 8;
-	  byte2 = ucs;
-	}
-      else if (need_ccl_conversion)
-	{
-	  char_converter.reg[0] = charset_leading_byte;
-	  char_converter.reg[1] = byte1;
-	  char_converter.reg[2] = byte2;
-	  ccl_driver (&char_converter, 0, 0, 0, 0, CCL_MODE_ENCODING);
-	  byte1 = char_converter.reg[1];
-	  byte2 = char_converter.reg[2];
-	}
-      else if (graphic == 0)
-	{
-	  byte1 &= 0x7F;
-	  byte2 &= 0x7F;
-	}
-      else
-	{
-	  byte1 |= 0x80;
-	  byte2 |= 0x80;
-	}
-
-      *text_storage++ = (unsigned char)byte1;
-
-      if (2 == dimension) *text_storage++ = (unsigned char)byte2;
-    }
-
-  if (runs_so_far)
-    {
-      run_storage[runs_so_far - 1].len =
-	text_storage - run_storage[runs_so_far - 1].ptr;
-      /* Dimension retains the relevant value for the run before it. */
-      if (2 == dimension)
-	run_storage[runs_so_far - 1].len >>= 1;
-    }
-
-  return runs_so_far;
-}
-#endif
-
-static int
-separate_textual_runs (unsigned char *text_storage,
-		       struct textual_run *run_storage,
-		       const Ichar *str, Charcount len,
-		       struct face_cachel *cachel)
-{
-#if defined(USE_XFT) && defined(MULE)
-  return separate_textual_runs_xft_mule(text_storage, run_storage, str, len, cachel);
-#endif
-#if defined(USE_XFT) && !defined(MULE)
-  return separate_textual_runs_xft_nomule(text_storage, run_storage, str, len, cachel);
-#endif
-#if !defined(USE_XFT) && defined(MULE)
-  return separate_textual_runs_mule(text_storage, run_storage, str, len, cachel);
-#endif
-#if !defined(USE_XFT) && !defined(MULE)
-  return separate_textual_runs_nomule(text_storage, run_storage, str, len, cachel);
-#endif
-}
-
-/****************************************************************************/
-/*                                                                          */
-/*                           X output routines                              */
-/*                                                                          */
-/****************************************************************************/
-
-static int
-x_text_width_single_run (struct frame * USED_IF_XFT (f),
-			 struct face_cachel *cachel, struct textual_run *run)
-{
-  Lisp_Object font_inst = FACE_CACHEL_FONT (cachel, run->charset);
-  Lisp_Font_Instance *fi = XFONT_INSTANCE (font_inst);
-  if (!fi->proportional_p)
-    return fi->width * run->len;
-#ifdef USE_XFT
-  else if (FONT_INSTANCE_X_XFTFONT(fi))
-    {
-      static XGlyphInfo glyphinfo;
-      struct device *d = XDEVICE (f->device);
-      Display *dpy = DEVICE_X_DISPLAY (d);
-
-      if (run->dimension == 2) {
-	XftTextExtents16 (dpy,
-			  FONT_INSTANCE_X_XFTFONT(fi),
-			  (XftChar16 *) run->ptr, run->len, &glyphinfo);
-      } else {
-	XftTextExtents8 (dpy,
-			 FONT_INSTANCE_X_XFTFONT(fi),
-			 run->ptr, run->len, &glyphinfo);
-      }
-    
-      return glyphinfo.xOff;
-    }
-#endif
-  else if (FONT_INSTANCE_X_FONT (fi))
-    {
-      if (run->dimension == 2)
-	return XTextWidth16 (FONT_INSTANCE_X_FONT (fi),
-			     (XChar2b *) run->ptr, run->len);
-      else
-	return XTextWidth (FONT_INSTANCE_X_FONT (fi),
-			   (char *) run->ptr, run->len);
-    }
-  else
-    abort();
-  return 0;			/* shut up GCC */
-}
-
-/*
-   x_text_width
-
-   Given a string and a merged face, return the string's length in pixels
-   when displayed in the fonts associated with the face.
-   */
-
-/* #### Break me out into a separate header */
-int x_text_width (struct frame *f, struct face_cachel *cachel,
-		  const Ichar *str, Charcount len);
-int
-x_text_width (struct frame *f, struct face_cachel *cachel,
-	      const Ichar *str, Charcount len)
-{
-  /* !!#### Needs review */
-  int width_so_far = 0;
-  unsigned char *text_storage = (unsigned char *) ALLOCA (2 * len);
-  struct textual_run *runs = alloca_array (struct textual_run, len);
-  int nruns;
-  int i;
-
-  nruns = separate_textual_runs (text_storage, runs, str, len, 
-				 cachel);
-
-  for (i = 0; i < nruns; i++)
-    width_so_far += x_text_width_single_run (f, cachel, runs + i);
-
-  return width_so_far;
-}
-
-/*****************************************************************************
- x_divider_height
-
- Return the height of the horizontal divider.  This is a function because
- divider_height is a device method.
-
- #### If we add etched horizontal divider lines this will have to get
- smarter.
- ****************************************************************************/
-static int
-x_divider_height (void)
-{
-  return 1;
-}
-
-/*****************************************************************************
- x_eol_cursor_width
-
- Return the width of the end-of-line cursor.  This is a function
- because eol_cursor_width is a device method.
- ****************************************************************************/
-static int
-x_eol_cursor_width (void)
-{
-  return EOL_CURSOR_WIDTH;
-}
+#include "redisplay-xlike-inc.c"
 
 /*****************************************************************************
  x_window_output_begin
@@ -530,218 +58,6 @@
 }
 
 /*****************************************************************************
- x_output_display_block
-
- Given a display line, a block number for that start line, output all
- runes between start and end in the specified display block.
- ****************************************************************************/
-static void
-x_output_display_block (struct window *w, struct display_line *dl, int block,
-			int start, int end, int start_pixpos, int cursor_start,
-			int cursor_width, int cursor_height)
-{
-#ifndef USE_XFT
-  struct frame *f = XFRAME (w->frame);
-#endif
-  Ichar_dynarr *buf;
-  Lisp_Object window;
-
-  struct display_block *db = Dynarr_atp (dl->display_blocks, block);
-  rune_dynarr *rba = db->runes;
-  struct rune *rb;
-
-  int elt = start;
-  face_index findex;
-  int xpos, width = 0;
-  Lisp_Object charset = Qunbound; /* Qnil is a valid charset when
-				     MULE is not defined */
-
-  window = wrap_window (w);
-  rb = Dynarr_atp (rba, start);
-
-  if (!rb)
-    /* Nothing to do so don't do anything. */
-    return;
-
-  findex = rb->findex;
-  xpos = rb->xpos;
-  if (rb->type == RUNE_CHAR)
-    charset = ichar_charset (rb->object.chr.ch);
-
-  if (end < 0)
-    end = Dynarr_length (rba);
-  buf = Dynarr_new (Ichar);
-
-  while (elt < end)
-    {
-      rb = Dynarr_atp (rba, elt);
-
-      if (rb->findex == findex && rb->type == RUNE_CHAR
-	  && rb->object.chr.ch != '\n' && rb->cursor_type != CURSOR_ON
-	  && EQ (charset, ichar_charset (rb->object.chr.ch)))
-	{
-	  Dynarr_add (buf, rb->object.chr.ch);
-	  width += rb->width;
-	  elt++;
-	}
-      else
-	{
-	  if (Dynarr_length (buf))
-	    {
-	      x_output_string (w, dl, buf, xpos, 0, start_pixpos, width,
-			       findex, 0, cursor_start, cursor_width,
-			       cursor_height);
-	      xpos = rb->xpos;
-	      width = 0;
-	    }
-	  Dynarr_reset (buf);
-	  width = 0;
-
-	  if (rb->type == RUNE_CHAR)
-	    {
-	      findex = rb->findex;
-	      xpos = rb->xpos;
-	      charset = ichar_charset (rb->object.chr.ch);
-
-	      if (rb->cursor_type == CURSOR_ON)
-		{
-		  if (rb->object.chr.ch == '\n')
-		    {
-		      x_output_eol_cursor (w, dl, xpos, findex);
-		    }
-		  else
-		    {
-		      Dynarr_add (buf, rb->object.chr.ch);
-		      x_output_string (w, dl, buf, xpos, 0, start_pixpos,
-				       rb->width, findex, 1,
-				       cursor_start, cursor_width,
-				       cursor_height);
-		      Dynarr_reset (buf);
-		    }
-
-		  xpos += rb->width;
-		  elt++;
-		}
-	      else if (rb->object.chr.ch == '\n')
-		{
-		  /* Clear in case a cursor was formerly here. */
-		  redisplay_clear_region (window, findex, xpos,
-					  DISPLAY_LINE_YPOS (dl),
-					  rb->width,
-					  DISPLAY_LINE_HEIGHT (dl));
-		  elt++;
-		}
-	    }
-	  else if (rb->type == RUNE_BLANK || rb->type == RUNE_HLINE)
-	    {
-	      if (rb->type == RUNE_BLANK)
-		x_output_blank (w, dl, rb, start_pixpos, cursor_start,
-				cursor_width);
-	      else
-		{
-		  /* #### Our flagging of when we need to redraw the
-                     modeline shadows sucks.  Since RUNE_HLINE is only used
-                     by the modeline at the moment it is a good bet
-                     that if it gets redrawn then we should also
-                     redraw the shadows.  This won't be true forever.
-                     We borrow the shadow_thickness_changed flag for
-                     now. */
-		  w->shadow_thickness_changed = 1;
-		  x_output_hline (w, dl, rb);
-		}
-
-	      elt++;
-	      if (elt < end)
-		{
-		  rb = Dynarr_atp (rba, elt);
-
-		  findex = rb->findex;
-		  xpos = rb->xpos;
-		}
-	    }
-	  else if (rb->type == RUNE_DGLYPH)
-	    {
-	      Lisp_Object instance;
-	      struct display_box dbox;
-	      struct display_glyph_area dga;
-
-	      redisplay_calculate_display_boxes (dl, rb->xpos, rb->object.dglyph.xoffset,
-						 rb->object.dglyph.yoffset, start_pixpos,
-                                                 rb->width, &dbox, &dga);
-
-	      window = wrap_window (w);
-	      instance = glyph_image_instance (rb->object.dglyph.glyph,
-					       window, ERROR_ME_DEBUG_WARN, 1);
-	      findex = rb->findex;
-
-	      if (IMAGE_INSTANCEP (instance))
-		{
-		  switch (XIMAGE_INSTANCE_TYPE (instance))
-		    {
-		    case IMAGE_MONO_PIXMAP:
-		    case IMAGE_COLOR_PIXMAP:
-		      redisplay_output_pixmap (w, instance, &dbox, &dga, findex,
-					       cursor_start, cursor_width,
-					       cursor_height, 0);
-		      break;
-
-		    case IMAGE_WIDGET:
-		      if (EQ (XIMAGE_INSTANCE_WIDGET_TYPE (instance),
-			      Qlayout))
-			{
-			  redisplay_output_layout (window, instance, &dbox, &dga, findex,
-						   cursor_start, cursor_width,
-						   cursor_height);
-			  break;
-			}
-		    case IMAGE_SUBWINDOW:
-		      redisplay_output_subwindow (w, instance, &dbox, &dga, findex,
-						  cursor_start, cursor_width,
-						  cursor_height);
-		      break;
-
-		    case IMAGE_NOTHING:
-		      /* nothing is as nothing does */
-		      break;
-
-		    case IMAGE_TEXT:
-		    case IMAGE_POINTER:
-		    default:
-		      ABORT ();
-		    }
-		  IMAGE_INSTANCE_OPTIMIZE_OUTPUT
-		    (XIMAGE_INSTANCE (instance)) = 0;
-		}
-
-	      xpos += rb->width;
-	      elt++;
-	    }
-	  else
-	    ABORT ();
-	}
-    }
-
-  if (Dynarr_length (buf))
-    x_output_string (w, dl, buf, xpos, 0, start_pixpos, width, findex,
-		     0, cursor_start, cursor_width, cursor_height);
-
-  if (dl->modeline
-      && !EQ (Qzero, w->modeline_shadow_thickness)
-#ifndef USE_XFT
-      /* This optimization doesn't work right with some Xft fonts, which
-	 leave antialiasing turds at the boundary.  I don't know if this
-	 is an Xft bug or not, but I think it is.   See x_output_string. */
-      && (f->clear
-	  || f->windows_structure_changed
-	  || w->shadow_thickness_changed)
-#endif
-      )
-    bevel_modeline (w, dl);
-
-  Dynarr_free (buf);
-}
-
-/*****************************************************************************
  x_bevel_area
 
  Draw shadows for the given area in the given face.
@@ -867,1072 +183,6 @@
 }
 
 /*****************************************************************************
- x_get_gc
-
- Given a number of parameters return a GC with those properties.
- ****************************************************************************/
-static GC
-x_get_gc (struct device *d, Lisp_Object font, Lisp_Object fg, Lisp_Object bg,
-	  Lisp_Object bg_pmap, Lisp_Object lwidth)
-{
-  XGCValues gcv;
-  unsigned long mask;
-
-  memset (&gcv, ~0, sizeof (XGCValues));
-  gcv.graphics_exposures = False;
-  /* Make absolutely sure that we don't pick up a clipping region in
-     the GC returned by this function. */
-  gcv.clip_mask = None;
-  gcv.clip_x_origin = 0;
-  gcv.clip_y_origin = 0;
-  gcv.fill_style = FillSolid;
-  mask = GCGraphicsExposures | GCClipMask | GCClipXOrigin | GCClipYOrigin;
-  mask |= GCFillStyle;
-
-  if (!NILP (font)
-#ifdef USE_XFT
-      /* Only set the font if it's a core font */
-      /* the renderfont will be set elsewhere (not part of gc) */
-      && !FONT_INSTANCE_X_XFTFONT (XFONT_INSTANCE (font))
-#endif
-      )
-    {
-      gcv.font = FONT_INSTANCE_X_FONT (XFONT_INSTANCE (font))->fid;
-      mask |= GCFont;
-    }
-
-  /* evil kludge! */
-  if (!NILP (fg) && !COLOR_INSTANCEP (fg) && !INTP (fg))
-    {
-      /* #### I fixed one case where this was getting hit.  It was a
-         bad macro expansion (compiler bug). */
-      stderr_out ("Help! x_get_gc got a bogus fg value! fg = ");
-      debug_print (fg);
-      fg = Qnil;
-    }
-
-  if (!NILP (fg))
-    {
-      if (COLOR_INSTANCEP (fg))
-	gcv.foreground = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (fg)).pixel;
-      else
-	gcv.foreground = XINT (fg);
-      mask |= GCForeground;
-    }
-
-  if (!NILP (bg))
-    {
-      if (COLOR_INSTANCEP (bg))
-	gcv.background = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (bg)).pixel;
-      else
-	gcv.background = XINT (bg);
-      mask |= GCBackground;
-    }
-
-  /* This special case comes from a request to draw text with a face which has
-     the dim property. We'll use a stippled foreground GC. */
-  if (EQ (bg_pmap, Qdim))
-    {
-      assert (DEVICE_X_GRAY_PIXMAP (d) != None);
-
-      gcv.fill_style = FillStippled;
-      gcv.stipple = DEVICE_X_GRAY_PIXMAP (d);
-      mask |= (GCFillStyle | GCStipple);
-    }
-  else  if (IMAGE_INSTANCEP (bg_pmap)
-	    && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
-    {
-      if (XIMAGE_INSTANCE_PIXMAP_DEPTH (bg_pmap) == 0)
-	{
-	  gcv.fill_style = FillOpaqueStippled;
-	  gcv.stipple = XIMAGE_INSTANCE_X_PIXMAP (bg_pmap);
-	  mask |= (GCStipple | GCFillStyle);
-	}
-      else
-	{
-	  gcv.fill_style = FillTiled;
-	  gcv.tile = XIMAGE_INSTANCE_X_PIXMAP (bg_pmap);
-	  mask |= (GCTile | GCFillStyle);
-	}
-    }
-
-  if (!NILP (lwidth))
-    {
-      gcv.line_width = XINT (lwidth);
-      mask |= GCLineWidth;
-    }
-
-#if 0
-  debug_out ("\nx_get_gc: calling gc_cache_lookup\n");
-#endif
-  return gc_cache_lookup (DEVICE_X_GC_CACHE (d), &gcv, mask);
-}
-
-/*****************************************************************************
- x_output_string
-
- Given a string and a starting position, output that string in the
- given face.  If cursor is true, draw a cursor around the string.
- Correctly handles multiple charsets in the string.
-
- The meaning of the parameters is something like this:
-
- W		Window that the text is to be displayed in.
- DL		Display line that this text is on.  The values in the
- 		structure are used to determine the vertical position and
-		clipping range of the text.
- BUF		Dynamic array of Ichars specifying what is actually to be
-		drawn.
- XPOS		X position in pixels where the text should start being drawn.
- XOFFSET	Number of pixels to be chopped off the left side of the
- 		text.  The effect is as if the text were shifted to the
-		left this many pixels and clipped at XPOS.
- CLIP_START	Clip everything left of this X position.
- WIDTH		Clip everything right of XPOS + WIDTH.
- FINDEX		Index for the face cache element describing how to display
- 		the text.
- CURSOR		#### I don't understand this.  There's something
- 		strange and overcomplexified with this variable.
-		Chuck, explain please?
- CURSOR_START	Starting X position of cursor.
- CURSOR_WIDTH	Width of cursor in pixels.
- CURSOR_HEIGHT	Height of cursor in pixels.
-
- Starting Y position of cursor is the top of the text line.
- The cursor is drawn sometimes whether or not CURSOR is set. ???
- ****************************************************************************/
-void
-x_output_string (struct window *w, struct display_line *dl,
-		 Ichar_dynarr *buf, int xpos, int xoffset, int clip_start,
-		 int width, face_index findex, int cursor,
-		 int cursor_start, int cursor_width, int cursor_height)
-{
-  /* General variables */
-  struct frame *f = XFRAME (w->frame);
-  struct device *d = XDEVICE (f->device);
-  Lisp_Object window = wrap_window (w);
-  Display *dpy = DEVICE_X_DISPLAY (d);
-  Window x_win = XtWindow (FRAME_X_TEXT_WIDGET (f));
-
-  int clip_end;
-
-  /* Cursor-related variables */
-  int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
-  int cursor_clip;
-  Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
-							 WINDOW_BUFFER (w));
-  struct face_cachel *cursor_cachel = 0;
-
-  /* Text-related variables */
-  Lisp_Object bg_pmap;
-  GC bgc, gc;
-  int height = DISPLAY_LINE_HEIGHT (dl);
-  int ypos = DISPLAY_LINE_YPOS (dl);
-  int len = Dynarr_length (buf);
-  unsigned char *text_storage = (unsigned char *) ALLOCA (2 * len);
-  struct textual_run *runs = alloca_array (struct textual_run, len);
-  int nruns;
-  int i;
-  struct face_cachel *cachel = WINDOW_FACE_CACHEL (w, findex);
-
-  int use_x_font = 1;		/* #### bogus!!
-				   The logic of this function needs review! */
-#ifdef USE_XFT
-  Colormap cmap = DEVICE_X_COLORMAP (d);
-  Visual *visual = DEVICE_X_VISUAL (d);
-  static XftColor fg, bg;
-  XftDraw *xftDraw;
-
-  /* Lazily initialize frame's xftDraw member. */
-  if (!FRAME_X_XFTDRAW (f)) {
-    FRAME_X_XFTDRAW (f) = XftDrawCreate (dpy, x_win, visual, cmap);
-  }
-  xftDraw = FRAME_X_XFTDRAW (f);
-
-  /* #### This will probably cause asserts when passed a Lisp integer for a
-     color.  See ca. line 759 this file.
-     #### Maybe xft_convert_color should take an XColor, not a pixel. */
-#define XFT_FROB_LISP_COLOR(color, dim) \
-  xft_convert_color (dpy, cmap, visual, \
-		     COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (color)).pixel, \
-		     (dim))
-#endif
-
-  if (width < 0)
-    width = x_text_width (f, cachel, Dynarr_atp (buf, 0), Dynarr_length (buf));
-
-  /* Regularize the variables passed in. */
-
-  if (clip_start < xpos)
-    clip_start = xpos;
-  clip_end = xpos + width;
-  if (clip_start >= clip_end)
-    /* It's all clipped out. */
-    return;
-
-  xpos -= xoffset;
-
-  /* make sure the area we are about to display is subwindow free. */
-  redisplay_unmap_subwindows_maybe (f, clip_start, ypos,
-				    clip_end - clip_start, height);
-
-  cursor_clip = (cursor_start >= clip_start &&
-		 cursor_start < clip_end);
-
-  /* This cursor code is really a mess. */
-  if (!NILP (w->text_cursor_visible_p)
-      && (cursor
-	  || cursor_clip
-	  || (cursor_width
-	      && (cursor_start + cursor_width >= clip_start)
-	      && !NILP (bar_cursor_value))))
-    {
-      /* These have to be in separate statements in order to avoid a
-         compiler bug. */
-      face_index sucks = get_builtin_face_cache_index (w, Vtext_cursor_face);
-      cursor_cachel = WINDOW_FACE_CACHEL (w, sucks);
-
-      /* We have to reset this since any call to WINDOW_FACE_CACHEL
-         may cause the cache to resize and any pointers to it to
-         become invalid. */
-      cachel = WINDOW_FACE_CACHEL (w, findex);
-    }
-
-#ifdef HAVE_XIM
-  if (cursor && focus && (cursor_start == clip_start) && cursor_height)
-    XIM_SetSpotLocation (f, xpos - 2, dl->ypos + dl->descent - 2);
-#endif /* HAVE_XIM */
-
-  bg_pmap = cachel->background_pixmap;
-  if (!IMAGE_INSTANCEP (bg_pmap)
-      || !IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
-    bg_pmap = Qnil;
-
-  if ((cursor && focus && NILP (bar_cursor_value)
-       && !NILP (w->text_cursor_visible_p)) || NILP (bg_pmap))
-    bgc = 0;
-  else
-    {
-      bgc = x_get_gc (d, Qnil, cachel->foreground, cachel->background,
-		      bg_pmap, Qnil);
-    }
-
-  if (bgc)
-    {
-      XFillRectangle (dpy, x_win, bgc, clip_start,
-		      ypos, clip_end - clip_start,
-		      height);
-    }
-
-  nruns = separate_textual_runs (text_storage, runs, Dynarr_atp (buf, 0),
-				 Dynarr_length (buf), cachel);
-
-  for (i = 0; i < nruns; i++)
-    {
-      Lisp_Object font = FACE_CACHEL_FONT (cachel, runs[i].charset);
-      Lisp_Font_Instance *fi = XFONT_INSTANCE (font);
-      int this_width;
-      int need_clipping;
-
-      if (EQ (font, Vthe_null_font_instance))
-	continue;
-
-      this_width = x_text_width_single_run (f, cachel, runs + i);
-      need_clipping = (dl->clip || clip_start > xpos ||
-		       clip_end < xpos + this_width);
-
-      /* XDrawImageString only clears the area equal to the height of
-	 the given font.  It is possible that a font is being displayed
-	 on a line taller than it is, so this would cause us to fail to
-	 clear some areas. */
-      if ((int) fi->height < (int) (height + dl->clip + dl->top_clip))
-	{
-	  int clear_start = max (xpos, clip_start);
-	  int clear_end = min (xpos + this_width, clip_end);
-
-	  if (cursor)
-	    {
-	      int ypos1_line, ypos1_string, ypos2_line, ypos2_string;
-
-	      ypos1_string = dl->ypos - fi->ascent;
-	      ypos2_string = dl->ypos + fi->descent;
-	      ypos1_line = ypos;
-	      ypos2_line = ypos1_line + height;
-
-	      /* Make sure we don't clear below the real bottom of the
-		 line. */
-	      if (ypos1_string > ypos2_line)
-		ypos1_string = ypos2_line;
-	      if (ypos2_string > ypos2_line)
-		ypos2_string = ypos2_line;
-
-	      if (ypos1_line < ypos1_string)
-		{
-		  redisplay_clear_region (window, findex, clear_start, ypos1_line,
-				  clear_end - clear_start,
-				  ypos1_string - ypos1_line);
-		}
-
-	      if (ypos2_line > ypos2_string)
-		{
-		  redisplay_clear_region (window, findex, clear_start, ypos2_string,
-				  clear_end - clear_start,
-				  ypos2_line - ypos2_string);
-		}
-	    }
-	  else
-	    {
-	      redisplay_clear_region (window, findex, clear_start,
-			      ypos, clear_end - clear_start,
-			      height);
-	    }
-	}
-
-      if (cursor && cursor_cachel && focus && NILP (bar_cursor_value))
-	{
-#ifdef USE_XFT
-	  fg = XFT_FROB_LISP_COLOR (cursor_cachel->foreground, 0);
-	  bg = XFT_FROB_LISP_COLOR (cursor_cachel->background, 0);
-#endif
-	  gc = x_get_gc (d, font, cursor_cachel->foreground,
-			 cursor_cachel->background, Qnil, Qnil);
-	}
-      else if (cachel->dim)
-	{
-	  /* Ensure the gray bitmap exists */
-	  if (DEVICE_X_GRAY_PIXMAP (d) == None)
-	    DEVICE_X_GRAY_PIXMAP (d) =
-	      XCreateBitmapFromData (dpy, x_win, (char *)gray_bits,
-				     gray_width, gray_height);
-
-	  /* Request a GC with the gray stipple pixmap to draw dimmed text */
-#ifdef USE_XFT
-	  fg = XFT_FROB_LISP_COLOR (cachel->foreground, 1);
-	  bg = XFT_FROB_LISP_COLOR (cachel->background, 0);
-#endif
-	  gc = x_get_gc (d, font, cachel->foreground, cachel->background,
-			 Qdim, Qnil);
-	}
-      else
-	{
-#ifdef USE_XFT
-	  fg = XFT_FROB_LISP_COLOR (cachel->foreground, 0);
-	  bg = XFT_FROB_LISP_COLOR (cachel->background, 0);
-#endif
-	  gc = x_get_gc (d, font, cachel->foreground, cachel->background,
-			 Qnil, Qnil);
-	}
-#ifdef USE_XFT
-      {
-	XftFont *rf = FONT_INSTANCE_X_XFTFONT (fi);
-
-	if (rf)
-	  {
-	    use_x_font = 0;
-	    if (need_clipping)
-	      {
-		Region clip_reg = XCreateRegion();
-		XRectangle clip_box = { clip_start, ypos,
-					clip_end - clip_start, height };
-
-		XUnionRectWithRegion (&clip_box, clip_reg, clip_reg); 
-		XftDrawSetClip(xftDraw, clip_reg);
-		XDestroyRegion(clip_reg);
-	      }
-
-	    if (!bgc)
-	      {
-		/* #### Neither rect_height nor XftTextExtents as computed
-		   below handles the vertical space taken up by antialiasing,
-		   which for some fonts (eg, Bitstream Vera Sans Mono-16 on
-		   my Mac PowerBook G4) leaves behind orphaned dots on
-		   insertion or deletion earlier in the line, especially in
-		   the case of the underscore character.
-		   Interestingly, insertion or deletion of a single character
-		   immediately after a refresh does not leave any droppings,
-		   but any further insertions or deletions do.
-		   While adding a pixel to rect_height (mostly) takes care of
-		   this, it trashes aggressively laid-out elements like the
-		   modeline (overwriting part of the bevel).
-		   OK, unconditionally redraw the bevel, and increment
-		   rect_height by 1.  See x_output_display_block. -- sjt */
-		struct textual_run *run = &runs[i];
-		int rect_width = x_text_width_single_run (f, cachel, run);
-#ifndef USE_XFTTEXTENTS_TO_AVOID_FONT_DROPPINGS
-		int rect_height = FONT_INSTANCE_ASCENT(fi)
-				  + FONT_INSTANCE_DESCENT(fi) + 1;
-#else
-		int rect_height = FONT_INSTANCE_ASCENT(fi)
-				  + FONT_INSTANCE_DESCENT(fi);
-		XGlyphInfo gi;
-		if (run->dimension == 2) {
-		  XftTextExtents16 (dpy,
-				    FONT_INSTANCE_X_XFTFONT(fi),
-				    (XftChar16 *) run->ptr, run->len, &gi);
-		} else {
-		  XftTextExtents8 (dpy,
-				   FONT_INSTANCE_X_XFTFONT(fi),
-				   run->ptr, run->len, &gi);
-		}
-		rect_height = rect_height > gi.height
-			      ? rect_height : gi.height;
-#endif
-
-		XftDrawRect (xftDraw, &bg,
-			     xpos, ypos, rect_width, rect_height);
-	      }
-	
-	    if (runs[i].dimension == 1)
-	      XftDrawString8 (xftDraw, &fg, rf, xpos, dl->ypos,
-			      runs[i].ptr, runs[i].len);
-	    else
-	      XftDrawString16 (xftDraw, &fg, rf, xpos, dl->ypos,
-			       (XftChar16 *) runs[i].ptr, runs[i].len);
-	  }
-      }
-#endif
-      {
-	if (use_x_font)
-	  {
-	    if (need_clipping)
-	      {
-		XRectangle clip_box[1];
-
-		clip_box[0].x = 0;
-		clip_box[0].y = 0;
-		clip_box[0].width = clip_end - clip_start;
-		clip_box[0].height = height;
-
-		XSetClipRectangles (dpy, gc, clip_start, ypos,
-				    clip_box, 1, YXBanded);
-	      }
-
-	    if (runs[i].dimension == 1)
-	      (bgc ? XDrawString : XDrawImageString)
-		(dpy, x_win, gc, xpos, dl->ypos,
-		 (char *) runs[i].ptr, runs[i].len);
-	    else
-	      (bgc ? XDrawString16 : XDrawImageString16)
-		(dpy, x_win, gc, xpos, dl->ypos,
-		 (XChar2b *) runs[i].ptr, runs[i].len);
-	  }
-      }
-
-      /* We draw underlines in the same color as the text. */
-      if (cachel->underline)
-	{
-	  int upos, uthick;
-	  unsigned long upos_ext, uthick_ext;
-	  XFontStruct *fs =
-	    use_x_font ? FONT_INSTANCE_X_FONT (XFONT_INSTANCE (font)) : 0;
-	  /* #### the logic of the next two may be suboptimal: we may want
-	     to use the POSITION and/or THICKNESS information with Xft */
-	  if (fs && XGetFontProperty (fs, XA_UNDERLINE_POSITION, &upos_ext))
-	    upos = (int) upos_ext;
-	  else
-	    upos = dl->descent / 2;
-	  if (fs && XGetFontProperty (fs, XA_UNDERLINE_THICKNESS, &uthick_ext))
-	    uthick = (int) uthick_ext;
-	  else
-	    uthick = 1;
-	  if (dl->ypos + upos < dl->ypos + dl->descent - dl->clip)
-	    {
-	      if (dl->ypos + upos + uthick > dl->ypos + dl->descent - dl->clip)
-		uthick = dl->descent - dl->clip - upos;
-
-	      if (uthick == 1)
-		{
-		  XDrawLine (dpy, x_win, gc, xpos, dl->ypos + upos,
-			     xpos + this_width, dl->ypos + upos);
-		}
-	      else if (uthick > 1)
-		{
-		  XFillRectangle (dpy, x_win, gc, xpos,
-				  dl->ypos + upos, this_width, uthick);
-		}
-	    }
-	}
-
-      if (cachel->strikethru)
-	{
-	  int ascent, descent, upos, uthick;
-	  unsigned long ascent_ext, descent_ext, uthick_ext;
-	  XFontStruct *fs = FONT_INSTANCE_X_FONT (fi);
-	  
-	  if (!use_x_font)
-	    {
-	      ascent = dl->ascent;
-	      descent = dl->descent;
-	      uthick = 1;
-	    }
-	  else
-	    {
-	      if (!XGetFontProperty (fs, XA_STRIKEOUT_ASCENT, &ascent_ext))
-		ascent = fs->ascent;
-	      else
-		ascent = (int) ascent_ext;
-	      if (!XGetFontProperty (fs, XA_STRIKEOUT_DESCENT, &descent_ext))
-		descent = fs->descent;
-	      else
-		descent = (int) descent_ext;
-	      if (!XGetFontProperty (fs, XA_UNDERLINE_THICKNESS, &uthick_ext))
-		uthick = 1;
-	      else
-		uthick = (int) uthick_ext;
-	    }
-
-	  upos = ascent - ((ascent + descent) / 2) + 1;
-
-	  /* Generally, upos will be positive (above the baseline),so
-             subtract */
-	  if (dl->ypos - upos < dl->ypos + dl->descent - dl->clip)
-	    {
-	      if (dl->ypos - upos + uthick > dl->ypos + dl->descent - dl->clip)
-		uthick = dl->descent - dl->clip + upos;
-
-	      if (uthick == 1)
-		XDrawLine (dpy, x_win, gc, xpos, dl->ypos - upos,
-			   xpos + this_width, dl->ypos - upos);
-	      else if (uthick > 1)
-		XFillRectangle (dpy, x_win, gc, xpos, dl->ypos + upos,
-				this_width, uthick);
-	    }
-	}
-
-      /* Restore the GC */
-      if (need_clipping)
-	{
-#ifdef USE_XFT
-	  if (!use_x_font)
-	    {
-	      XftDrawSetClip(xftDraw, 0);
-	    }
-	  else
-	    {
-#endif
-	      XSetClipMask (dpy, gc, None);
-	      XSetClipOrigin (dpy, gc, 0, 0);
-#ifdef USE_XFT
-	    }
-#endif
-	}
-
-      /* If we are actually superimposing the cursor then redraw with just
-	 the appropriate section highlighted. */
-      if (cursor_clip && !cursor && focus && cursor_cachel)
-	{
-#ifdef USE_XFT
-	  if (!use_x_font)	/* Xft */
-	    {
-	      XftFont *rf = FONT_INSTANCE_X_XFTFONT (fi);
-	  
-	      { /* set up clipping */
-		Region clip_reg = XCreateRegion();
-		XRectangle clip_box = { cursor_start, ypos,
-					cursor_width, height };
-	    
-		XUnionRectWithRegion (&clip_box, clip_reg, clip_reg); 
-		XftDrawSetClip(xftDraw, clip_reg);
-		XDestroyRegion(clip_reg);
-	      }
-	      { /* draw background rectangle & draw text */
-		int rect_height = FONT_INSTANCE_ASCENT(fi)
-				  + FONT_INSTANCE_DESCENT(fi);
-		int rect_width = x_text_width_single_run(f, cachel, &runs[i]);
-		XftColor xft_color;
-
-		xft_color = XFT_FROB_LISP_COLOR (cursor_cachel->background, 0);
-		XftDrawRect (xftDraw, &xft_color,
-			     xpos, ypos, rect_width, rect_height);
-
-		xft_color = XFT_FROB_LISP_COLOR (cursor_cachel->foreground, 0);
-		if (runs[i].dimension == 1)
-		  XftDrawString8 (xftDraw, &xft_color, rf, xpos, dl->ypos,
-				  runs[i].ptr, runs[i].len);
-		else
-		  XftDrawString16 (xftDraw, &xft_color, rf, xpos, dl->ypos,
-				   (XftChar16 *) runs[i].ptr, runs[i].len);
-	      }
-
-	      XftDrawSetClip(xftDraw, 0);
-	    }
-	  else			/* core font, not Xft */
-	    {
-#endif
-	      GC cgc;
-	      XRectangle clip_box[1];
-	
-	      cgc = x_get_gc (d, font, cursor_cachel->foreground,
-			      cursor_cachel->background, Qnil, Qnil);
-
-	      clip_box[0].x = 0;
-	      clip_box[0].y = 0;
-	      clip_box[0].width = cursor_width;
-	      clip_box[0].height = height;
-	
-	      XSetClipRectangles (dpy, cgc, cursor_start, ypos,
-				  clip_box, 1, YXBanded);
-	      if (runs[i].dimension == 1)
-		XDrawImageString (dpy, x_win, cgc, xpos, dl->ypos,
-				  (char *) runs[i].ptr, runs[i].len);
-	      else
-		XDrawImageString16 (dpy, x_win, cgc, xpos, dl->ypos,
-				    (XChar2b *) runs[i].ptr, runs[i].len);
-	
-	      XSetClipMask (dpy, cgc, None);
-	      XSetClipOrigin (dpy, cgc, 0, 0);
-#ifdef USE_XFT
-	    }
-#endif
-	}
-
-      xpos += this_width;
-    }
-
-  /* Draw the non-focus box or bar-cursor as needed. */
-  /* Can't this logic be simplified? */
-  if (cursor_cachel
-      && ((cursor && !focus && NILP (bar_cursor_value))
-	  || (cursor_width
-	      && (cursor_start + cursor_width >= clip_start)
-	      && !NILP (bar_cursor_value))))
-    {
-      int tmp_height, tmp_y;
-      int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2;
-      int need_clipping = (cursor_start < clip_start
-			   || clip_end < cursor_start + cursor_width);
-
-      /* #### This value is correct (as far as I know) because
-	 all of the times we need to draw this cursor, we will
-	 be called with exactly one character, so we know we
-	 can always use runs[0].
-
-	 This is bogus as all hell, however.  The cursor handling in
-	 this function is way bogus and desperately needs to be
-	 cleaned up.  (In particular, the drawing of the cursor should
-	 really really be separated out of this function.  This may be
-	 a bit tricky now because this function itself does way too
-	 much stuff, a lot of which needs to be moved into
-	 redisplay.c.)  This is the only way to be able to easily add
-	 new cursor types or (e.g.) make the bar cursor be able to
-	 span two characters instead of overlaying just one. */
-      int bogusly_obtained_ascent_value =
-	XFONT_INSTANCE (FACE_CACHEL_FONT (cachel, runs[0].charset))->ascent;
-
-      if (!NILP (bar_cursor_value))
-	{
-	  gc = x_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil,
-			 make_int (bar_width));
-	}
-      else
-	{
-	  gc = x_get_gc (d, Qnil, cursor_cachel->background,
-			 Qnil, Qnil, Qnil);
-	}
-
-      tmp_y = dl->ypos - bogusly_obtained_ascent_value;
-      tmp_height = cursor_height;
-      if (tmp_y + tmp_height > (int) (ypos + height))
-	{
-	  tmp_y = ypos + height - tmp_height;
-	  if (tmp_y < (int) ypos)
-	    tmp_y = ypos;
-	  tmp_height = ypos + height - tmp_y;
-	}
-
-      if (need_clipping)
-	{
-	  XRectangle clip_box[1];
-	  clip_box[0].x = 0;
-	  clip_box[0].y = 0;
-	  clip_box[0].width = clip_end - clip_start;
-	  clip_box[0].height = tmp_height;
-	  XSetClipRectangles (dpy, gc, clip_start, tmp_y,
-			      /* #### why not Unsorted? */
-			      clip_box, 1, YXBanded);
-	}
-
-      if (!focus && NILP (bar_cursor_value))
-	{
-	  XDrawRectangle (dpy, x_win, gc, cursor_start, tmp_y,
-			  cursor_width - 1, tmp_height - 1);
-	}
-      else if (focus && !NILP (bar_cursor_value))
-	{
-	  XDrawLine (dpy, x_win, gc, cursor_start + bar_width - 1, tmp_y,
-		     cursor_start + bar_width - 1, tmp_y + tmp_height - 1);
-	}
-
-      /* Restore the GC */
-      if (need_clipping)
-	{
-	  XSetClipMask (dpy, gc, None);
-	  XSetClipOrigin (dpy, gc, 0, 0);
-	}
-    }
-
-#ifdef USE_XFT
-#undef XFT_FROB_LISP_COLOR
-#endif
-
-}
-
-void
-x_output_x_pixmap (struct frame *f, Lisp_Image_Instance *p, int x,
-		   int y, int xoffset, int yoffset,
-		   int width, int height, unsigned long fg, unsigned long bg,
-		   GC override_gc)
-{
-  struct device *d = XDEVICE (f->device);
-  Display *dpy = DEVICE_X_DISPLAY (d);
-  Window x_win = XtWindow (FRAME_X_TEXT_WIDGET (f));
-
-  GC gc;
-  XGCValues gcv;
-  unsigned long pixmap_mask;
-
-  if (!override_gc)
-    {
-      memset (&gcv, ~0, sizeof (XGCValues));
-      gcv.graphics_exposures = False;
-      gcv.foreground = fg;
-      gcv.background = bg;
-      pixmap_mask = GCForeground | GCBackground | GCGraphicsExposures;
-
-      if (IMAGE_INSTANCE_X_MASK (p))
-	{
-	  gcv.function = GXcopy;
-	  gcv.clip_mask = IMAGE_INSTANCE_X_MASK (p);
-	  gcv.clip_x_origin = x - xoffset;
-	  gcv.clip_y_origin = y - yoffset;
-	  pixmap_mask |= (GCFunction | GCClipMask | GCClipXOrigin |
-			  GCClipYOrigin);
-	  /* Can't set a clip rectangle because we already have a mask.
-	     Is it possible to get an equivalent effect by changing the
-	     args to XCopyArea below rather than messing with a clip box?
-	     - dkindred@cs.cmu.edu
-	     Yes. We don't clip at all now - andy@xemacs.org
-	  */
-	}
-
-      gc = gc_cache_lookup (DEVICE_X_GC_CACHE (d), &gcv, pixmap_mask);
-    }
-  else
-    {
-      gc = override_gc;
-      /* override_gc might have a mask already--we don't want to nuke it.
-	 Maybe we can insist that override_gc have no mask, or use
-	 one of the suggestions above. */
-    }
-
-  /* depth of 0 means it's a bitmap, not a pixmap, and we should use
-     XCopyPlane (1 = current foreground color, 0 = background) instead
-     of XCopyArea, which means that the bits in the pixmap are actual
-     pixel values, instead of symbolic of fg/bg. */
-  if (IMAGE_INSTANCE_PIXMAP_DEPTH (p) > 0)
-    {
-      XCopyArea (dpy,
-		 IMAGE_INSTANCE_X_PIXMAP_SLICE
-		 (p, IMAGE_INSTANCE_PIXMAP_SLICE (p)), x_win, gc, xoffset,
-		 yoffset, width,
-		 height, x, y);
-    }
-  else
-    {
-      XCopyPlane (dpy, IMAGE_INSTANCE_X_PIXMAP_SLICE
-		  (p, IMAGE_INSTANCE_PIXMAP_SLICE (p)), x_win, gc,
-		  xoffset, yoffset, width, height, x, y, 1L);
-    }
-}
-
-static void
-x_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 UNUSED (bg_pixmap))
-{
-  struct frame *f = XFRAME (w->frame);
-  struct device *d = XDEVICE (f->device);
-  Lisp_Image_Instance *p = XIMAGE_INSTANCE (image_instance);
-
-  Display *dpy = DEVICE_X_DISPLAY (d);
-  Window x_win = XtWindow (FRAME_X_TEXT_WIDGET (f));
-
-  /* Output the pixmap. */
-  {
-    Lisp_Object tmp_pixel;
-    XColor tmp_bcolor, tmp_fcolor;
-
-    tmp_pixel = WINDOW_FACE_CACHEL_FOREGROUND (w, findex);
-    tmp_fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel));
-    tmp_pixel = WINDOW_FACE_CACHEL_BACKGROUND (w, findex);
-    tmp_bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel));
-
-    x_output_x_pixmap (f, p, db->xpos, db->ypos,
-		       dga->xoffset, dga->yoffset,
-		       dga->width, dga->height,
-		       tmp_fcolor.pixel, tmp_bcolor.pixel, 0);
-  }
-
-  /* Draw a cursor over top of the pixmap. */
-  if (cursor_width && cursor_height && (cursor_start >= db->xpos)
-      && !NILP (w->text_cursor_visible_p)
-      && (cursor_start < db->xpos + dga->width))
-    {
-      GC gc;
-      int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
-      struct face_cachel *cursor_cachel =
-	WINDOW_FACE_CACHEL (w,
-			    get_builtin_face_cache_index
-			    (w, Vtext_cursor_face));
-
-      gc = x_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil, Qnil);
-
-      if (cursor_width > db->xpos + dga->width - cursor_start)
-	cursor_width = db->xpos + dga->width - cursor_start;
-
-      if (focus)
-	{
-	  XFillRectangle (dpy, x_win, gc, cursor_start, db->ypos, cursor_width,
-			  cursor_height);
-	}
-      else
-	{
-	  XDrawRectangle (dpy, x_win, gc, cursor_start, db->ypos, cursor_width,
-			  cursor_height);
-	}
-    }
-}
-
-/*****************************************************************************
- x_output_vertical_divider
-
- Draw a vertical divider down the right side of the given window.
- ****************************************************************************/
-static void
-x_output_vertical_divider (struct window *w, int clear)
-{
-  struct frame *f = XFRAME (w->frame);
-  struct device *d = XDEVICE (f->device);
-
-  Display *dpy = DEVICE_X_DISPLAY (d);
-  Window x_win = XtWindow (FRAME_X_TEXT_WIDGET (f));
-  Lisp_Object tmp_pixel;
-  XColor tmp_color;
-  XGCValues gcv;
-  GC background_gc;
-  enum edge_style style;
-
-  unsigned long mask;
-  int x, y1, y2, width, shadow_thickness, spacing, line_width;
-  face_index div_face =
-    get_builtin_face_cache_index (w, Vvertical_divider_face);
-
-  width = window_divider_width (w);
-  shadow_thickness = XINT (w->vertical_divider_shadow_thickness);
-  spacing = XINT (w->vertical_divider_spacing);
-  line_width = XINT (w->vertical_divider_line_width);
-  x = WINDOW_RIGHT (w) - width;
-  y1 = WINDOW_TOP (w);
-  y2 = WINDOW_BOTTOM (w);
-
-  memset (&gcv, ~0, sizeof (XGCValues));
-
-  tmp_pixel = WINDOW_FACE_CACHEL_BACKGROUND (w, div_face);
-  tmp_color = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel));
-
-  /* First, get the GC's. */
-  gcv.background = tmp_color.pixel;
-  gcv.foreground = tmp_color.pixel;
-  gcv.graphics_exposures = False;
-  mask = GCForeground | GCBackground | GCGraphicsExposures;
-  background_gc = gc_cache_lookup (DEVICE_X_GC_CACHE (d), &gcv, mask);
-
-  /* Clear the divider area first.  This needs to be done when a
-     window split occurs. */
-  if (clear)
-    XClearArea (dpy, x_win, x, y1, width, y2 - y1, False);
-
-  /* Draw the divider line. */
-  XFillRectangle (dpy, x_win, background_gc,
-		  x + spacing + shadow_thickness, y1,
-		  line_width, y2 - y1);
-
-  if (shadow_thickness < 0)
-    {
-      shadow_thickness = -shadow_thickness;
-      style = EDGE_BEVEL_IN;
-    }
-  else
-    {
-      style = EDGE_BEVEL_OUT;
-    }
-
-  /* Draw the shadows around the divider line */
-  x_bevel_area (w, div_face, x + spacing, y1,
-		width - 2 * spacing, y2 - y1,
-		shadow_thickness, EDGE_ALL, style);
-}
-
-/*****************************************************************************
- x_output_blank
-
- Output a blank by clearing the area it covers in the foreground color
- of its face.
- ****************************************************************************/
-static void
-x_output_blank (struct window *w, struct display_line *dl, struct rune *rb,
-		int start_pixpos, int cursor_start, int cursor_width)
-{
-  struct frame *f = XFRAME (w->frame);
-  struct device *d = XDEVICE (f->device);
-
-  Display *dpy = DEVICE_X_DISPLAY (d);
-  Window x_win = XtWindow (FRAME_X_TEXT_WIDGET (f));
-  GC gc;
-  struct face_cachel *cursor_cachel =
-    WINDOW_FACE_CACHEL (w,
-			get_builtin_face_cache_index
-			(w, Vtext_cursor_face));
-  Lisp_Object bg_pmap;
-  Lisp_Object buffer = WINDOW_BUFFER (w);
-  Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
-							 buffer);
-
-  int x = rb->xpos;
-  int y = DISPLAY_LINE_YPOS (dl);
-  int width = rb->width;
-  int height = DISPLAY_LINE_HEIGHT (dl);
-
-  /* Unmap all subwindows in the area we are going to blank. */
-  redisplay_unmap_subwindows_maybe (f, x, y, width, height);
-
-  if (start_pixpos > x)
-    {
-      if (start_pixpos >= (x + width))
-	return;
-      else
-	{
-	  width -= (start_pixpos - x);
-	  x = start_pixpos;
-	}
-    }
-
-  bg_pmap = WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP (w, rb->findex);
-  if (!IMAGE_INSTANCEP (bg_pmap)
-      || !IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
-    bg_pmap = Qnil;
-
-  if (NILP (bg_pmap))
-    gc = x_get_gc (d, Qnil, WINDOW_FACE_CACHEL_BACKGROUND (w, rb->findex),
-		   Qnil, Qnil, Qnil);
-  else
-    gc = x_get_gc (d, Qnil, WINDOW_FACE_CACHEL_FOREGROUND (w, rb->findex),
-		   WINDOW_FACE_CACHEL_BACKGROUND (w, rb->findex), bg_pmap,
-		   Qnil);
-
-  XFillRectangle (dpy, x_win, gc, x, y, width, height);
-
-  /* If this rune is marked as having the cursor, then it is actually
-     representing a tab. */
-  if (!NILP (w->text_cursor_visible_p)
-      && (rb->cursor_type == CURSOR_ON
-	  || (cursor_width
-	      && (cursor_start + cursor_width > x)
-	      && cursor_start < (x + width))))
-    {
-      int cursor_height, cursor_y;
-      int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
-      Lisp_Font_Instance *fi;
-
-      fi = XFONT_INSTANCE (FACE_CACHEL_FONT
-			   (WINDOW_FACE_CACHEL (w, rb->findex),
-			    Vcharset_ascii));
-
-      gc = x_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil, Qnil);
-
-      cursor_y = dl->ypos - fi->ascent;
-      cursor_height = fi->height;
-      if (cursor_y + cursor_height > y + height)
-	cursor_height = y + height - cursor_y;
-
-      if (focus)
-	{
-	  if (NILP (bar_cursor_value))
-	    {
-	      XFillRectangle (dpy, x_win, gc, cursor_start, cursor_y,
-			      fi->width, cursor_height);
-	    }
-	  else
-	    {
-	      int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2;
-
-	      gc = x_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil,
-			     make_int (bar_width));
-	      XDrawLine (dpy, x_win, gc, cursor_start + bar_width - 1,
-			 cursor_y, cursor_start + bar_width - 1,
-			 cursor_y + cursor_height - 1);
-	    }
-	}
-      else if (NILP (bar_cursor_value))
-	{
-	  XDrawRectangle (dpy, x_win, gc, cursor_start, cursor_y,
-			  fi->width - 1, cursor_height - 1);
-	}
-    }
-}
-
-/*****************************************************************************
- x_output_hline
-
- Output a horizontal line in the foreground of its face.
- ****************************************************************************/
-static void
-x_output_hline (struct window *w, struct display_line *dl, struct rune *rb)
-{
-  struct frame *f = XFRAME (w->frame);
-  struct device *d = XDEVICE (f->device);
-
-  Display *dpy = DEVICE_X_DISPLAY (d);
-  Window x_win = XtWindow (FRAME_X_TEXT_WIDGET (f));
-  GC gc;
-
-  int x = rb->xpos;
-  int width = rb->width;
-  int height = DISPLAY_LINE_HEIGHT (dl);
-  int ypos1, ypos2, ypos3, ypos4;
-
-  ypos1 = DISPLAY_LINE_YPOS (dl);
-  ypos2 = ypos1 + rb->object.hline.yoffset;
-  ypos3 = ypos2 + rb->object.hline.thickness;
-  ypos4 = dl->ypos + dl->descent - dl->clip;
-
-  /* First clear the area not covered by the line. */
-  if (height - rb->object.hline.thickness > 0)
-    {
-      gc = x_get_gc (d, Qnil, WINDOW_FACE_CACHEL_FOREGROUND (w, rb->findex),
-		     Qnil, Qnil, Qnil);
-
-      if (ypos2 - ypos1 > 0)
-	XFillRectangle (dpy, x_win, gc, x, ypos1, width, ypos2 - ypos1);
-      if (ypos4 - ypos3 > 0)
-	XFillRectangle (dpy, x_win, gc, x, ypos1, width, ypos2 - ypos1);
-    }
-
-  /* Now draw the line. */
-  gc = x_get_gc (d, Qnil, WINDOW_FACE_CACHEL_BACKGROUND (w, rb->findex),
-		 Qnil, Qnil, Qnil);
-
-  if (ypos2 < ypos1)
-    ypos2 = ypos1;
-  if (ypos3 > ypos4)
-    ypos3 = ypos4;
-
-  if (ypos3 - ypos2 > 0)
-    XFillRectangle (dpy, x_win, gc, x, ypos2, width, ypos3 - ypos2);
-}
-
-/*****************************************************************************
  x_output_shadows
 
  Draw a shadow around the given area using the given GC's.  It is the
@@ -2084,261 +334,6 @@
     }
 }
 
-/****************************************************************************
- x_clear_region
-
- Clear the area in the box defined by the given parameters using the
- given face.
- ****************************************************************************/
-static void
-x_clear_region (Lisp_Object UNUSED (locale), struct device* d,
-		struct frame* f, face_index UNUSED (findex),
-		int x, int y,
-		int width, int height, Lisp_Object fcolor, Lisp_Object bcolor,
-		Lisp_Object background_pixmap)
-{
-  Display *dpy;
-  Window x_win;
-  GC gc = NULL;
-
-  dpy = DEVICE_X_DISPLAY (d);
-  x_win = XtWindow (FRAME_X_TEXT_WIDGET (f));
-
-    if (!UNBOUNDP (background_pixmap))
-    {
-      gc = x_get_gc (d, Qnil, fcolor, bcolor, background_pixmap, Qnil);
-    }
-
-  if (gc)
-    XFillRectangle (dpy, x_win, gc, x, y, width, height);
-  else
-    XClearArea (dpy, x_win, x, y, width, height, False);
-}
-
-/*****************************************************************************
- x_output_eol_cursor
-
- Draw a cursor at the end of a line.  The end-of-line cursor is
- narrower than the normal cursor.
- ****************************************************************************/
-static void
-x_output_eol_cursor (struct window *w, struct display_line *dl, int xpos,
-		     face_index findex)
-{
-  struct frame *f = XFRAME (w->frame);
-  struct device *d = XDEVICE (f->device);
-  Lisp_Object window;
-
-  Display *dpy = DEVICE_X_DISPLAY (d);
-  Window x_win = XtWindow (FRAME_X_TEXT_WIDGET (f));
-  GC gc;
-  face_index elt = get_builtin_face_cache_index (w, Vtext_cursor_face);
-  struct face_cachel *cursor_cachel = WINDOW_FACE_CACHEL (w, elt);
-
-  int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
-  Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
-							 WINDOW_BUFFER (w));
-
-  int x = xpos;
-  int y = DISPLAY_LINE_YPOS (dl);
-  int width = EOL_CURSOR_WIDTH;
-  int height = DISPLAY_LINE_HEIGHT (dl);
-  int cursor_height, cursor_y;
-  int defheight, defascent;
-
-  window = wrap_window (w);
-  redisplay_clear_region (window, findex, x, y, width, height);
-
-  if (NILP (w->text_cursor_visible_p))
-    return;
-
-  gc = x_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil, Qnil);
-
-  default_face_font_info (window, &defascent, 0, &defheight, 0, 0);
-
-  /* make sure the cursor is entirely contained between y and y+height */
-  cursor_height = min (defheight, height);
-  cursor_y = max (y, min (y + height - cursor_height,
-			  dl->ypos - defascent));
-
-  if (focus)
-    {
-#ifdef HAVE_XIM
-      XIM_SetSpotLocation (f, x - 2 , cursor_y + cursor_height - 2);
-#endif /* HAVE_XIM */
-
-      if (NILP (bar_cursor_value))
-	{
-	  XFillRectangle (dpy, x_win, gc, x, cursor_y, width, cursor_height);
-	}
-      else
-	{
-	  int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2;
-
-	  gc = x_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil,
-			 make_int (bar_width));
-	  XDrawLine (dpy, x_win, gc, x + bar_width - 1, cursor_y,
-		     x + bar_width - 1, cursor_y + cursor_height - 1);
-	}
-    }
-  else if (NILP (bar_cursor_value))
-    {
-      XDrawRectangle (dpy, x_win, gc, x, cursor_y, width - 1,
-		      cursor_height - 1);
-    }
-}
-
-static void
-x_clear_frame_window (Lisp_Object window)
-{
-  struct window *w = XWINDOW (window);
-
-  if (!NILP (w->vchild))
-    {
-      x_clear_frame_windows (w->vchild);
-      return;
-    }
-
-  if (!NILP (w->hchild))
-    {
-      x_clear_frame_windows (w->hchild);
-      return;
-    }
-
-  redisplay_clear_to_window_end (w, WINDOW_TEXT_TOP (w),
-				 WINDOW_TEXT_BOTTOM (w));
-}
-
-static void
-x_clear_frame_windows (Lisp_Object window)
-{
-  for (; !NILP (window); window = XWINDOW (window)->next)
-    x_clear_frame_window (window);
-}
-
-static void
-x_clear_frame (struct frame *f)
-{
-  struct device *d = XDEVICE (f->device);
-  Display *dpy = DEVICE_X_DISPLAY (d);
-  Window x_win = XtWindow (FRAME_X_TEXT_WIDGET (f));
-  int x, y, width, height;
-  Lisp_Object frame;
-
-  x = FRAME_LEFT_BORDER_START (f);
-  width = (FRAME_PIXWIDTH (f) - FRAME_REAL_LEFT_TOOLBAR_WIDTH (f) -
-	   FRAME_REAL_RIGHT_TOOLBAR_WIDTH (f) -
-	   2 * FRAME_REAL_LEFT_TOOLBAR_BORDER_WIDTH (f) -
-	   2 * FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH (f));
-  /* #### This adjustment by 1 should be being done in the macros.
-     There is some small differences between when the menubar is on
-     and off that we still need to deal with. */
-  y = FRAME_TOP_BORDER_START (f) - 1;
-  height = (FRAME_PIXHEIGHT (f) - FRAME_REAL_TOP_TOOLBAR_HEIGHT (f) -
-	    FRAME_REAL_BOTTOM_TOOLBAR_HEIGHT (f) -
-	    2 * FRAME_REAL_TOP_TOOLBAR_BORDER_WIDTH (f) -
-	    2 * FRAME_REAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f)) + 1;
-
-  XClearArea (dpy, x_win, x, y, width, height, False);
-
-  frame = wrap_frame (f);
-
-  if (!UNBOUNDP (FACE_BACKGROUND_PIXMAP (Vdefault_face, frame))
-      || !UNBOUNDP (FACE_BACKGROUND_PIXMAP (Vleft_margin_face, frame))
-      || !UNBOUNDP (FACE_BACKGROUND_PIXMAP (Vright_margin_face, frame)))
-    {
-      x_clear_frame_windows (f->root_window);
-    }
-
-  if (!(check_if_pending_expose_event (d)))
-    XFlush (DEVICE_X_DISPLAY (d));
-}
-
-/* briefly swap the foreground and background colors.
- */
-
-static int
-x_flash (struct device *d)
-{
-  Display *dpy;
-  Window win;
-  XGCValues gcv;
-  GC gc;
-  XColor tmp_fcolor, tmp_bcolor;
-  Lisp_Object tmp_pixel, frame;
-  struct frame *f = device_selected_frame (d);
-  struct window *w = XWINDOW (FRAME_ROOT_WINDOW (f));
-  Widget shell = FRAME_X_SHELL_WIDGET (f);
-  int flash_height;
-
-  frame = wrap_frame (f);
-
-  tmp_pixel = FACE_FOREGROUND (Vdefault_face, frame);
-  tmp_fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel));
-  tmp_pixel = FACE_BACKGROUND (Vdefault_face, frame);
-  tmp_bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel));
-
-  dpy = XtDisplay (shell);
-  win = XtWindow (FRAME_X_TEXT_WIDGET (f));
-  memset (&gcv, ~0, sizeof (XGCValues)); /* initialize all slots to ~0 */
-  gcv.foreground = (tmp_fcolor.pixel ^ tmp_bcolor.pixel);
-  gcv.function = GXxor;
-  gcv.graphics_exposures = False;
-  gc = gc_cache_lookup (DEVICE_X_GC_CACHE (XDEVICE (f->device)), &gcv,
-			(GCForeground | GCFunction | GCGraphicsExposures));
-  default_face_height_and_width (frame, &flash_height, 0);
-
-  /* If window is tall, flash top and bottom line.  */
-  if (EQ (Vvisible_bell, Qtop_bottom) && w->pixel_height > 3 * flash_height)
-    {
-      XFillRectangle (dpy, win, gc, w->pixel_left, w->pixel_top,
-		      w->pixel_width, flash_height);
-      XFillRectangle (dpy, win, gc, w->pixel_left,
-		      w->pixel_top + w->pixel_height - flash_height,
-		      w->pixel_width, flash_height);
-    }
-  else
-    /* If it is short, flash it all.  */
-    XFillRectangle (dpy, win, gc, w->pixel_left, w->pixel_top,
-		    w->pixel_width, w->pixel_height);
-
-  XSync (dpy, False);
-
-#ifdef HAVE_SELECT
-  {
-    int usecs = 100000;
-    struct timeval tv;
-    tv.tv_sec  = usecs / 1000000L;
-    tv.tv_usec = usecs % 1000000L;
-    /* I'm sure someone is going to complain about this... */
-    select (0, 0, 0, 0, &tv);
-  }
-#else
-#ifdef HAVE_POLL
-  poll (0, 0, 100);
-#else /* !HAVE_POLL */
-  bite me
-#endif /* HAVE_POLL */
-#endif /* HAVE_SELECT */
-
-  /* If window is tall, flash top and bottom line.  */
-  if (EQ (Vvisible_bell, Qtop_bottom) && w->pixel_height > 3 * flash_height)
-    {
-      XFillRectangle (dpy, win, gc, w->pixel_left, w->pixel_top,
-		      w->pixel_width, flash_height);
-      XFillRectangle (dpy, win, gc, w->pixel_left,
-		      w->pixel_top + w->pixel_height - flash_height,
-		      w->pixel_width, flash_height);
-    }
-  else
-    /* If it is short, flash it all.  */
-    XFillRectangle (dpy, win, gc, w->pixel_left, w->pixel_top,
-		    w->pixel_width, w->pixel_height);
-
-  XSync (dpy, False);
-
-  return 1;
-}
 
 /* Make audible bell.  */
 
@@ -2376,28 +371,3 @@
       XSync (display, 0);
     }
 }
-
-
-/************************************************************************/
-/*                            initialization                            */
-/************************************************************************/
-
-void
-console_type_create_redisplay_x (void)
-{
-  /* redisplay methods */
-  CONSOLE_HAS_METHOD (x, text_width);
-  CONSOLE_HAS_METHOD (x, output_display_block);
-  CONSOLE_HAS_METHOD (x, divider_height);
-  CONSOLE_HAS_METHOD (x, eol_cursor_width);
-  CONSOLE_HAS_METHOD (x, output_vertical_divider);
-  CONSOLE_HAS_METHOD (x, clear_region);
-  CONSOLE_HAS_METHOD (x, clear_frame);
-  CONSOLE_HAS_METHOD (x, window_output_begin);
-  CONSOLE_HAS_METHOD (x, window_output_end);
-  CONSOLE_HAS_METHOD (x, flash);
-  CONSOLE_HAS_METHOD (x, ring_bell);
-  CONSOLE_HAS_METHOD (x, bevel_area);
-  CONSOLE_HAS_METHOD (x, output_string);
-  CONSOLE_HAS_METHOD (x, output_pixmap);
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/redisplay-xlike-inc.c	Fri Jan 29 15:06:36 2010 -0600
@@ -0,0 +1,2533 @@
+/* Common code between X and GTK.
+   Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
+   Copyright (C) 1994 Lucid, Inc.
+   Copyright (C) 1995 Sun Microsystems, Inc.
+   Copyright (C) 2002, 2003, 2005, 2009, 2010 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. */
+
+/* Author: Chuck Thompson */
+/* Gtk flavor by William Perry */
+/* X and GTK code merged by Ben Wing, 1-10 */
+
+/* Lots of work done by Ben Wing for Mule */
+
+#include <config.h>
+#include "lisp.h"
+
+#include "buffer.h"
+#include "debug.h"
+#include "device-impl.h"
+#include "faces.h"
+#include "file-coding.h"
+#include "frame-impl.h"
+#include "gutter.h"
+#include "redisplay.h"
+#include "sysdep.h"
+#include "window.h"
+
+#ifdef MULE
+#include "mule-ccl.h"
+#endif
+#include "charset.h"
+
+#ifdef THIS_IS_X
+#include "console-x-impl.h"
+#include "glyphs-x.h"
+#include "objects-x-impl.h"
+#include "xgccache.h"
+#else /* THIS_IS_GTK */
+#include "console-gtk-impl.h"
+#include "gccache-gtk.h"
+#include "glyphs-gtk.h"
+#include "objects-gtk-impl.h"
+#endif /* THIS_IS_GTK */
+
+#include "EmacsFrame.h"
+#include "EmacsFrameP.h"
+
+#include "sysproc.h" /* for select() */
+
+#ifdef THIS_IS_X
+#include <X11/bitmaps/gray>
+#endif /* THIS_IS_X */
+
+#define EOL_CURSOR_WIDTH	5
+
+/* About some of the types below:
+
+   X has two ways of representing a color: (a) as an unsigned long
+   representing a color pixel value, i.e. the actual value stored in memory
+   or a file at a particular pixel location to indicate that the pixel
+   takes on a specific color; and (b) an XColor structure, which
+   encapsulates both the RGB components of a color and the associated color
+   pixel value.
+
+   We call the former type XLIKE_PIXCOLOR and the latter XLIKE_COLOR.
+   GTK uses the same GdkColor structure for both, and normally passes in
+   a pointer.  We provide routines to handle the two logical color types.  */
+
+#ifdef THIS_IS_X
+
+/***************************************************************************/
+/*               Definitions implementing X flavor of XLIKE                */
+/***************************************************************************/
+
+#define XLIKE_NAME x
+#define USED_IF_X(var) var
+
+/* types */
+#define XLIKE_DISPLAY Display *
+#define XLIKE_WINDOW Window
+#define XLIKE_GC GC
+#define XLIKE_RECTANGLE XRectangle
+#define XLIKE_GCVALUES XGCValues
+#define XLIKE_COLOR XColor
+#define XLIKE_PIXCOLOR unsigned long
+
+/* constants */
+#define XLIKE_NONE None
+#define XLIKE_FALSE False
+
+#define XLIKE_GC_BACKGROUND GCBackground
+#define XLIKE_GC_CLIP_MASK GCClipMask
+#define XLIKE_GC_CLIP_X_ORIGIN GCClipXOrigin
+#define XLIKE_GC_CLIP_Y_ORIGIN GCClipYOrigin
+#define XLIKE_GC_EXPOSURES GCGraphicsExposures
+#define XLIKE_GC_FILL GCFillStyle
+#define XLIKE_GC_FONT GCFont
+#define XLIKE_GC_FOREGROUND GCForeground
+#define XLIKE_GC_FUNCTION GCFunction
+#define XLIKE_GC_LINE_WIDTH GCLineWidth
+#define XLIKE_GC_STIPPLE GCStipple
+#define XLIKE_GC_TILE GCTile
+
+#define XLIKE_GX_COPY GXcopy
+#define XLIKE_GX_XOR GXxor
+
+#define XLIKE_FILL_MEMBER fill_style
+#define XLIKE_FILL_STIPPLED FillStippled
+#define XLIKE_FILL_OPAQUE_STIPPLED FillOpaqueStippled
+#define XLIKE_FILL_TILED FillTiled
+#define XLIKE_FILL_SOLID FillSolid
+
+/* functions */
+#define GET_XLIKE_DISPLAY(d) DEVICE_X_DISPLAY (d)
+#define GET_XLIKE_WINDOW(w) XtWindow (FRAME_X_TEXT_WIDGET (f))
+#define XLIKE_FILL_RECTANGLE(dpy, x_win, gc, x, y, width, height) \
+  XFillRectangle (dpy, x_win, gc, x, y, width, height)
+#define XLIKE_DRAW_RECTANGLE(dpy, x_win, gc, x, y, width, height) \
+  XDrawRectangle (dpy, x_win, gc, x, y, width, height)
+#define XLIKE_DRAW_LINE(dpy, x_win, gc, x1, y1, x2, y2) \
+  XDrawLine (dpy, x_win, gc, x1, y1, x2, y2)
+#define XLIKE_OUTPUT_XLIKE_PIXMAP x_output_x_pixmap
+
+#define XLIKE_DISPLAY_LINE_HEIGHT(dl) DISPLAY_LINE_HEIGHT (dl)
+#define XLIKE_DISPLAY_LINE_YPOS(dl) DISPLAY_LINE_YPOS (dl)
+#define XLIKE_DISPLAY_LINE_TOP_CLIP(dl) ((dl)->top_clip)
+#define XLIKE_SET_CLIP_RECTANGLE(dpy, gc, xorig, yorig, prect)		\
+  /* #### why not Unsorted? */						\
+  XSetClipRectangles (dpy, gc, xorig, yorig, prect, 1, YXBanded)
+#define XLIKE_CLEAR_CLIP_MASK(dpy, gc)		\
+do						\
+  {						\
+    XSetClipMask (dpy, gc, None);		\
+    XSetClipOrigin (dpy, gc, 0, 0);		\
+  }						\
+while (0)
+#define XLIKE_FLUSH(dpy) XSync (dpy, False)
+#define XLIKE_CLEAR_AREA(dpy, win, x, y, width, height) \
+  XClearArea (dpy, win, x, y, width, height, False)
+ 
+#define IMAGE_INSTANCE_XLIKE_MASK IMAGE_INSTANCE_X_MASK
+#define XIMAGE_INSTANCE_XLIKE_PIXMAP XIMAGE_INSTANCE_X_PIXMAP
+#define COLOR_INSTANCE_XLIKE_COLOR COLOR_INSTANCE_X_COLOR
+#define FONT_INSTANCE_XLIKE_FONT FONT_INSTANCE_X_FONT
+#define DEVICE_XLIKE_GC_CACHE DEVICE_X_GC_CACHE
+#define DEVICE_XLIKE_GRAY_PIXMAP DEVICE_X_GRAY_PIXMAP
+#define XLIKE_COLOR_TO_PIXCOLOR(ci) ((ci).pixel)
+#define XLIKE_SET_PIXCOLOR_COPY(lval, rval) ((lval) = (rval))
+#define XLIKE_SET_PIXCOLOR_NUM(lval, rval) ((lval) = (rval))
+#define XLIKE_FONT_NUM(val) ((val)->fid)
+
+#define XLIKE_OUTPUT_XLIKE_PIXMAP x_output_x_pixmap
+
+/************ End X flavor of XLIKE **********/
+
+
+
+
+#else /* THIS_IS_GTK */
+
+/***************************************************************************/
+/*              Definitions implementing GTK flavor of XLIKE               */
+/***************************************************************************/
+
+#define XLIKE_NAME gtk
+#define USED_IF_X(var) UNUSED (var)
+
+/*types */
+#define XLIKE_DISPLAY void *
+#define XLIKE_WINDOW GdkWindow *
+#define XLIKE_GC GdkGC *
+#define XLIKE_RECTANGLE GdkRectangle
+#define XLIKE_GCVALUES GdkGCValues
+#define XLIKE_COLOR GdkColor *
+#define XLIKE_PIXCOLOR GdkColor *
+
+/* constants */
+#define XLIKE_NONE 0
+#define XLIKE_FALSE FALSE
+
+#define XLIKE_GC_BACKGROUND GDK_GC_BACKGROUND
+#define XLIKE_GC_CLIP_MASK GDK_GC_CLIP_MASK
+#define XLIKE_GC_CLIP_X_ORIGIN GDK_GC_CLIP_X_ORIGIN
+#define XLIKE_GC_CLIP_Y_ORIGIN GDK_GC_CLIP_Y_ORIGIN
+#define XLIKE_GC_EXPOSURES GDK_GC_EXPOSURES
+#define XLIKE_GC_FILL GDK_GC_FILL
+#define XLIKE_GC_FONT GDK_GC_FONT
+#define XLIKE_GC_FOREGROUND GDK_GC_FOREGROUND
+#define XLIKE_GC_FUNCTION GDK_GC_FUNCTION
+#define XLIKE_GC_LINE_WIDTH GDK_GC_LINE_WIDTH
+#define XLIKE_GC_STIPPLE GDK_GC_STIPPLE
+#define XLIKE_GC_TILE GDK_GC_TILE
+
+#define XLIKE_GX_COPY GDK_COPY
+#define XLIKE_GX_XOR GDK_XOR
+
+#define XLIKE_FILL_MEMBER fill
+#define XLIKE_FILL_STIPPLED GDK_STIPPLED
+#define XLIKE_FILL_OPAQUE_STIPPLED GDK_OPAQUE_STIPPLED
+#define XLIKE_FILL_TILED GDK_TILED
+#define XLIKE_FILL_SOLID GDK_SOLID
+
+/* functions */
+
+#define GET_XLIKE_DISPLAY(d) NULL
+#define GET_XLIKE_WINDOW(w) GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (w))
+#define XLIKE_FILL_RECTANGLE(dpy, x_win, gc, x, y, width, height) \
+  gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, x, y, width, height)
+#define XLIKE_DRAW_RECTANGLE(dpy, x_win, gc, x, y, width, height) \
+  gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, FALSE, x, y, width, height)
+#define XLIKE_DRAW_LINE(dpy, x_win, gc, x1, y1, x2, y2) \
+  gdk_draw_line (GDK_DRAWABLE (x_win), gc, x1, y1, x2, y2)
+#define XLIKE_OUTPUT_XLIKE_PIXMAP gtk_output_gdk_pixmap
+
+/* FIXME: This is totally bogus.  It removes dl->top_clip from the
+   equations.  If there is a bug involving this, fix it properly!
+   Or just ensure that top_clip is 0. */
+#define XLIKE_DISPLAY_LINE_HEIGHT(dl) \
+  ((dl)->ascent + ((dl)->descent - (dl)->clip)
+#define XLIKE_DISPLAY_LINE_YPOS(dl) ((dl)->ypos - (dl)->ascent)
+#define XLIKE_DISPLAY_LINE_TOP_CLIP(dl) ((0)
+#define XLIKE_SET_CLIP_RECTANGLE(dpy, gc, xorig, yorig, prect)	\
+do								\
+  {								\
+    gdk_gc_set_clip_rectangle (gc, prect);			\
+    gdk_gc_set_clip_origin (gc, xorig, yorig);			\
+  }								\
+while (0)
+#define XLIKE_CLEAR_CLIP_MASK(dpy, gc)		\
+do						\
+  {						\
+    gdk_gc_set_clip_rectangle (gc, NULL);	\
+    gdk_gc_set_clip_origin (gc, 0, 0);		\
+  }						\
+while (0)
+#define XLIKE_FLUSH(dpy) gdk_flush ()
+#define XLIKE_CLEAR_AREA(dpy, win, x, y, width, height) \
+  gdk_window_clear_area (win, x, y, width, height)
+
+#define IMAGE_INSTANCE_XLIKE_MASK IMAGE_INSTANCE_GTK_MASK
+#define XIMAGE_INSTANCE_XLIKE_PIXMAP XIMAGE_INSTANCE_GTK_PIXMAP
+#define COLOR_INSTANCE_XLIKE_COLOR COLOR_INSTANCE_GTK_COLOR
+#define FONT_INSTANCE_XLIKE_FONT FONT_INSTANCE_GTK_FONT
+#define DEVICE_XLIKE_GRAY_PIXMAP DEVICE_GTK_GRAY_PIXMAP
+#define DEVICE_XLIKE_GC_CACHE DEVICE_GTK_GC_CACHE
+#define XLIKE_COLOR_TO_PIXCOLOR(ci) (ci)
+#define XLIKE_SET_PIXCOLOR_COPY(lval, rval) ((lval) = *(rval))
+#define XLIKE_SET_PIXCOLOR_NUM(lval, rval) ((lval).pixel = (rval))
+#define XLIKE_FONT_NUM(val) (val)
+
+#define XLIKE_OUTPUT_XLIKE_PIXMAP gtk_output_gdk_pixmap
+
+static void gtk_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 bgpixmap);
+static void gtk_clear_region (Lisp_Object locale, struct device* d,
+			      struct frame* f, face_index findex, int x, int y,
+			      int width, int height, Lisp_Object fcolor,
+			      Lisp_Object bcolor,
+			      Lisp_Object background_pixmap);
+static void gtk_bevel_modeline (struct window *w, struct display_line *dl);
+
+#if 0
+static void __describe_gc (GdkGC *);
+#endif
+
+/************ End GTK flavor of XLIKE **********/
+
+#endif /* (not) THIS_IS_X */
+
+
+
+/***************************************************************************/
+/*                           Common definitions                            */
+/***************************************************************************/
+
+#define XCOLOR_INSTANCE_XLIKE_COLOR(x) \
+  COLOR_INSTANCE_XLIKE_COLOR (XCOLOR_INSTANCE (x))
+
+#define XLIKE_PASTE_1(a,b) a##_##b
+#define XLIKE_PASTE(a,b) XLIKE_PASTE_1(a,b)
+#define XLIKE_CONSOLE_HAS_METHOD_1(xlike, name) CONSOLE_HAS_METHOD (xlike, name)
+#define XLIKE_CONSOLE_HAS_METHOD(name) \
+  XLIKE_CONSOLE_HAS_METHOD_1 (XLIKE_NAME, name)
+
+/* Device methods */
+
+#define XLIKE_text_width XLIKE_PASTE (XLIKE_NAME, text_width)
+#define XLIKE_output_display_block XLIKE_PASTE (XLIKE_NAME, output_display_block)
+#define XLIKE_divider_height XLIKE_PASTE (XLIKE_NAME, divider_height)
+#define XLIKE_eol_cursor_width XLIKE_PASTE (XLIKE_NAME, eol_cursor_width)
+#define XLIKE_output_vertical_divider XLIKE_PASTE (XLIKE_NAME, output_vertical_divider)
+#define XLIKE_clear_region XLIKE_PASTE (XLIKE_NAME, clear_region)
+#define XLIKE_clear_frame XLIKE_PASTE (XLIKE_NAME, clear_frame)
+#define XLIKE_flash XLIKE_PASTE (XLIKE_NAME, flash)
+#define XLIKE_ring_bell XLIKE_PASTE (XLIKE_NAME, ring_bell)
+#define XLIKE_bevel_area XLIKE_PASTE (XLIKE_NAME, bevel_area)
+#define XLIKE_output_string XLIKE_PASTE (XLIKE_NAME, output_string)
+#define XLIKE_output_pixmap XLIKE_PASTE (XLIKE_NAME, output_pixmap)
+#define XLIKE_window_output_begin XLIKE_PASTE (XLIKE_NAME, window_output_begin)
+#define XLIKE_window_output_end XLIKE_PASTE (XLIKE_NAME, window_output_end)
+
+/* Miscellaneous split functions */
+
+#define console_type_create_redisplay_XLIKE XLIKE_PASTE (console_type_create_redisplay, XLIKE_NAME)
+#define XLIKE_get_gc XLIKE_PASTE (XLIKE_NAME, get_gc)
+#define XLIKE_output_blank XLIKE_PASTE (XLIKE_NAME, output_blank)
+#define XLIKE_text_width_single_run XLIKE_PASTE (XLIKE_NAME, text_width_single_run)
+
+static void XLIKE_output_blank (struct window *w, struct display_line *dl,
+				struct rune *rb, int start_pixpos,
+				int cursor_start, int cursor_width);
+static void XLIKE_output_horizontal_line (struct window *w,
+					  struct display_line *dl,
+					  struct rune *rb);
+
+static void XLIKE_output_vertical_divider (struct window *w, int clear);
+
+static void XLIKE_output_eol_cursor (struct window *w,
+				     struct display_line *dl,
+				     int xpos, face_index findex);
+static void XLIKE_clear_frame (struct frame *f);
+static void XLIKE_clear_frame_windows (Lisp_Object window);
+static void XLIKE_window_output_begin (struct window *w);
+static void XLIKE_window_output_end (struct window *w);
+static void XLIKE_bevel_area (struct window *w, face_index findex,
+			      int x, int y, int width, int height,
+			      int shadow_thickness, int edges,
+			      enum edge_style style);
+static void XLIKE_ring_bell (struct device *d, int volume, int pitch,
+			     int duration);
+
+/****************************************************************************/
+/*                                                                          */
+/*                           Separate textual runs                          */
+/*                                                                          */
+/****************************************************************************/
+
+
+     /* Note: We do not use the Xmb*() functions and XFontSets, nor the
+	Motif XFontLists and CompoundStrings.
+	Those functions are generally losing for a number of reasons.
+	Most important, they only support one locale (e.g. you could
+	display Japanese and ASCII text, but not mixed Japanese/Chinese
+	text).  You could maybe call setlocale() frequently to try to deal
+	with this, but that would generally fail because an XFontSet is
+	tied to one locale and won't have the other character sets in it.
+
+	fontconfig (the font database for Xft) has some specifier-like
+	properties, but it's not sufficient (witness the existence of
+	Pango).  Pango might do the trick, but it's not a cross-platform
+	solution; it would need significant advantages to be worth the
+	effort.
+     */
+
+struct textual_run
+{
+  Lisp_Object charset;
+  unsigned char *ptr;
+  int len;
+  int dimension;
+};
+
+/* Separate out the text in STR (an array of Ichars, not a string
+   representation) of length LEN into a series of runs, stored in
+   RUN_STORAGE.  RUN_STORAGE is guaranteed to hold enough space for all
+   runs that could be generated from this text.  Each run points to the a
+   stretch of text given simply by the position codes TEXT_STORAGE into a
+   series of textual runs of a particular charset.  Also convert the
+   characters as necessary into the format needed by XDrawImageString(),
+   XDrawImageString16(), et al.  This means converting to one or two byte
+   format, possibly tweaking the high bits, and possibly running a CCL
+   program.  You must pre-allocate the space used and pass it in. (This is
+   done so you can ALLOCA () the space.) (2 * len) bytes must be allocated
+   for TEXT_STORAGE and (len * sizeof (struct textual_run)) bytes of
+   RUN_STORAGE, where LEN is the length of the dynarr.
+
+   bufchar might not be fixed width (in the case of UTF-8).
+
+   Returns the number of runs actually used. */
+
+/* Notes on Xft implementation
+
+   - With Unicode, we're no longer going to have repertoires reified as
+   charsets.  (Not that we ever really did, what with corporate variants,
+   and so on.)  So we really should be querying the face for the desired
+   font, rather than the character for the charset, and that's what would
+   determine the separation into runs.
+   - The widechar versions of fontconfig (and therefore Xft) functions
+   seem to be just bigendian Unicode.  So there's actually no need to use
+   the 8-bit versions in computing runs and runes, it would seem.
+*/
+
+#if !defined(USE_XFT) && !defined(MULE)
+static int
+separate_textual_runs_nomule (unsigned char *text_storage,
+			      struct textual_run *run_storage,
+			      const Ichar *str, Charcount len,
+			      struct face_cachel *UNUSED(cachel))
+{
+  if (!len)
+    return 0;
+
+  run_storage[0].ptr = text_storage;
+  run_storage[0].len = len;
+  run_storage[0].dimension = 1;
+  run_storage[0].charset = Qnil;
+
+  while (len--)
+    *text_storage++ = *str++;
+  return 1;
+}
+#endif
+
+#if defined(USE_XFT) && !defined(MULE)
+/*
+  Note that in this configuration the "Croatian hack" of using an 8-bit,
+  non-Latin-1 font to get localized display without Mule simply isn't
+  available.  That's by design -- Unicode does not aid or abet that kind
+  of punning.
+  This means that the cast to XftChar16 gives the correct "conversion" to
+  UCS-2.
+  #### Is there an alignment issue with text_storage?
+*/
+static int
+separate_textual_runs_xft_nomule (unsigned char *text_storage,
+				  struct textual_run *run_storage,
+				  const Ichar *str, Charcount len,
+				  struct face_cachel *UNUSED(cachel))
+{
+  int i;
+  if (!len)
+    return 0;
+
+  run_storage[0].ptr = text_storage;
+  run_storage[0].len = len;
+  run_storage[0].dimension = 2;
+  run_storage[0].charset = Qnil;
+
+  for (i = 0; i < len; i++)
+    {
+      *(XftChar16 *)text_storage = str[i];
+      text_storage += sizeof(XftChar16);
+    }
+  return 1;
+}
+#endif
+
+#if defined(USE_XFT) && defined(MULE)
+static int
+separate_textual_runs_xft_mule (unsigned char *text_storage,
+				struct textual_run *run_storage,
+				const Ichar *str, Charcount len,
+				struct face_cachel *UNUSED(cachel))
+{
+  Lisp_Object prev_charset = Qunbound;
+  int runs_so_far = 0, i;
+
+  run_storage[0].ptr = text_storage;
+  run_storage[0].len = len;
+  run_storage[0].dimension = 2;
+  run_storage[0].charset = Qnil;
+
+  for (i = 0; i < len; i++)
+    {
+      Ichar ch = str[i];
+      Lisp_Object charset = ichar_charset(ch);
+      int ucs = ichar_to_unicode(ch);
+
+      /* If UCS is less than zero or greater than 0xFFFF, set ucs2 to
+	 REPLACMENT CHARACTER. */
+      /* That means we can't handle characters outside of the BMP for now */
+      ucs = (ucs & ~0xFFFF) ? 0xFFFD : ucs;
+
+      if (!EQ (charset, prev_charset))
+	{
+	  if (runs_so_far)
+	    run_storage[runs_so_far-1].len = (text_storage - run_storage[runs_so_far-1].ptr) >> 1;
+	  run_storage[runs_so_far].ptr = text_storage;
+	  run_storage[runs_so_far].dimension = 2;
+	  run_storage[runs_so_far].charset = charset;
+	  prev_charset = charset;
+	  runs_so_far++;
+	}
+
+      *(XftChar16 *)text_storage = ucs;
+      text_storage += sizeof(XftChar16);
+    }
+
+  if (runs_so_far)
+    run_storage[runs_so_far-1].len = (text_storage - run_storage[runs_so_far-1].ptr) >> 1;
+  return runs_so_far;
+}
+#endif
+
+#if !defined(USE_XFT) && defined(MULE)
+/*
+  This is the most complex function of this group, due to the various
+  indexing schemes used by different fonts.  For our purposes, they
+  fall into three classes.  Some fonts are indexed compatibly with ISO
+  2022; those fonts just use the Mule internal representation directly
+  (typically the high bit must be reset; this is determined by the `graphic'
+  flag).  Some fonts are indexed by Unicode, specifically by UCS-2.  These
+  are all translated using `ichar_to_unicode'.  Finally some fonts have
+  irregular indexes, and must be translated ad hoc.  In XEmacs ad hoc
+  translations are accomplished with CCL programs. */
+static int
+separate_textual_runs_mule (unsigned char *text_storage,
+			    struct textual_run *run_storage,
+			    const Ichar *str, Charcount len,
+			    struct face_cachel *cachel)
+{
+  Lisp_Object prev_charset = Qunbound;
+  int runs_so_far = 0, i;
+  Ibyte charset_leading_byte = LEADING_BYTE_ASCII;
+  int dimension = 1, graphic = 0, need_ccl_conversion = 0;
+  Lisp_Object ccl_prog;
+  struct ccl_program char_converter;
+
+  int translate_to_ucs_2 = 0;
+
+  for (i = 0; i < len; i++)
+    {
+      Ichar ch = str[i];
+      Lisp_Object charset;
+      int byte1, byte2;		/* BREAKUP_ICHAR dereferences the addresses
+				   of its arguments as pointer to int. */
+      BREAKUP_ICHAR (ch, charset, byte1, byte2);
+
+      if (!EQ (charset, prev_charset))
+	{
+	  /* At this point, dimension' and `prev_charset' refer to just-
+	     completed run.  `runs_so_far' and `text_storage' refer to the
+	     run about to start. */
+	  if (runs_so_far)
+	    {
+	      /* Update metadata for previous run. */
+	      run_storage[runs_so_far - 1].len =
+		text_storage - run_storage[runs_so_far - 1].ptr;
+	      if (2 == dimension) run_storage[runs_so_far - 1].len >>= 1;
+	    }
+
+	  /* Compute metadata for current run.
+	     First, classify font.
+	     If the font is indexed by UCS-2, set `translate_to_ucs_2'.
+	     Else if the charset has a CCL program, set `need_ccl_conversion'.
+	     Else if the font is indexed by an ISO 2022 "graphic register",
+	         set `graphic'.
+	     These flags are almost mutually exclusive, but we're sloppy
+	     about resetting "shadowed" flags.  So the flags must be checked
+	     in the proper order in computing byte1 and byte2, below. */
+	  charset_leading_byte = XCHARSET_LEADING_BYTE(charset);
+	  translate_to_ucs_2 =
+	    bit_vector_bit (FACE_CACHEL_FONT_FINAL_STAGE (cachel),
+			    charset_leading_byte - MIN_LEADING_BYTE);
+	  if (translate_to_ucs_2)
+	    {
+	      dimension = 2;
+	    }
+	  else
+	    {
+	      dimension = XCHARSET_DIMENSION (charset);
+
+	      /* Check for CCL charset.
+		 If setup_ccl_program fails, we'll get a garbaged display.
+		 This should never happen, and even if it does, it should
+		 be harmless (unless the X server has buggy handling of
+		 characters undefined in the font).  It may be marginally
+		 more useful to users and debuggers than substituting a
+		 fixed replacement character. */
+	      ccl_prog = XCHARSET_CCL_PROGRAM (charset);
+	      if ((!NILP (ccl_prog))
+		  && (setup_ccl_program (&char_converter, ccl_prog) >= 0))
+		{
+		  need_ccl_conversion = 1;
+		}
+	      else 
+		{
+		  /* The charset must have an ISO 2022-compatible font index.
+		     There are 2 "registers" (what such fonts use as index).
+		     GL (graphic == 0) has the high bit of each octet reset,
+		     GR (graphic == 1) has it set. */
+		  graphic   = XCHARSET_GRAPHIC (charset);
+		  need_ccl_conversion = 0;
+		}
+	    }
+
+	  /* Initialize metadata for current run. */
+	  run_storage[runs_so_far].ptr       = text_storage;
+	  run_storage[runs_so_far].charset   = charset;
+	  run_storage[runs_so_far].dimension = dimension;
+
+	  /* Update loop variables. */
+	  prev_charset = charset;
+	  runs_so_far++;
+	} 
+
+      /* Must check flags in this order.  See comment above. */
+      if (translate_to_ucs_2)
+	{
+	  int ucs = ichar_to_unicode(ch);
+	  /* If UCS is less than zero or greater than 0xFFFF, set ucs2 to
+	     REPLACMENT CHARACTER. */
+	  ucs = (ucs & ~0xFFFF) ? 0xFFFD : ucs;
+
+	  byte1 = ucs >> 8;
+	  byte2 = ucs;
+	}
+      else if (need_ccl_conversion)
+	{
+	  char_converter.reg[0] = charset_leading_byte;
+	  char_converter.reg[1] = byte1;
+	  char_converter.reg[2] = byte2;
+	  ccl_driver (&char_converter, 0, 0, 0, 0, CCL_MODE_ENCODING);
+	  byte1 = char_converter.reg[1];
+	  byte2 = char_converter.reg[2];
+	}
+      else if (graphic == 0)
+	{
+	  byte1 &= 0x7F;
+	  byte2 &= 0x7F;
+	}
+      else
+	{
+	  byte1 |= 0x80;
+	  byte2 |= 0x80;
+	}
+
+      *text_storage++ = (unsigned char)byte1;
+
+      if (2 == dimension) *text_storage++ = (unsigned char)byte2;
+    }
+
+  if (runs_so_far)
+    {
+      run_storage[runs_so_far - 1].len =
+	text_storage - run_storage[runs_so_far - 1].ptr;
+      /* Dimension retains the relevant value for the run before it. */
+      if (2 == dimension)
+	run_storage[runs_so_far - 1].len >>= 1;
+    }
+
+  return runs_so_far;
+}
+#endif
+
+static int
+separate_textual_runs (unsigned char *text_storage,
+		       struct textual_run *run_storage,
+		       const Ichar *str, Charcount len,
+		       struct face_cachel *cachel)
+{
+#if defined(USE_XFT) && defined(MULE)
+  return separate_textual_runs_xft_mule (text_storage, run_storage,
+					 str, len, cachel);
+#endif
+#if defined(USE_XFT) && !defined(MULE)
+  return separate_textual_runs_xft_nomule (text_storage, run_storage,
+					   str, len, cachel);
+#endif
+#if !defined(USE_XFT) && defined(MULE)
+  return separate_textual_runs_mule (text_storage, run_storage,
+				     str, len, cachel);
+#endif
+#if !defined(USE_XFT) && !defined(MULE)
+  return separate_textual_runs_nomule (text_storage, run_storage,
+				       str, len, cachel);
+#endif
+}
+
+/****************************************************************************/
+/*                                                                          */
+/*                           Xlike output routines                          */
+/*                                                                          */
+/****************************************************************************/
+
+static int
+XLIKE_text_width_single_run (struct frame * USED_IF_XFT (f),
+			     struct face_cachel *cachel,
+			     struct textual_run *run)
+{
+  Lisp_Object font_inst = FACE_CACHEL_FONT (cachel, run->charset);
+  Lisp_Font_Instance *fi = XFONT_INSTANCE (font_inst);
+
+  if (!fi->proportional_p)
+    return fi->width * run->len;
+#ifdef USE_XFT
+  else if (FONT_INSTANCE_X_XFTFONT (fi))
+    {
+      static XGlyphInfo glyphinfo;
+      struct device *d = XDEVICE (f->device);
+      Display *dpy = DEVICE_X_DISPLAY (d);
+
+      if (run->dimension == 2)
+	{
+	  XftTextExtents16 (dpy,
+			    FONT_INSTANCE_X_XFTFONT (fi),
+			    (XftChar16 *) run->ptr, run->len, &glyphinfo);
+	}
+      else
+	{
+	  XftTextExtents8 (dpy,
+			   FONT_INSTANCE_X_XFTFONT (fi),
+			   run->ptr, run->len, &glyphinfo);
+	}
+    
+      return glyphinfo.xOff;
+    }
+#endif
+  else if (FONT_INSTANCE_XLIKE_FONT (fi))
+    {
+      if (run->dimension == 2)
+	{	
+#ifdef THIS_IS_X
+	  return XTextWidth16 (FONT_INSTANCE_X_FONT (fi),
+			       (XChar2b *) run->ptr, run->len);
+#else /* THIS_IS_GTK */
+	  /* stderr_out ("Measuring wide characters\n"); */
+	  return gdk_text_width_wc (FONT_INSTANCE_GTK_FONT (fi),
+				    (GdkWChar *) run->ptr, run->len);
+#endif /* THIS_IS_GTK */
+	}
+      else
+	{
+#ifdef THIS_IS_X
+	  return XTextWidth (FONT_INSTANCE_X_FONT (fi),
+			     (char *) run->ptr, run->len);
+#else /* THIS_IS_GTK */
+	  return gdk_text_width (FONT_INSTANCE_GTK_FONT (fi),
+				 (char *) run->ptr, run->len);
+#endif /* THIS_IS_GTK */
+	}
+    }
+  else
+    abort();
+  return 0;			/* shut up GCC */
+}
+
+/*
+   XLIKE_text_width
+
+   Given a string and a merged face, return the string's length in pixels
+   when displayed in the fonts associated with the face.
+   */
+
+/* #### Break me out into a separate header */
+int XLIKE_text_width (struct frame *USED_IF_X (f), struct face_cachel *cachel,
+		      const Ichar *str, Charcount len);
+int
+XLIKE_text_width (struct frame *USED_IF_X (f), struct face_cachel *cachel,
+		  const Ichar *str, Charcount len)
+{
+  /* !!#### Needs review */
+  int width_so_far = 0;
+  unsigned char *text_storage = (unsigned char *) ALLOCA (2 * len);
+  struct textual_run *runs = alloca_array (struct textual_run, len);
+  int nruns;
+  int i;
+
+  nruns = separate_textual_runs (text_storage, runs, str, len, 
+				 cachel);
+
+  for (i = 0; i < nruns; i++)
+    width_so_far += XLIKE_text_width_single_run (f, cachel, runs + i);
+
+  return width_so_far;
+}
+
+/*****************************************************************************
+ XLIKE_divider_height
+
+ Return the height of the horizontal divider.  This is a function because
+ divider_height is a device method.
+
+ #### If we add etched horizontal divider lines this will have to get
+ smarter.
+ ****************************************************************************/
+static int
+XLIKE_divider_height (void)
+{
+#ifdef THIS_IS_X
+  return 1;
+#else /* THIS_IS_GTK */
+  return 2;
+#endif /* THIS_IS_GTK */
+}
+
+/*****************************************************************************
+ XLIKE_eol_cursor_width
+
+ Return the width of the end-of-line cursor.  This is a function
+ because eol_cursor_width is a device method.
+ ****************************************************************************/
+static int
+XLIKE_eol_cursor_width (void)
+{
+  return EOL_CURSOR_WIDTH;
+}
+
+/*****************************************************************************
+ XLIKE_output_display_block
+
+ Given a display line, a block number for that start line, output all
+ runes between start and end in the specified display block.
+ ****************************************************************************/
+static void
+XLIKE_output_display_block (struct window *w, struct display_line *dl,
+			    int block, int start, int end, int start_pixpos,
+			    int cursor_start, int cursor_width,
+			    int cursor_height)
+{
+#ifndef USE_XFT
+  struct frame *f = XFRAME (w->frame);
+#endif
+  Ichar_dynarr *buf;
+  Lisp_Object window;
+
+  struct display_block *db = Dynarr_atp (dl->display_blocks, block);
+  rune_dynarr *rba = db->runes;
+  struct rune *rb;
+
+  int elt = start;
+  face_index findex;
+  int xpos, width = 0;
+  Lisp_Object charset = Qunbound; /* Qnil is a valid charset when
+				     MULE is not defined */
+
+  window = wrap_window (w);
+  rb = Dynarr_atp (rba, start);
+
+  if (!rb)
+    /* Nothing to do so don't do anything. */
+    return;
+
+  findex = rb->findex;
+  xpos = rb->xpos;
+  if (rb->type == RUNE_CHAR)
+    charset = ichar_charset (rb->object.chr.ch);
+
+  if (end < 0)
+    end = Dynarr_length (rba);
+  buf = Dynarr_new (Ichar);
+
+  while (elt < end)
+    {
+      rb = Dynarr_atp (rba, elt);
+
+      if (rb->findex == findex && rb->type == RUNE_CHAR
+	  && rb->object.chr.ch != '\n' && rb->cursor_type != CURSOR_ON
+	  && EQ (charset, ichar_charset (rb->object.chr.ch)))
+	{
+	  Dynarr_add (buf, rb->object.chr.ch);
+	  width += rb->width;
+	  elt++;
+	}
+      else
+	{
+	  if (Dynarr_length (buf))
+	    {
+	      XLIKE_output_string (w, dl, buf, xpos, 0, start_pixpos, width,
+				   findex, 0, cursor_start, cursor_width,
+				   cursor_height);
+	      xpos = rb->xpos;
+	      width = 0;
+	    }
+	  Dynarr_reset (buf);
+	  width = 0;
+
+	  if (rb->type == RUNE_CHAR)
+	    {
+	      findex = rb->findex;
+	      xpos = rb->xpos;
+	      charset = ichar_charset (rb->object.chr.ch);
+
+	      if (rb->cursor_type == CURSOR_ON)
+		{
+		  if (rb->object.chr.ch == '\n')
+		    {
+		      XLIKE_output_eol_cursor (w, dl, xpos, findex);
+		    }
+		  else
+		    {
+		      Dynarr_add (buf, rb->object.chr.ch);
+		      XLIKE_output_string (w, dl, buf, xpos, 0, start_pixpos,
+					   rb->width, findex, 1,
+					   cursor_start, cursor_width,
+					   cursor_height);
+		      Dynarr_reset (buf);
+		    }
+
+		  xpos += rb->width;
+		  elt++;
+		}
+	      else if (rb->object.chr.ch == '\n')
+		{
+		  /* Clear in case a cursor was formerly here. */
+		  redisplay_clear_region (window, findex, xpos,
+					  XLIKE_DISPLAY_LINE_YPOS (dl),
+					  rb->width,
+					  XLIKE_DISPLAY_LINE_HEIGHT (dl));
+		  elt++;
+		}
+	    }
+	  else if (rb->type == RUNE_BLANK || rb->type == RUNE_HLINE)
+	    {
+	      if (rb->type == RUNE_BLANK)
+		XLIKE_output_blank (w, dl, rb, start_pixpos, cursor_start,
+				    cursor_width);
+	      else
+		{
+		  /* #### Our flagging of when we need to redraw the
+                     modeline shadows sucks.  Since RUNE_HLINE is only used
+                     by the modeline at the moment it is a good bet
+                     that if it gets redrawn then we should also
+                     redraw the shadows.  This won't be true forever.
+                     We borrow the shadow_thickness_changed flag for
+                     now. */
+		  w->shadow_thickness_changed = 1;
+		  XLIKE_output_horizontal_line (w, dl, rb);
+		}
+
+	      elt++;
+	      if (elt < end)
+		{
+		  rb = Dynarr_atp (rba, elt);
+
+		  findex = rb->findex;
+		  xpos = rb->xpos;
+		}
+	    }
+	  else if (rb->type == RUNE_DGLYPH)
+	    {
+	      Lisp_Object instance;
+	      struct display_box dbox;
+	      struct display_glyph_area dga;
+
+	      redisplay_calculate_display_boxes (dl, rb->xpos, rb->object.dglyph.xoffset,
+						 rb->object.dglyph.yoffset, start_pixpos,
+                                                 rb->width, &dbox, &dga);
+
+	      window = wrap_window (w);
+	      instance = glyph_image_instance (rb->object.dglyph.glyph,
+					       window, ERROR_ME_DEBUG_WARN, 1);
+	      findex = rb->findex;
+
+	      if (IMAGE_INSTANCEP (instance))
+		{
+		  switch (XIMAGE_INSTANCE_TYPE (instance))
+		    {
+		    case IMAGE_TEXT:
+#ifdef THIS_IS_GTK
+		      {
+			/* !!#### Examine for Mule-izing */
+			/* #### This is way losing.  See the comment in
+			   add_glyph_rune(). */
+			Lisp_Object string =
+			  XIMAGE_INSTANCE_TEXT_STRING (instance);
+			convert_ibyte_string_into_ichar_dynarr
+			  (XSTRING_DATA (string), XSTRING_LENGTH (string),
+			   buf);
+
+			gtk_output_string (w, dl, buf, xpos,
+					   rb->object.dglyph.xoffset,
+					   start_pixpos, -1, findex,
+					   (rb->cursor_type == CURSOR_ON),
+					   cursor_start, cursor_width,
+					   cursor_height);
+			Dynarr_reset (buf);
+		      }
+		      break;
+#else
+		      ABORT ();
+#endif /* THIS_IS_GTK */
+		    case IMAGE_MONO_PIXMAP:
+		    case IMAGE_COLOR_PIXMAP:
+		      redisplay_output_pixmap (w, instance, &dbox, &dga,
+					       findex, cursor_start,
+					       cursor_width,
+					       cursor_height, 0);
+		      break;
+
+		    case IMAGE_WIDGET:
+		      if (EQ (XIMAGE_INSTANCE_WIDGET_TYPE (instance),
+			      Qlayout))
+			{
+			  redisplay_output_layout (window, instance, &dbox,
+						   &dga, findex,
+						   cursor_start, cursor_width,
+						   cursor_height);
+			  break;
+			}
+
+		    case IMAGE_SUBWINDOW:
+		      redisplay_output_subwindow (w, instance, &dbox, &dga,
+						  findex, cursor_start,
+						  cursor_width, cursor_height);
+		      break;
+
+		    case IMAGE_NOTHING:
+		      /* nothing is as nothing does */
+		      break;
+
+		    case IMAGE_POINTER:
+		    default:
+		      ABORT ();
+		    }
+		  IMAGE_INSTANCE_OPTIMIZE_OUTPUT
+		    (XIMAGE_INSTANCE (instance)) = 0;
+		}
+
+	      xpos += rb->width;
+	      elt++;
+	    }
+	  else
+	    ABORT ();
+	}
+    }
+
+  if (Dynarr_length (buf))
+    XLIKE_output_string (w, dl, buf, xpos, 0, start_pixpos, width, findex,
+			 0, cursor_start, cursor_width, cursor_height);
+
+  if (dl->modeline
+      && !EQ (Qzero, w->modeline_shadow_thickness)
+#ifndef USE_XFT
+      /* This optimization doesn't work right with some Xft fonts, which
+	 leave antialiasing turds at the boundary.  I don't know if this
+	 is an Xft bug or not, but I think it is.   See x_output_string. */
+      && (f->clear
+	  || f->windows_structure_changed
+	  || w->shadow_thickness_changed)
+#endif
+      )
+    bevel_modeline (w, dl);
+
+  Dynarr_free (buf);
+}
+
+/*****************************************************************************
+ XLIKE_get_gc
+
+ Given a number of parameters return a GC with those properties.
+ ****************************************************************************/
+static XLIKE_GC
+XLIKE_get_gc (struct device *d, Lisp_Object font, Lisp_Object fg, 
+	      Lisp_Object bg, Lisp_Object bg_pmap, Lisp_Object lwidth)
+{
+  XLIKE_GCVALUES gcv;
+  unsigned long mask;
+
+  memset (&gcv, ~0, sizeof (gcv));
+  gcv.graphics_exposures = XLIKE_FALSE;
+  /* Make absolutely sure that we don't pick up a clipping region in
+     the GC returned by this function. */
+  gcv.clip_mask = XLIKE_NONE;
+  gcv.clip_x_origin = 0;
+  gcv.clip_y_origin = 0;
+  gcv.XLIKE_FILL_MEMBER = XLIKE_FILL_SOLID;
+  mask = XLIKE_GC_EXPOSURES | XLIKE_GC_CLIP_MASK | XLIKE_GC_CLIP_X_ORIGIN | XLIKE_GC_CLIP_Y_ORIGIN;
+  mask |= XLIKE_GC_FILL;
+
+  if (!NILP (font)
+#ifdef USE_XFT
+      /* Only set the font if it's a core font */
+      /* the renderfont will be set elsewhere (not part of gc) */
+      && !FONT_INSTANCE_X_XFTFONT (XFONT_INSTANCE (font))
+#endif
+      )
+    {
+      gcv.font =
+	XLIKE_FONT_NUM (FONT_INSTANCE_XLIKE_FONT (XFONT_INSTANCE (font)));
+      mask |= XLIKE_GC_FONT;
+    }
+
+  /* evil kludge! */
+  if (!NILP (fg) && !COLOR_INSTANCEP (fg) && !INTP (fg))
+    {
+      /* #### I fixed one case where this was getting hit.  It was a
+         bad macro expansion (compiler bug). */
+      stderr_out ("Help! x_get_gc got a bogus fg value! fg = ");
+      debug_print (fg);
+      fg = Qnil;
+    }
+
+  if (!NILP (fg))
+    {
+      if (COLOR_INSTANCEP (fg))
+	XLIKE_SET_PIXCOLOR_COPY
+	  (gcv.foreground,
+	   XLIKE_COLOR_TO_PIXCOLOR (XCOLOR_INSTANCE_XLIKE_COLOR (fg)));
+      else
+	XLIKE_SET_PIXCOLOR_NUM (gcv.foreground, XINT (fg));
+      mask |= XLIKE_GC_FOREGROUND;
+    }
+
+  if (!NILP (bg))
+    {
+      if (COLOR_INSTANCEP (bg))
+	XLIKE_SET_PIXCOLOR_COPY
+	  (gcv.background,
+	   XLIKE_COLOR_TO_PIXCOLOR (XCOLOR_INSTANCE_XLIKE_COLOR (bg)));
+      else
+	XLIKE_SET_PIXCOLOR_NUM (gcv.background, XINT (bg));
+      mask |= XLIKE_GC_BACKGROUND;
+    }
+
+  /* This special case comes from a request to draw text with a face which has
+     the dim property. We'll use a stippled foreground GC. */
+  if (EQ (bg_pmap, Qdim))
+    {
+      assert (DEVICE_XLIKE_GRAY_PIXMAP (d) != XLIKE_NONE);
+
+      gcv.XLIKE_FILL_MEMBER = XLIKE_FILL_STIPPLED;
+      gcv.stipple = DEVICE_XLIKE_GRAY_PIXMAP (d);
+      mask |= (XLIKE_GC_FILL | XLIKE_GC_STIPPLE);
+    }
+  else if (IMAGE_INSTANCEP (bg_pmap)
+	   && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
+    {
+      if (XIMAGE_INSTANCE_PIXMAP_DEPTH (bg_pmap) == 0)
+	{
+	  gcv.XLIKE_FILL_MEMBER = XLIKE_FILL_OPAQUE_STIPPLED;
+	  gcv.stipple = XIMAGE_INSTANCE_XLIKE_PIXMAP (bg_pmap);
+	  mask |= (XLIKE_GC_STIPPLE | XLIKE_GC_FILL);
+	}
+      else
+	{
+	  gcv.XLIKE_FILL_MEMBER = XLIKE_FILL_TILED;
+	  gcv.tile = XIMAGE_INSTANCE_XLIKE_PIXMAP (bg_pmap);
+	  mask |= (XLIKE_GC_TILE | XLIKE_GC_FILL);
+	}
+    }
+
+  if (!NILP (lwidth))
+    {
+      gcv.line_width = XINT (lwidth);
+      mask |= XLIKE_GC_LINE_WIDTH;
+    }
+
+#if 0
+  debug_out ("\nx_get_gc: calling gc_cache_lookup\n");
+#endif
+  return gc_cache_lookup (DEVICE_XLIKE_GC_CACHE (d), &gcv, mask);
+}
+
+/*****************************************************************************
+ XLIKE_output_string
+
+ Given a string and a starting position, output that string in the
+ given face.  If cursor is true, draw a cursor around the string.
+ Correctly handles multiple charsets in the string.
+
+ The meaning of the parameters is something like this:
+
+ W		Window that the text is to be displayed in.
+ DL		Display line that this text is on.  The values in the
+ 		structure are used to determine the vertical position and
+		clipping range of the text.
+ BUF		Dynamic array of Ichars specifying what is actually to be
+		drawn.
+ XPOS		X position in pixels where the text should start being drawn.
+ XOFFSET	Number of pixels to be chopped off the left side of the
+ 		text.  The effect is as if the text were shifted to the
+		left this many pixels and clipped at XPOS.
+ CLIP_START	Clip everything left of this X position.
+ WIDTH		Clip everything right of XPOS + WIDTH.
+ FINDEX		Index for the face cache element describing how to display
+ 		the text.
+ CURSOR		#### I don't understand this.  There's something
+ 		strange and overcomplexified with this variable.
+		Chuck, explain please?
+ CURSOR_START	Starting X position of cursor.
+ CURSOR_WIDTH	Width of cursor in pixels.
+ CURSOR_HEIGHT	Height of cursor in pixels.
+
+ Starting Y position of cursor is the top of the text line.
+ The cursor is drawn sometimes whether or not CURSOR is set. ???
+ ****************************************************************************/
+#ifdef THIS_IS_GTK
+static
+void gdk_draw_text_image (GdkDrawable *drawable,
+			  GdkFont     *font,
+			  GdkGC       *gc,
+			  gint         x,
+			  gint         y,
+			  const gchar *text,
+			  gint         text_length);
+
+#endif /* THIS_IS_GTK */
+void
+XLIKE_output_string (struct window *w, struct display_line *dl,
+		     Ichar_dynarr *buf, int xpos, int xoffset, int clip_start,
+		     int width, face_index findex, int cursor,
+		     int cursor_start, int cursor_width, int cursor_height)
+{
+  /* General variables */
+  struct frame *f = XFRAME (w->frame);
+  struct device *d = XDEVICE (f->device);
+  XLIKE_DISPLAY dpy = GET_XLIKE_DISPLAY (d);
+  XLIKE_WINDOW x_win = GET_XLIKE_WINDOW (f);
+  Lisp_Object window = wrap_window (w);
+
+  int clip_end;
+
+  /* Cursor-related variables */
+  int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
+  int cursor_clip;
+  Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
+							 WINDOW_BUFFER (w));
+  struct face_cachel *cursor_cachel = 0;
+
+  /* Text-related variables */
+  Lisp_Object bg_pmap;
+  XLIKE_GC bgc, gc;
+  int height = XLIKE_DISPLAY_LINE_HEIGHT (dl);
+  int ypos = XLIKE_DISPLAY_LINE_YPOS (dl);
+  int len = Dynarr_length (buf);
+  unsigned char *text_storage = (unsigned char *) ALLOCA (2 * len);
+  struct textual_run *runs = alloca_array (struct textual_run, len);
+  int nruns;
+  int i;
+  struct face_cachel *cachel = WINDOW_FACE_CACHEL (w, findex);
+
+#ifdef THIS_IS_X
+  int use_x_font = 1;		/* #### bogus!!
+				   The logic of this function needs review! */
+#endif
+#ifdef USE_XFT
+  Colormap cmap = DEVICE_X_COLORMAP (d);
+  Visual *visual = DEVICE_X_VISUAL (d);
+  static XftColor fg, bg;
+  XftDraw *xftDraw;
+
+  /* Lazily initialize frame's xftDraw member. */
+  if (!FRAME_X_XFTDRAW (f)) {
+    FRAME_X_XFTDRAW (f) = XftDrawCreate (dpy, x_win, visual, cmap);
+  }
+  xftDraw = FRAME_X_XFTDRAW (f);
+
+  /* #### This will probably cause asserts when passed a Lisp integer for a
+     color.  See ca. line 759 this file.
+     #### Maybe xft_convert_color should take an XColor, not a pixel. */
+#define XFT_FROB_LISP_COLOR(color, dim) \
+  xft_convert_color (dpy, cmap, visual, \
+		     COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (color)).pixel, \
+		     (dim))
+#endif /* USE_XFT */
+
+  if (width < 0)
+    width = XLIKE_text_width (f, cachel, Dynarr_atp (buf, 0),
+			      Dynarr_length (buf));
+
+  /* Regularize the variables passed in. */
+
+  if (clip_start < xpos)
+    clip_start = xpos;
+  clip_end = xpos + width;
+  if (clip_start >= clip_end)
+    /* It's all clipped out. */
+    return;
+
+  xpos -= xoffset;
+
+  /* make sure the area we are about to display is subwindow free. */
+  redisplay_unmap_subwindows_maybe (f, clip_start, ypos,
+				    clip_end - clip_start, height);
+
+  cursor_clip = (cursor_start >= clip_start &&
+		 cursor_start < clip_end);
+
+  /* This cursor code is really a mess. */
+  if (!NILP (w->text_cursor_visible_p)
+      && (cursor
+	  || cursor_clip
+	  || (cursor_width
+	      && (cursor_start + cursor_width >= clip_start)
+	      && !NILP (bar_cursor_value))))
+    {
+      /* These have to be in separate statements in order to avoid a
+         compiler bug. */
+      face_index sucks = get_builtin_face_cache_index (w, Vtext_cursor_face);
+      cursor_cachel = WINDOW_FACE_CACHEL (w, sucks);
+
+      /* We have to reset this since any call to WINDOW_FACE_CACHEL
+         may cause the cache to resize and any pointers to it to
+         become invalid. */
+      cachel = WINDOW_FACE_CACHEL (w, findex);
+    }
+
+#ifdef HAVE_XIM
+  if (cursor && focus && (cursor_start == clip_start) && cursor_height)
+    XIM_SetSpotLocation (f, xpos - 2, dl->ypos + dl->descent - 2);
+#endif /* HAVE_XIM */
+
+  bg_pmap = cachel->background_pixmap;
+  if (!IMAGE_INSTANCEP (bg_pmap)
+      || !IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
+    bg_pmap = Qnil;
+
+  if ((cursor && focus && NILP (bar_cursor_value)
+       && !NILP (w->text_cursor_visible_p)) || NILP (bg_pmap))
+    bgc = 0;
+  else
+    bgc = XLIKE_get_gc (d, Qnil, cachel->foreground, cachel->background,
+			bg_pmap, Qnil);
+
+  if (bgc)
+    {
+      XLIKE_FILL_RECTANGLE (dpy, x_win, bgc, clip_start,
+			    ypos, clip_end - clip_start,
+			    height);
+    }
+
+  nruns = separate_textual_runs (text_storage, runs, Dynarr_atp (buf, 0),
+				 Dynarr_length (buf), cachel);
+
+  for (i = 0; i < nruns; i++)
+    {
+      Lisp_Object font = FACE_CACHEL_FONT (cachel, runs[i].charset);
+      Lisp_Font_Instance *fi = XFONT_INSTANCE (font);
+      int this_width;
+      int need_clipping;
+
+      if (EQ (font, Vthe_null_font_instance))
+	continue;
+
+      this_width = XLIKE_text_width_single_run (f, cachel, runs + i);
+      need_clipping = (dl->clip || clip_start > xpos ||
+		       clip_end < xpos + this_width);
+
+      /* XDrawImageString only clears the area equal to the height of
+	 the given font.  It is possible that a font is being displayed
+	 on a line taller than it is, so this would cause us to fail to
+	 clear some areas. */
+      if ((int) fi->height < (int) (height + dl->clip +
+				    XLIKE_DISPLAY_LINE_TOP_CLIP (dl)))
+	{
+	  int clear_start = max (xpos, clip_start);
+	  int clear_end = min (xpos + this_width, clip_end);
+
+	  if (cursor)
+	    {
+	      int ypos1_line, ypos1_string, ypos2_line, ypos2_string;
+
+	      ypos1_string = dl->ypos - fi->ascent;
+	      ypos2_string = dl->ypos + fi->descent;
+	      ypos1_line = ypos;
+	      ypos2_line = ypos1_line + height;
+
+	      /* Make sure we don't clear below the real bottom of the
+		 line. */
+	      if (ypos1_string > ypos2_line)
+		ypos1_string = ypos2_line;
+	      if (ypos2_string > ypos2_line)
+		ypos2_string = ypos2_line;
+
+	      if (ypos1_line < ypos1_string)
+		{
+		  redisplay_clear_region (window, findex, clear_start, ypos1_line,
+				  clear_end - clear_start,
+				  ypos1_string - ypos1_line);
+		}
+
+	      if (ypos2_line > ypos2_string)
+		{
+		  redisplay_clear_region (window, findex, clear_start, ypos2_string,
+				  clear_end - clear_start,
+				  ypos2_line - ypos2_string);
+		}
+	    }
+	  else
+	    {
+	      redisplay_clear_region (window, findex, clear_start,
+			      ypos, clear_end - clear_start,
+			      height);
+	    }
+	}
+
+      if (cursor && cursor_cachel && focus && NILP (bar_cursor_value))
+	{
+#ifdef USE_XFT
+	  fg = XFT_FROB_LISP_COLOR (cursor_cachel->foreground, 0);
+	  bg = XFT_FROB_LISP_COLOR (cursor_cachel->background, 0);
+#endif
+	  gc = XLIKE_get_gc (d, font, cursor_cachel->foreground,
+			     cursor_cachel->background, Qnil, Qnil);
+	}
+      else if (cachel->dim)
+	{
+	  /* Ensure the gray bitmap exists */
+	  if (DEVICE_XLIKE_GRAY_PIXMAP (d) == XLIKE_NONE)
+	    DEVICE_XLIKE_GRAY_PIXMAP (d) =
+#ifdef THIS_IS_X
+	      XCreateBitmapFromData (dpy, x_win, (char *)gray_bits,
+				     gray_width, gray_height)
+#else
+	      /* #### FIXME! Implement me! */
+	      XLIKE_NONE
+#endif
+	      ;
+
+	  /* Request a GC with the gray stipple pixmap to draw dimmed text */
+#ifdef USE_XFT
+	  fg = XFT_FROB_LISP_COLOR (cachel->foreground, 1);
+	  bg = XFT_FROB_LISP_COLOR (cachel->background, 0);
+#endif
+	  gc = XLIKE_get_gc (d, font, cachel->foreground, cachel->background,
+			     Qdim, Qnil);
+	}
+      else
+	{
+#ifdef USE_XFT
+	  fg = XFT_FROB_LISP_COLOR (cachel->foreground, 0);
+	  bg = XFT_FROB_LISP_COLOR (cachel->background, 0);
+#endif
+	  gc = XLIKE_get_gc (d, font, cachel->foreground, cachel->background,
+			     Qnil, Qnil);
+	}
+#ifdef USE_XFT
+      {
+	XftFont *rf = FONT_INSTANCE_X_XFTFONT (fi);
+
+	if (rf)
+	  {
+	    use_x_font = 0;
+	    if (need_clipping)
+	      {
+		Region clip_reg = XCreateRegion();
+		XRectangle clip_box = { clip_start, ypos,
+					clip_end - clip_start, height };
+
+		XUnionRectWithRegion (&clip_box, clip_reg, clip_reg); 
+		XftDrawSetClip(xftDraw, clip_reg);
+		XDestroyRegion(clip_reg);
+	      }
+
+	    if (!bgc)
+	      {
+		/* #### Neither rect_height nor XftTextExtents as computed
+		   below handles the vertical space taken up by antialiasing,
+		   which for some fonts (eg, Bitstream Vera Sans Mono-16 on
+		   my Mac PowerBook G4) leaves behind orphaned dots on
+		   insertion or deletion earlier in the line, especially in
+		   the case of the underscore character.
+		   Interestingly, insertion or deletion of a single character
+		   immediately after a refresh does not leave any droppings,
+		   but any further insertions or deletions do.
+		   While adding a pixel to rect_height (mostly) takes care of
+		   this, it trashes aggressively laid-out elements like the
+		   modeline (overwriting part of the bevel).
+		   OK, unconditionally redraw the bevel, and increment
+		   rect_height by 1.  See x_output_display_block. -- sjt */
+		struct textual_run *run = &runs[i];
+		int rect_width = x_text_width_single_run (f, cachel, run);
+#ifndef USE_XFTTEXTENTS_TO_AVOID_FONT_DROPPINGS
+		int rect_height = FONT_INSTANCE_ASCENT(fi)
+				  + FONT_INSTANCE_DESCENT(fi) + 1;
+#else
+		int rect_height = FONT_INSTANCE_ASCENT(fi)
+				  + FONT_INSTANCE_DESCENT(fi);
+		XGlyphInfo gi;
+		if (run->dimension == 2) {
+		  XftTextExtents16 (dpy,
+				    FONT_INSTANCE_X_XFTFONT(fi),
+				    (XftChar16 *) run->ptr, run->len, &gi);
+		} else {
+		  XftTextExtents8 (dpy,
+				   FONT_INSTANCE_X_XFTFONT(fi),
+				   run->ptr, run->len, &gi);
+		}
+		rect_height = rect_height > gi.height
+			      ? rect_height : gi.height;
+#endif
+
+		XftDrawRect (xftDraw, &bg,
+			     xpos, ypos, rect_width, rect_height);
+	      }
+	
+	    if (runs[i].dimension == 1)
+	      XftDrawString8 (xftDraw, &fg, rf, xpos, dl->ypos,
+			      runs[i].ptr, runs[i].len);
+	    else
+	      XftDrawString16 (xftDraw, &fg, rf, xpos, dl->ypos,
+			       (XftChar16 *) runs[i].ptr, runs[i].len);
+	  }
+      }
+#endif /* USE_XFT */
+
+#ifdef THIS_IS_X
+      if (use_x_font)
+#endif
+	{
+	  if (need_clipping)
+	    {
+	      XLIKE_RECTANGLE clip_box;
+
+	      clip_box.x = 0;
+	      clip_box.y = 0;
+	      clip_box.width = clip_end - clip_start;
+	      clip_box.height = height;
+
+	      XLIKE_SET_CLIP_RECTANGLE (dpy, gc, clip_start, ypos, &clip_box);
+	    }
+
+#ifdef THIS_IS_X
+	  if (runs[i].dimension == 1)
+	    (bgc ? XDrawString : XDrawImageString)
+	      (dpy, x_win, gc, xpos, dl->ypos,
+	       (char *) runs[i].ptr, runs[i].len);
+	  else
+	    (bgc ? XDrawString16 : XDrawImageString16)
+	      (dpy, x_win, gc, xpos, dl->ypos,
+	       (XChar2b *) runs[i].ptr, runs[i].len);
+#else /* THIS_IS_GTK */
+
+      /* The X specific called different functions (XDraw*String
+         vs. XDraw*String16), but apparently gdk_draw_text takes care
+         of that for us.
+
+	 BUT, gdk_draw_text also does too much, by dividing the length
+	 by 2.  So we fake them out my multiplying the length by the
+	 dimension of the text.  This will do the right thing for
+	 single-dimension runs as well of course.
+      */
+      (bgc ? gdk_draw_text : gdk_draw_text_image)
+	(GDK_DRAWABLE (x_win), FONT_INSTANCE_GTK_FONT (fi), gc, xpos,
+	 dl->ypos, (char *) runs[i].ptr, runs[i].len * runs[i].dimension);
+#endif /* (not) THIS_IS_X */
+	}
+
+      /* We draw underlines in the same color as the text. */
+      if (cachel->underline)
+	{
+	  int upos, uthick;
+#ifdef THIS_IS_X
+	  unsigned long upos_ext, uthick_ext;
+	  XFontStruct *fs =
+	    use_x_font ? FONT_INSTANCE_X_FONT (XFONT_INSTANCE (font)) : 0;
+	  /* #### the logic of the next two may be suboptimal: we may want
+	     to use the POSITION and/or THICKNESS information with Xft */
+	  if (fs && XGetFontProperty (fs, XA_UNDERLINE_POSITION, &upos_ext))
+	    upos = (int) upos_ext;
+	  else
+#else /* THIS_IS_GTK */
+	  /* Cannot get at font properties in Gtk, so we resort to
+             guessing */
+#endif /* THIS_IS_GTK */
+	    upos = dl->descent / 2;
+#ifdef THIS_IS_X
+	  if (fs && XGetFontProperty (fs, XA_UNDERLINE_THICKNESS, &uthick_ext))
+	    uthick = (int) uthick_ext;
+	  else
+#endif /* THIS_IS_X */
+	    uthick = 1;
+	  if (dl->ypos + upos < dl->ypos + dl->descent - dl->clip)
+	    {
+	      if (dl->ypos + upos + uthick > dl->ypos + dl->descent - dl->clip)
+		uthick = dl->descent - dl->clip - upos;
+
+	      if (uthick == 1)
+		{
+		  XLIKE_DRAW_LINE (dpy, x_win, gc, xpos, dl->ypos + upos,
+				   xpos + this_width, dl->ypos + upos);
+		}
+	      else if (uthick > 1)
+		{
+		  XLIKE_FILL_RECTANGLE (dpy, x_win, gc, xpos,
+					dl->ypos + upos, this_width, uthick);
+		}
+	    }
+	}
+
+      if (cachel->strikethru)
+	{
+#ifdef THIS_IS_X
+	  int ascent, descent, upos, uthick;
+	  unsigned long ascent_ext, descent_ext, uthick_ext;
+	  XFontStruct *fs = FONT_INSTANCE_X_FONT (fi);
+#else /* THIS_IS_GTK */
+	  gint ascent, descent, upos, uthick;
+	  GdkFont *gfont = FONT_INSTANCE_GTK_FONT (fi);
+#endif /* THIS_IS_GTK */
+	  
+#ifdef THIS_IS_X
+	  if (!use_x_font)
+	    {
+	      ascent = dl->ascent;
+	      descent = dl->descent;
+	      uthick = 1;
+	    }
+	  else
+	    {
+	      if (!XGetFontProperty (fs, XA_STRIKEOUT_ASCENT, &ascent_ext))
+		ascent = fs->ascent;
+	      else
+		ascent = (int) ascent_ext;
+	      if (!XGetFontProperty (fs, XA_STRIKEOUT_DESCENT, &descent_ext))
+		descent = fs->descent;
+	      else
+		descent = (int) descent_ext;
+	      if (!XGetFontProperty (fs, XA_UNDERLINE_THICKNESS, &uthick_ext))
+		uthick = 1;
+	      else
+		uthick = (int) uthick_ext;
+	    }
+#else /* THIS_IS_GTK */
+	/* Cannot get at font properties in Gtk, so we resort to
+           guessing */
+
+	  ascent = gfont->ascent;
+	  descent = gfont->descent;
+	  uthick = 1;
+#endif /* THIS_IS_GTK */
+
+	  upos = ascent - ((ascent + descent) / 2) + 1;
+
+	  /* Generally, upos will be positive (above the baseline),so
+             subtract */
+	  if (dl->ypos - upos < dl->ypos + dl->descent - dl->clip)
+	    {
+	      if (dl->ypos - upos + uthick > dl->ypos + dl->descent - dl->clip)
+		uthick = dl->descent - dl->clip + upos;
+
+	      if (uthick == 1)
+		XLIKE_DRAW_LINE (dpy, x_win, gc, xpos, dl->ypos - upos,
+				 xpos + this_width, dl->ypos - upos);
+	      else if (uthick > 1)
+		XLIKE_FILL_RECTANGLE (dpy, x_win, gc, xpos, dl->ypos + upos,
+				      this_width, uthick);
+	    }
+	}
+
+      /* Restore the GC */
+      if (need_clipping)
+	{
+#ifdef USE_XFT
+	  if (!use_x_font)
+	    {
+	      XftDrawSetClip (xftDraw, 0);
+	    }
+	  else
+#endif
+	    XLIKE_CLEAR_CLIP_MASK (dpy, gc);
+	}
+
+      /* If we are actually superimposing the cursor then redraw with just
+	 the appropriate section highlighted. */
+      if (cursor_clip && !cursor && focus && cursor_cachel)
+	{
+#ifdef USE_XFT
+	  if (!use_x_font)	/* Xft */
+	    {
+	      XftFont *rf = FONT_INSTANCE_X_XFTFONT (fi);
+	  
+	      { /* set up clipping */
+		Region clip_reg = XCreateRegion();
+		XRectangle clip_box = { cursor_start, ypos,
+					cursor_width, height };
+	    
+		XUnionRectWithRegion (&clip_box, clip_reg, clip_reg); 
+		XftDrawSetClip(xftDraw, clip_reg);
+		XDestroyRegion(clip_reg);
+	      }
+	      { /* draw background rectangle & draw text */
+		int rect_height = FONT_INSTANCE_ASCENT(fi)
+				  + FONT_INSTANCE_DESCENT(fi);
+		int rect_width = x_text_width_single_run(f, cachel, &runs[i]);
+		XftColor xft_color;
+
+		xft_color = XFT_FROB_LISP_COLOR (cursor_cachel->background, 0);
+		XftDrawRect (xftDraw, &xft_color,
+			     xpos, ypos, rect_width, rect_height);
+
+		xft_color = XFT_FROB_LISP_COLOR (cursor_cachel->foreground, 0);
+		if (runs[i].dimension == 1)
+		  XftDrawString8 (xftDraw, &xft_color, rf, xpos, dl->ypos,
+				  runs[i].ptr, runs[i].len);
+		else
+		  XftDrawString16 (xftDraw, &xft_color, rf, xpos, dl->ypos,
+				   (XftChar16 *) runs[i].ptr, runs[i].len);
+	      }
+
+	      XftDrawSetClip(xftDraw, 0);
+	    }
+	  else			/* core font, not Xft */
+#endif /* USE_XFT */
+	    {
+	      XLIKE_RECTANGLE clip_box;
+	      XLIKE_GC cgc;
+	      cgc = XLIKE_get_gc (d, font, cursor_cachel->foreground,
+				  cursor_cachel->background, Qnil, Qnil);
+
+	      clip_box.x = 0;
+	      clip_box.y = 0;
+	      clip_box.width = cursor_width;
+	      clip_box.height = height;
+
+	      XLIKE_SET_CLIP_RECTANGLE (dpy, cgc, cursor_start, ypos,
+					&clip_box);
+#ifdef THIS_IS_X
+	      if (runs[i].dimension == 1)
+		XDrawImageString (dpy, x_win, cgc, xpos, dl->ypos,
+				  (char *) runs[i].ptr, runs[i].len);
+	      else
+		XDrawImageString16 (dpy, x_win, cgc, xpos, dl->ypos,
+				    (XChar2b *) runs[i].ptr, runs[i].len);
+#else
+	      /* The X specific called different functions (XDraw*String
+		 vs. XDraw*String16), but apparently gdk_draw_text takes care
+		 of that for us.
+
+		 BUT, gdk_draw_text also does too much, by dividing the
+		 length by 2.  So we fake them out my multiplying the
+		 length by the dimension of the text.  This will do the
+		 right thing for single-dimension runs as well of course.
+	      */
+	      gdk_draw_text_image (GDK_DRAWABLE (x_win),
+				   FONT_INSTANCE_GTK_FONT (fi), cgc, xpos,
+				   dl->ypos, (char *) runs[i].ptr,
+				   runs[i].len * runs[i].dimension);
+#endif /* (not) THIS_IS_X */
+
+	      XLIKE_CLEAR_CLIP_MASK (dpy, cgc);
+	    }
+	}
+
+      xpos += this_width;
+    }
+
+  /* Draw the non-focus box or bar-cursor as needed. */
+  /* Can't this logic be simplified? */
+  if (cursor_cachel
+      && ((cursor && !focus && NILP (bar_cursor_value))
+	  || (cursor_width
+	      && (cursor_start + cursor_width >= clip_start)
+	      && !NILP (bar_cursor_value))))
+    {
+      int tmp_height, tmp_y;
+      int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2;
+      int need_clipping = (cursor_start < clip_start
+			   || clip_end < cursor_start + cursor_width);
+
+      /* #### This value is correct (as far as I know) because
+	 all of the times we need to draw this cursor, we will
+	 be called with exactly one character, so we know we
+	 can always use runs[0].
+
+	 This is bogus as all hell, however.  The cursor handling in
+	 this function is way bogus and desperately needs to be
+	 cleaned up.  (In particular, the drawing of the cursor should
+	 really really be separated out of this function.  This may be
+	 a bit tricky now because this function itself does way too
+	 much stuff, a lot of which needs to be moved into
+	 redisplay.c.)  This is the only way to be able to easily add
+	 new cursor types or (e.g.) make the bar cursor be able to
+	 span two characters instead of overlaying just one. */
+      int bogusly_obtained_ascent_value =
+	XFONT_INSTANCE (FACE_CACHEL_FONT (cachel, runs[0].charset))->ascent;
+
+      if (!NILP (bar_cursor_value))
+	{
+	  gc = XLIKE_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil,
+			     make_int (bar_width));
+	}
+      else
+	{
+	  gc = XLIKE_get_gc (d, Qnil, cursor_cachel->background,
+			     Qnil, Qnil, Qnil);
+	}
+
+      tmp_y = dl->ypos - bogusly_obtained_ascent_value;
+      tmp_height = cursor_height;
+      if (tmp_y + tmp_height > (int) (ypos + height))
+	{
+	  tmp_y = ypos + height - tmp_height;
+	  if (tmp_y < (int) ypos)
+	    tmp_y = ypos;
+	  tmp_height = ypos + height - tmp_y;
+	}
+
+      if (need_clipping)
+	{
+	  XLIKE_RECTANGLE clip_box;
+	  clip_box.x = 0;
+	  clip_box.y = 0;
+	  clip_box.width = clip_end - clip_start;
+	  clip_box.height = tmp_height;
+	  XLIKE_SET_CLIP_RECTANGLE (dpy, gc, clip_start, tmp_y, &clip_box);
+	}
+
+      if (!focus && NILP (bar_cursor_value))
+	{
+	  XLIKE_DRAW_RECTANGLE (dpy, x_win, gc, cursor_start, tmp_y,
+				cursor_width - 1, tmp_height - 1);
+	}
+      else if (focus && !NILP (bar_cursor_value))
+	{
+	  XLIKE_DRAW_LINE (dpy, x_win, gc, cursor_start + bar_width - 1, tmp_y,
+			   cursor_start + bar_width - 1,
+			   tmp_y + tmp_height - 1);
+	}
+
+      /* Restore the GC */
+      if (need_clipping)
+	{
+	  XLIKE_CLEAR_CLIP_MASK (dpy, gc);
+	}
+    }
+
+#ifdef USE_XFT
+#undef XFT_FROB_LISP_COLOR
+#endif
+}
+
+#ifdef THIS_IS_GTK
+static void
+our_draw_bitmap (GdkDrawable *drawable,
+		 GdkGC       *gc,
+		 GdkPixmap   *src,
+		 gint         xsrc,
+		 gint         ysrc,
+		 gint         xdest,
+		 gint         ydest,
+		 gint         width,
+		 gint         height);
+#endif /* THIS_IS_GTK */
+
+
+void
+XLIKE_OUTPUT_XLIKE_PIXMAP (struct frame *f, Lisp_Image_Instance *p, int x,
+			   int y, int xoffset, int yoffset,
+			   int width, int height,
+			   XLIKE_PIXCOLOR fg, XLIKE_PIXCOLOR bg,
+			   XLIKE_GC override_gc)
+{
+  struct device *d = XDEVICE (f->device);
+  XLIKE_DISPLAY dpy = GET_XLIKE_DISPLAY (d);
+  XLIKE_WINDOW x_win = GET_XLIKE_WINDOW (f);
+  XLIKE_GC gc;
+  XLIKE_GCVALUES gcv;
+  unsigned long pixmap_mask;
+
+  if (!override_gc)
+    {
+      memset (&gcv, ~0, sizeof (gcv));
+      gcv.graphics_exposures = XLIKE_FALSE;
+      XLIKE_SET_PIXCOLOR_COPY (gcv.foreground, fg);
+      XLIKE_SET_PIXCOLOR_COPY (gcv.background, bg);
+      pixmap_mask = XLIKE_GC_FOREGROUND | XLIKE_GC_BACKGROUND | XLIKE_GC_EXPOSURES;
+
+      if (IMAGE_INSTANCE_XLIKE_MASK (p))
+	{
+	  gcv.function = XLIKE_GX_COPY;
+	  gcv.clip_mask = IMAGE_INSTANCE_XLIKE_MASK (p);
+	  gcv.clip_x_origin = x - xoffset;
+	  gcv.clip_y_origin = y - yoffset;
+	  pixmap_mask |= (XLIKE_GC_FUNCTION | XLIKE_GC_CLIP_MASK |
+			  XLIKE_GC_CLIP_X_ORIGIN |
+			  XLIKE_GC_CLIP_Y_ORIGIN);
+	  /* Can't set a clip rectangle below because we already have a mask.
+	     We could conceivably create a new clipmask by zeroing out
+	     everything outside the clip region.  Is it worth it?
+	     Is it possible to get an equivalent effect by changing the
+	     args to XCopyArea below rather than messing with a clip box?
+	     - dkindred@cs.cmu.edu
+	     Yes. We don't clip at all now - andy@xemacs.org
+	  */
+	}
+
+      gc = gc_cache_lookup (DEVICE_XLIKE_GC_CACHE (d), &gcv, pixmap_mask);
+    }
+  else
+    {
+      gc = override_gc;
+      /* override_gc might have a mask already--we don't want to nuke it.
+	 Maybe we can insist that override_gc have no mask, or use
+	 one of the suggestions above. */
+    }
+
+#ifdef THIS_IS_X
+  /* depth of 0 means it's a bitmap, not a pixmap, and we should use
+     XCopyPlane (1 = current foreground color, 0 = background) instead
+     of XCopyArea, which means that the bits in the pixmap are actual
+     pixel values, instead of symbolic of fg/bg. */
+#endif /* THIS_IS_X */
+  if (IMAGE_INSTANCE_PIXMAP_DEPTH (p) > 0)
+    {
+#ifdef THIS_IS_X
+      XCopyArea (dpy,
+		 IMAGE_INSTANCE_X_PIXMAP_SLICE
+		 (p, IMAGE_INSTANCE_PIXMAP_SLICE (p)), x_win, gc, xoffset,
+		 yoffset, width,
+		 height, x, y);
+#else /* THIS_IS_GTK */
+      gdk_draw_pixmap (GDK_DRAWABLE (x_win), gc,
+		       IMAGE_INSTANCE_GTK_PIXMAP (p),
+		       xoffset, yoffset, x, y, width, height);
+#endif /* THIS_IS_GTK */
+    }
+  else
+    {
+#ifdef THIS_IS_X
+      XCopyPlane (dpy, IMAGE_INSTANCE_X_PIXMAP_SLICE
+		  (p, IMAGE_INSTANCE_PIXMAP_SLICE (p)), x_win, gc,
+		  xoffset, yoffset, width, height, x, y, 1L);
+#else /* THIS_IS_GTK */
+      our_draw_bitmap (GDK_DRAWABLE (x_win), gc,
+		       IMAGE_INSTANCE_GTK_PIXMAP (p),
+		       xoffset, yoffset, x, y, width, height);
+#endif /* THIS_IS_GTK */
+    }
+}
+
+static void
+XLIKE_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 UNUSED (bg_pixmap))
+{
+  struct frame *f = XFRAME (w->frame);
+  struct device *d = XDEVICE (f->device);
+  Lisp_Image_Instance *p = XIMAGE_INSTANCE (image_instance);
+  XLIKE_DISPLAY dpy = GET_XLIKE_DISPLAY (d);
+  XLIKE_WINDOW x_win = GET_XLIKE_WINDOW (f);
+
+  /* Output the pixmap. */
+  {
+    Lisp_Object tmp_pixel;
+    XLIKE_COLOR tmp_bcolor, tmp_fcolor;
+
+    tmp_pixel = WINDOW_FACE_CACHEL_FOREGROUND (w, findex);
+    tmp_fcolor = XCOLOR_INSTANCE_XLIKE_COLOR (tmp_pixel);
+    tmp_pixel = WINDOW_FACE_CACHEL_BACKGROUND (w, findex);
+    tmp_bcolor = XCOLOR_INSTANCE_XLIKE_COLOR (tmp_pixel);
+
+    XLIKE_OUTPUT_XLIKE_PIXMAP (f, p, db->xpos, db->ypos,
+			       dga->xoffset, dga->yoffset,
+			       dga->width, dga->height,
+			       XLIKE_COLOR_TO_PIXCOLOR (tmp_fcolor),
+			       XLIKE_COLOR_TO_PIXCOLOR (tmp_bcolor), 0);
+  }
+
+  /* Draw a cursor over top of the pixmap. */
+  if (cursor_width && cursor_height && (cursor_start >= db->xpos)
+      && !NILP (w->text_cursor_visible_p)
+      && (cursor_start < db->xpos + dga->width))
+    {
+      XLIKE_GC gc;
+      int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
+      struct face_cachel *cursor_cachel =
+	WINDOW_FACE_CACHEL (w,
+			    get_builtin_face_cache_index
+			    (w, Vtext_cursor_face));
+
+      gc = XLIKE_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil, Qnil);
+
+      if (cursor_width > db->xpos + dga->width - cursor_start)
+	cursor_width = db->xpos + dga->width - cursor_start;
+
+      if (focus)
+	  XLIKE_FILL_RECTANGLE (dpy, x_win, gc, cursor_start, db->ypos,
+				cursor_width, cursor_height);
+      else
+	{
+	  XLIKE_DRAW_RECTANGLE (dpy, x_win, gc, cursor_start, db->ypos,
+				cursor_width, cursor_height);
+	}
+    }
+}
+
+/*****************************************************************************
+ XLIKE_output_vertical_divider
+
+ Draw a vertical divider down the right side of the given window.
+ ****************************************************************************/
+static void
+XLIKE_output_vertical_divider (struct window *w, int USED_IF_X(clear))
+{
+  struct frame *f = XFRAME (w->frame);
+  struct device *d = XDEVICE (f->device);
+
+  XLIKE_DISPLAY dpy = GET_XLIKE_DISPLAY (d);
+  XLIKE_WINDOW x_win = GET_XLIKE_WINDOW (f);
+  Lisp_Object tmp_pixel;
+  XLIKE_GCVALUES gcv;
+  XLIKE_GC background_gc;
+#ifdef THIS_IS_X
+  enum edge_style style;
+#endif /* THIS_IS_X */
+  unsigned long mask;
+  int x, y1, y2, width, shadow_thickness, spacing, line_width;
+  face_index div_face =
+    get_builtin_face_cache_index (w, Vvertical_divider_face);
+
+  width = window_divider_width (w);
+  shadow_thickness = XINT (w->vertical_divider_shadow_thickness);
+  spacing = XINT (w->vertical_divider_spacing);
+  line_width = XINT (w->vertical_divider_line_width);
+  x = WINDOW_RIGHT (w) - width;
+  y1 = WINDOW_TOP (w);
+  y2 = WINDOW_BOTTOM (w);
+
+  memset (&gcv, ~0, sizeof (gcv));
+
+  tmp_pixel = WINDOW_FACE_CACHEL_BACKGROUND (w, div_face);
+
+  /* First, get the GC's. */
+  XLIKE_SET_PIXCOLOR_COPY
+    (gcv.background,
+     XLIKE_COLOR_TO_PIXCOLOR (XCOLOR_INSTANCE_XLIKE_COLOR (tmp_pixel)));
+  gcv.foreground = gcv.background;
+  gcv.graphics_exposures = XLIKE_FALSE;
+  mask = XLIKE_GC_FOREGROUND | XLIKE_GC_BACKGROUND | XLIKE_GC_EXPOSURES;
+
+  background_gc = gc_cache_lookup (DEVICE_XLIKE_GC_CACHE (d), &gcv, mask);
+
+  /* Clear the divider area first.  This needs to be done when a
+     window split occurs. */
+#ifdef THIS_IS_X
+  if (clear)
+    XClearArea (dpy, x_win, x, y1, width, y2 - y1, False);
+#else /* THIS_IS_GTK */
+  /* if (clear) */
+  gdk_draw_rectangle (GDK_DRAWABLE (x_win), background_gc, TRUE,
+		      x, y1, width, y2 - y1);
+#endif /* THIS_IS_GTK */
+
+#ifndef THIS_IS_GTK
+   /* #### FIXME Why not? Formerly '#if 0' in the GDK code */
+  /* Draw the divider line. */
+  XLIKE_FILL_RECTANGLE (dpy, x_win, background_gc,
+			x + spacing + shadow_thickness, y1,
+			line_width, y2 - y1);
+
+  /* This code not formerly present in GTK version, maybe the omittal
+     is intentional? */
+  if (shadow_thickness < 0)
+    {
+      shadow_thickness = -shadow_thickness;
+      style = EDGE_BEVEL_IN;
+    }
+  else
+    {
+      style = EDGE_BEVEL_OUT;
+    }
+#endif /* not THIS_IS_GTK */
+
+  /* Draw the shadows around the divider line */
+#ifdef THIS_IS_X
+  x_bevel_area (w, div_face, x + spacing, y1,
+		width - 2 * spacing, y2 - y1,
+		shadow_thickness, EDGE_ALL, style);
+#else /* THIS_IS_GTK */
+  gtk_output_shadows (f, x + spacing, y1, 
+		      width - 2 * spacing, y2 - y1,
+		      shadow_thickness);
+#endif /* THIS_IS_GTK */
+}
+
+/*****************************************************************************
+ XLIKE_output_blank
+
+ Output a blank by clearing the area it covers in the foreground color
+ of its face.
+ ****************************************************************************/
+static void
+XLIKE_output_blank (struct window *w, struct display_line *dl, struct rune *rb,
+		    int start_pixpos, int cursor_start, int cursor_width)
+{
+  struct frame *f = XFRAME (w->frame);
+  struct device *d = XDEVICE (f->device);
+
+  XLIKE_DISPLAY dpy = GET_XLIKE_DISPLAY (d);
+  XLIKE_WINDOW x_win = GET_XLIKE_WINDOW (f);
+  XLIKE_GC gc;
+  struct face_cachel *cursor_cachel =
+    WINDOW_FACE_CACHEL (w,
+			get_builtin_face_cache_index
+			(w, Vtext_cursor_face));
+  Lisp_Object bg_pmap;
+  Lisp_Object buffer = WINDOW_BUFFER (w);
+  Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
+							 buffer);
+
+  int x = rb->xpos;
+  int y = XLIKE_DISPLAY_LINE_YPOS (dl);
+  int height = XLIKE_DISPLAY_LINE_HEIGHT (dl);
+  int width = rb->width;
+
+  /* Unmap all subwindows in the area we are going to blank. */
+  redisplay_unmap_subwindows_maybe (f, x, y, width, height);
+
+  if (start_pixpos > x)
+    {
+      if (start_pixpos >= (x + width))
+	return;
+      else
+	{
+	  width -= (start_pixpos - x);
+	  x = start_pixpos;
+	}
+    }
+
+  bg_pmap = WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP (w, rb->findex);
+  if (!IMAGE_INSTANCEP (bg_pmap)
+      || !IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
+    bg_pmap = Qnil;
+
+  if (NILP (bg_pmap))
+    gc = XLIKE_get_gc (d, Qnil, WINDOW_FACE_CACHEL_BACKGROUND (w, rb->findex),
+		       Qnil, Qnil, Qnil);
+  else
+    gc = XLIKE_get_gc (d, Qnil, WINDOW_FACE_CACHEL_FOREGROUND (w, rb->findex),
+		       WINDOW_FACE_CACHEL_BACKGROUND (w, rb->findex), bg_pmap,
+		       Qnil);
+
+  XLIKE_FILL_RECTANGLE (dpy, x_win, gc, x, y, width, height);
+
+  /* If this rune is marked as having the cursor, then it is actually
+     representing a tab. */
+  if (!NILP (w->text_cursor_visible_p)
+      && (rb->cursor_type == CURSOR_ON
+	  || (cursor_width
+	      && (cursor_start + cursor_width > x)
+	      && cursor_start < (x + width))))
+    {
+      int cursor_height, cursor_y;
+      int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
+      Lisp_Font_Instance *fi;
+
+      fi = XFONT_INSTANCE (FACE_CACHEL_FONT
+			   (WINDOW_FACE_CACHEL (w, rb->findex),
+			    Vcharset_ascii));
+
+      gc = XLIKE_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil, Qnil);
+
+      cursor_y = dl->ypos - fi->ascent;
+      cursor_height = fi->height;
+      if (cursor_y + cursor_height > y + height)
+	cursor_height = y + height - cursor_y;
+
+      if (focus)
+	{
+	  if (NILP (bar_cursor_value))
+	    {
+	      XLIKE_FILL_RECTANGLE (dpy, x_win, gc, cursor_start, cursor_y,
+				    fi->width, cursor_height);
+	    }
+	  else
+	    {
+	      int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2;
+
+	      gc = XLIKE_get_gc (d, Qnil, cursor_cachel->background,
+				 Qnil, Qnil, make_int (bar_width));
+	      XLIKE_DRAW_LINE (dpy, x_win, gc, cursor_start + bar_width - 1,
+			       cursor_y, cursor_start + bar_width - 1,
+			       cursor_y + cursor_height - 1);
+	    }
+	}
+      else if (NILP (bar_cursor_value))
+	{
+	  XLIKE_DRAW_RECTANGLE (dpy, x_win, gc, cursor_start, cursor_y,
+				fi->width - 1, cursor_height - 1);
+	}
+    }
+}
+
+/*****************************************************************************
+ XLIKE_output_horizontal_line
+
+ Output a horizontal line in the foreground of its face.
+ ****************************************************************************/
+static void
+XLIKE_output_horizontal_line (struct window *w, struct display_line *dl,
+			      struct rune *rb)
+{
+  struct frame *f = XFRAME (w->frame);
+  struct device *d = XDEVICE (f->device);
+
+  XLIKE_DISPLAY dpy = GET_XLIKE_DISPLAY (d);
+  XLIKE_WINDOW x_win = GET_XLIKE_WINDOW (f);
+  XLIKE_GC gc;
+
+  int x = rb->xpos;
+  int width = rb->width;
+  int height = XLIKE_DISPLAY_LINE_HEIGHT (dl);
+  int ypos1, ypos2, ypos3, ypos4;
+
+  ypos1 = XLIKE_DISPLAY_LINE_YPOS (dl);
+  ypos2 = ypos1 + rb->object.hline.yoffset;
+  ypos3 = ypos2 + rb->object.hline.thickness;
+  ypos4 = dl->ypos + dl->descent - dl->clip;
+
+  /* First clear the area not covered by the line. */
+  if (height - rb->object.hline.thickness > 0)
+    {
+      gc = XLIKE_get_gc (d, Qnil,
+			 WINDOW_FACE_CACHEL_FOREGROUND (w, rb->findex),
+			 Qnil, Qnil, Qnil);
+
+      if (ypos2 - ypos1 > 0)
+	XLIKE_FILL_RECTANGLE (dpy, x_win, gc, x, ypos1, width, ypos2 - ypos1);
+      if (ypos4 - ypos3 > 0)
+	XLIKE_FILL_RECTANGLE (dpy, x_win, gc, x, ypos1, width, ypos2 - ypos1);
+    }
+
+#ifdef THIS_IS_GTK
+  {
+    GtkStyle *style = FRAME_GTK_TEXT_WIDGET (f)->style;
+    gtk_paint_hline (style, x_win, GTK_STATE_NORMAL, NULL,
+		     FRAME_GTK_TEXT_WIDGET (f), "hline", x, x + width, ypos2);
+  }
+#else /* THIS_IS_X */
+  /* Now draw the line. */
+  gc = XLIKE_get_gc (d, Qnil, WINDOW_FACE_CACHEL_BACKGROUND (w, rb->findex),
+		     Qnil, Qnil, Qnil);
+
+  if (ypos2 < ypos1)
+    ypos2 = ypos1;
+  if (ypos3 > ypos4)
+    ypos3 = ypos4;
+
+  if (ypos3 - ypos2 > 0)
+    XLIKE_FILL_RECTANGLE (dpy, x_win, gc, x, ypos2, width, ypos3 - ypos2);
+#endif /* THIS_IS_X */
+}
+
+/****************************************************************************
+ XLIKE_clear_region
+
+ Clear the area in the box defined by the given parameters using the
+ given face.
+ ****************************************************************************/
+static void
+XLIKE_clear_region (Lisp_Object UNUSED (locale), struct device* d,
+		    struct frame* f, face_index UNUSED (findex), int x, int y,
+		    int width, int height, Lisp_Object fcolor,
+		    Lisp_Object bcolor, Lisp_Object background_pixmap)
+{
+  XLIKE_DISPLAY dpy = GET_XLIKE_DISPLAY (d);
+  XLIKE_WINDOW x_win = GET_XLIKE_WINDOW (f);
+  XLIKE_GC gc = NULL;
+
+  if (!UNBOUNDP (background_pixmap))
+    {
+      gc = XLIKE_get_gc (d, Qnil, fcolor, bcolor, background_pixmap, Qnil);
+    }
+
+  if (gc)
+    XLIKE_FILL_RECTANGLE (dpy, x_win, gc, x, y, width, height);
+  else
+    XLIKE_CLEAR_AREA (dpy, x_win, x, y, width, height);
+}
+
+/*****************************************************************************
+ xlike_output_eol_cursor
+
+ Draw a cursor at the end of a line.  The end-of-line cursor is
+ narrower than the normal cursor.
+ ****************************************************************************/
+static void
+XLIKE_output_eol_cursor (struct window *w, struct display_line *dl, int xpos,
+			 face_index findex)
+{
+  struct frame *f = XFRAME (w->frame);
+  struct device *d = XDEVICE (f->device);
+  Lisp_Object window;
+
+  XLIKE_DISPLAY dpy = GET_XLIKE_DISPLAY (d);
+  XLIKE_WINDOW x_win = GET_XLIKE_WINDOW (f);
+  XLIKE_GC gc = NULL;
+  face_index elt = get_builtin_face_cache_index (w, Vtext_cursor_face);
+  struct face_cachel *cursor_cachel = WINDOW_FACE_CACHEL (w, elt);
+
+  int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
+  Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
+							 WINDOW_BUFFER (w));
+
+  int x = xpos;
+  int y = XLIKE_DISPLAY_LINE_YPOS (dl);
+  int width = EOL_CURSOR_WIDTH;
+  int height = XLIKE_DISPLAY_LINE_HEIGHT (dl);
+  int cursor_height, cursor_y;
+  int defheight, defascent;
+
+  window = wrap_window (w);
+  redisplay_clear_region (window, findex, x, y, width, height);
+
+  if (NILP (w->text_cursor_visible_p))
+    return;
+
+  gc = XLIKE_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil, Qnil);
+
+  default_face_font_info (window, &defascent, 0, &defheight, 0, 0);
+
+  /* make sure the cursor is entirely contained between y and y+height */
+  cursor_height = min (defheight, height);
+  cursor_y = max (y, min (y + height - cursor_height,
+			  dl->ypos - defascent));
+
+  if (focus)
+    {
+#ifdef HAVE_XIM
+      XIM_SetSpotLocation (f, x - 2 , cursor_y + cursor_height - 2);
+#endif /* HAVE_XIM */
+
+      if (NILP (bar_cursor_value))
+	{
+	  XLIKE_FILL_RECTANGLE (dpy, x_win, gc, x, cursor_y, width,
+				cursor_height);
+	}
+      else
+	{
+	  int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2;
+
+	  gc = XLIKE_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil,
+			     make_int (bar_width));
+	  XLIKE_DRAW_LINE (dpy, x_win, gc, x + bar_width - 1, cursor_y,
+			   x + bar_width - 1, cursor_y + cursor_height - 1);
+	}
+    }
+  else if (NILP (bar_cursor_value))
+    {
+      XLIKE_DRAW_RECTANGLE (dpy, x_win, gc, x, cursor_y, width - 1,
+			    cursor_height - 1);
+    }
+}
+
+static void
+XLIKE_clear_frame_window (Lisp_Object window)
+{
+  struct window *w = XWINDOW (window);
+
+  if (!NILP (w->vchild))
+    {
+      XLIKE_clear_frame_windows (w->vchild);
+      return;
+    }
+
+  if (!NILP (w->hchild))
+    {
+      XLIKE_clear_frame_windows (w->hchild);
+      return;
+    }
+
+  redisplay_clear_to_window_end (w, WINDOW_TEXT_TOP (w),
+				 WINDOW_TEXT_BOTTOM (w));
+}
+
+static void
+XLIKE_clear_frame_windows (Lisp_Object window)
+{
+  for (; !NILP (window); window = XWINDOW (window)->next)
+    XLIKE_clear_frame_window (window);
+}
+
+static void
+XLIKE_clear_frame (struct frame *f)
+{
+  XLIKE_DISPLAY dpy = GET_XLIKE_DISPLAY (XDEVICE (f->device));
+  XLIKE_WINDOW x_win = GET_XLIKE_WINDOW (f);
+  int x, y, width, height;
+  Lisp_Object frame;
+
+  x = FRAME_LEFT_BORDER_START (f);
+  width = (FRAME_PIXWIDTH (f) - FRAME_REAL_LEFT_TOOLBAR_WIDTH (f) -
+	   FRAME_REAL_RIGHT_TOOLBAR_WIDTH (f) -
+	   2 * FRAME_REAL_LEFT_TOOLBAR_BORDER_WIDTH (f) -
+	   2 * FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH (f));
+  /* #### This adjustment by 1 should be being done in the macros.
+     There is some small differences between when the menubar is on
+     and off that we still need to deal with. */
+  y = FRAME_TOP_BORDER_START (f) - 1;
+  height = (FRAME_PIXHEIGHT (f) - FRAME_REAL_TOP_TOOLBAR_HEIGHT (f) -
+	    FRAME_REAL_BOTTOM_TOOLBAR_HEIGHT (f) -
+	    2 * FRAME_REAL_TOP_TOOLBAR_BORDER_WIDTH (f) -
+	    2 * FRAME_REAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f)) + 1;
+
+  XLIKE_CLEAR_AREA (dpy, x_win, x, y, width, height);
+
+  frame = wrap_frame (f);
+
+  if (!UNBOUNDP (FACE_BACKGROUND_PIXMAP (Vdefault_face, frame))
+      || !UNBOUNDP (FACE_BACKGROUND_PIXMAP (Vleft_margin_face, frame))
+      || !UNBOUNDP (FACE_BACKGROUND_PIXMAP (Vright_margin_face, frame)))
+    {
+      XLIKE_clear_frame_windows (f->root_window);
+    }
+#ifdef THIS_IS_X
+  {
+    struct device *d = XDEVICE (f->device);
+    if (!(check_if_pending_expose_event (d)))
+      XFlush (DEVICE_X_DISPLAY (d));
+  }
+#endif /* THIS_IS_X */
+}
+
+/* briefly swap the foreground and background colors.
+ */
+
+static int
+XLIKE_flash (struct device *d)
+{
+  struct frame *f = device_selected_frame (d);
+  XLIKE_DISPLAY dpy = GET_XLIKE_DISPLAY (d);
+  XLIKE_WINDOW win = GET_XLIKE_WINDOW (f);
+  XLIKE_GC gc = NULL;
+  XLIKE_GCVALUES gcv;
+  XLIKE_COLOR tmp_fcolor, tmp_bcolor;
+  Lisp_Object tmp_pixel, frame;
+  struct window *w = XWINDOW (FRAME_ROOT_WINDOW (f));
+  int flash_height;
+
+  frame = wrap_frame (f);
+
+  tmp_pixel = FACE_FOREGROUND (Vdefault_face, frame);
+  XLIKE_SET_PIXCOLOR_COPY (tmp_fcolor,
+			   XCOLOR_INSTANCE_XLIKE_COLOR (tmp_pixel));
+  tmp_pixel = FACE_BACKGROUND (Vdefault_face, frame);
+  XLIKE_SET_PIXCOLOR_COPY (tmp_bcolor,
+			   XCOLOR_INSTANCE_XLIKE_COLOR (tmp_pixel));
+  memset (&gcv, ~0, sizeof (gcv)); /* initialize all slots to ~0 */
+  XLIKE_SET_PIXCOLOR_NUM (gcv.foreground,
+			  (tmp_fcolor.pixel ^ tmp_bcolor.pixel));
+  gcv.function = XLIKE_GX_XOR;
+  gcv.graphics_exposures = XLIKE_FALSE;
+  gc = gc_cache_lookup (DEVICE_XLIKE_GC_CACHE (XDEVICE (f->device)), &gcv,
+			XLIKE_GC_FOREGROUND | XLIKE_GC_FUNCTION | XLIKE_GC_EXPOSURES);
+  default_face_height_and_width (frame, &flash_height, 0);
+
+  /* If window is tall, flash top and bottom line.  */
+  if (EQ (Vvisible_bell, Qtop_bottom) && w->pixel_height > 3 * flash_height)
+    {
+      XLIKE_FILL_RECTANGLE (dpy, win, gc, w->pixel_left, w->pixel_top,
+			    w->pixel_width, flash_height);
+      XLIKE_FILL_RECTANGLE (dpy, win, gc, w->pixel_left,
+			    w->pixel_top + w->pixel_height - flash_height,
+			    w->pixel_width, flash_height);
+    }
+  else
+    /* If it is short, flash it all.  */
+    XLIKE_FILL_RECTANGLE (dpy, win, gc, w->pixel_left, w->pixel_top,
+			  w->pixel_width, w->pixel_height);
+
+  XLIKE_FLUSH (dpy);
+
+#ifdef HAVE_SELECT
+  {
+    int usecs = 100000;
+    struct timeval tv;
+    tv.tv_sec  = usecs / 1000000L;
+    tv.tv_usec = usecs % 1000000L;
+    /* I'm sure someone is going to complain about this... */
+    select (0, 0, 0, 0, &tv);
+  }
+#else
+#ifdef HAVE_POLL
+  poll (0, 0, 100);
+#else /* !HAVE_POLL */
+#error bite me
+#endif /* HAVE_POLL */
+#endif /* HAVE_SELECT */
+
+  /* If window is tall, flash top and bottom line.  */
+  if (EQ (Vvisible_bell, Qtop_bottom) && w->pixel_height > 3 * flash_height)
+    {
+      XLIKE_FILL_RECTANGLE (dpy, win, gc, w->pixel_left, w->pixel_top,
+			    w->pixel_width, flash_height);
+      XLIKE_FILL_RECTANGLE (dpy, win, gc, w->pixel_left,
+			    w->pixel_top + w->pixel_height - flash_height,
+			    w->pixel_width, flash_height);
+    }
+  else
+    /* If it is short, flash it all.  */
+    XLIKE_FILL_RECTANGLE (dpy, win, gc, w->pixel_left, w->pixel_top,
+			  w->pixel_width, w->pixel_height);
+
+  XLIKE_FLUSH (dpy);
+
+  return 1;
+}
+
+
+/************************************************************************/
+/*                            initialization                            */
+/************************************************************************/
+
+void
+console_type_create_redisplay_XLIKE (void)
+{
+  /* redisplay methods */
+  XLIKE_CONSOLE_HAS_METHOD (text_width);
+  XLIKE_CONSOLE_HAS_METHOD (output_display_block);
+  XLIKE_CONSOLE_HAS_METHOD (divider_height);
+  XLIKE_CONSOLE_HAS_METHOD (eol_cursor_width);
+  XLIKE_CONSOLE_HAS_METHOD (output_vertical_divider);
+  XLIKE_CONSOLE_HAS_METHOD (clear_region);
+  XLIKE_CONSOLE_HAS_METHOD (clear_frame);
+  XLIKE_CONSOLE_HAS_METHOD (flash);
+  XLIKE_CONSOLE_HAS_METHOD (ring_bell);
+  XLIKE_CONSOLE_HAS_METHOD (bevel_area);
+  XLIKE_CONSOLE_HAS_METHOD (output_string);
+  XLIKE_CONSOLE_HAS_METHOD (output_pixmap);
+
+#ifdef THIS_IS_X
+  XLIKE_CONSOLE_HAS_METHOD (window_output_begin);
+  XLIKE_CONSOLE_HAS_METHOD (window_output_end);
+#endif
+}