diff src/glyphs-x.c @ 412:697ef44129c6 r21-2-14

Import from CVS: tag r21-2-14
author cvs
date Mon, 13 Aug 2007 11:20:41 +0200
parents de805c49cfc1
children 41dbb7a9d5f2
line wrap: on
line diff
--- a/src/glyphs-x.c	Mon Aug 13 11:19:22 2007 +0200
+++ b/src/glyphs-x.c	Mon Aug 13 11:20:41 2007 +0200
@@ -4,7 +4,6 @@
    Copyright (C) 1995 Tinker Systems
    Copyright (C) 1995, 1996 Ben Wing
    Copyright (C) 1995 Sun Microsystems
-   Copyright (C) 1999, 2000 Andy Piper
 
 This file is part of XEmacs.
 
@@ -40,11 +39,9 @@
    Many changes for color work and optimizations by Jareth Hein for 21.0
    Switch of GIF/JPEG/PNG to new EImage intermediate code by Jareth Hein for 21.0
    TIFF code by Jareth Hein for 21.0
-   GIF/JPEG/PNG/TIFF code moved to new glyph-eimage.c by Andy Piper for 21.0
-   Subwindow and Widget support by Andy Piper for 21.2
+   GIF/JPEG/PNG/TIFF code moved to new glyph-eimage.c for 21.0
 
    TODO:
-   Support the GrayScale, StaticColor and StaticGray visual classes.
    Convert images.el to C and stick it in here?
  */
 
@@ -54,9 +51,6 @@
 #include "console-x.h"
 #include "glyphs-x.h"
 #include "objects-x.h"
-#ifdef HAVE_WIDGETS
-#include "gui-x.h"
-#endif
 #include "xmu.h"
 
 #include "buffer.h"
@@ -64,8 +58,6 @@
 #include "frame.h"
 #include "insdel.h"
 #include "opaque.h"
-#include "gui.h"
-#include "faces.h"
 
 #include "imgproc.h"
 
@@ -77,11 +69,6 @@
 #include "file-coding.h"
 #endif
 
-#ifdef LWLIB_WIDGETS_MOTIF
-#include <Xm/Xm.h>
-#endif
-#include <X11/IntrinsicP.h>
-
 #if INTBITS == 32
 # define FOUR_BYTE_TYPE unsigned int
 #elif LONGBITS == 32
@@ -94,22 +81,6 @@
 
 #define LISP_DEVICE_TO_X_SCREEN(dev) XDefaultScreenOfDisplay (DEVICE_X_DISPLAY (XDEVICE (dev)))
 
-DECLARE_IMAGE_INSTANTIATOR_FORMAT (nothing);
-DECLARE_IMAGE_INSTANTIATOR_FORMAT (string);
-DECLARE_IMAGE_INSTANTIATOR_FORMAT (formatted_string);
-DECLARE_IMAGE_INSTANTIATOR_FORMAT (inherit);
-#ifdef HAVE_JPEG
-DECLARE_IMAGE_INSTANTIATOR_FORMAT (jpeg);
-#endif
-#ifdef HAVE_TIFF
-DECLARE_IMAGE_INSTANTIATOR_FORMAT (tiff);
-#endif
-#ifdef HAVE_PNG
-DECLARE_IMAGE_INSTANTIATOR_FORMAT (png);
-#endif
-#ifdef HAVE_GIF
-DECLARE_IMAGE_INSTANTIATOR_FORMAT (gif);
-#endif
 #ifdef HAVE_XPM
 DEFINE_DEVICE_IIFORMAT (x, xpm);
 #endif
@@ -126,20 +97,6 @@
 
 DEFINE_IMAGE_INSTANTIATOR_FORMAT (autodetect);
 
-#ifdef HAVE_WIDGETS
-DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout);
-DEFINE_DEVICE_IIFORMAT (x, widget);
-DEFINE_DEVICE_IIFORMAT (x, native_layout);
-DEFINE_DEVICE_IIFORMAT (x, button);
-DEFINE_DEVICE_IIFORMAT (x, progress_gauge);
-DEFINE_DEVICE_IIFORMAT (x, edit_field);
-#if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1
-DEFINE_DEVICE_IIFORMAT (x, combo_box);
-#endif
-DEFINE_DEVICE_IIFORMAT (x, tab_control);
-DEFINE_DEVICE_IIFORMAT (x, label);
-#endif
-
 static void cursor_font_instantiate (Lisp_Object image_instance,
 				     Lisp_Object instantiator,
 				     Lisp_Object pointer_fg,
@@ -147,15 +104,6 @@
 				     int dest_mask,
 				     Lisp_Object domain);
 
-#ifdef HAVE_WIDGETS
-static void
-update_widget_face (widget_value* wv,
-		    Lisp_Image_Instance* ii, Lisp_Object domain);
-static void
-update_tab_widget_face (widget_value* wv,
-			Lisp_Image_Instance* ii, Lisp_Object domain);
-#endif
-
 #include "bitmaps.h"
 
 
@@ -190,13 +138,6 @@
   vis = DEVICE_X_VISUAL (XDEVICE(device));
   depth = DEVICE_X_DEPTH(XDEVICE(device));
 
-  if (vis->class == GrayScale || vis->class == StaticColor ||
-      vis->class == StaticGray)
-    {
-      /* #### Implement me!!! */
-      return NULL;
-    }
-
   if (vis->class == PseudoColor)
     {
       /* Quantize the image and get a histogram while we're at it.
@@ -234,7 +175,7 @@
       *pixtbl = xnew_array (unsigned long, pixcount);
       *npixels = 0;
 
-      /* #### should implement a sort by popularity to assure proper allocation */
+      /* ### should implement a sort by popularity to assure proper allocation */
       n = *npixels;
       for (i = 0; i < qtable->num_active_colors; i++)
 	{
@@ -265,7 +206,7 @@
 	      gr = *ip++;
 	      bl = *ip++;
 	      conv.val = pixarray[QUANT_GET_COLOR(qtable,rd,gr,bl)];
-#ifdef WORDS_BIGENDIAN
+#if WORDS_BIGENDIAN
 	      if (outimg->byte_order == MSBFirst)
 		for (q = 4-byte_cnt; q < 4; q++) *dp++ = conv.cp[q];
 	      else
@@ -340,7 +281,7 @@
 		bl = *ip++ >> (8 - bbits);
 
 	      conv.val = (rd << rshift) | (gr << gshift) | (bl << bshift);
-#ifdef WORDS_BIGENDIAN
+#if WORDS_BIGENDIAN
 	      if (outimg->byte_order == MSBFirst)
 		for (q = 4-byte_cnt; q < 4; q++) *dp++ = conv.cp[q];
 	      else
@@ -360,7 +301,7 @@
 
 
 static void
-x_print_image_instance (Lisp_Image_Instance *p,
+x_print_image_instance (struct Lisp_Image_Instance *p,
 			Lisp_Object printcharfun,
 			int escapeflag)
 {
@@ -385,43 +326,19 @@
     }
 }
 
-#ifdef DEBUG_WIDGETS
-extern int debug_widget_instances;
-#endif
-
 static void
-x_finalize_image_instance (Lisp_Image_Instance *p)
+x_finalize_image_instance (struct Lisp_Image_Instance *p)
 {
   if (!p->data)
     return;
 
-  if (DEVICE_LIVE_P (XDEVICE (IMAGE_INSTANCE_DEVICE (p))))
+  if (DEVICE_LIVE_P (XDEVICE (p->device)))
     {
-      Display *dpy = DEVICE_X_DISPLAY 
-	(XDEVICE (IMAGE_INSTANCE_DEVICE (p)));
-      if (0)
-	;
-#ifdef HAVE_WIDGETS
-      else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET)
-	{
-	  if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
-	    {
-#ifdef DEBUG_WIDGETS
-	      debug_widget_instances--;
-	      stderr_out ("widget destroyed, %d left\n", debug_widget_instances);
-#endif
-	      lw_destroy_widget (IMAGE_INSTANCE_X_WIDGET_ID (p));
-	      lw_destroy_widget (IMAGE_INSTANCE_X_CLIPWIDGET (p));
+      Display *dpy = DEVICE_X_DISPLAY (XDEVICE (p->device));
 
-	      /* We can release the callbacks again. */
-	      ungcpro_popup_callbacks (IMAGE_INSTANCE_X_WIDGET_LWID (p));
-
-	      IMAGE_INSTANCE_X_WIDGET_ID (p) = 0;
-	      IMAGE_INSTANCE_X_CLIPWIDGET (p) = 0;
-	    }
-	}
-#endif
-      else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
+      if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET
+	  || 
+	  IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
 	{
 	  if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
 	    XDestroyWindow (dpy, IMAGE_INSTANCE_X_SUBWINDOW_ID (p));
@@ -429,33 +346,20 @@
 	}
       else
 	{
-	  int i;
-	  if (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p))
-	    disable_glyph_animated_timeout (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p));
-
+	  if (IMAGE_INSTANCE_X_PIXMAP (p))
+	    XFreePixmap (dpy, IMAGE_INSTANCE_X_PIXMAP (p));
 	  if (IMAGE_INSTANCE_X_MASK (p) &&
 	      IMAGE_INSTANCE_X_MASK (p) != IMAGE_INSTANCE_X_PIXMAP (p))
 	    XFreePixmap (dpy, IMAGE_INSTANCE_X_MASK (p));
-	  IMAGE_INSTANCE_PIXMAP_MASK (p) = 0;
-
-	  if (IMAGE_INSTANCE_X_PIXMAP_SLICES (p))
-	    {
-	      for (i = 0; i < IMAGE_INSTANCE_PIXMAP_MAXSLICE (p); i++)
-		if (IMAGE_INSTANCE_X_PIXMAP_SLICE (p,i))
-		  {
-		    XFreePixmap (dpy, IMAGE_INSTANCE_X_PIXMAP_SLICE (p,i));
-		    IMAGE_INSTANCE_X_PIXMAP_SLICE (p, i) = 0;
-		  }
-	      xfree (IMAGE_INSTANCE_X_PIXMAP_SLICES (p));
-	      IMAGE_INSTANCE_X_PIXMAP_SLICES (p) = 0;
-	    }
-
+	  IMAGE_INSTANCE_X_PIXMAP (p) = 0;
+	  IMAGE_INSTANCE_X_MASK (p) = 0;
+	  
 	  if (IMAGE_INSTANCE_X_CURSOR (p))
 	    {
 	      XFreeCursor (dpy, IMAGE_INSTANCE_X_CURSOR (p));
 	      IMAGE_INSTANCE_X_CURSOR (p) = 0;
 	    }
-
+	  
 	  if (IMAGE_INSTANCE_X_NPIXELS (p) != 0)
 	    {
 	      XFreeColors (dpy,
@@ -466,13 +370,7 @@
 	    }
 	}
     }
-  /* You can sometimes have pixels without a live device. I forget
-     why, but that's why we free them here if we have a pixmap type
-     image instance. It probably means that we might also get a memory
-     leak with widgets. */
-  if (IMAGE_INSTANCE_TYPE (p) != IMAGE_WIDGET
-      && IMAGE_INSTANCE_TYPE (p) != IMAGE_SUBWINDOW
-      && IMAGE_INSTANCE_X_PIXELS (p))
+  if (IMAGE_INSTANCE_X_PIXELS (p))
     {
       xfree (IMAGE_INSTANCE_X_PIXELS (p));
       IMAGE_INSTANCE_X_PIXELS (p) = 0;
@@ -483,8 +381,8 @@
 }
 
 static int
-x_image_instance_equal (Lisp_Image_Instance *p1,
-			Lisp_Image_Instance *p2, int depth)
+x_image_instance_equal (struct Lisp_Image_Instance *p1,
+			struct Lisp_Image_Instance *p2, int depth)
 {
   switch (IMAGE_INSTANCE_TYPE (p1))
     {
@@ -503,7 +401,7 @@
 }
 
 static unsigned long
-x_image_instance_hash (Lisp_Image_Instance *p, int depth)
+x_image_instance_hash (struct Lisp_Image_Instance *p, int depth)
 {
   switch (IMAGE_INSTANCE_TYPE (p))
     {
@@ -523,14 +421,10 @@
    methods are called. */
 
 static void
-x_initialize_pixmap_image_instance (Lisp_Image_Instance *ii,
-				    int slices,
+x_initialize_pixmap_image_instance (struct Lisp_Image_Instance *ii,
 				    enum image_instance_type type)
 {
   ii->data = xnew_and_zero (struct x_image_instance_data);
-  IMAGE_INSTANCE_PIXMAP_MAXSLICE (ii) = slices;
-  IMAGE_INSTANCE_X_PIXMAP_SLICES (ii) =
-    xnew_array_and_zero (Pixmap, slices);
   IMAGE_INSTANCE_TYPE (ii) = type;
   IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = Qnil;
   IMAGE_INSTANCE_PIXMAP_MASK_FILENAME (ii) = Qnil;
@@ -574,7 +468,7 @@
 	 (XSTRING_BYTE (name, 2) == '/')))))
     {
       if (!NILP (Ffile_readable_p (name)))
-	return Fexpand_file_name (name, Qnil);
+	return name;
       else
 	return Qnil;
     }
@@ -700,7 +594,7 @@
   /* Get the data while doing the conversion */
   while (1)
     {
-      ssize_t size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf));
+      int size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf));
       if (!size_in_bytes)
 	break;
       /* It does seem the flushes are necessary... */
@@ -843,13 +737,12 @@
    Use the same code as for `xpm'. */
 
 static void
-init_image_instance_from_x_image (Lisp_Image_Instance *ii,
+init_image_instance_from_x_image (struct Lisp_Image_Instance *ii,
 				  XImage *ximage,
 				  int dest_mask,
 				  Colormap cmap,
 				  unsigned long *pixels,
 				  int npixels,
-				  int slices,
 				  Lisp_Object instantiator)
 {
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
@@ -885,15 +778,13 @@
 
   XFreeGC (dpy, gc);
 
-  x_initialize_pixmap_image_instance (ii, slices, IMAGE_COLOR_PIXMAP);
+  x_initialize_pixmap_image_instance (ii, IMAGE_COLOR_PIXMAP);
 
   IMAGE_INSTANCE_PIXMAP_FILENAME (ii) =
     find_keyword_in_vector (instantiator, Q_file);
 
-  /* Fixup a set of pixmaps. */
   IMAGE_INSTANCE_X_PIXMAP (ii) = pixmap;
-
-  IMAGE_INSTANCE_PIXMAP_MASK (ii) = 0;
+  IMAGE_INSTANCE_X_MASK (ii) = 0;
   IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = ximage->width;
   IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = ximage->height;
   IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = ximage->depth;
@@ -903,44 +794,8 @@
 }
 
 static void
-image_instance_add_x_image (Lisp_Image_Instance *ii,
-			    XImage *ximage,
-			    int slice,
-			    Lisp_Object instantiator)
-{
-  Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
-  Display *dpy;
-  GC gc;
-  Drawable d;
-  Pixmap pixmap;
-
-  dpy = DEVICE_X_DISPLAY (XDEVICE (device));
-  d = XtWindow(DEVICE_XT_APP_SHELL (XDEVICE (device)));
-
-  pixmap = XCreatePixmap (dpy, d, ximage->width,
-			  ximage->height, ximage->depth);
-  if (!pixmap)
-    signal_simple_error ("Unable to create pixmap", instantiator);
-
-  gc = XCreateGC (dpy, pixmap, 0, NULL);
-  if (!gc)
-    {
-      XFreePixmap (dpy, pixmap);
-      signal_simple_error ("Unable to create GC", instantiator);
-    }
-
-  XPutImage (dpy, pixmap, gc, ximage, 0, 0, 0, 0,
-	     ximage->width, ximage->height);
-
-  XFreeGC (dpy, gc);
-
-  IMAGE_INSTANCE_X_PIXMAP_SLICE (ii, slice) = pixmap;
-}
-
-static void
-x_init_image_instance_from_eimage (Lisp_Image_Instance *ii,
+x_init_image_instance_from_eimage (struct Lisp_Image_Instance *ii,
 				   int width, int height,
-				   int slices,
 				   unsigned char *eimage,
 				   int dest_mask,
 				   Lisp_Object instantiator,
@@ -950,42 +805,33 @@
   Colormap cmap = DEVICE_X_COLORMAP (XDEVICE(device));
   unsigned long *pixtbl = NULL;
   int npixels = 0;
-  int slice;
   XImage* ximage;
 
-  for (slice = 0; slice < slices; slice++)
+  ximage = convert_EImage_to_XImage (device, width, height, eimage,
+				     &pixtbl, &npixels);
+  if (!ximage)
     {
-      ximage = convert_EImage_to_XImage (device, width, height,
-					 eimage + (width * height * 3 * slice),
-					 &pixtbl, &npixels);
-      if (!ximage)
-	{
-	  if (pixtbl) xfree (pixtbl);
-	  signal_image_error("EImage to XImage conversion failed", instantiator);
-	}
+      if (pixtbl) xfree (pixtbl);
+      signal_image_error("EImage to XImage conversion failed", instantiator);
+    }
 
-      /* Now create the pixmap and set up the image instance */
-      if (slice == 0)
-	init_image_instance_from_x_image (ii, ximage, dest_mask,
-					  cmap, pixtbl, npixels, slices,
-					  instantiator);
-      else
-	image_instance_add_x_image (ii, ximage, slice, instantiator);
+  /* Now create the pixmap and set up the image instance */
+  init_image_instance_from_x_image (ii, ximage, dest_mask,
+				    cmap, pixtbl, npixels,
+				    instantiator);
 
-      if (ximage)
-	{
-	  if (ximage->data)
-	    {
-	      xfree (ximage->data);
-	      ximage->data = 0;
-	    }
-	  XDestroyImage (ximage);
-	  ximage = 0;
-	}
+  if (ximage)
+    {
+      if (ximage->data)
+        {
+	  xfree (ximage->data);
+          ximage->data = 0;
+        }
+      XDestroyImage (ximage);
     }
 }
 
-int read_bitmap_data_from_file (const char *filename, unsigned int *width,
+int read_bitmap_data_from_file (CONST char *filename, unsigned int *width,
 				unsigned int *height, unsigned char **datap,
 				int *x_hot, int *y_hot)
 {
@@ -999,7 +845,7 @@
 static Pixmap
 pixmap_from_xbm_inline (Lisp_Object device, int width, int height,
 			/* Note that data is in ext-format! */
-			const Extbyte *bits)
+			CONST Extbyte *bits)
 {
   return XCreatePixmapFromBitmapData (DEVICE_X_DISPLAY (XDEVICE(device)),
 				      XtWindow (DEVICE_XT_APP_SHELL (XDEVICE (device))),
@@ -1011,10 +857,10 @@
    image instance accordingly. */
 
 static void
-init_image_instance_from_xbm_inline (Lisp_Image_Instance *ii,
+init_image_instance_from_xbm_inline (struct Lisp_Image_Instance *ii,
 				     int width, int height,
 				     /* Note that data is in ext-format! */
-				     const char *bits,
+				     CONST char *bits,
 				     Lisp_Object instantiator,
 				     Lisp_Object pointer_fg,
 				     Lisp_Object pointer_bg,
@@ -1056,7 +902,7 @@
 			      IMAGE_MONO_PIXMAP_MASK | IMAGE_COLOR_PIXMAP_MASK
 			      | IMAGE_POINTER_MASK);
 
-  x_initialize_pixmap_image_instance (ii, 1, type);
+  x_initialize_pixmap_image_instance (ii, type);
   IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = width;
   IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = height;
   IMAGE_INSTANCE_PIXMAP_FILENAME (ii) =
@@ -1152,24 +998,24 @@
 		   Lisp_Object pointer_fg, Lisp_Object pointer_bg,
 		   int dest_mask, int width, int height,
 		   /* Note that data is in ext-format! */
-		   const char *bits)
+		   CONST char *bits)
 {
   Lisp_Object mask_data = find_keyword_in_vector (instantiator, Q_mask_data);
   Lisp_Object mask_file = find_keyword_in_vector (instantiator, Q_mask_file);
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Pixmap mask = 0;
+  CONST char *gcc_may_you_rot_in_hell;
 
   if (!NILP (mask_data))
     {
-      const char *ext_data;
-
-      TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (XCDR (XCDR (mask_data))),
-			  C_STRING_ALLOCA, ext_data,
-			  Qbinary);
-      mask = pixmap_from_xbm_inline (IMAGE_INSTANCE_DEVICE (ii),
-				     XINT (XCAR (mask_data)),
-				     XINT (XCAR (XCDR (mask_data))),
-				     (const unsigned char *) ext_data);
+      GET_C_STRING_BINARY_DATA_ALLOCA (XCAR (XCDR (XCDR (mask_data))),
+				       gcc_may_you_rot_in_hell);
+      mask =
+	pixmap_from_xbm_inline (IMAGE_INSTANCE_DEVICE (ii),
+				XINT (XCAR (mask_data)),
+				XINT (XCAR (XCDR (mask_data))),
+				(CONST unsigned char *)
+				gcc_may_you_rot_in_hell);
     }
 
   init_image_instance_from_xbm_inline (ii, width, height, bits,
@@ -1185,17 +1031,16 @@
 		   int dest_mask, Lisp_Object domain)
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
-  const char *ext_data;
+  CONST char *gcc_go_home;
 
   assert (!NILP (data));
 
-  TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (XCDR (XCDR (data))),
-		      C_STRING_ALLOCA, ext_data,
-		      Qbinary);
+  GET_C_STRING_BINARY_DATA_ALLOCA (XCAR (XCDR (XCDR (data))),
+				   gcc_go_home);
 
   xbm_instantiate_1 (image_instance, instantiator, pointer_fg,
 		     pointer_bg, dest_mask, XINT (XCAR (data)),
-		     XINT (XCAR (XCDR (data))), ext_data);
+		     XINT (XCAR (XCDR (data))), gcc_go_home);
 }
 
 
@@ -1299,11 +1144,11 @@
 
 static void
 x_xpm_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
-		   Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		   int dest_mask, Lisp_Object domain)
+				   Lisp_Object pointer_fg, Lisp_Object pointer_bg,
+				   int dest_mask, Lisp_Object domain)
 {
   /* This function can GC */
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   Display *dpy;
@@ -1361,7 +1206,7 @@
   visual = DEVICE_X_VISUAL (XDEVICE(device));
 #endif
 
-  x_initialize_pixmap_image_instance (ii, 1, type);
+  x_initialize_pixmap_image_instance (ii, type);
 
   assert (!NILP (data));
 
@@ -1471,7 +1316,7 @@
       pixels = NULL;
 
     IMAGE_INSTANCE_X_PIXMAP (ii) = pixmap;
-    IMAGE_INSTANCE_PIXMAP_MASK (ii) = (void*)mask;
+    IMAGE_INSTANCE_X_MASK (ii) = mask;
     IMAGE_INSTANCE_X_COLORMAP (ii) = cmap;
     IMAGE_INSTANCE_X_PIXELS (ii) = pixels;
     IMAGE_INSTANCE_X_NPIXELS (ii) = npixels;
@@ -1670,16 +1515,13 @@
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   int i, stattis;
-  char *bits, *bp;
-  const char *p;
-  const char * volatile emsg = 0;
-  const char * volatile dstring;
+  char *p, *bits, *bp;
+  CONST char * volatile emsg = 0;
+  CONST char * volatile dstring;
 
   assert (!NILP (data));
 
-  TO_EXTERNAL_FORMAT (LISP_STRING, data,
-		      C_STRING_ALLOCA, dstring,
-		      Qbinary);
+  GET_C_STRING_BINARY_DATA_ALLOCA (data, dstring);
 
   if ((p = strchr (dstring, ':')))
     {
@@ -1743,7 +1585,7 @@
 
 static Lisp_Object
 autodetect_normalize (Lisp_Object instantiator,
-		      Lisp_Object console_type)
+				Lisp_Object console_type)
 {
   Lisp_Object file = find_keyword_in_vector (instantiator, Q_data);
   Lisp_Object filename = Qnil;
@@ -1834,10 +1676,10 @@
 
 static void
 autodetect_instantiate (Lisp_Object image_instance,
-			Lisp_Object instantiator,
-			Lisp_Object pointer_fg,
-			Lisp_Object pointer_bg,
-			int dest_mask, Lisp_Object domain)
+				  Lisp_Object instantiator,
+				  Lisp_Object pointer_fg,
+				  Lisp_Object pointer_bg,
+				  int dest_mask, Lisp_Object domain)
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   struct gcpro gcpro1, gcpro2, gcpro3;
@@ -1850,10 +1692,8 @@
   alist = tagged_vector_to_alist (instantiator);
   if (dest_mask & IMAGE_POINTER_MASK)
     {
-      const char *name_ext;
-      TO_EXTERNAL_FORMAT (LISP_STRING, data,
-			  C_STRING_ALLOCA, name_ext,
-			  Qfile_name);
+      CONST char *name_ext;
+      GET_C_STRING_FILENAME_DATA_ALLOCA (data, name_ext);
       if (XmuCursorNameToIndex (name_ext) != -1)
         {
           result = alist_to_tagged_vector (Qcursor_font, alist);
@@ -1940,7 +1780,7 @@
 {
   /* This function can GC */
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
   Display *dpy;
   XColor fg, bg;
@@ -2004,7 +1844,7 @@
 
   /* #### call XQueryTextExtents() and check_pointer_sizes() here. */
 
-  x_initialize_pixmap_image_instance (ii, 1, IMAGE_POINTER);
+  x_initialize_pixmap_image_instance (ii, IMAGE_POINTER);
   IMAGE_INSTANCE_X_CURSOR (ii) =
     XCreateGlyphCursor (dpy, source, mask, source_char, mask_char,
 			&fg, &bg);
@@ -2038,11 +1878,11 @@
 {
   /* This function can GC */
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
   Display *dpy;
   int i;
-  const char *name_ext;
+  CONST char *name_ext;
   Lisp_Object foreground, background;
 
   if (!DEVICE_X_P (XDEVICE (device)))
@@ -2053,13 +1893,11 @@
   if (!(dest_mask & IMAGE_POINTER_MASK))
     incompatible_image_types (instantiator, dest_mask, IMAGE_POINTER_MASK);
 
-  TO_EXTERNAL_FORMAT (LISP_STRING, data,
-		      C_STRING_ALLOCA, name_ext,
-		      Qfile_name);
+  GET_C_STRING_FILENAME_DATA_ALLOCA (data, name_ext);
   if ((i = XmuCursorNameToIndex (name_ext)) == -1)
     signal_simple_error ("Unrecognized cursor-font name", data);
 
-  x_initialize_pixmap_image_instance (ii, 1, IMAGE_POINTER);
+  x_initialize_pixmap_image_instance (ii, IMAGE_POINTER);
   IMAGE_INSTANCE_X_CURSOR (ii) = XCreateFontCursor (dpy, i);
   foreground = find_keyword_in_vector (instantiator, Q_foreground);
   if (NILP (foreground))
@@ -2074,7 +1912,7 @@
 x_colorize_image_instance (Lisp_Object image_instance,
 			   Lisp_Object foreground, Lisp_Object background)
 {
-  Lisp_Image_Instance *p;
+  struct Lisp_Image_Instance *p;
 
   p = XIMAGE_INSTANCE (image_instance);
 
@@ -2084,7 +1922,7 @@
       IMAGE_INSTANCE_TYPE (p) = IMAGE_COLOR_PIXMAP;
       /* Make sure there aren't two pointers to the same mask, causing
 	 it to get freed twice. */
-      IMAGE_INSTANCE_PIXMAP_MASK (p) = 0;
+      IMAGE_INSTANCE_X_MASK (p) = 0;
       break;
 
     default:
@@ -2127,145 +1965,21 @@
 /* unmap the image if it is a widget. This is used by redisplay via
    redisplay_unmap_subwindows */
 static void
-x_unmap_subwindow (Lisp_Image_Instance *p)
+x_unmap_subwindow (struct Lisp_Image_Instance *p)
 {
-  if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
-    {
-      XUnmapWindow
-	(IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
-	 IMAGE_INSTANCE_X_CLIPWINDOW (p));
-    }
-  else				/* must be a widget */
-    {
-      XtUnmapWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p));
-    }
+  XUnmapWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p)),
+		IMAGE_INSTANCE_X_SUBWINDOW_ID (p));
 }
 
 /* map the subwindow. This is used by redisplay via
    redisplay_output_subwindow */
 static void
-x_map_subwindow (Lisp_Image_Instance *p, int x, int y,
-		 struct display_glyph_area* dga)
-{
-  if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
-    {
-      Window subwindow = IMAGE_INSTANCE_X_SUBWINDOW_ID (p);
-      XMoveResizeWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
-			 IMAGE_INSTANCE_X_CLIPWINDOW (p),
-			 x, y, dga->width, dga->height);
-      XMoveWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
-		   subwindow, -dga->xoffset, -dga->yoffset);
-      XMapWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
-		  IMAGE_INSTANCE_X_CLIPWINDOW (p));
-    }
-  else				/* must be a widget */
-    {
-      XtConfigureWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p),
-			 x + IMAGE_INSTANCE_X_WIDGET_XOFFSET (p),
-			 y + IMAGE_INSTANCE_X_WIDGET_YOFFSET (p),
-			 dga->width, dga->height, 0);
-      XtMoveWidget (IMAGE_INSTANCE_X_WIDGET_ID (p),
-		    -dga->xoffset, -dga->yoffset);
-      XtMapWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p));
-    }
-}
-
-/* when you click on a widget you may activate another widget this
-   needs to be checked and all appropriate widgets updated */
-static void
-x_update_subwindow (Lisp_Image_Instance *p)
-{
-  /* Update the subwindow size if necessary. */
-  if (IMAGE_INSTANCE_SIZE_CHANGED (p))
-    {
-      XResizeWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
-		     IMAGE_INSTANCE_X_SUBWINDOW_ID (p),
-		     IMAGE_INSTANCE_WIDTH (p),
-		     IMAGE_INSTANCE_HEIGHT (p));
-    }
-}
-
-/* Update all attributes that have changed. Lwlib actually does most
-   of this for us. */
-static void
-x_update_widget (Lisp_Image_Instance *p)
+x_map_subwindow (struct Lisp_Image_Instance *p, int x, int y)
 {
-  /* This function can GC if IN_REDISPLAY is false. */
-#ifdef HAVE_WIDGETS
-  widget_value* wv = 0;
-
-  /* First get the items if they have changed since this is a
-     structural change. As such it will nuke all added values so we
-     need to update most other things after the items have changed.*/
-  if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p))
-    {
-      Lisp_Object image_instance;
-
-      XSETIMAGE_INSTANCE (image_instance, p);
-      wv = gui_items_to_widget_values
-	(image_instance, IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (p));
-      wv->change = STRUCTURAL_CHANGE;
-      /* now modify the widget */
-      lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p),
-			     wv, True);
-      free_widget_value_tree (wv);
-    }
-
-  /* Now do non structural updates. */
-  wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (p));
-
-  if (!wv)
-    return;
-
-  /* Possibly update the colors and font */
-  if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (p)
-      ||
-      XFRAME (IMAGE_INSTANCE_FRAME (p))->faces_changed
-      ||
-      IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p))
-    {
-      update_widget_face (wv, p, IMAGE_INSTANCE_FRAME (p));
-    }
-
-  /* Possibly update the text. */
-  if (IMAGE_INSTANCE_TEXT_CHANGED (p))
-    {
-      char* str;
-      Lisp_Object val = IMAGE_INSTANCE_WIDGET_TEXT (p);
-      TO_EXTERNAL_FORMAT (LISP_STRING, val,
-			  C_STRING_ALLOCA, str,
-			  Qnative);
-      wv->value = str;
-    }
-
-  /* Possibly update the size. */
-  if (IMAGE_INSTANCE_SIZE_CHANGED (p)
-      ||
-      IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p)
-      ||
-      IMAGE_INSTANCE_TEXT_CHANGED (p))
-    {
-      assert (IMAGE_INSTANCE_X_WIDGET_ID (p) &&
-	      IMAGE_INSTANCE_X_CLIPWIDGET (p)) ;
-
-      if (IMAGE_INSTANCE_X_WIDGET_ID (p)->core.being_destroyed
-	  || !XtIsManaged(IMAGE_INSTANCE_X_WIDGET_ID (p)))
-	{
-	  Lisp_Object sw;
-	  XSETIMAGE_INSTANCE (sw, p);
-	  signal_simple_error ("XEmacs bug: subwindow is deleted", sw);
-	}
-
-      lw_add_widget_value_arg (wv, XtNwidth,
-			       (Dimension)IMAGE_INSTANCE_WIDTH (p));
-      lw_add_widget_value_arg (wv, XtNheight,
-			       (Dimension)IMAGE_INSTANCE_HEIGHT (p));
-    }
-
-  /* now modify the widget */
-  lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p),
-			 wv, False);
-#endif
+  XMapWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p)),
+	      IMAGE_INSTANCE_X_SUBWINDOW_ID (p));
+  XMoveWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p)),
+	       IMAGE_INSTANCE_X_SUBWINDOW_ID (p), x, y);
 }
 
 /* instantiate and x type subwindow */
@@ -2275,17 +1989,17 @@
 			int dest_mask, Lisp_Object domain)
 {
   /* This function can GC */
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
-  Lisp_Object frame = DOMAIN_FRAME (domain);
+  Lisp_Object frame = FW_FRAME (domain);
   struct frame* f = XFRAME (frame);
   Display *dpy;
   Screen *xs;
   Window pw, win;
   XSetWindowAttributes xswa;
   Mask valueMask = 0;
-  unsigned int w = IMAGE_INSTANCE_WIDTH (ii),
-    h = IMAGE_INSTANCE_HEIGHT (ii);
+  unsigned int w = IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii), 
+    h = IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii);
 
   if (!DEVICE_X_P (XDEVICE (device)))
     signal_simple_error ("Not an X device", device);
@@ -2293,32 +2007,28 @@
   dpy = DEVICE_X_DISPLAY (XDEVICE (device));
   xs = DefaultScreenOfDisplay (dpy);
 
-  IMAGE_INSTANCE_TYPE (ii) = IMAGE_SUBWINDOW;
+  if (dest_mask & IMAGE_SUBWINDOW_MASK)
+    IMAGE_INSTANCE_TYPE (ii) = IMAGE_SUBWINDOW;
+  else
+    incompatible_image_types (instantiator, dest_mask,
+			      IMAGE_SUBWINDOW_MASK);
 
   pw = XtWindow (FRAME_X_TEXT_WIDGET (f));
 
   ii->data = xnew_and_zero (struct x_subwindow_data);
 
   IMAGE_INSTANCE_X_SUBWINDOW_PARENT (ii) = pw;
-  IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (ii) = DisplayOfScreen (xs);
+  IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (ii) = xs;
 
   xswa.backing_store = Always;
   valueMask |= CWBackingStore;
   xswa.colormap = DefaultColormapOfScreen (xs);
   valueMask |= CWColormap;
-
-  /* Create a window for clipping */
-  IMAGE_INSTANCE_X_CLIPWINDOW (ii) =
-    XCreateWindow (dpy, pw, 0, 0, w, h, 0, CopyFromParent,
-		   InputOutput, CopyFromParent, valueMask,
-		   &xswa);
-
-  /* Now put the subwindow inside the clip window. */
-  win = XCreateWindow (dpy, IMAGE_INSTANCE_X_CLIPWINDOW (ii),
-		       0, 0, w, h, 0, CopyFromParent,
+  
+  win = XCreateWindow (dpy, pw, 0, 0, w, h, 0, CopyFromParent,
 		       InputOutput, CopyFromParent, valueMask,
 		       &xswa);
-
+  
   IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)win;
 }
 
@@ -2331,7 +2041,7 @@
        (subwindow, property, data))
 {
   Atom property_atom;
-  Lisp_Subwindow *sw;
+  struct Lisp_Subwindow *sw;
   Display *dpy;
 
   CHECK_SUBWINDOW (subwindow);
@@ -2352,416 +2062,14 @@
 }
 #endif
 
-
-#ifdef HAVE_WIDGETS
-
-/************************************************************************/
-/*                            widgets                            */
-/************************************************************************/
-
-static void
-update_widget_face (widget_value* wv, Lisp_Image_Instance *ii,
-		    Lisp_Object domain)
-{
-#ifdef LWLIB_WIDGETS_MOTIF
-  XmFontList fontList;
-#endif
-  /* Update the foreground. */
-  Lisp_Object pixel = FACE_FOREGROUND
-    (IMAGE_INSTANCE_WIDGET_FACE (ii),
-     domain);
-  XColor fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)), bcolor;
-  lw_add_widget_value_arg (wv, XtNforeground, fcolor.pixel);
-
-  /* Update the background. */
-  pixel = FACE_BACKGROUND (IMAGE_INSTANCE_WIDGET_FACE (ii),
-			   domain);
-  bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
-  lw_add_widget_value_arg (wv, XtNbackground, bcolor.pixel);
-
-#ifdef LWLIB_WIDGETS_MOTIF
-  fontList = XmFontListCreate
-    (FONT_INSTANCE_X_FONT
-     (XFONT_INSTANCE (query_string_font
-		      (IMAGE_INSTANCE_WIDGET_TEXT (ii),
-		       IMAGE_INSTANCE_WIDGET_FACE (ii),
-		       domain))),  XmSTRING_DEFAULT_CHARSET);
-  lw_add_widget_value_arg (wv, XmNfontList, (XtArgVal)fontList);
-#endif
-  lw_add_widget_value_arg
-    (wv, XtNfont, (XtArgVal)FONT_INSTANCE_X_FONT
-     (XFONT_INSTANCE (query_string_font
-		      (IMAGE_INSTANCE_WIDGET_TEXT (ii),
-		       IMAGE_INSTANCE_WIDGET_FACE (ii),
-		       domain))));
-}
-
-static void
-update_tab_widget_face (widget_value* wv, Lisp_Image_Instance *ii,
-			Lisp_Object domain)
-{
-  if (wv->contents)
-    {
-      widget_value* val = wv->contents, *cur;
-
-      /* Give each child label the correct foreground color. */
-      Lisp_Object pixel = FACE_FOREGROUND
-	(IMAGE_INSTANCE_WIDGET_FACE (ii),
-	 domain);
-      XColor fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
-      lw_add_widget_value_arg (val, XtNtabForeground, fcolor.pixel);
-
-      for (cur = val->next; cur; cur = cur->next)
-	{
-	  if (cur->value)
-	    {
-	      lw_copy_widget_value_args (val, cur);
-	    }
-	}
-    }
-}
-
-static void
-x_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
-		      Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		      int dest_mask, Lisp_Object domain,
-		      const char* type, widget_value* wv)
+static void 
+x_resize_subwindow (struct Lisp_Image_Instance* ii, int w, int h)
 {
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), pixel;
-  struct device* d = XDEVICE (device);
-  Lisp_Object frame = DOMAIN_FRAME (domain);
-  struct frame* f = XFRAME (frame);
-  char* nm=0;
-  Widget wid;
-  Arg al [32];
-  int ac = 0;
-  int id = new_lwlib_id ();
-  widget_value* clip_wv;
-  XColor fcolor, bcolor;
-
-  if (!DEVICE_X_P (d))
-    signal_simple_error ("Not an X device", device);
-
-  /* have to set the type this late in case there is no device
-     instantiation for a widget. But we can go ahead and do it without
-     checking because there is always a generic instantiator. */
-  IMAGE_INSTANCE_TYPE (ii) = IMAGE_WIDGET;
-
-  if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii)))
-    TO_EXTERNAL_FORMAT (LISP_STRING, IMAGE_INSTANCE_WIDGET_TEXT (ii),
-			C_STRING_ALLOCA, nm,
-			Qnative);
-
-  ii->data = xnew_and_zero (struct x_subwindow_data);
-
-  /* Create a clip window to contain the subwidget. Incredibly the
-     XEmacs manager seems to be the most appropriate widget for
-     this. Nothing else is simple enough and yet does what is
-     required. */
-  clip_wv = xmalloc_widget_value ();
-
-  lw_add_widget_value_arg (clip_wv, XtNresize, False);
-  lw_add_widget_value_arg (clip_wv, XtNwidth,
-			   (Dimension)IMAGE_INSTANCE_WIDTH (ii));
-  lw_add_widget_value_arg (clip_wv, XtNheight,
-			   (Dimension)IMAGE_INSTANCE_HEIGHT (ii));
-  clip_wv->enabled = True;
-
-  clip_wv->name = xstrdup ("clip-window");
-  clip_wv->value = xstrdup ("clip-window");
-
-  IMAGE_INSTANCE_X_CLIPWIDGET (ii)
-    = lw_create_widget ("clip-window", "clip-window", new_lwlib_id (),
-			clip_wv, FRAME_X_CONTAINER_WIDGET (f),
-			False, 0, 0, 0);
-
-  free_widget_value_tree (clip_wv);
-
-  /* copy any args we were given */
-  ac = 0;
-  lw_add_value_args_to_args (wv, al, &ac);
-
-  /* Fixup the colors. We have to do this *before* the widget gets
-     created so that Motif will fix up the shadow colors
-     correctly. Once the widget is created Motif won't do this
-     anymore...*/
-  pixel = FACE_FOREGROUND
-    (IMAGE_INSTANCE_WIDGET_FACE (ii),
-     IMAGE_INSTANCE_FRAME (ii));
-  fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
-
-  pixel = FACE_BACKGROUND
-    (IMAGE_INSTANCE_WIDGET_FACE (ii),
-     IMAGE_INSTANCE_FRAME (ii));
-  bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
-
-  lw_add_widget_value_arg (wv, XtNbackground, bcolor.pixel);
-  lw_add_widget_value_arg (wv, XtNforeground, fcolor.pixel);
-  /* we cannot allow widgets to resize themselves */
-  lw_add_widget_value_arg (wv, XtNresize, False);
-  lw_add_widget_value_arg (wv, XtNwidth,
-			   (Dimension)IMAGE_INSTANCE_WIDTH (ii));
-  lw_add_widget_value_arg (wv, XtNheight,
-			   (Dimension)IMAGE_INSTANCE_HEIGHT (ii));
-  /* update the font. */
-  update_widget_face (wv, ii, domain);
-
-  wid = lw_create_widget (type, wv->name, id, wv, IMAGE_INSTANCE_X_CLIPWIDGET (ii),
-			  False, 0, popup_selection_callback, 0);
-
-  IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)wid;
-  IMAGE_INSTANCE_X_WIDGET_LWID (ii) = id;
-  /* because the EmacsManager is the widgets parent we have to
-     offset the redisplay of the widget by the amount the text
-     widget is inside the manager. */
-  ac = 0;
-  XtSetArg (al [ac], XtNx, &IMAGE_INSTANCE_X_WIDGET_XOFFSET (ii)); ac++;
-  XtSetArg (al [ac], XtNy, &IMAGE_INSTANCE_X_WIDGET_YOFFSET (ii)); ac++;
-  XtGetValues (FRAME_X_TEXT_WIDGET (f), al, ac);
-
-  XtSetMappedWhenManaged (wid, TRUE);
-
-  free_widget_value_tree (wv);
-  /* A kludgy but simple way to make sure the callback for a widget
-     doesn't get deleted. */
-  gcpro_popup_callbacks (id);
-}
-
-/* get properties of a control */
-static Lisp_Object
-x_widget_property (Lisp_Object image_instance, Lisp_Object prop)
-{
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  /* get the text from a control */
-  if (EQ (prop, Q_text))
-    {
-      widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii));
-      return build_ext_string (wv->value, Qnative);
-    }
-  return Qunbound;
-}
-
-/* Instantiate a layout control for putting other widgets in. */
-static void
-x_native_layout_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
-			     Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-			     int dest_mask, Lisp_Object domain)
-{
-  x_widget_instantiate (image_instance, instantiator, pointer_fg,
-			pointer_bg, dest_mask, domain, "layout", 0);
+  XResizeWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (ii)),
+		 IMAGE_INSTANCE_X_SUBWINDOW_ID (ii),
+		 w, h);
 }
 
-/* Instantiate a button widget. Unfortunately instantiated widgets are
-   particular to a frame since they need to have a parent. It's not
-   like images where you just select the image into the context you
-   want to display it in and BitBlt it. So images instances can have a
-   many-to-one relationship with things you see, whereas widgets can
-   only be one-to-one (i.e. per frame) */
-static void
-x_button_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
-		      Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		      int dest_mask, Lisp_Object domain)
-{
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
-  Lisp_Object glyph = find_keyword_in_vector (instantiator, Q_image);
-  widget_value* wv = gui_items_to_widget_values (image_instance, gui);
-
-  if (!NILP (glyph))
-    {
-      if (!IMAGE_INSTANCEP (glyph))
-	glyph = glyph_image_instance (glyph, domain, ERROR_ME, 1);
-    }
-
-  x_widget_instantiate (image_instance, instantiator, pointer_fg,
-			pointer_bg, dest_mask, domain, "button", wv);
-
-  /* add the image if one was given */
-  if (!NILP (glyph) && IMAGE_INSTANCEP (glyph)
-      && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (glyph)))
-    {
-      Arg al [2];
-      int ac =0;
-#ifdef LWLIB_WIDGETS_MOTIF
-      XtSetArg (al [ac], XmNlabelType, XmPIXMAP);	ac++;
-      XtSetArg (al [ac], XmNlabelPixmap, XIMAGE_INSTANCE_X_PIXMAP (glyph));ac++;
-#else
-      XtSetArg (al [ac], XtNpixmap, XIMAGE_INSTANCE_X_PIXMAP (glyph));	ac++;
-#endif
-      XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, ac);
-    }
-}
-
-/* Update a button's clicked state.
-
-   #### This is overkill, but it works. Right now this causes all
-   button instances to flash for some reason buried deep in lwlib. In
-   theory this should be the Right Thing to do since lwlib should only
-   merge in changed values - and if nothing has changed then nothing
-   should get done. This may be because of the args stuff,
-   i.e. although the arg contents may be the same the args look
-   different and so are re-applied to the widget. */
-static void
-x_button_update (Lisp_Object image_instance)
-{
-  /* This function can GC if IN_REDISPLAY is false. */
-  Lisp_Image_Instance *p = XIMAGE_INSTANCE (image_instance);
-  widget_value* wv =
-    gui_items_to_widget_values (image_instance,
-				IMAGE_INSTANCE_WIDGET_ITEMS (p));
-
-  /* now modify the widget */
-  lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p),
-			 wv, True);
-  free_widget_value_tree (wv);
-}
-
-/* get properties of a button */
-static Lisp_Object
-x_button_property (Lisp_Object image_instance, Lisp_Object prop)
-{
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  /* check the state of a button */
-  if (EQ (prop, Q_selected))
-    {
-      widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii));
-
-      if (wv->selected)
-	return Qt;
-      else
-	return Qnil;
-    }
-  return Qunbound;
-}
-
-/* instantiate a progress gauge */
-static void
-x_progress_gauge_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
-			Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-			int dest_mask, Lisp_Object domain)
-{
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
-  widget_value* wv = gui_items_to_widget_values (image_instance, gui);
-
-  x_widget_instantiate (image_instance, instantiator, pointer_fg,
-			pointer_bg, dest_mask, domain, "progress", wv);
-}
-
-/* set the properties of a progres guage */
-static void
-x_progress_gauge_update (Lisp_Object image_instance)
-{
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-
-  if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii))
-    {
-      Arg al [1];
-      Lisp_Object val;
-#ifdef ERROR_CHECK_GLYPHS
-      assert (GUI_ITEMP (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii)));
-#endif
-      val = XGUI_ITEM (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii))->value;
-      XtSetArg (al[0], XtNvalue, XINT (val));
-      XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, 1);
-    }
-}
-
-/* instantiate an edit control */
-static void
-x_edit_field_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
-		    Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		    int dest_mask, Lisp_Object domain)
-{
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
-  widget_value* wv = gui_items_to_widget_values (image_instance, gui);
-
-  x_widget_instantiate (image_instance, instantiator, pointer_fg,
-			pointer_bg, dest_mask, domain, "text-field", wv);
-}
-
-#if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1
-/* instantiate a combo control */
-static void
-x_combo_box_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
-		     Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		     int dest_mask, Lisp_Object domain)
-{
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  widget_value * wv = 0;
-  /* This is not done generically because of sizing problems under
-     mswindows. */
-  widget_instantiate (image_instance, instantiator, pointer_fg,
-		      pointer_bg, dest_mask, domain);
-
-  wv = gui_items_to_widget_values (image_instance,
-				   IMAGE_INSTANCE_WIDGET_ITEMS (ii));
-
-  x_widget_instantiate (image_instance, instantiator, pointer_fg,
-			pointer_bg, dest_mask, domain, "combo-box", wv);
-}
-#endif
-
-static void
-x_tab_control_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
-			   Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-			   int dest_mask, Lisp_Object domain)
-{
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  widget_value * wv =
-    gui_items_to_widget_values (image_instance,
-				IMAGE_INSTANCE_WIDGET_ITEMS (ii));
-
-  update_tab_widget_face (wv, ii,
-			  IMAGE_INSTANCE_FRAME (ii));
-
-  x_widget_instantiate (image_instance, instantiator, pointer_fg,
-			pointer_bg, dest_mask, domain, "tab-control", wv);
-}
-
-/* set the properties of a tab control */
-static void
-x_tab_control_update (Lisp_Object image_instance)
-{
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-
-  /* Possibly update the face. */
-  if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (ii)
-      ||
-      XFRAME (IMAGE_INSTANCE_FRAME (ii))->faces_changed
-      ||
-      IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii))
-    {
-      widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii));
-
-      /* #### I don't know why this can occur. */
-      if (!wv)
-	return;
-
-      update_tab_widget_face (wv, ii,
-			      IMAGE_INSTANCE_FRAME (ii));
-
-      lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, True);
-    }
-}
-
-/* instantiate a static control possible for putting other things in */
-static void
-x_label_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
-		     Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		     int dest_mask, Lisp_Object domain)
-{
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
-  widget_value* wv = gui_items_to_widget_values (image_instance, gui);
-
-  x_widget_instantiate (image_instance, instantiator, pointer_fg,
-			pointer_bg, dest_mask, domain, "button", wv);
-}
-#endif /* HAVE_WIDGETS */
-
 
 /************************************************************************/
 /*                            initialization                            */
@@ -2789,76 +2097,23 @@
   CONSOLE_HAS_METHOD (x, locate_pixmap_file);
   CONSOLE_HAS_METHOD (x, unmap_subwindow);
   CONSOLE_HAS_METHOD (x, map_subwindow);
-  CONSOLE_HAS_METHOD (x, update_widget);
-  CONSOLE_HAS_METHOD (x, update_subwindow);
+  CONSOLE_HAS_METHOD (x, resize_subwindow);
 }
 
 void
 image_instantiator_format_create_glyphs_x (void)
 {
-  IIFORMAT_VALID_CONSOLE (x, nothing);
-  IIFORMAT_VALID_CONSOLE (x, string);
-#ifdef HAVE_WIDGETS
-  IIFORMAT_VALID_CONSOLE (x, layout);
-#endif
-  IIFORMAT_VALID_CONSOLE (x, formatted_string);
-  IIFORMAT_VALID_CONSOLE (x, inherit);
 #ifdef HAVE_XPM
   INITIALIZE_DEVICE_IIFORMAT (x, xpm);
   IIFORMAT_HAS_DEVMETHOD (x, xpm, instantiate);
 #endif
-#ifdef HAVE_JPEG
-  IIFORMAT_VALID_CONSOLE (x, jpeg);
-#endif
-#ifdef HAVE_TIFF
-  IIFORMAT_VALID_CONSOLE (x, tiff);
-#endif
-#ifdef HAVE_PNG
-  IIFORMAT_VALID_CONSOLE (x, png);
-#endif
-#ifdef HAVE_GIF
-  IIFORMAT_VALID_CONSOLE (x, gif);
-#endif
   INITIALIZE_DEVICE_IIFORMAT (x, xbm);
   IIFORMAT_HAS_DEVMETHOD (x, xbm, instantiate);
 
   INITIALIZE_DEVICE_IIFORMAT (x, subwindow);
   IIFORMAT_HAS_DEVMETHOD (x, subwindow, instantiate);
-#ifdef HAVE_WIDGETS
-  /* layout widget */
-  INITIALIZE_DEVICE_IIFORMAT (x, native_layout);
-  IIFORMAT_HAS_DEVMETHOD (x, native_layout, instantiate);
-  /* button widget */
-  INITIALIZE_DEVICE_IIFORMAT (x, button);
-  IIFORMAT_HAS_DEVMETHOD (x, button, property);
-  IIFORMAT_HAS_DEVMETHOD (x, button, instantiate);
-  IIFORMAT_HAS_DEVMETHOD (x, button, update);
-  /* general widget methods. */
-  INITIALIZE_DEVICE_IIFORMAT (x, widget);
-  IIFORMAT_HAS_DEVMETHOD (x, widget, property);
-  /* progress gauge */
-  INITIALIZE_DEVICE_IIFORMAT (x, progress_gauge);
-  IIFORMAT_HAS_DEVMETHOD (x, progress_gauge, update);
-  IIFORMAT_HAS_DEVMETHOD (x, progress_gauge, instantiate);
-  /* text field */
-  INITIALIZE_DEVICE_IIFORMAT (x, edit_field);
-  IIFORMAT_HAS_DEVMETHOD (x, edit_field, instantiate);
-#if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1
-  /* combo box */
-  INITIALIZE_DEVICE_IIFORMAT (x, combo_box);
-  IIFORMAT_HAS_DEVMETHOD (x, combo_box, instantiate);
-  IIFORMAT_HAS_SHARED_DEVMETHOD (x, combo_box, update, tab_control);
-#endif
-  /* tab control widget */
-  INITIALIZE_DEVICE_IIFORMAT (x, tab_control);
-  IIFORMAT_HAS_DEVMETHOD (x, tab_control, instantiate);
-  IIFORMAT_HAS_DEVMETHOD (x, tab_control, update);
-  /* label */
-  INITIALIZE_DEVICE_IIFORMAT (x, label);
-  IIFORMAT_HAS_DEVMETHOD (x, label, instantiate);
-#endif
+
   INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (cursor_font, "cursor-font");
-  IIFORMAT_VALID_CONSOLE (x, cursor_font);
 
   IIFORMAT_HAS_METHOD (cursor_font, validate);
   IIFORMAT_HAS_METHOD (cursor_font, possible_dest_types);
@@ -2873,7 +2128,6 @@
   IIFORMAT_HAS_METHOD (font, validate);
   IIFORMAT_HAS_METHOD (font, possible_dest_types);
   IIFORMAT_HAS_METHOD (font, instantiate);
-  IIFORMAT_VALID_CONSOLE (x, font);
 
   IIFORMAT_VALID_KEYWORD (font, Q_data, check_valid_string);
   IIFORMAT_VALID_KEYWORD (font, Q_foreground, check_valid_string);
@@ -2891,7 +2145,6 @@
   IIFORMAT_HAS_METHOD (autodetect, normalize);
   IIFORMAT_HAS_METHOD (autodetect, possible_dest_types);
   IIFORMAT_HAS_METHOD (autodetect, instantiate);
-  IIFORMAT_VALID_CONSOLE (x, autodetect);
 
   IIFORMAT_VALID_KEYWORD (autodetect, Q_data, check_valid_string);
 }
@@ -2919,7 +2172,7 @@
 		     make_int (name##_height),			\
 		     make_ext_string (name##_bits,		\
 				      sizeof (name##_bits),	\
-				      Qbinary))),		\
+				      FORMAT_BINARY))),		\
      Qglobal, Qx, Qnil)
 
   BUILD_GLYPH_INST (Vtruncation_glyph, truncator);