diff src/glyphs-msw.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 e804706bfb8c
line wrap: on
line diff
--- a/src/glyphs-msw.c	Mon Aug 13 11:19:22 2007 +0200
+++ b/src/glyphs-msw.c	Mon Aug 13 11:20:41 2007 +0200
@@ -1,6 +1,6 @@
 /* mswindows-specific glyph objects.
-   Copyright (C) 1998, 1999, 2000 Andy Piper.
-
+   Copyright (C) 1998 Andy Piper.
+   
 This file is part of XEmacs.
 
 XEmacs is free software; you can redistribute it and/or modify it
@@ -20,7 +20,7 @@
 
 /* Synched up with: Not in FSF. */
 
-/* written by Andy Piper <andy@xemacs.org> plagiarising bits from
+/* written by Andy Piper <andy@xemacs.org> plagerising bits from
    glyphs-x.c */
 
 #include <config.h>
@@ -53,44 +53,24 @@
 
 #define WIDGET_GLYPH_SLOT 0
 
-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 (mswindows, xpm);
-DEFINE_DEVICE_IIFORMAT (msprinter, xpm);
 #endif
 DEFINE_DEVICE_IIFORMAT (mswindows, xbm);
-DEFINE_DEVICE_IIFORMAT (msprinter, xbm);
 #ifdef HAVE_XFACE
 DEFINE_DEVICE_IIFORMAT (mswindows, xface);
-DEFINE_DEVICE_IIFORMAT (msprinter, xface);
 #endif
-DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout);
-DEFINE_DEVICE_IIFORMAT (mswindows, native_layout);
 DEFINE_DEVICE_IIFORMAT (mswindows, button);
-DEFINE_DEVICE_IIFORMAT (mswindows, edit_field);
+DEFINE_DEVICE_IIFORMAT (mswindows, edit);
+#if 0
+DEFINE_DEVICE_IIFORMAT (mswindows, group);
+#endif
 DEFINE_DEVICE_IIFORMAT (mswindows, subwindow);
 DEFINE_DEVICE_IIFORMAT (mswindows, widget);
 DEFINE_DEVICE_IIFORMAT (mswindows, label);
 DEFINE_DEVICE_IIFORMAT (mswindows, scrollbar);
-DEFINE_DEVICE_IIFORMAT (mswindows, combo_box);
-DEFINE_DEVICE_IIFORMAT (mswindows, progress_gauge);
-DEFINE_DEVICE_IIFORMAT (mswindows, tree_view);
-DEFINE_DEVICE_IIFORMAT (mswindows, tab_control);
+DEFINE_DEVICE_IIFORMAT (mswindows, combo);
+DEFINE_DEVICE_IIFORMAT (mswindows, progress);
 
 DEFINE_IMAGE_INSTANTIATOR_FORMAT (bmp);
 Lisp_Object Qbmp;
@@ -102,60 +82,13 @@
 Lisp_Object Qmswindows_resource;
 
 static void
-mswindows_initialize_dibitmap_image_instance (Lisp_Image_Instance *ii,
-					     int slices,
-					     enum image_instance_type type);
+mswindows_initialize_dibitmap_image_instance (struct Lisp_Image_Instance *ii,
+					      enum image_instance_type type);
 static void
-mswindows_initialize_image_instance_mask (Lisp_Image_Instance* image,
-					  HDC hcdc);
-
-/*
- * Given device D, retrieve compatible device context. D can be either
- * mswindows or an msprinter device.
- */
-inline static HDC
-get_device_compdc (struct device *d)
-{
-  if (DEVICE_MSWINDOWS_P (d))
-    return DEVICE_MSWINDOWS_HCDC (d);
-  else
-    return DEVICE_MSPRINTER_HCDC (d);
-}
+mswindows_initialize_image_instance_mask (struct Lisp_Image_Instance* image, 
+					  struct frame* f);
 
-/*
- * Initialize image instance pixel sizes in II.  For a display bitmap,
- * these will be same as real bitmap sizes.  For a printer bitmap,
- * these will be scaled up so that the bitmap is proportionally enlarged
- * when output to printer.  Redisplay code takes care of scaling, to
- * conserve memory we do not really scale bitmaps.  Set the watermark
- * only here.
- * #### Add support for unscalable bitmaps.
- */
-static void init_image_instance_geometry (Lisp_Image_Instance *ii)
-{
-  struct device *d = DOMAIN_XDEVICE (ii->domain);
-  
-  if (/* #### Scaleable && */ DEVICE_MSPRINTER_P (d))
-    {
-      HDC printer_dc = DEVICE_MSPRINTER_HCDC (d);
-      HDC display_dc = CreateCompatibleDC (NULL);
-      IMAGE_INSTANCE_PIXMAP_WIDTH (ii) =
-	MulDiv (IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii),
-		GetDeviceCaps (printer_dc, LOGPIXELSX),
-		GetDeviceCaps (display_dc, LOGPIXELSX));
-      IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) =
-	MulDiv (IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii),
-		GetDeviceCaps (printer_dc, LOGPIXELSY),
-		GetDeviceCaps (display_dc, LOGPIXELSY));
-    }
-  else
-    {
-      IMAGE_INSTANCE_PIXMAP_WIDTH (ii) =
-	IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii);
-      IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) =
-	IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii);
-    }      
-}
+COLORREF mswindows_string_to_color (CONST char *name);
 
 #define BPLINE(width) ((int)(~3UL & (unsigned long)((width) +3)))
 
@@ -176,7 +109,7 @@
   BITMAPINFO*	bmp_info;
   unsigned char *ip, *dp;
 
-  if (GetDeviceCaps (get_device_compdc (d), BITSPIXEL) > 0)
+  if (DEVICE_MSWINDOWS_BITSPIXEL (d) > 0)
     {
       int bpline = BPLINE(width * 3);
       /* FIXME: we can do this because 24bpp implies no color table, once
@@ -187,7 +120,7 @@
        * structure - unless it has memory / color allocation implications
        * .... */
       bmp_info=xnew_and_zero (BITMAPINFO);
-
+      
       if (!bmp_info)
 	{
 	  return NULL;
@@ -195,7 +128,7 @@
 
       bmp_info->bmiHeader.biBitCount=24; /* just RGB triples for now */
       bmp_info->bmiHeader.biCompression=BI_RGB; /* just RGB triples for now */
-      bmp_info->bmiHeader.biSizeImage=width*height*3;
+      bmp_info->bmiHeader.biSizeImage=width*height*3; 
 
       /* bitmap data needs to be in blue, green, red triples - in that
 	 order, eimage is in RGB format so we need to convert */
@@ -231,7 +164,7 @@
 
       /* use our quantize table to allocate the colors */
       ncolors = qtable->num_active_colors;
-      bmp_info=(BITMAPINFO*)xmalloc_and_zero (sizeof(BITMAPINFOHEADER) +
+      bmp_info=(BITMAPINFO*)xmalloc_and_zero (sizeof(BITMAPINFOHEADER) + 
 					     sizeof(RGBQUAD) * ncolors);
       if (!bmp_info)
 	{
@@ -241,12 +174,12 @@
 
       colortbl=(RGBQUAD*)(((unsigned char*)bmp_info)+sizeof(BITMAPINFOHEADER));
 
-      bmp_info->bmiHeader.biBitCount=8;
-      bmp_info->bmiHeader.biCompression=BI_RGB;
+      bmp_info->bmiHeader.biBitCount=8; 
+      bmp_info->bmiHeader.biCompression=BI_RGB; 
       bmp_info->bmiHeader.biSizeImage=bpline*height;
-      bmp_info->bmiHeader.biClrUsed=ncolors;
-      bmp_info->bmiHeader.biClrImportant=ncolors;
-
+      bmp_info->bmiHeader.biClrUsed=ncolors; 
+      bmp_info->bmiHeader.biClrImportant=ncolors; 
+      
       *bmp_data = (unsigned char *) xmalloc_and_zero (bpline * height);
       *bit_count = bpline * height;
 
@@ -256,39 +189,36 @@
 	  xfree (bmp_info);
 	  return NULL;
 	}
-
+      
       /* build up an RGBQUAD colortable */
-      for (i = 0; i < qtable->num_active_colors; i++)
-	{
-	  colortbl[i].rgbRed = (BYTE) qtable->rm[i];
-	  colortbl[i].rgbGreen = (BYTE) qtable->gm[i];
-	  colortbl[i].rgbBlue = (BYTE) qtable->bm[i];
-	  colortbl[i].rgbReserved = 0;
-	}
+      for (i = 0; i < qtable->num_active_colors; i++) {
+	colortbl[i].rgbRed = (BYTE) qtable->rm[i];
+	colortbl[i].rgbGreen = (BYTE) qtable->gm[i];
+	colortbl[i].rgbBlue = (BYTE) qtable->bm[i];
+	colortbl[i].rgbReserved = 0;
+      }
 
       /* now build up the data. picture has to be upside-down and
          back-to-front for msw bitmaps */
       ip = pic;
-      for (i = height-1; i >= 0; i--)
-	{
-	  dp = (*bmp_data) + (i * bpline);
-	  for (j = 0; j < width; j++)
-	    {
-	      rd = *ip++;
-	      gr = *ip++;
-	      bl = *ip++;
-	      *dp++ = QUANT_GET_COLOR (qtable,rd,gr,bl);
-	    }
+      for (i = height-1; i >= 0; i--) {
+	dp = (*bmp_data) + (i * bpline);
+	for (j = 0; j < width; j++) {
+	  rd = *ip++;
+	  gr = *ip++;
+	  bl = *ip++;
+	  *dp++ = QUANT_GET_COLOR (qtable,rd,gr,bl);
 	}
+      }
       xfree (qtable);
-    }
+    } 
   /* fix up the standard stuff */
   bmp_info->bmiHeader.biWidth=width;
   bmp_info->bmiHeader.biHeight=height;
   bmp_info->bmiHeader.biPlanes=1;
   bmp_info->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
   bmp_info->bmiHeader.biXPelsPerMeter=0; /* unless you know better */
-  bmp_info->bmiHeader.biYPelsPerMeter=0;
+  bmp_info->bmiHeader.biYPelsPerMeter=0; 
 
   return bmp_info;
 }
@@ -312,7 +242,7 @@
 	 (IS_DIRECTORY_SEP(XSTRING_BYTE (name, 2)))))))
     {
       if (!NILP (Ffile_readable_p (name)))
-	return Fexpand_file_name (name, Qnil);
+	return name;
       else
 	return Qnil;
     }
@@ -326,7 +256,7 @@
       locate_file (temp, name, Qnil, &found, R_OK);
       UNGCPRO;
     }
-
+    
   return found;
 }
 
@@ -339,36 +269,45 @@
    in the error message. */
 
 static void
-init_image_instance_from_dibitmap (Lisp_Image_Instance *ii,
+init_image_instance_from_dibitmap (struct Lisp_Image_Instance *ii,
 				   BITMAPINFO *bmp_info,
 				   int dest_mask,
 				   void *bmp_data,
 				   int bmp_bits,
-				   int slices,
-				   Lisp_Object instantiator,
+				   Lisp_Object instantiator, 
 				   int x_hot, int y_hot,
 				   int create_mask)
 {
-  struct device *d = XDEVICE (IMAGE_INSTANCE_DEVICE (ii));
+  Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
+  struct device *d = XDEVICE (device);
+  struct frame *f;
   void* bmp_buf=0;
-  enum image_instance_type type;
+  int type;
   HBITMAP bitmap;
   HDC hdc;
 
+  if (!DEVICE_MSWINDOWS_P (d))
+    signal_simple_error ("Not an mswindows device", device);
+
+  if (NILP (DEVICE_SELECTED_FRAME (d)))
+    signal_simple_error ("No selected frame on mswindows device", device);
+
+  f = XFRAME (DEVICE_SELECTED_FRAME (d));
+  
   if (dest_mask & IMAGE_COLOR_PIXMAP_MASK)
     type = IMAGE_COLOR_PIXMAP;
   else if (dest_mask & IMAGE_POINTER_MASK)
     type = IMAGE_POINTER;
-  else
+  else 
     incompatible_image_types (instantiator, dest_mask,
 			      IMAGE_COLOR_PIXMAP_MASK | IMAGE_POINTER_MASK);
+  hdc = FRAME_MSWINDOWS_CDC (f);
 
-  hdc = get_device_compdc (d);
-  bitmap = CreateDIBSection (hdc,
-			     bmp_info,
-			     DIB_RGB_COLORS,
-			     &bmp_buf,
-			     0, 0);
+  bitmap=CreateDIBSection (hdc,  
+			  bmp_info,
+			  DIB_RGB_COLORS,
+			  &bmp_buf, 
+			  0,0);
 
   if (!bitmap || !bmp_buf)
     signal_simple_error ("Unable to create bitmap", instantiator);
@@ -376,29 +315,24 @@
   /* copy in the actual bitmap */
   memcpy (bmp_buf, bmp_data, bmp_bits);
 
-  mswindows_initialize_dibitmap_image_instance (ii, slices, type);
+  mswindows_initialize_dibitmap_image_instance (ii, type);
 
   IMAGE_INSTANCE_PIXMAP_FILENAME (ii) =
     find_keyword_in_vector (instantiator, Q_file);
 
-  /* Fixup a set of bitmaps. */
   IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = bitmap;
-
   IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = NULL;
-  IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii) =
-    bmp_info->bmiHeader.biWidth;
-  IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii) =
-    bmp_info->bmiHeader.biHeight;
-  IMAGE_INSTANCE_PIXMAP_DEPTH (ii)   = bmp_info->bmiHeader.biBitCount;
+  IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = bmp_info->bmiHeader.biWidth;
+  IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = bmp_info->bmiHeader.biHeight;
+  IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = bmp_info->bmiHeader.biBitCount;
   XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii), x_hot);
   XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii), y_hot);
-  init_image_instance_geometry (ii);
 
   if (create_mask)
     {
-      mswindows_initialize_image_instance_mask (ii, hdc);
+      mswindows_initialize_image_instance_mask (ii, f);
     }
-
+  
   if (type == IMAGE_POINTER)
     {
       mswindows_initialize_image_instance_icon(ii, TRUE);
@@ -406,35 +340,9 @@
 }
 
 static void
-image_instance_add_dibitmap (Lisp_Image_Instance *ii,
-			     BITMAPINFO *bmp_info,
-			     void *bmp_data,
-			     int bmp_bits,
-			     int slice,
-			     Lisp_Object instantiator)
-{
-  struct device *d = XDEVICE (IMAGE_INSTANCE_DEVICE (ii));
-  void* bmp_buf=0;
-
-  HBITMAP bitmap = CreateDIBSection (get_device_compdc (d),
-				     bmp_info,
-				     DIB_RGB_COLORS,
-				     &bmp_buf,
-				     0,0);
-
-  if (!bitmap || !bmp_buf)
-    signal_simple_error ("Unable to create bitmap", instantiator);
-
-  /* copy in the actual bitmap */
-  memcpy (bmp_buf, bmp_data, bmp_bits);
-  IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE (ii, slice) = bitmap;
-}
-
-static void
-mswindows_init_image_instance_from_eimage (Lisp_Image_Instance *ii,
+mswindows_init_image_instance_from_eimage (struct Lisp_Image_Instance *ii,
 					   int width, int height,
-					   int slices,
-					   unsigned char *eimage,
+					   unsigned char *eimage, 
 					   int dest_mask,
 					   Lisp_Object instantiator,
 					   Lisp_Object domain)
@@ -444,86 +352,79 @@
   unsigned char*	bmp_data;
   int			bmp_bits;
   COLORREF		bkcolor;
-  int slice;
-
-  CHECK_MSGDI_DEVICE (device);
+  
+  if (!DEVICE_MSWINDOWS_P (XDEVICE (device)))
+    signal_simple_error ("Not an mswindows device", device);
 
   /* this is a hack but MaskBlt and TransparentBlt are not supported
      on most windows variants */
-  bkcolor = COLOR_INSTANCE_MSWINDOWS_COLOR
+  bkcolor = COLOR_INSTANCE_MSWINDOWS_COLOR 
     (XCOLOR_INSTANCE (FACE_BACKGROUND (Vdefault_face, domain)));
 
-  for (slice = 0; slice < slices; slice++)
+  /* build a bitmap from the eimage */
+  if (!(bmp_info=convert_EImage_to_DIBitmap (device, width, height, eimage,
+					     &bmp_bits, &bmp_data)))
     {
-      /* build a bitmap from the eimage */
-      if (!(bmp_info=convert_EImage_to_DIBitmap (device, width, height,
-						 eimage + (width * height * 3 * slice),
-						 &bmp_bits, &bmp_data)))
-	{
-	  signal_simple_error ("EImage to DIBitmap conversion failed",
-			       instantiator);
-	}
+      signal_simple_error ("EImage to DIBitmap conversion failed",
+			   instantiator);
+    }
 
-      /* Now create the pixmap and set up the image instance */
-      if (slice == 0)
-	init_image_instance_from_dibitmap (ii, bmp_info, dest_mask,
-					   bmp_data, bmp_bits, slices, instantiator,
-					   0, 0, 0);
-      else
-	image_instance_add_dibitmap (ii, bmp_info, bmp_data, bmp_bits, slice,
-				     instantiator);
+  /* Now create the pixmap and set up the image instance */
+  init_image_instance_from_dibitmap (ii, bmp_info, dest_mask,
+				     bmp_data, bmp_bits, instantiator,
+				     0, 0, 0);
 
-      xfree (bmp_info);
-      xfree (bmp_data);
-    }
+  xfree (bmp_info);
+  xfree (bmp_data);
 }
 
-inline static void
-set_mono_pixel (unsigned char* bits,
-		int bpline, int height,
-		int x, int y, int white)
-{
-  int i;
-  unsigned char bitnum;
+static void set_mono_pixel ( unsigned char* bits, 
+			     int bpline, int height, 
+			     int x, int y, int white ) 
+{ 
+  int index;
+  unsigned char    bitnum;  
   /* Find the byte on which this scanline begins */
-  i = (height - y - 1) * bpline;
+  index = (height - y - 1) * bpline; 
   /* Find the byte containing this pixel */
-  i += (x >> 3);
+  index += (x >> 3); 
   /* Which bit is it? */
-  bitnum = (unsigned char) (7 - (x & 7));
-  if (white)	/* Turn it on */
-    bits[i] |= (1 << bitnum);
-  else          /* Turn it off */
-    bits[i] &= ~(1 << bitnum);
-}
+  bitnum = (unsigned char)( 7 - (x % 8) );  
+  if( white )         /* Turn it on */
+    bits[index] |= (1<<bitnum);
+  else         /* Turn it off */
+    bits[index] &= ~(1<<bitnum); 
+} 
 
 static void
-mswindows_initialize_image_instance_mask (Lisp_Image_Instance* image,
-					  HDC hcdc)
+mswindows_initialize_image_instance_mask (struct Lisp_Image_Instance* image, 
+					  struct frame* f)
 {
   HBITMAP mask;
   HGDIOBJ old = NULL;
-  unsigned char *dibits, *and_bits;
-  BITMAPINFO *bmp_info =
-    (BITMAPINFO*) xmalloc_and_zero (sizeof (BITMAPINFO) + sizeof (RGBQUAD));
+  HDC hcdc = FRAME_MSWINDOWS_CDC (f);
+  unsigned char* dibits;
+  BITMAPINFO* bmp_info = 
+    xmalloc_and_zero (sizeof(BITMAPINFO) + sizeof(RGBQUAD));
   int i, j;
-  int height = IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (image);
-
-  int maskbpline = BPLINE ((IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (image) + 7) / 8);
-  int bpline = BPLINE (IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (image) * 3);
+  int height = IMAGE_INSTANCE_PIXMAP_HEIGHT (image);
+  
+  void* and_bits; 
+  int maskbpline = BPLINE (((IMAGE_INSTANCE_PIXMAP_WIDTH (image)+7)/8));
+  int bpline = BPLINE (IMAGE_INSTANCE_PIXMAP_WIDTH (image) * 3); 
 
   if (!bmp_info)
     return;
 
-  bmp_info->bmiHeader.biWidth=IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (image);
+  bmp_info->bmiHeader.biWidth=IMAGE_INSTANCE_PIXMAP_WIDTH (image);
   bmp_info->bmiHeader.biHeight = height;
-  bmp_info->bmiHeader.biPlanes = 1;
+  bmp_info->bmiHeader.biPlanes=1;
   bmp_info->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
-  bmp_info->bmiHeader.biBitCount = 1;
-  bmp_info->bmiHeader.biCompression = BI_RGB;
-  bmp_info->bmiHeader.biClrUsed = 2;
-  bmp_info->bmiHeader.biClrImportant = 2;
-  bmp_info->bmiHeader.biSizeImage = height * maskbpline;
+  bmp_info->bmiHeader.biBitCount=1; 
+  bmp_info->bmiHeader.biCompression=BI_RGB; 
+  bmp_info->bmiHeader.biClrUsed = 2; 
+  bmp_info->bmiHeader.biClrImportant = 2; 
+  bmp_info->bmiHeader.biSizeImage = height * maskbpline; 
   bmp_info->bmiColors[0].rgbRed = 0;
   bmp_info->bmiColors[0].rgbGreen = 0;
   bmp_info->bmiColors[0].rgbBlue = 0;
@@ -532,11 +433,11 @@
   bmp_info->bmiColors[1].rgbGreen = 255;
   bmp_info->bmiColors[1].rgbBlue = 255;
   bmp_info->bmiColors[0].rgbReserved = 0;
-
-  if (!(mask = CreateDIBSection (hcdc,
+    
+  if (!(mask = CreateDIBSection (hcdc,  
 				 bmp_info,
 				 DIB_RGB_COLORS,
-				 (void**)&and_bits,
+				 &and_bits, 
 				 0,0)))
     {
       xfree (bmp_info);
@@ -547,17 +448,17 @@
   /* build up an in-memory set of bits to mess with */
   xzero (*bmp_info);
 
-  bmp_info->bmiHeader.biWidth = IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (image);
+  bmp_info->bmiHeader.biWidth=IMAGE_INSTANCE_PIXMAP_WIDTH (image);
   bmp_info->bmiHeader.biHeight = -height;
-  bmp_info->bmiHeader.biPlanes = 1;
-  bmp_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
-  bmp_info->bmiHeader.biBitCount = 24;
-  bmp_info->bmiHeader.biCompression = BI_RGB;
-  bmp_info->bmiHeader.biClrUsed = 0;
-  bmp_info->bmiHeader.biClrImportant = 0;
+  bmp_info->bmiHeader.biPlanes=1;
+  bmp_info->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
+  bmp_info->bmiHeader.biBitCount=24; 
+  bmp_info->bmiHeader.biCompression=BI_RGB; 
+  bmp_info->bmiHeader.biClrUsed = 0; 
+  bmp_info->bmiHeader.biClrImportant = 0; 
   bmp_info->bmiHeader.biSizeImage = height * bpline;
 
-  dibits = (unsigned char*) xmalloc_and_zero (bpline * height);
+  dibits = xmalloc_and_zero (bpline * height);
   if (GetDIBits (hcdc,
 		 IMAGE_INSTANCE_MSWINDOWS_BITMAP (image),
 		 0,
@@ -572,20 +473,20 @@
 
   /* now set the colored bits in the mask and transparent ones to
      black in the original */
-  for (i = 0; i < IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (image); i++)
-    {
-      for (j=0; j<height; j++)
-	{
+  for(i=0; i<IMAGE_INSTANCE_PIXMAP_WIDTH (image); i++)     
+    { 
+      for(j=0; j<height; j++)         
+	{ 
 	  unsigned char* idx = &dibits[j * bpline + i * 3];
 
-	  if (RGB (idx[2], idx[1], idx[0]) == transparent_color)
-	    {
+	  if( RGB (idx[2], idx[1], idx[0]) == transparent_color )
+	    { 
 	      idx[0] = idx[1] = idx[2] = 0;
-	      set_mono_pixel (and_bits, maskbpline, height, i, j, TRUE);
+	      set_mono_pixel( and_bits, maskbpline, height, i, j, TRUE );
 	    }
-	  else
-	    {
-	      set_mono_pixel (and_bits, maskbpline, height, i, j, FALSE);
+	  else             
+	    { 
+	      set_mono_pixel( and_bits, maskbpline, height, i, j, FALSE );
             }
 	}
     }
@@ -600,14 +501,14 @@
 
   xfree (bmp_info);
   xfree (dibits);
-
+  
   SelectObject(hcdc, old);
 
   IMAGE_INSTANCE_MSWINDOWS_MASK (image) = mask;
 }
 
 void
-mswindows_initialize_image_instance_icon (Lisp_Image_Instance* image,
+mswindows_initialize_image_instance_icon (struct Lisp_Image_Instance* image,
 					  int cursor)
 {
   ICONINFO x_icon;
@@ -618,32 +519,31 @@
   x_icon.yHotspot=XINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (image));
   x_icon.hbmMask=IMAGE_INSTANCE_MSWINDOWS_MASK (image);
   x_icon.hbmColor=IMAGE_INSTANCE_MSWINDOWS_BITMAP (image);
-
+  
   IMAGE_INSTANCE_MSWINDOWS_ICON (image)=
     CreateIconIndirect (&x_icon);
 }
 
-static HBITMAP
-create_resized_bitmap (HBITMAP curbmp, struct frame *f,
-		       int curx, int cury,
-		       int newx, int newy)
+HBITMAP
+mswindows_create_resized_bitmap (struct Lisp_Image_Instance* ii,
+				 struct frame* f,
+				 int newx, int newy)
 {
   HBITMAP newbmp;
   HGDIOBJ old1, old2;
-
-  HDC hcdc = get_device_compdc (XDEVICE (FRAME_DEVICE (f)));
-  HDC hdcDst = CreateCompatibleDC (hcdc);
-
-  old1 = SelectObject (hcdc, curbmp);
-
+  HDC hcdc = FRAME_MSWINDOWS_CDC (f);
+  HDC hdcDst = CreateCompatibleDC (hcdc);  
+  
+  old1 = SelectObject (hcdc, IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii)); 
+  
   newbmp = CreateCompatibleBitmap (hcdc, newx, newy);
 
   old2 = SelectObject (hdcDst, newbmp);
-
+  
   if (!StretchBlt (hdcDst, 0, 0, newx, newy,
-		   hcdc, 0, 0,
-		   curx,
-		   cury,
+		   hcdc, 0, 0, 
+		   IMAGE_INSTANCE_PIXMAP_WIDTH (ii), 
+		   IMAGE_INSTANCE_PIXMAP_HEIGHT (ii), 
 		   SRCCOPY))
     {
       DeleteObject (newbmp);
@@ -659,37 +559,45 @@
 }
 
 HBITMAP
-mswindows_create_resized_bitmap (Lisp_Image_Instance* ii,
-				 struct frame* f,
-				 int newx, int newy)
-{
-  return create_resized_bitmap (IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii),
-				f,
-				IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii),
-				IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii),
-				newx, newy);
-}
-
-HBITMAP
-mswindows_create_resized_mask (Lisp_Image_Instance* ii,
+mswindows_create_resized_mask (struct Lisp_Image_Instance* ii,
 			       struct frame* f,
 			       int newx, int newy)
 {
-  if (IMAGE_INSTANCE_MSWINDOWS_MASK (ii) == NULL)
-    return NULL;
+  if (IMAGE_INSTANCE_MSWINDOWS_MASK (ii))
+    {
+      HBITMAP newmask;
+      HGDIOBJ old1, old2;
+      HDC hcdc = FRAME_MSWINDOWS_CDC (f);
+      HDC hdcDst = CreateCompatibleDC (hcdc);  
+  
+      old1 = SelectObject (hcdc, IMAGE_INSTANCE_MSWINDOWS_MASK (ii)); 
+      newmask = CreateCompatibleBitmap(hcdc, newx, newy);
+      old2 = SelectObject (hdcDst, newmask);
 
-  return create_resized_bitmap (IMAGE_INSTANCE_MSWINDOWS_MASK (ii),
-				f,
-				IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii),
-				IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii),
-				newx, newy);
+      if (!StretchBlt(hdcDst, 0, 0, newx, newy,
+		      hcdc, 0, 0, 
+		      IMAGE_INSTANCE_PIXMAP_WIDTH (ii), 
+		      IMAGE_INSTANCE_PIXMAP_HEIGHT (ii), 
+		      SRCCOPY))
+	{
+	  DeleteObject (newmask);
+	  DeleteDC (hdcDst);
+	  return NULL;
+	}
+      
+      SelectObject (hdcDst, old2);
+      SelectObject (hcdc, old1);
+
+      DeleteDC (hdcDst);
+
+      return newmask;
+    }
+
+  return NULL;
 }
 
-#if 0 /* Currently unused */
-/* #### Warining: This function is not correct anymore with
-   resizable printer bitmaps.  If you uncomment it, clean it. --kkm */
 int
-mswindows_resize_dibitmap_instance (Lisp_Image_Instance* ii,
+mswindows_resize_dibitmap_instance (struct Lisp_Image_Instance* ii,
 				    struct frame* f,
 				    int newx, int newy)
 {
@@ -698,7 +606,7 @@
 
   if (!newbmp)
     return FALSE;
-
+  
   if (IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii))
     DeleteObject (IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii));
   if (IMAGE_INSTANCE_MSWINDOWS_MASK (ii))
@@ -711,7 +619,6 @@
 
   return TRUE;
 }
-#endif
 
 /**********************************************************************
  *                               XPM                                  *
@@ -775,12 +682,10 @@
   for (j=0; j<i; j++)
     {
       Lisp_Object cons = XCAR (results);
-      colortbl[j].color =
+      colortbl[j].color = 
 	COLOR_INSTANCE_MSWINDOWS_COLOR (XCOLOR_INSTANCE (XCDR (cons)));
 
-      TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (cons),
-			  C_STRING_ALLOCA, colortbl[j].name,
-			  Qnative);
+      GET_C_STRING_OS_DATA_ALLOCA (XCAR (cons), colortbl[j].name);
       colortbl[j].name = xstrdup (colortbl[j].name); /* mustn't lose this when we return */
       free_cons (XCONS (cons));
       cons = results;
@@ -790,7 +695,7 @@
   return colortbl;
 }
 
-static int xpm_to_eimage (Lisp_Object image, const Extbyte *buffer,
+static int xpm_to_eimage (Lisp_Object image, CONST Extbyte *buffer,
 			  unsigned char** data,
 			  int* width, int* height,
 			  int* x_hot, int* y_hot,
@@ -804,7 +709,7 @@
   unsigned char* dptr;
   unsigned int* sptr;
   COLORREF color; /* the american spelling virus hits again .. */
-  COLORREF* colortbl;
+  COLORREF* colortbl; 
 
   xzero (xpmimage);
   xzero (xpminfo);
@@ -830,15 +735,15 @@
     default:
       {
 	signal_double_file_error_2 ("Parsing pixmap data",
-				    "unknown error",
+				    "unknown error code",
 				    make_int (result), image);
       }
     }
-
+  
   *width = xpmimage.width;
   *height = xpmimage.height;
-  maskbpline = BPLINE ((~7UL & (unsigned long)(*width + 7)) / 8);
-
+  maskbpline = BPLINE (((~7UL & (unsigned long)(*width + 7)) / 8));
+  
   *data = xnew_array_and_zero (unsigned char, *width * *height * 3);
 
   if (!*data)
@@ -869,7 +774,7 @@
 	      !strcasecmp (xpmimage.colorTable[i].symbolic,"None"))
 	    {
 	      *transp=TRUE;
-	      colortbl[i]=transparent_color;
+	      colortbl[i]=transparent_color; 
 	      transp_idx=i;
 	      goto label_found_color;
 	    }
@@ -894,7 +799,7 @@
       if (!strcasecmp (xpmimage.colorTable[i].c_color,"None"))
 	{
 	  *transp=TRUE;
-	  colortbl[i]=transparent_color;
+	  colortbl[i]=transparent_color; 
 	  transp_idx=i;
 	  goto label_found_color;
 	}
@@ -905,14 +810,14 @@
 	    mswindows_string_to_color (xpmimage.colorTable[i].c_color);
 	  goto label_found_color;
 	}
-
+      
     label_no_color:
       xfree (*data);
       xfree (colortbl);
       XpmFreeXpmImage (&xpmimage);
       XpmFreeXpmInfo (&xpminfo);
       return 0;
-
+      
     label_found_color:;
     }
 
@@ -944,9 +849,9 @@
 			   Lisp_Object pointer_fg, Lisp_Object pointer_bg,
 			   int dest_mask, Lisp_Object domain)
 {
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
-  const Extbyte		*bytes;
+  CONST Extbyte		*bytes;
   Extcount 		len;
   unsigned char		*eimage;
   int			width, height, x_hot, y_hot;
@@ -955,18 +860,17 @@
   int			bmp_bits;
   int 			nsymbols=0, transp;
   struct color_symbol*	color_symbols=NULL;
-
+  
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   Lisp_Object color_symbol_alist = find_keyword_in_vector (instantiator,
 							   Q_color_symbols);
 
-  CHECK_MSGDI_DEVICE (device);
+  if (!DEVICE_MSWINDOWS_P (XDEVICE (device)))
+    signal_simple_error ("Not an mswindows device", device);
 
   assert (!NILP (data));
 
-  TO_EXTERNAL_FORMAT (LISP_STRING, data,
-		      ALLOCA, (bytes, len),
-		      Qbinary);
+  GET_STRING_BINARY_DATA_ALLOCA (data, bytes, len);
 
   /* in case we have color symbols */
   color_symbols = extract_xpm_color_names (device, domain,
@@ -976,10 +880,10 @@
   if (!xpm_to_eimage (image_instance, bytes, &eimage, &width, &height,
 		      &x_hot, &y_hot, &transp, color_symbols, nsymbols))
     {
-      signal_simple_error ("XPM to EImage conversion failed",
+      signal_simple_error ("XPM to EImage conversion failed", 
 			   image_instance);
     }
-
+  
   if (color_symbols)
     {
       while (nsymbols--)
@@ -988,7 +892,7 @@
 	}
       xfree(color_symbols);
     }
-
+  
   /* build a bitmap from the eimage */
   if (!(bmp_info=convert_EImage_to_DIBitmap (device, width, height, eimage,
 					     &bmp_bits, &bmp_data)))
@@ -1000,7 +904,7 @@
 
   /* Now create the pixmap and set up the image instance */
   init_image_instance_from_dibitmap (ii, bmp_info, dest_mask,
-				     bmp_data, bmp_bits, 1, instantiator,
+				     bmp_data, bmp_bits, instantiator,
 				     x_hot, y_hot, transp);
 
   xfree (bmp_info);
@@ -1035,9 +939,9 @@
 		 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
 		 int dest_mask, Lisp_Object domain)
 {
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
-  const Extbyte		*bytes;
+  CONST Extbyte		*bytes;
   Extcount 		len;
   BITMAPFILEHEADER*	bmp_file_header;
   BITMAPINFO*		bmp_info;
@@ -1045,18 +949,17 @@
   int			bmp_bits;
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
 
-  CHECK_MSGDI_DEVICE (device);
+  if (!DEVICE_MSWINDOWS_P (XDEVICE (device)))
+    signal_simple_error ("Not an mswindows device", device);
 
   assert (!NILP (data));
 
-  TO_EXTERNAL_FORMAT (LISP_STRING, data,
-		      ALLOCA, (bytes, len),
-		      Qbinary);
-
+  GET_STRING_BINARY_DATA_ALLOCA (data, bytes, len);
+  
   /* Then slurp the image into memory, decoding along the way.
      The result is the image in a simple one-byte-per-pixel
      format. */
-
+  
   bmp_file_header=(BITMAPFILEHEADER*)bytes;
   bmp_info = (BITMAPINFO*)(bytes + sizeof(BITMAPFILEHEADER));
   bmp_data = (Extbyte*)bytes + bmp_file_header->bfOffBits;
@@ -1064,7 +967,7 @@
 
   /* Now create the pixmap and set up the image instance */
   init_image_instance_from_dibitmap (ii, bmp_info, dest_mask,
-				     bmp_data, bmp_bits, 1, instantiator,
+				     bmp_data, bmp_bits, instantiator,
 				     0, 0, 0);
 }
 
@@ -1076,9 +979,9 @@
 static void
 mswindows_resource_validate (Lisp_Object instantiator)
 {
-  if ((NILP (find_keyword_in_vector (instantiator, Q_file))
+  if ((NILP (find_keyword_in_vector (instantiator, Q_file)) 
        &&
-       NILP (find_keyword_in_vector (instantiator, Q_resource_id)))
+       NILP (find_keyword_in_vector (instantiator, Q_resource_id))) 
       ||
       NILP (find_keyword_in_vector (instantiator, Q_resource_type)))
     signal_simple_error ("Must supply :file, :resource-id and :resource-type",
@@ -1095,7 +998,7 @@
 
   GCPRO2 (file, alist);
 
-  file = potential_pixmap_file_instantiator (inst, Q_file, Q_data,
+  file = potential_pixmap_file_instantiator (inst, Q_file, Q_data, 
 					     console_type);
 
   if (CONSP (file)) /* failure locating filename */
@@ -1126,7 +1029,7 @@
   return IMAGE_POINTER_MASK | IMAGE_COLOR_PIXMAP_MASK;
 }
 
-typedef struct
+typedef struct 
 {
   char *name;
   int	resource_id;
@@ -1140,12 +1043,10 @@
 #define OIC_BANG            32515
 #define OIC_NOTE            32516
 #define OIC_WINLOGO         32517
-#if defined (CYGWIN) && CYGWIN_VERSION_DLL_MAJOR < 21
 #define LR_SHARED           0x8000
 #endif
-#endif
 
-static const resource_t bitmap_table[] =
+static CONST resource_t bitmap_table[] = 
 {
   /* bitmaps */
   { "close", OBM_CLOSE },
@@ -1177,7 +1078,7 @@
   {0}
 };
 
-static const resource_t cursor_table[] =
+static CONST resource_t cursor_table[] = 
 {
   /* cursors */
   { "normal", OCR_NORMAL },
@@ -1196,7 +1097,7 @@
   { 0 }
 };
 
-static const resource_t icon_table[] =
+static CONST resource_t icon_table[] = 
 {
   /* icons */
   { "sample", OIC_SAMPLE },
@@ -1210,8 +1111,8 @@
 
 static int resource_name_to_resource (Lisp_Object name, int type)
 {
-  const resource_t* res = (type == IMAGE_CURSOR ? cursor_table
-			   : type == IMAGE_ICON ? icon_table
+  CONST resource_t* res = (type == IMAGE_CURSOR ? cursor_table 
+			   : type == IMAGE_ICON ? icon_table 
 			   : bitmap_table);
 
   if (INTP (name))
@@ -1222,12 +1123,10 @@
     {
       signal_simple_error ("invalid resource identifier", name);
     }
-
+  
   do {
     Extbyte* nm=0;
-    TO_EXTERNAL_FORMAT (LISP_STRING, name,
-			C_STRING_ALLOCA, nm,
-			Qnative);
+    GET_C_STRING_OS_DATA_ALLOCA (name, nm);
       if (!strcasecmp ((char*)res->name, nm))
       return res->resource_id;
   } while ((++res)->name);
@@ -1252,25 +1151,26 @@
 		    Lisp_Object pointer_fg, Lisp_Object pointer_bg,
 		    int dest_mask, Lisp_Object domain)
 {
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   unsigned int type = 0;
   HANDLE himage = NULL;
   LPCTSTR resid=0;
   HINSTANCE hinst = NULL;
   ICONINFO iconinfo;
-  enum image_instance_type iitype;
+  int iitype=0;
   char* fname=0;
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
 
   Lisp_Object file = find_keyword_in_vector (instantiator, Q_file);
-  Lisp_Object resource_type = find_keyword_in_vector (instantiator,
+  Lisp_Object resource_type = find_keyword_in_vector (instantiator, 
 						      Q_resource_type);
-  Lisp_Object resource_id = find_keyword_in_vector (instantiator,
+  Lisp_Object resource_id = find_keyword_in_vector (instantiator, 
 						    Q_resource_id);
 
   xzero (iconinfo);
 
-  CHECK_MSGDI_DEVICE (device);
+  if (!DEVICE_MSWINDOWS_P (XDEVICE (device)))
+    signal_simple_error ("Not an mswindows device", device);
 
   type = resource_symbol_to_type (resource_type);
 
@@ -1278,7 +1178,7 @@
     iitype = IMAGE_POINTER;
   else if (dest_mask & IMAGE_COLOR_PIXMAP_MASK)
     iitype = IMAGE_COLOR_PIXMAP;
-  else
+  else 
     incompatible_image_types (instantiator, dest_mask,
 			      IMAGE_COLOR_PIXMAP_MASK | IMAGE_POINTER_MASK);
 
@@ -1286,15 +1186,13 @@
   if (!NILP (file))
     {
       Extbyte* f=0;
-      TO_EXTERNAL_FORMAT (LISP_STRING, file,
-			  C_STRING_ALLOCA, f,
-			  Qfile_name);
-#ifdef CYGWIN
+      GET_C_STRING_FILENAME_DATA_ALLOCA (file, f);
+#ifdef __CYGWIN32__
       CYGWIN_WIN32_PATH (f, fname);
 #else
       fname = f;
 #endif
-
+      
       if (NILP (resource_id))
 	resid = (LPCTSTR)fname;
       else
@@ -1303,21 +1201,19 @@
 				 LOAD_LIBRARY_AS_DATAFILE);
 	  resid = MAKEINTRESOURCE (resource_name_to_resource (resource_id,
 							   type));
-
+	  
 	  if (!resid)
-	    TO_EXTERNAL_FORMAT (LISP_STRING, resource_id,
-				C_STRING_ALLOCA, resid,
-				Qnative);
+	    GET_C_STRING_OS_DATA_ALLOCA (resource_id, resid);
 	}
     }
   else if (!(resid = MAKEINTRESOURCE (resource_name_to_resource (resource_id,
 							       type))))
     signal_simple_error ("Invalid resource identifier", resource_id);
-
+  
   /* load the image */
   if (!(himage = LoadImage (hinst, resid, type, 0, 0,
-			    LR_CREATEDIBSECTION | LR_DEFAULTSIZE |
-			    LR_SHARED |
+			    LR_CREATEDIBSECTION | LR_DEFAULTSIZE | 
+			    LR_SHARED |      
 			    (!NILP (file) ? LR_LOADFROMFILE : 0))))
     {
       signal_simple_error ("Cannot load image", instantiator);
@@ -1326,31 +1222,30 @@
   if (hinst)
     FreeLibrary (hinst);
 
-  mswindows_initialize_dibitmap_image_instance (ii, 1, iitype);
+  mswindows_initialize_dibitmap_image_instance (ii, iitype);
 
   IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = file;
-  IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii) =
+  IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = 
     GetSystemMetrics (type == IMAGE_CURSOR ? SM_CXCURSOR : SM_CXICON);
-  IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii) =
+  IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = 
     GetSystemMetrics (type == IMAGE_CURSOR ? SM_CYCURSOR : SM_CYICON);
   IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = 1;
-  init_image_instance_geometry (ii);
 
   /* hey, we've got an icon type thing so we can reverse engineer the
      bitmap and mask */
   if (type != IMAGE_BITMAP)
     {
-      GetIconInfo ((HICON)himage, &iconinfo);
+      GetIconInfo (himage, &iconinfo);
       IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = iconinfo.hbmColor;
       IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = iconinfo.hbmMask;
       XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii), iconinfo.xHotspot);
       XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii), iconinfo.yHotspot);
-      IMAGE_INSTANCE_MSWINDOWS_ICON (ii) = (HICON) himage;
+      IMAGE_INSTANCE_MSWINDOWS_ICON (ii) = himage;
     }
   else
     {
       IMAGE_INSTANCE_MSWINDOWS_ICON (ii) = NULL;
-      IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = (HBITMAP) himage;
+      IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = himage;
       IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = NULL;
       XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii), 0);
       XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii), 0);
@@ -1376,6 +1271,15 @@
     signal_simple_error ("invalid resource identifier", data);
 }
 
+void
+check_valid_string_or_int (Lisp_Object data)
+{
+  if (!INTP (data))
+    CHECK_STRING (data);
+  else
+    CHECK_INT (data);
+}
+
 /**********************************************************************
  *                             XBM                                    *
  **********************************************************************/
@@ -1420,7 +1324,7 @@
  *					and return data
  *
  * Note that this file and ../X/XRdBitF.c look very similar....  Keep them
- * that way (but don't use common source code so that people can have one
+ * that way (but don't use common source code so that people can have one 
  * without the other).
  */
 
@@ -1444,8 +1348,7 @@
  *	Table index for the hex values. Initialized once, first time.
  *	Used for translation value or delimiter significance lookup.
  */
-static void
-initHexTable (void)
+static void initHexTable()
 {
     /*
      * We build the table at run time for several reasons:
@@ -1471,21 +1374,20 @@
     hexTable[' '] = -1;	hexTable[','] = -1;
     hexTable['}'] = -1;	hexTable['\n'] = -1;
     hexTable['\t'] = -1;
-
+	
     initialized = TRUE;
 }
 
 /*
  *	read next hex value in the input stream, return -1 if EOF
  */
-static int
-NextInt (FILE *fstream)
+static int NextInt ( FILE *fstream )
 {
     int	ch;
     int	value = 0;
     int gotone = 0;
     int done = 0;
-
+    
     /* loop, accumulate hex value until find delimiter  */
     /* skip any initial delimiters found in read stream */
 
@@ -1514,9 +1416,11 @@
  * its arguments won't have been touched.  This routine should look as much
  * like the Xlib routine XReadBitmapfile as possible.
  */
-int read_bitmap_data (FILE* fstream, unsigned int *width,
-		      unsigned int *height, unsigned char **datap,
-		      int *x_hot, int *y_hot)
+int read_bitmap_data (fstream, width, height, datap, x_hot, y_hot)
+    FILE *fstream;			/* handle on file  */
+    unsigned int *width, *height;	/* RETURNED */
+    unsigned char **datap;		/* RETURNED */
+    int *x_hot, *y_hot;			/* RETURNED */
 {
     unsigned char *data = NULL;		/* working variable */
     char line[MAX_SIZE];		/* input line from file */
@@ -1564,7 +1468,7 @@
 	    }
 	    continue;
 	}
-
+    
 	if (sscanf(line, "static short %s = {", name_and_type) == 1)
 	  version10p = 1;
 	else if (sscanf(line,"static unsigned char %s = {",name_and_type) == 1)
@@ -1581,7 +1485,7 @@
 
 	if (strcmp("bits[]", type))
 	  continue;
-
+    
 	if (!ww || !hh)
 	  RETURN (BitmapFileInvalid);
 
@@ -1594,7 +1498,7 @@
 
 	size = bytes_per_line * hh;
 	data = (unsigned char *) Xmalloc ((unsigned int) size);
-	if (!data)
+	if (!data) 
 	  RETURN (BitmapNoMemory);
 
 	if (version10p) {
@@ -1613,7 +1517,7 @@
 	    int bytes;
 
 	    for (bytes=0, ptr=data; bytes<size; bytes++, ptr++) {
-		if ((value = NextInt(fstream)) < 0)
+		if ((value = NextInt(fstream)) < 0) 
 		  RETURN (BitmapFileInvalid);
 		*ptr=value;
 	    }
@@ -1636,7 +1540,7 @@
 }
 
 
-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)
 {
@@ -1665,7 +1569,7 @@
    padded to a multiple of 16.  Scan lines are stored in increasing
    byte order from left to right, big-endian within a byte.  0 =
    black, 1 = white.  */
-static HBITMAP
+HBITMAP
 xbm_create_bitmap_from_data (HDC hdc, char *data,
 			     unsigned int width, unsigned int height,
 			     int mask, COLORREF fg, COLORREF bg)
@@ -1676,21 +1580,21 @@
   void *bmp_buf = 0;
   unsigned char *new_data, *new_offset;
   int i, j;
-  BITMAPINFO *bmp_info =
-    (BITMAPINFO*) xmalloc_and_zero (sizeof(BITMAPINFO) + sizeof(RGBQUAD));
+  BITMAPINFO* bmp_info = 
+    xmalloc_and_zero (sizeof(BITMAPINFO) + sizeof(RGBQUAD));
   HBITMAP bitmap;
 
   if (!bmp_info)
     return NULL;
-
+  
   new_data = (unsigned char *) xmalloc_and_zero (height * new_width);
-
+      
   if (!new_data)
     {
       xfree (bmp_info);
       return NULL;
     }
-
+  
   for (i=0; i<height; i++)
     {
       offset = data + i*old_width;
@@ -1718,11 +1622,11 @@
   bmp_info->bmiHeader.biHeight=-(LONG)height;
   bmp_info->bmiHeader.biPlanes=1;
   bmp_info->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
-  bmp_info->bmiHeader.biBitCount=1;
+  bmp_info->bmiHeader.biBitCount=1; 
   bmp_info->bmiHeader.biCompression=BI_RGB;
-  bmp_info->bmiHeader.biClrUsed = 2;
-  bmp_info->bmiHeader.biClrImportant = 2;
-  bmp_info->bmiHeader.biSizeImage = height * new_width;
+  bmp_info->bmiHeader.biClrUsed = 2; 
+  bmp_info->bmiHeader.biClrImportant = 2; 
+  bmp_info->bmiHeader.biSizeImage = height * new_width; 
   bmp_info->bmiColors[0].rgbRed = GetRValue (fg);
   bmp_info->bmiColors[0].rgbGreen = GetGValue (fg);
   bmp_info->bmiColors[0].rgbBlue = GetBValue (fg);
@@ -1731,21 +1635,21 @@
   bmp_info->bmiColors[1].rgbGreen = GetGValue (bg);
   bmp_info->bmiColors[1].rgbBlue = GetBValue (bg);
   bmp_info->bmiColors[1].rgbReserved = 0;
-
-  bitmap = CreateDIBSection (hdc,
+  
+  bitmap = CreateDIBSection (hdc,  
 			     bmp_info,
 			     DIB_RGB_COLORS,
-			     &bmp_buf,
+			     &bmp_buf, 
 			     0,0);
 
   xfree (bmp_info);
-
+  
   if (!bitmap || !bmp_buf)
     {
       xfree (new_data);
       return NULL;
     }
-
+  
   /* copy in the actual bitmap */
   memcpy (bmp_buf, new_data, height * new_width);
   xfree (new_data);
@@ -1757,10 +1661,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,
@@ -1769,16 +1673,17 @@
 				     Lisp_Object mask_filename)
 {
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
+  struct frame* f = XFRAME (DEVICE_SELECTED_FRAME (XDEVICE (device)));
   Lisp_Object foreground = find_keyword_in_vector (instantiator, Q_foreground);
   Lisp_Object background = find_keyword_in_vector (instantiator, Q_background);
   enum image_instance_type type;
   COLORREF black = PALETTERGB (0,0,0);
   COLORREF white = PALETTERGB (255,255,255);
-  HDC hdc;
+
+  HDC hdc = FRAME_MSWINDOWS_CDC (f);
 
-  CHECK_MSGDI_DEVICE (device);
-
-  hdc = get_device_compdc (XDEVICE (device));
+  if (!DEVICE_MSWINDOWS_P (XDEVICE (device)))
+    signal_simple_error ("Not an MS-Windows device", device);
 
   if ((dest_mask & IMAGE_MONO_PIXMAP_MASK) &&
       (dest_mask & IMAGE_COLOR_PIXMAP_MASK))
@@ -1799,26 +1704,24 @@
 			      IMAGE_MONO_PIXMAP_MASK | IMAGE_COLOR_PIXMAP_MASK
 			      | IMAGE_POINTER_MASK);
 
-  mswindows_initialize_dibitmap_image_instance (ii, 1, type);
-
+  mswindows_initialize_dibitmap_image_instance (ii, type);
+  
   IMAGE_INSTANCE_PIXMAP_FILENAME (ii) =
     find_keyword_in_vector (instantiator, Q_file);
-  IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii) = width;
-  IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii) = height;
+  IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = width;
+  IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = height;
   IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = 1;
   XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii), 0);
   XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii), 0);
-  init_image_instance_geometry (ii);
-
   IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = mask ? mask :
-    xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height,
+    xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height, 
 				 TRUE, black, white);
 
   switch (type)
     {
     case IMAGE_MONO_PIXMAP:
-      IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) =
-	xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height,
+      IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = 
+	xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height, 
 				     FALSE, black, black);
       break;
 
@@ -1846,8 +1749,8 @@
 	IMAGE_INSTANCE_PIXMAP_FG (ii) = foreground;
 	IMAGE_INSTANCE_PIXMAP_BG (ii) = background;
 
-	IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) =
-	  xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height,
+	IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = 
+	  xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height, 
 				       FALSE, fg, black);
       }
       break;
@@ -1862,9 +1765,9 @@
 	if (NILP (background))
 	  background = pointer_bg;
 
-	IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii) =
+	IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii) = 
 	  find_keyword_in_vector (instantiator, Q_hotspot_x);
-	IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii) =
+	IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii) = 
 	  find_keyword_in_vector (instantiator, Q_hotspot_y);
 	IMAGE_INSTANCE_PIXMAP_FG (ii) = foreground;
 	IMAGE_INSTANCE_PIXMAP_BG (ii) = background;
@@ -1873,8 +1776,8 @@
 	if (COLOR_INSTANCEP (background))
 	  bg = COLOR_INSTANCE_MSWINDOWS_COLOR (XCOLOR_INSTANCE (background));
 
-	IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) =
-	  xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height,
+	IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = 
+	  xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height, 
 				       TRUE, fg, black);
 	mswindows_initialize_image_instance_icon (ii, TRUE);
       }
@@ -1890,28 +1793,29 @@
 		   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);
-  HDC hdc = get_device_compdc (XDEVICE (IMAGE_INSTANCE_DEVICE (ii)));
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  struct frame* f = XFRAME (DEVICE_SELECTED_FRAME 
+			    (XDEVICE (IMAGE_INSTANCE_DEVICE (ii))));
+  HDC hdc = FRAME_MSWINDOWS_CDC (f);
   HBITMAP 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 = xbm_create_bitmap_from_data (hdc,
-					  (unsigned char *) ext_data,
-					  XINT (XCAR (mask_data)),
-					  XINT (XCAR (XCDR (mask_data))),
-					  FALSE,
-					  PALETTERGB (0,0,0),
-					  PALETTERGB (255,255,255));
+      GET_C_STRING_BINARY_DATA_ALLOCA (XCAR (XCDR (XCDR (mask_data))),
+				       gcc_may_you_rot_in_hell);
+      mask =
+	xbm_create_bitmap_from_data ( hdc,
+				      (unsigned char *)
+				      gcc_may_you_rot_in_hell,
+				      XINT (XCAR (mask_data)),
+				      XINT (XCAR (XCDR (mask_data))), FALSE,
+				      PALETTERGB (0,0,0),
+				      PALETTERGB (255,255,255));
     }
 
   init_image_instance_from_xbm_inline (ii, width, height, bits,
@@ -1922,23 +1826,22 @@
 /* Instantiate method for XBM's. */
 
 static void
-mswindows_xbm_instantiate (Lisp_Object image_instance,
+mswindows_xbm_instantiate (Lisp_Object image_instance, 
 			   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);
-  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);
 }
 
 #ifdef HAVE_XFACE
@@ -1973,14 +1876,12 @@
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   int i, stattis;
   char *p, *bits, *bp;
-  const char * volatile emsg = 0;
-  const char * volatile dstring;
+  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, ':')))
     {
@@ -2036,7 +1937,7 @@
 /************************************************************************/
 
 static void
-mswindows_print_image_instance (Lisp_Image_Instance *p,
+mswindows_print_image_instance (struct Lisp_Image_Instance *p,
 				Lisp_Object printcharfun,
 				int escapeflag)
 {
@@ -2047,12 +1948,12 @@
     case IMAGE_MONO_PIXMAP:
     case IMAGE_COLOR_PIXMAP:
     case IMAGE_POINTER:
-      sprintf (buf, " (0x%lx",
+      sprintf (buf, " (0x%lx", 
 	       (unsigned long) IMAGE_INSTANCE_MSWINDOWS_BITMAP (p));
       write_c_string (buf, printcharfun);
       if (IMAGE_INSTANCE_MSWINDOWS_MASK (p))
 	{
-	  sprintf (buf, "/0x%lx",
+	  sprintf (buf, "/0x%lx", 
 		   (unsigned long) IMAGE_INSTANCE_MSWINDOWS_MASK (p));
 	  write_c_string (buf, printcharfun);
 	}
@@ -2064,49 +1965,24 @@
     }
 }
 
-#ifdef DEBUG_WIDGETS
-extern int debug_widget_instances;
-#endif
-
 static void
-mswindows_finalize_image_instance (Lisp_Image_Instance *p)
+mswindows_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)))
     {
-      if (image_instance_type_to_mask (IMAGE_INSTANCE_TYPE (p))
-	  & (IMAGE_WIDGET_MASK | IMAGE_SUBWINDOW_MASK))
+      if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET
+	  || 
+	  IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
 	{
-#ifdef DEBUG_WIDGETS
-	  debug_widget_instances--;
-	  stderr_out ("widget destroyed, %d left\n", debug_widget_instances);
-#endif
 	  if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
-	    {
-	      DestroyWindow (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p));
-	      DestroyWindow (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p));
-	      IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0;
-	    }
+	    DestroyWindow (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p));
+	  IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0;
 	}
       else if (p->data)
 	{
-	  int i;
-	  if (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p))
-	    disable_glyph_animated_timeout (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p));
-
-	  if (IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICES (p))
-	    {
-	      for (i = 0; i < IMAGE_INSTANCE_PIXMAP_MAXSLICE (p); i++)
-		{
-		  if (IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE (p, i))
-		    DeleteObject (IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE (p, i));
-		  IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE (p, i) = 0;
-		}
-	      xfree (IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICES (p));
-	      IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICES (p) = 0;
-	    }
+	  if (IMAGE_INSTANCE_MSWINDOWS_BITMAP (p))
+	    DeleteObject (IMAGE_INSTANCE_MSWINDOWS_BITMAP (p));
+	  IMAGE_INSTANCE_MSWINDOWS_BITMAP (p) = 0;
 	  if (IMAGE_INSTANCE_MSWINDOWS_MASK (p))
 	    DeleteObject (IMAGE_INSTANCE_MSWINDOWS_MASK (p));
 	  IMAGE_INSTANCE_MSWINDOWS_MASK (p) = 0;
@@ -2127,158 +2003,51 @@
 /*                      subwindow and widget support                      */
 /************************************************************************/
 
-static HFONT
-mswindows_widget_hfont (Lisp_Image_Instance *p,
-			Lisp_Object domain)
-{
-  Lisp_Object face = IMAGE_INSTANCE_WIDGET_FACE (p);
-  int under = FACE_UNDERLINE_P (face, domain);
-  int strike = FACE_STRIKETHRU_P (face, domain);
-  Lisp_Object font = query_string_font (IMAGE_INSTANCE_WIDGET_TEXT (p),
-					face, domain);
-
-  return mswindows_get_hfont (XFONT_INSTANCE (font), under, strike);
-}
-
-static HDWP
-begin_defer_window_pos (struct frame *f)
-{
-  if (FRAME_MSWINDOWS_DATA (f)->hdwp == 0)
-    FRAME_MSWINDOWS_DATA (f)->hdwp = BeginDeferWindowPos (10);
-  return FRAME_MSWINDOWS_DATA (f)->hdwp;
-}
-  
 /* unmap the image if it is a widget. This is used by redisplay via
    redisplay_unmap_subwindows */
 static void
-mswindows_unmap_subwindow (Lisp_Image_Instance *p)
+mswindows_unmap_subwindow (struct Lisp_Image_Instance *p)
 {
   if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
     {
-      struct frame *f = XFRAME (IMAGE_INSTANCE_FRAME (p));
-      HDWP hdwp = begin_defer_window_pos (f);
-      HDWP new_hdwp;
-      new_hdwp = DeferWindowPos (hdwp, IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p),
-				 NULL,
-				 0, 0, 0, 0,
-				 SWP_HIDEWINDOW | SWP_NOACTIVATE |
-				 SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER
-				 /* Setting this flag causes the call to
-				    DeferWindowPos to fail with
-				    "Invalid parameter".  I don't understand
-				    why we bother to try and set this
-				    anyway. -- ben */
-				 /* | SWP_NOSENDCHANGING */
-				 );
-      if (!new_hdwp)
-	mswindows_output_last_error ("unmapping");
-      else
-	hdwp = new_hdwp;
-      FRAME_MSWINDOWS_DATA (f)->hdwp = hdwp;
-      if (GetFocus() == WIDGET_INSTANCE_MSWINDOWS_HANDLE (p))
-	SetFocus (GetParent (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p)));
+      SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), 
+		    NULL, 
+		    0, 0, 0, 0,
+		    SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE 
+		    | SWP_NOCOPYBITS | SWP_NOSENDCHANGING);
     }
 }
 
 /* map the subwindow. This is used by redisplay via
    redisplay_output_subwindow */
 static void
-mswindows_map_subwindow (Lisp_Image_Instance *p, int x, int y,
-			 struct display_glyph_area* dga)
+mswindows_map_subwindow (struct Lisp_Image_Instance *p, int x, int y)
 {
-  struct frame *f = XFRAME (IMAGE_INSTANCE_FRAME (p));
-  HDWP hdwp = begin_defer_window_pos (f);
-  HDWP new_hdwp;
-  /* move the window before mapping it ... */
-  SetWindowPos (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p),
-		NULL,
-		x, y, dga->width, dga->height,
-		SWP_NOZORDER
-		| SWP_NOCOPYBITS | SWP_NOSENDCHANGING);
-  /* ... adjust the child ... */
-  SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p),
-		NULL,
-		-dga->xoffset, -dga->yoffset, 0, 0,
-		SWP_NOZORDER | SWP_NOSIZE
+  /*  ShowWindow (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), SW_SHOW);*/
+  SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), 
+		NULL, 
+		x, y, 0, 0,
+		SWP_NOZORDER | SWP_SHOWWINDOW | SWP_NOSIZE
 		| SWP_NOCOPYBITS | SWP_NOSENDCHANGING);
-  /* ... now map it - we are not allowed to move it at the same time. */
-  new_hdwp = DeferWindowPos (hdwp, IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p),
-			     NULL,
-			     0, 0, 0, 0,
-			     SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE
-			     | SWP_SHOWWINDOW
-			     /* | SWP_NOCOPYBITS */
-			     /* Setting this flag causes the call to
-				DeferWindowPos to fail with
-				"Invalid parameter".  I don't understand
-				why we bother to try and set this
-				anyway. -- ben */
-			     /* | SWP_NOSENDCHANGING */
-			     | SWP_NOACTIVATE);
-  if (!new_hdwp)
-    mswindows_output_last_error ("mapping");
-  else
-    hdwp = new_hdwp;
-  FRAME_MSWINDOWS_DATA (f)->hdwp = hdwp;
-}
-
-/* resize the subwindow instance */
-static void
-mswindows_resize_subwindow (Lisp_Image_Instance* ii, int w, int h)
-{
-  /* Set the size of the control .... */
-  if (!SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii),
-		     NULL,
-		     0, 0, w, h,
-		     SWP_NOZORDER | SWP_NOMOVE
-		     | SWP_NOCOPYBITS | SWP_NOSENDCHANGING))
-    mswindows_output_last_error ("resizing");
-}
-
-/* Simply resize the window here. */
-static void
-mswindows_update_subwindow (Lisp_Image_Instance *p)
-{
-  mswindows_resize_subwindow (p,
-			      IMAGE_INSTANCE_WIDTH (p),
-			      IMAGE_INSTANCE_HEIGHT (p));
 }
 
 /* when you click on a widget you may activate another widget this
    needs to be checked and all appropriate widgets updated */
 static void
-mswindows_update_widget (Lisp_Image_Instance *p)
+mswindows_update_subwindow (struct Lisp_Image_Instance *p)
 {
-  /* Possibly update the face font and colors. */
-  if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (p))
-      && (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (p)
-	  || XFRAME (IMAGE_INSTANCE_FRAME (p))->faces_changed
-	  || IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p)))
+  if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET)
     {
-      /* set the widget font from the widget face */
-      SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p),
-		   WM_SETFONT,
-		   (WPARAM) mswindows_widget_hfont
-		   (p, IMAGE_INSTANCE_FRAME (p)),
-		   MAKELPARAM (TRUE, 0));
-    }
-  /* Possibly update the dimensions. */
-  if (IMAGE_INSTANCE_SIZE_CHANGED (p))
-    {
-      mswindows_resize_subwindow (p, 
-				  IMAGE_INSTANCE_WIDTH (p),
-				  IMAGE_INSTANCE_HEIGHT (p));
-    }
-  /* Possibly update the text in the widget. */
-  if (IMAGE_INSTANCE_TEXT_CHANGED (p)
-      && !NILP (IMAGE_INSTANCE_WIDGET_TEXT (p)))
-    {
-      Extbyte* lparam=0;
-      TO_EXTERNAL_FORMAT (LISP_STRING, IMAGE_INSTANCE_WIDGET_TEXT (p),
-			  C_STRING_ALLOCA, lparam,
-			  Qnative);
-      SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p),
-		   WM_SETTEXT, 0, (LPARAM)lparam);
+      /* buttons checked or otherwise */
+      if ( EQ (IMAGE_INSTANCE_WIDGET_TYPE (p), Qbutton))
+	{
+	  if (gui_item_selected_p (&IMAGE_INSTANCE_WIDGET_ITEM (p)))
+	    SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), 
+			 BM_SETCHECK, (WPARAM)BST_CHECKED, 0); 
+	  else
+	    SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p),
+			 BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
+	}
     }
 }
 
@@ -2286,29 +2055,17 @@
    callbacks. The hashtable is weak so deregistration is handled
    automatically */
 static int
-mswindows_register_gui_item (Lisp_Object image_instance,
-			     Lisp_Object gui, Lisp_Object domain)
-{
-  Lisp_Object frame = DOMAIN_FRAME (domain);
-  struct frame* f = XFRAME (frame);
-  int id = gui_item_id_hash (FRAME_MSWINDOWS_WIDGET_HASH_TABLE2 (f),
-			     gui,
-			     WIDGET_GLYPH_SLOT);
-  Fputhash (make_int (id), image_instance,
-	    FRAME_MSWINDOWS_WIDGET_HASH_TABLE1 (f));
-  Fputhash (make_int (id), XGUI_ITEM (gui)->callback,
-	    FRAME_MSWINDOWS_WIDGET_HASH_TABLE2 (f));
-  Fputhash (make_int (id), XGUI_ITEM (gui)->callback_ex,
-	    FRAME_MSWINDOWS_WIDGET_HASH_TABLE3 (f));
-  return id;
-}
-
-static int
 mswindows_register_widget_instance (Lisp_Object instance, Lisp_Object domain)
 {
-  return mswindows_register_gui_item (instance,
-				      XIMAGE_INSTANCE_WIDGET_ITEM (instance),
-				      domain);
+  Lisp_Object frame = FW_FRAME (domain);
+  struct frame* f = XFRAME (frame);
+  int id = gui_item_hash (FRAME_MSWINDOWS_WIDGET_HASH_TABLE (f),
+			  &XIMAGE_INSTANCE_WIDGET_ITEM (instance),
+			  WIDGET_GLYPH_SLOT);
+  Fputhash (make_int (id),
+	    XIMAGE_INSTANCE_WIDGET_CALLBACK (instance),
+	    FRAME_MSWINDOWS_WIDGET_HASH_TABLE (f));
+  return id;
 }
 
 static void
@@ -2316,49 +2073,31 @@
 				 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
 				 int dest_mask, Lisp_Object domain)
 {
-  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);
+  struct device* d = XDEVICE (device);
+  Lisp_Object frame = FW_FRAME (domain);
   HWND wnd;
 
-  CHECK_MSWINDOWS_DEVICE (device);
+  if (!DEVICE_MSWINDOWS_P (d))
+    signal_simple_error ("Not an mswindows device", device);
 
   /* have to set the type this late in case there is no device
      instantiation for a widget */
   IMAGE_INSTANCE_TYPE (ii) = IMAGE_SUBWINDOW;
-  /* Allocate space for the clip window */
-  ii->data = xnew_and_zero (struct mswindows_subwindow_data);
 
-  if ((IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii)
-       = CreateWindowEx(
-			0,		/* EX flags */
-			XEMACS_CONTROL_CLASS,
-			0,		/* text */
-			WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_CHILD,
-			0,         /* starting x position */
-			0,         /* starting y position */
-			IMAGE_INSTANCE_WIDGET_WIDTH (ii),
-			IMAGE_INSTANCE_WIDGET_HEIGHT (ii),
-			/* parent window */
-			FRAME_MSWINDOWS_HANDLE (XFRAME (frame)),
-			NULL,       /* No menu */
-			NULL, /* must be null for this class */
-			NULL)) == NULL)
-    signal_simple_error ("window creation failed with code",
-			 make_int (GetLastError()));
-
-  wnd = CreateWindow( "STATIC",
+  wnd = CreateWindow( "STATIC",  
 		      "",
-		      WS_CHILD,
+		      WS_CHILD,  
 		      0,         /* starting x position */
 		      0,         /* starting y position */
 		      IMAGE_INSTANCE_WIDGET_WIDTH (ii),
 		      IMAGE_INSTANCE_WIDGET_HEIGHT (ii),
-		      IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii),
+		      FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), /* parent window */
 		      0,
-		      (HINSTANCE)
+		      (HINSTANCE) 
 		      GetWindowLong (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)),
-				     GWL_HINSTANCE),
+				     GWL_HINSTANCE), 
 		      NULL);
 
   SetWindowLong (wnd, GWL_USERDATA, (LONG)LISP_TO_VOID(image_instance));
@@ -2366,19 +2105,19 @@
 }
 
 static int
-mswindows_image_instance_equal (Lisp_Image_Instance *p1,
-				Lisp_Image_Instance *p2, int depth)
+mswindows_image_instance_equal (struct Lisp_Image_Instance *p1,
+				struct Lisp_Image_Instance *p2, int depth)
 {
   switch (IMAGE_INSTANCE_TYPE (p1))
     {
     case IMAGE_MONO_PIXMAP:
     case IMAGE_COLOR_PIXMAP:
     case IMAGE_POINTER:
-      if (IMAGE_INSTANCE_MSWINDOWS_BITMAP (p1)
+      if (IMAGE_INSTANCE_MSWINDOWS_BITMAP (p1) 
 	  != IMAGE_INSTANCE_MSWINDOWS_BITMAP (p2))
 	return 0;
       break;
-
+    
     default:
       break;
     }
@@ -2387,7 +2126,7 @@
 }
 
 static unsigned long
-mswindows_image_instance_hash (Lisp_Image_Instance *p, int depth)
+mswindows_image_instance_hash (struct Lisp_Image_Instance *p, int depth)
 {
   switch (IMAGE_INSTANCE_TYPE (p))
     {
@@ -2395,7 +2134,7 @@
     case IMAGE_COLOR_PIXMAP:
     case IMAGE_POINTER:
       return (unsigned long) IMAGE_INSTANCE_MSWINDOWS_BITMAP (p);
-
+    
     default:
       return 0;
     }
@@ -2408,8 +2147,7 @@
    methods are called. */
 
 static void
-mswindows_initialize_dibitmap_image_instance (Lisp_Image_Instance *ii,
-					      int slices,
+mswindows_initialize_dibitmap_image_instance (struct Lisp_Image_Instance *ii,
 					      enum image_instance_type type)
 {
   ii->data = xnew_and_zero (struct mswindows_image_instance_data);
@@ -2420,126 +2158,93 @@
   IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii) = Qnil;
   IMAGE_INSTANCE_PIXMAP_FG (ii) = Qnil;
   IMAGE_INSTANCE_PIXMAP_BG (ii) = Qnil;
-  IMAGE_INSTANCE_PIXMAP_MAXSLICE (ii) = slices;
-  IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICES (ii) =
-    xnew_array_and_zero (HBITMAP, slices);
 }
 
 
-#ifdef HAVE_WIDGETS
-
 /************************************************************************/
 /*                            widgets                            */
 /************************************************************************/
+
 static void
 mswindows_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* class, int flags, int exflags)
+			      CONST char* class, int flags, int exflags)
 {
-  /* this function can call lisp */
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+#if 0
+  struct Lisp_Image_Instance *groupii = 0;
+  Lisp_Object group = find_keyword_in_vector (instantiator, Q_group);
+#endif
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), style;
-  Lisp_Object frame = DOMAIN_FRAME (domain);
+  struct device* d = XDEVICE (device);
+  Lisp_Object frame = FW_FRAME (domain);
   Extbyte* nm=0;
   HWND wnd;
   int id = 0xffff;
-  Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
-  Lisp_Gui_Item* pgui = XGUI_ITEM (gui);
+  struct gui_item* pgui = &IMAGE_INSTANCE_WIDGET_ITEM (ii);
 
-  CHECK_MSWINDOWS_DEVICE (device);
-
-  if (!gui_item_active_p (gui))
+  if (!DEVICE_MSWINDOWS_P (d))
+    signal_simple_error ("Not an mswindows device", device);
+#if 0
+  /* if the user specified another glyph as a group pick up the
+     instance in our domain. */
+  if (!NILP (group))
+    {
+      if (SYMBOLP (group))
+	group = XSYMBOL (group)->value;
+      group = glyph_image_instance (group, domain, ERROR_ME, 1);
+      groupii = XIMAGE_INSTANCE (group);
+    }
+#endif
+  if (!gui_item_active_p (pgui))
     flags |= WS_DISABLED;
 
   style = pgui->style;
 
-  if (!NILP (pgui->callback) || !NILP (pgui->callback_ex))
+  if (!NILP (pgui->callback))
     {
       id = mswindows_register_widget_instance (image_instance, domain);
     }
-
+  /* have to set the type this late in case there is no device
+     instantiation for a widget */
+  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);
-
-  /* allocate space for the clip window and then allocate the clip window */
-  ii->data = xnew_and_zero (struct mswindows_subwindow_data);
+    GET_C_STRING_OS_DATA_ALLOCA (IMAGE_INSTANCE_WIDGET_TEXT (ii), nm);
 
-  if ((IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii)
-       = CreateWindowEx(
-			WS_EX_CONTROLPARENT,	/* EX flags */
-			XEMACS_CONTROL_CLASS,
-			0,		/* text */
-			WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_CHILD,
-			0,         /* starting x position */
-			0,         /* starting y position */
-			IMAGE_INSTANCE_WIDGET_WIDTH (ii),
-			IMAGE_INSTANCE_WIDGET_HEIGHT (ii),
-			/* parent window */
-			DOMAIN_MSWINDOWS_HANDLE (domain),
-			(HMENU)id,       /* No menu */
-			NULL, /* must be null for this class */
-			NULL)) == NULL)
-    signal_simple_error ("window creation failed with code",
-			 make_int (GetLastError()));
-
-  if ((wnd = CreateWindowEx(
-			    exflags /* | WS_EX_NOPARENTNOTIFY*/,
-			    class,
-			    nm,
-			    flags | WS_CHILD | WS_VISIBLE,
-			    0,         /* starting x position */
-			    0,         /* starting y position */
-			    IMAGE_INSTANCE_WIDGET_WIDTH (ii),
-			    IMAGE_INSTANCE_WIDGET_HEIGHT (ii),
-			    /* parent window */
-			    IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii),
-			    (HMENU)id,       /* No menu */
-			    (HINSTANCE)
-			    GetWindowLong
-			    (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)),
-			     GWL_HINSTANCE),
-			    NULL)) == NULL)
-    signal_simple_error ("window creation failed with code",
-			 make_int (GetLastError()));
+  wnd = CreateWindowEx( 
+		       exflags /* | WS_EX_NOPARENTNOTIFY*/,
+		       class,  
+		       nm,
+		       flags | WS_CHILD,
+		       0,         /* starting x position */
+		       0,         /* starting y position */
+		       IMAGE_INSTANCE_WIDGET_WIDTH (ii),
+		       IMAGE_INSTANCE_WIDGET_HEIGHT (ii),
+		       /* parent window */
+		       FRAME_MSWINDOWS_HANDLE (XFRAME (frame)),
+		       (HMENU)id,       /* No menu */
+		       (HINSTANCE) 
+		       GetWindowLong (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)),
+				      GWL_HINSTANCE), 
+		       NULL);
 
   IMAGE_INSTANCE_SUBWINDOW_ID (ii) = wnd;
   SetWindowLong (wnd, GWL_USERDATA, (LONG)LISP_TO_VOID(image_instance));
   /* set the widget font from the widget face */
-  if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii)))
-    SendMessage (wnd, WM_SETFONT,
-		 (WPARAM) mswindows_widget_hfont (ii, domain),
-		 MAKELPARAM (TRUE, 0));
-}
-
-/* Instantiate a native layout widget. */
-static void
-mswindows_native_layout_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);
-
-  mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
-				pointer_bg, dest_mask, domain, "STATIC", 
-				/* Approximation to styles available with
-				   an XEmacs layout. */
-				EQ (IMAGE_INSTANCE_LAYOUT_BORDER (ii),
-				    Qetched_in) ||
-				EQ (IMAGE_INSTANCE_LAYOUT_BORDER (ii),
-				    Qetched_out) ||
-				GLYPHP (IMAGE_INSTANCE_LAYOUT_BORDER (ii))
-				? SS_ETCHEDFRAME : SS_SUNKEN,
-				0);
+  SendMessage (wnd, WM_SETFONT, 
+	       (WPARAM)FONT_INSTANCE_MSWINDOWS_HFONT 
+	       (XFONT_INSTANCE (widget_face_font_info 
+				(domain, 
+				 IMAGE_INSTANCE_WIDGET_FACE (ii),
+				 0, 0))), 
+	       MAKELPARAM (TRUE, 0));
 }
 
 /* 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 image instances can have a
+   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
@@ -2547,31 +2252,28 @@
 			      Lisp_Object pointer_fg, Lisp_Object pointer_bg,
 			      int dest_mask, Lisp_Object domain)
 {
-  /* This function can call lisp */
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   HWND wnd;
-  int flags = WS_TABSTOP;/* BS_NOTIFY #### is needed to get exotic feedback
-			    only. Since we seem to want nothing beyond BN_CLICK,
-			    the style is perhaps not necessary -- kkm */
+  int flags = BS_NOTIFY;
   Lisp_Object style;
-  Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
-  Lisp_Gui_Item* pgui = XGUI_ITEM (gui);
+  struct gui_item* pgui = &IMAGE_INSTANCE_WIDGET_ITEM (ii);
   Lisp_Object glyph = find_keyword_in_vector (instantiator, Q_image);
 
+  if (!gui_item_active_p (pgui))
+    flags |= WS_DISABLED;
+
   if (!NILP (glyph))
     {
       if (!IMAGE_INSTANCEP (glyph))
 	glyph = glyph_image_instance (glyph, domain, ERROR_ME, 1);
 
       if (IMAGE_INSTANCEP (glyph))
-	flags |= XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ?
+	flags |= XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ? 
 	  BS_BITMAP : BS_ICON;
     }
 
   style = pgui->style;
 
-  /* #### consider using the default face for radio and toggle
-     buttons. */
   if (EQ (style, Qradio))
     {
       flags |= BS_RADIOBUTTON;
@@ -2581,282 +2283,75 @@
       flags |= BS_AUTOCHECKBOX;
     }
   else
-    {
-      flags |= BS_DEFPUSHBUTTON;
-    }
+    flags |= BS_DEFPUSHBUTTON;
 
   mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
-				pointer_bg, dest_mask, domain, "BUTTON",
-				flags, 0);
+				pointer_bg, dest_mask, domain, "BUTTON", flags, 
+				WS_EX_CONTROLPARENT);
 
   wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
   /* set the checked state */
-  if (gui_item_selected_p (gui))
-    SendMessage (wnd, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
+  if (gui_item_selected_p (pgui))
+    SendMessage (wnd, BM_SETCHECK, (WPARAM)BST_CHECKED, 0); 
   else
     SendMessage (wnd, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
   /* add the image if one was given */
-  if (!NILP (glyph) && IMAGE_INSTANCEP (glyph)
-      &&
-      IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (glyph)))
+  if (!NILP (glyph) && IMAGE_INSTANCEP (glyph))
     {
-      SendMessage (wnd, BM_SETIMAGE,
-		   (WPARAM) (XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ?
+      SendMessage (wnd, BM_SETIMAGE, 
+		   (WPARAM) (XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ? 
 			     IMAGE_BITMAP : IMAGE_ICON),
-		   (XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ?
-		    (LPARAM) XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) :
-		    (LPARAM) XIMAGE_INSTANCE_MSWINDOWS_ICON (glyph)));
+		   (LPARAM) (XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ?
+			     XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) :
+			     XIMAGE_INSTANCE_MSWINDOWS_ICON (glyph)));
     }
 }
 
-/* Update the state of a button. */
-static void
-mswindows_button_update (Lisp_Object image_instance)
-{
-  /* This function can GC if IN_REDISPLAY is false. */
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-
-  /* buttons checked or otherwise */
-  if (gui_item_selected_p (IMAGE_INSTANCE_WIDGET_ITEM (ii)))
-    SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii),
-		 BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
-  else
-    SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii),
-		 BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
-}
-
 /* instantiate an edit control */
 static void
-mswindows_edit_field_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
+mswindows_edit_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 			    Lisp_Object pointer_fg, Lisp_Object pointer_bg,
 			    int dest_mask, Lisp_Object domain)
 {
   mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
-				pointer_bg, dest_mask, domain, "EDIT",
+				pointer_bg, dest_mask, domain, "EDIT", 
 				ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP
-				| WS_BORDER, WS_EX_CLIENTEDGE);
+				| WS_BORDER,
+				WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT);
 }
 
-/* instantiate a progress gauge */
+/* instantiate an edit control */
 static void
-mswindows_progress_gauge_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
+mswindows_progress_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 				Lisp_Object pointer_fg, Lisp_Object pointer_bg,
 				int dest_mask, Lisp_Object domain)
 {
   HWND wnd;
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
-				pointer_bg, dest_mask, domain, PROGRESS_CLASS,
-				WS_BORDER | PBS_SMOOTH, WS_EX_CLIENTEDGE);
+				pointer_bg, dest_mask, domain, PROGRESS_CLASS, 
+				WS_TABSTOP | WS_BORDER | PBS_SMOOTH,
+				WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT);
   wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
   /* set the colors */
 #ifdef PBS_SETBKCOLOR
-  SendMessage (wnd, PBS_SETBKCOLOR, 0,
-	       (LPARAM) (COLOR_INSTANCE_MSWINDOWS_COLOR
-			 (XCOLOR_INSTANCE
-			  (FACE_BACKGROUND
+  SendMessage (wnd, PBS_SETBKCOLOR, 0, 
+	       (LPARAM) (COLOR_INSTANCE_MSWINDOWS_COLOR 
+			 (XCOLOR_INSTANCE 
+			  (FACE_BACKGROUND 
 			   (XIMAGE_INSTANCE_WIDGET_FACE (ii),
-			    XIMAGE_INSTANCE_FRAME (ii))))));
+			    XIMAGE_INSTANCE_SUBWINDOW_FRAME (ii))))));
 #endif
 #ifdef PBS_SETBARCOLOR
-  SendMessage (wnd, PBS_SETBARCOLOR, 0,
-	       (L:PARAM) (COLOR_INSTANCE_MSWINDOWS_COLOR
-			  (XCOLOR_INSTANCE
-			   (FACE_FOREGROUND
+  SendMessage (wnd, PBS_SETBARCOLOR, 0, 
+	       (L:PARAM) (COLOR_INSTANCE_MSWINDOWS_COLOR 
+			  (XCOLOR_INSTANCE 
+			   (FACE_FOREGROUND 
 			    (XIMAGE_INSTANCE_WIDGET_FACE (ii),
-			     XIMAGE_INSTANCE_FRAME (ii))))));
+			     XIMAGE_INSTANCE_SUBWINDOW_FRAME (ii))))));
 #endif
 }
 
-/* instantiate a tree view widget */
-static HTREEITEM add_tree_item (Lisp_Object image_instance,
-				HWND wnd, HTREEITEM parent, Lisp_Object item,
-				int children, Lisp_Object domain)
-{
-  TV_INSERTSTRUCT tvitem;
-  HTREEITEM ret;
-
-  tvitem.hParent = parent;
-  tvitem.hInsertAfter = TVI_LAST;
-  tvitem.item.mask = TVIF_TEXT | TVIF_CHILDREN;
-  tvitem.item.cChildren = children;
-
-  if (GUI_ITEMP (item))
-    {
-      tvitem.item.lParam = mswindows_register_gui_item (image_instance,
-							item, domain);
-      tvitem.item.mask |= TVIF_PARAM;
-      TO_EXTERNAL_FORMAT (LISP_STRING, XGUI_ITEM (item)->name,
-			  C_STRING_ALLOCA, tvitem.item.pszText,
-			  Qnative);
-    }
-  else
-    TO_EXTERNAL_FORMAT (LISP_STRING, item,
-			C_STRING_ALLOCA, tvitem.item.pszText,
-			Qnative);
-
-  tvitem.item.cchTextMax = strlen (tvitem.item.pszText);
-
-  if ((ret = (HTREEITEM)SendMessage (wnd, TVM_INSERTITEM,
-				     0, (LPARAM)&tvitem)) == 0)
-    signal_simple_error ("error adding tree view entry", item);
-
-  return ret;
-}
-
-static void add_tree_item_list (Lisp_Object image_instance,
-				HWND wnd, HTREEITEM parent, Lisp_Object list,
-				Lisp_Object domain)
-{
-  Lisp_Object rest;
-
-  /* get the first item */
-  parent = add_tree_item (image_instance, wnd, parent, XCAR (list), TRUE, domain);
-  /* recursively add items to the tree view */
-  LIST_LOOP (rest, XCDR (list))
-    {
-      if (LISTP (XCAR (rest)))
-	add_tree_item_list (image_instance, wnd, parent, XCAR (rest), domain);
-      else
-	add_tree_item (image_instance, wnd, parent, XCAR (rest), FALSE, domain);
-    }
-}
-
-static void
-mswindows_tree_view_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
-			    Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-			    int dest_mask, Lisp_Object domain)
-{
-  Lisp_Object rest;
-  HWND wnd;
-  HTREEITEM parent;
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
-				pointer_bg, dest_mask, domain, WC_TREEVIEW,
-				WS_TABSTOP | WS_BORDER | PBS_SMOOTH
-				| TVS_HASLINES | TVS_HASBUTTONS,
-				WS_EX_CLIENTEDGE);
-
-  wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
-
-  /* define a root */
-  parent = add_tree_item (image_instance, wnd, NULL,
-			  XCAR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)),
-			  TRUE, domain);
-
-  /* recursively add items to the tree view */
-  /* add items to the tab */
-  LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)))
-    {
-      if (LISTP (XCAR (rest)))
-	add_tree_item_list (image_instance, wnd, parent, XCAR (rest), domain);
-      else
-	add_tree_item (image_instance, wnd, parent, XCAR (rest), FALSE, domain);
-    }
-}
-
-/* instantiate a tab control */
-static TC_ITEM* add_tab_item (Lisp_Object image_instance,
-			     HWND wnd, Lisp_Object item,
-			     Lisp_Object domain, int i)
-{
-  TC_ITEM tvitem, *ret;
-
-  tvitem.mask = TCIF_TEXT;
-
-  if (GUI_ITEMP (item))
-    {
-      tvitem.lParam = mswindows_register_gui_item (image_instance,
-						   item, domain);
-      tvitem.mask |= TCIF_PARAM;
-      TO_EXTERNAL_FORMAT (LISP_STRING, XGUI_ITEM (item)->name,
-			  C_STRING_ALLOCA, tvitem.pszText,
-			  Qnative);
-    }
-  else
-    {
-      CHECK_STRING (item);
-      TO_EXTERNAL_FORMAT (LISP_STRING, item,
-			  C_STRING_ALLOCA, tvitem.pszText,
-			  Qnative);
-    }
-
-  tvitem.cchTextMax = strlen (tvitem.pszText);
-
-  if ((ret = (TC_ITEM*)SendMessage (wnd, TCM_INSERTITEM,
-				    i, (LPARAM)&tvitem)) < 0)
-    signal_simple_error ("error adding tab entry", item);
-
-  return ret;
-}
-
-static void
-mswindows_tab_control_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
-			   Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-			   int dest_mask, Lisp_Object domain)
-{
-  /* This function can call lisp */
-  Lisp_Object rest;
-  HWND wnd;
-  int i = 0, selected = 0;
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation);
-  unsigned int flags = WS_TABSTOP;
-
-  if (EQ (orient, Qleft) || EQ (orient, Qright))
-    {
-      flags |= TCS_VERTICAL | TCS_MULTILINE;
-    }
-  if (EQ (orient, Qright) || EQ (orient, Qbottom))
-    {
-      flags |= TCS_BOTTOM;
-    }
-
-  mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
-				pointer_bg, dest_mask, domain, WC_TABCONTROL,
-				/* borders don't suit tabs so well */
-				flags, 0);
-  wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
-  /* add items to the tab */
-  LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)))
-    {
-      add_tab_item (image_instance, wnd, XCAR (rest), domain, i);
-      if (gui_item_selected_p (XCAR (rest)))
-	selected = i;
-      i++;
-    }
-  SendMessage (wnd, TCM_SETCURSEL, selected, 0);
-}
-
-/* set the properties of a tab control */
-static void
-mswindows_tab_control_update (Lisp_Object image_instance)
-{
-  /* This function can GC if IN_REDISPLAY is false. */
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-
-  if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii))
-    {
-      HWND wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
-      int i = 0, selected = 0;
-      Lisp_Object rest;
-
-      /* delete the pre-existing items */
-      SendMessage (wnd, TCM_DELETEALLITEMS, 0, 0);
-
-      /* add items to the tab */
-      LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii)))
-	{
-	  add_tab_item (image_instance, wnd, XCAR (rest),
-			IMAGE_INSTANCE_FRAME (ii), i);
-	  if (gui_item_selected_p (XCAR (rest)))
-	    selected = i;
-	  i++;
-	}
-      SendMessage (wnd, TCM_SETCURSEL, selected, 0);
-    }
-}
-
 /* instantiate a static control possible for putting other things in */
 static void
 mswindows_label_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
@@ -2864,10 +2359,24 @@
 			     int dest_mask, Lisp_Object domain)
 {
   mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
-				pointer_bg, dest_mask, domain, "STATIC",
+				pointer_bg, dest_mask, domain, "STATIC", 
 				0, WS_EX_STATICEDGE);
 }
 
+#if 0
+/* instantiate a static control possible for putting other things in */
+static void
+mswindows_group_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
+			    Lisp_Object pointer_fg, Lisp_Object pointer_bg,
+			    int dest_mask, Lisp_Object domain)
+{
+  mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
+				pointer_bg, dest_mask, domain, "BUTTON", 
+				WS_GROUP | BS_GROUPBOX | WS_BORDER,
+				WS_EX_CLIENTEDGE );
+}
+#endif
+
 /* instantiate a scrollbar control */
 static void
 mswindows_scrollbar_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
@@ -2875,22 +2384,20 @@
 				 int dest_mask, Lisp_Object domain)
 {
   mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
-				pointer_bg, dest_mask, domain, "SCROLLBAR",
-				WS_TABSTOP, WS_EX_CLIENTEDGE);
+				pointer_bg, dest_mask, domain, "SCROLLBAR", 
+				0,
+				WS_EX_CLIENTEDGE );
 }
 
 /* instantiate a combo control */
 static void
-mswindows_combo_box_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
+mswindows_combo_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);
-  HWND wnd;
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  HANDLE wnd;
   Lisp_Object rest;
-  Lisp_Object data = Fplist_get (find_keyword_in_vector (instantiator, Q_properties),
-				 Q_items, Qnil);
-  int len, height;
 
   /* Maybe ought to generalise this more but it may be very windows
      specific. In windows the window height of a combo box is the
@@ -2898,38 +2405,23 @@
      before creating the window and then reset it to a single line
      after the window is created so that redisplay does the right
      thing. */
-  widget_instantiate (image_instance, instantiator, pointer_fg,
-		      pointer_bg, dest_mask, domain);
-
-  /* We now have everything right apart from the height. */
-  default_face_font_info (domain, 0, 0, &height, 0, 0);
-  GET_LIST_LENGTH (data, len);
-
-  height = (height + WIDGET_BORDER_HEIGHT * 2 ) * len;
-  IMAGE_INSTANCE_HEIGHT (ii) = height;
-
-  /* Now create the widget. */
   mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
-				pointer_bg, dest_mask, domain, "COMBOBOX",
+				pointer_bg, dest_mask, domain, "COMBOBOX", 
 				WS_BORDER | WS_TABSTOP | CBS_DROPDOWN
-				| CBS_AUTOHSCROLL
+				| CBS_AUTOHSCROLL  
 				| CBS_HASSTRINGS | WS_VSCROLL,
-				WS_EX_CLIENTEDGE);
-  /* Reset the height. layout will probably do this safely, but better make sure. */
-  image_instance_layout (image_instance,
-			 IMAGE_UNSPECIFIED_GEOMETRY,
-			 IMAGE_UNSPECIFIED_GEOMETRY,
-			 domain);
-
+				WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT);
+  /* reset the height */
+  widget_text_to_pixel_conversion (domain, 
+				   IMAGE_INSTANCE_WIDGET_FACE (ii), 1, 0, 
+				   &IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii), 0);
   wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
   /* add items to the combo box */
   SendMessage (wnd, CB_RESETCONTENT, 0, 0);
   LIST_LOOP (rest, Fplist_get (IMAGE_INSTANCE_WIDGET_PROPS (ii), Q_items, Qnil))
     {
       Extbyte* lparam;
-      TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (rest),
-			  C_STRING_ALLOCA, lparam,
-			  Qnative);
+      GET_C_STRING_OS_DATA_ALLOCA (XCAR (rest), lparam);
       if (SendMessage (wnd, CB_ADDSTRING, 0, (LPARAM)lparam) == CB_ERR)
 	signal_simple_error ("error adding combo entries", instantiator);
     }
@@ -2939,16 +2431,16 @@
 static Lisp_Object
 mswindows_widget_property (Lisp_Object image_instance, Lisp_Object prop)
 {
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  HWND wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  HANDLE wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
   /* get the text from a control */
   if (EQ (prop, Q_text))
     {
       Extcount len = SendMessage (wnd, WM_GETTEXTLENGTH, 0, 0);
-      Extbyte *buf = (Extbyte*) alloca (len+1);
-
+      Extbyte* buf =alloca (len+1);
+      
       SendMessage (wnd, WM_GETTEXT, (WPARAM)len+1, (LPARAM) buf);
-      return build_ext_string (buf, Qnative);
+      return build_ext_string (buf, FORMAT_OS);
     }
   return Qunbound;
 }
@@ -2957,8 +2449,8 @@
 static Lisp_Object
 mswindows_button_property (Lisp_Object image_instance, Lisp_Object prop)
 {
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  HWND wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  HANDLE wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
   /* check the state of a button */
   if (EQ (prop, Q_selected))
     {
@@ -2972,68 +2464,58 @@
 
 /* get properties of a combo box */
 static Lisp_Object
-mswindows_combo_box_property (Lisp_Object image_instance, Lisp_Object prop)
+mswindows_combo_property (Lisp_Object image_instance, Lisp_Object prop)
 {
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  HWND wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  HANDLE wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
   /* get the text from a control */
   if (EQ (prop, Q_text))
     {
       long item = SendMessage (wnd, CB_GETCURSEL, 0, 0);
       Extcount len = SendMessage (wnd, CB_GETLBTEXTLEN, (WPARAM)item, 0);
-      Extbyte* buf = (Extbyte*) alloca (len+1);
+      Extbyte* buf = alloca (len+1);
       SendMessage (wnd, CB_GETLBTEXT, (WPARAM)item, (LPARAM)buf);
-      return build_ext_string (buf, Qnative);
+      return build_ext_string (buf, FORMAT_OS);
+    }
+  return Qunbound;
+}
+
+/* set the properties of a control */
+static Lisp_Object
+mswindows_widget_set_property (Lisp_Object image_instance, Lisp_Object prop,
+			       Lisp_Object val)
+{
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+
+  if (EQ (prop, Q_text))
+    {
+      Extbyte* lparam=0;
+      CHECK_STRING (val);
+      GET_C_STRING_OS_DATA_ALLOCA (val, lparam);
+      SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii),
+		   WM_SETTEXT, 0, (LPARAM)lparam);
+      return Qt;
     }
   return Qunbound;
 }
 
 /* set the properties of a progres guage */
-static void
-mswindows_progress_gauge_update (Lisp_Object image_instance)
+static Lisp_Object
+mswindows_progress_set_property (Lisp_Object image_instance, Lisp_Object prop,
+				 Lisp_Object val)
 {
-  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  
-  if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii))
+  struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+
+  if (EQ (prop, Q_percent))
     {
-      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;
-#ifdef DEBUG_WIDGET_OUTPUT     
-      printf ("progress gauge displayed value on %p updated to %ld\n",
-	      WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii),
-	      XINT(val));
-#endif
       CHECK_INT (val);
       SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii),
 		   PBM_SETPOS, (WPARAM)XINT (val), 0);
+      return Qt;
     }
+  return Qunbound;
 }
 
-LRESULT WINAPI
-mswindows_control_wnd_proc (HWND hwnd, UINT msg,
-			    WPARAM wParam, LPARAM lParam)
-{
-  switch (msg)
-    {
-    case WM_NOTIFY:
-    case WM_COMMAND:
-    case WM_CTLCOLORBTN:
-    case WM_CTLCOLORLISTBOX:
-    case WM_CTLCOLOREDIT:
-    case WM_CTLCOLORSTATIC:
-    case WM_CTLCOLORSCROLLBAR:
-
-      return mswindows_wnd_proc (GetParent (hwnd), msg, wParam, lParam);
-    default:
-      return DefWindowProc (hwnd, msg, wParam, lParam);
-    }
-}
-
-#endif /* HAVE_WIDGETS */
-
 
 /************************************************************************/
 /*                            initialization                            */
@@ -3049,107 +2531,66 @@
 void
 console_type_create_glyphs_mswindows (void)
 {
-  /* image methods - display */
+  /* image methods */
+
   CONSOLE_HAS_METHOD (mswindows, print_image_instance);
   CONSOLE_HAS_METHOD (mswindows, finalize_image_instance);
   CONSOLE_HAS_METHOD (mswindows, unmap_subwindow);
   CONSOLE_HAS_METHOD (mswindows, map_subwindow);
   CONSOLE_HAS_METHOD (mswindows, update_subwindow);
-  CONSOLE_HAS_METHOD (mswindows, resize_subwindow);
-  CONSOLE_HAS_METHOD (mswindows, update_widget);
   CONSOLE_HAS_METHOD (mswindows, image_instance_equal);
   CONSOLE_HAS_METHOD (mswindows, image_instance_hash);
   CONSOLE_HAS_METHOD (mswindows, init_image_instance_from_eimage);
   CONSOLE_HAS_METHOD (mswindows, locate_pixmap_file);
-
-  /* image methods - printer */
-  CONSOLE_INHERITS_METHOD (msprinter, mswindows, print_image_instance);
-  CONSOLE_INHERITS_METHOD (msprinter, mswindows, finalize_image_instance);
-  CONSOLE_INHERITS_METHOD (msprinter, mswindows, image_instance_equal);
-  CONSOLE_INHERITS_METHOD (msprinter, mswindows, image_instance_hash);
-  CONSOLE_INHERITS_METHOD (msprinter, mswindows, init_image_instance_from_eimage);
-  CONSOLE_INHERITS_METHOD (msprinter, mswindows, locate_pixmap_file);
 }
 
 void
 image_instantiator_format_create_glyphs_mswindows (void)
 {
-  IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, nothing);
-  IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, string);
-  IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, formatted_string);
-  IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, inherit);
   /* image-instantiator types */
-  INITIALIZE_DEVICE_IIFORMAT (mswindows, xbm);
-  INITIALIZE_DEVICE_IIFORMAT (msprinter, xbm);
-  IIFORMAT_HAS_DEVMETHOD (mswindows, xbm, instantiate);
-  IIFORMAT_INHERITS_DEVMETHOD (msprinter, mswindows, xbm, instantiate);
 #ifdef HAVE_XPM
   INITIALIZE_DEVICE_IIFORMAT (mswindows, xpm);
-  INITIALIZE_DEVICE_IIFORMAT (msprinter, xpm);
   IIFORMAT_HAS_DEVMETHOD (mswindows, xpm, instantiate);
-  IIFORMAT_INHERITS_DEVMETHOD (msprinter, mswindows, xpm, instantiate);
 #endif
+  INITIALIZE_DEVICE_IIFORMAT (mswindows, xbm);
+  IIFORMAT_HAS_DEVMETHOD (mswindows, xbm, instantiate);
 #ifdef HAVE_XFACE
   INITIALIZE_DEVICE_IIFORMAT (mswindows, xface);
-  INITIALIZE_DEVICE_IIFORMAT (msprinter, xface);
   IIFORMAT_HAS_DEVMETHOD (mswindows, xface, instantiate);
-  IIFORMAT_INHERITS_DEVMETHOD (msprinter, mswindows, xface, instantiate);
-#endif
-#ifdef HAVE_JPEG
-  IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, jpeg);
-#endif
-#ifdef HAVE_TIFF
-  IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, tiff);
 #endif
-#ifdef HAVE_PNG
-  IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, png);
-#endif
-#ifdef HAVE_GIF
-  IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, gif);
-#endif
-#ifdef HAVE_WIDGETS
-  INITIALIZE_DEVICE_IIFORMAT (mswindows, widget);
-  IIFORMAT_HAS_DEVMETHOD (mswindows, widget, property);
-  /* layout widget */
-  IIFORMAT_VALID_CONSOLE (mswindows, layout);
-  INITIALIZE_DEVICE_IIFORMAT (mswindows, native_layout);
-  IIFORMAT_HAS_DEVMETHOD (mswindows, native_layout, instantiate);
-  /* button widget */
   INITIALIZE_DEVICE_IIFORMAT (mswindows, button);
   IIFORMAT_HAS_DEVMETHOD (mswindows, button, property);
   IIFORMAT_HAS_DEVMETHOD (mswindows, button, instantiate);
-  IIFORMAT_HAS_DEVMETHOD (mswindows, button, update);
-  /* edit-field widget */
-  INITIALIZE_DEVICE_IIFORMAT (mswindows, edit_field);
-  IIFORMAT_HAS_DEVMETHOD (mswindows, edit_field, instantiate);
-  /* subwindow */
+
+  INITIALIZE_DEVICE_IIFORMAT (mswindows, edit);
+  IIFORMAT_HAS_DEVMETHOD (mswindows, edit, instantiate);
+  
   INITIALIZE_DEVICE_IIFORMAT (mswindows, subwindow);
   IIFORMAT_HAS_DEVMETHOD (mswindows, subwindow, instantiate);
-  /* label */
+
+  INITIALIZE_DEVICE_IIFORMAT (mswindows, widget);
+  IIFORMAT_HAS_DEVMETHOD (mswindows, widget, property);
+  IIFORMAT_HAS_DEVMETHOD (mswindows, widget, set_property);
+#if 0
+  INITIALIZE_DEVICE_IIFORMAT (mswindows, group);
+  IIFORMAT_HAS_DEVMETHOD (mswindows, group, instantiate);
+#endif
   INITIALIZE_DEVICE_IIFORMAT (mswindows, label);
   IIFORMAT_HAS_DEVMETHOD (mswindows, label, instantiate);
-  /* combo box */
-  INITIALIZE_DEVICE_IIFORMAT (mswindows, combo_box);
-  IIFORMAT_HAS_DEVMETHOD (mswindows, combo_box, property);
-  IIFORMAT_HAS_DEVMETHOD (mswindows, combo_box, instantiate);
-  /* scrollbar */
+
+  INITIALIZE_DEVICE_IIFORMAT (mswindows, combo);
+  IIFORMAT_HAS_DEVMETHOD (mswindows, combo, property);
+  IIFORMAT_HAS_DEVMETHOD (mswindows, combo, instantiate);
+
   INITIALIZE_DEVICE_IIFORMAT (mswindows, scrollbar);
   IIFORMAT_HAS_DEVMETHOD (mswindows, scrollbar, instantiate);
-  /* progress gauge */
-  INITIALIZE_DEVICE_IIFORMAT (mswindows, progress_gauge);
-  IIFORMAT_HAS_DEVMETHOD (mswindows, progress_gauge, update);
-  IIFORMAT_HAS_DEVMETHOD (mswindows, progress_gauge, instantiate);
-  /* tree view widget */
-  INITIALIZE_DEVICE_IIFORMAT (mswindows, tree_view);
-  /*  IIFORMAT_HAS_DEVMETHOD (mswindows, progress, set_property);*/
-  IIFORMAT_HAS_DEVMETHOD (mswindows, tree_view, instantiate);
-  /* tab control widget */
-  INITIALIZE_DEVICE_IIFORMAT (mswindows, tab_control);
-  IIFORMAT_HAS_DEVMETHOD (mswindows, tab_control, instantiate);
-  IIFORMAT_HAS_DEVMETHOD (mswindows, tab_control, update);
-#endif
-  /* windows bitmap format */
+
+  INITIALIZE_DEVICE_IIFORMAT (mswindows, progress);
+  IIFORMAT_HAS_DEVMETHOD (mswindows, progress, set_property);
+  IIFORMAT_HAS_DEVMETHOD (mswindows, progress, instantiate);
+
   INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (bmp, "bmp");
+
   IIFORMAT_HAS_METHOD (bmp, validate);
   IIFORMAT_HAS_METHOD (bmp, normalize);
   IIFORMAT_HAS_METHOD (bmp, possible_dest_types);
@@ -3157,9 +2598,7 @@
 
   IIFORMAT_VALID_KEYWORD (bmp, Q_data, check_valid_string);
   IIFORMAT_VALID_KEYWORD (bmp, Q_file, check_valid_string);
-  IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, bmp);
 
-  /* mswindows resources */
   INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (mswindows_resource,
 					"mswindows-resource");
 
@@ -3168,21 +2607,29 @@
   IIFORMAT_HAS_METHOD (mswindows_resource, possible_dest_types);
   IIFORMAT_HAS_METHOD (mswindows_resource, instantiate);
 
-  IIFORMAT_VALID_KEYWORD (mswindows_resource, Q_resource_type,
+  IIFORMAT_VALID_KEYWORD (mswindows_resource, Q_resource_type, 
 			  check_valid_resource_symbol);
   IIFORMAT_VALID_KEYWORD (mswindows_resource, Q_resource_id, check_valid_resource_id);
   IIFORMAT_VALID_KEYWORD (mswindows_resource, Q_file, check_valid_string);
-  IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, mswindows_resource);
 }
 
 void
 vars_of_glyphs_mswindows (void)
 {
+  Fprovide (Qbmp);
+  Fprovide (Qmswindows_resource);
   DEFVAR_LISP ("mswindows-bitmap-file-path", &Vmswindows_bitmap_file_path /*
 A list of the directories in which mswindows bitmap files may be found.
 This is used by the `make-image-instance' function.
 */ );
   Vmswindows_bitmap_file_path = Qnil;
+
+  Fprovide (Qbutton);
+  Fprovide (Qedit);
+  Fprovide (Qcombo);
+  Fprovide (Qscrollbar);
+  Fprovide (Qlabel);
+  Fprovide (Qprogress);
 }
 
 void