--- /home/cpdev/src/classpath/gnu/java/awt/peer/gtk/GtkToolkit.java	2005-07-05 05:32:33.000000000 +0000
+++ gnu/java/awt/peer/gtk/GtkToolkit.java	2005-06-30 05:34:04.000000000 +0000
@@ -40,6 +40,7 @@
 
 import gnu.classpath.Configuration;
 import gnu.java.awt.EmbeddedWindow;
+import gnu.java.awt.EmbeddedWindowSupport;
 import gnu.java.awt.peer.ClasspathFontPeer;
 import gnu.java.awt.peer.ClasspathTextLayoutPeer;
 import gnu.java.awt.peer.EmbeddedWindowPeer;
@@ -52,7 +53,6 @@
 import java.awt.im.InputMethodHighlight;
 import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
-import java.awt.image.DirectColorModel;
 import java.awt.image.ImageConsumer;
 import java.awt.image.ImageObserver;
 import java.awt.image.ImageProducer;
@@ -85,6 +85,7 @@
  * object to be used.
  */
 public class GtkToolkit extends gnu.java.awt.ClasspathToolkit
+  implements EmbeddedWindowSupport
 {
   Hashtable containers = new Hashtable();
   static EventQueue q;
@@ -139,7 +140,9 @@
       | ImageObserver.HEIGHT;
 
     if (image instanceof GtkImage)
-	return ((GtkImage) image).checkImage (observer);
+      {        
+        status = ((GtkImage) image).checkImage ();
+      }
 
     if (observer != null)
       observer.imageUpdate (image, status,
@@ -247,7 +250,12 @@
     if (useGraphics2D())
       return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (filename));
     else
-      return new GtkImage (filename);
+      {
+        GdkPixbufDecoder d = new GdkPixbufDecoder (filename);
+        GtkImage image = new GtkImage (d, null);
+        d.startProduction (image);
+        return image;        
+      }
   }
 
   public Image createImage (URL url)
@@ -257,7 +265,8 @@
     else
       {
         GdkPixbufDecoder d = new GdkPixbufDecoder (url);
-        GtkImage image = new GtkImage (d);
+        GtkImage image = new GtkImage (d, null);
+        d.startProduction (image);
         return image;        
       }
   }
@@ -267,7 +276,11 @@
     if (useGraphics2D())
       return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (producer));
     else
-      return new GtkImage (producer);
+      {
+        GtkImage image = new GtkImage (producer, null);
+        producer.startProduction (image);
+        return image;        
+      }
   }
 
   public Image createImage (byte[] imagedata, int imageoffset,
@@ -282,7 +295,8 @@
         GdkPixbufDecoder d = new GdkPixbufDecoder (imagedata,
                                                    imageoffset, 
                                                    imagelength);
-        GtkImage image = new GtkImage (d);
+        GtkImage image = new GtkImage (d, null);
+        d.startProduction (image);
         return image;        
       }
   }
@@ -298,18 +312,9 @@
     return new GdkPixbufDecoder(url);  
   }
 
-  /**
-   * Returns the native color model (which isn't the same as the default
-   * ARGB color model, but doesn't have to be). 
-   */
   public ColorModel getColorModel () 
   {
-    /* Return the GDK-native ABGR format */
-    return new DirectColorModel(32, 
-				0x000000FF,
-				0x0000FF00,
-				0x00FF0000,
-				0xFF000000);
+    return ColorModel.getRGBdefault ();
   }
 
   public String[] getFontList () 
@@ -398,20 +403,32 @@
     return systemClipboard;
   }
 
-  /**
-   * Prepares a GtkImage. For every other kind of Image it just
-   * assumes the image is already prepared for rendering.
-   */
   public boolean prepareImage (Image image, int width, int height, 
 			       ImageObserver observer) 
   {
-    /* GtkImages are always prepared, as long as they're loaded. */
-    if (image instanceof GtkImage)
-      return ((((GtkImage)image).checkImage (observer) & 
-	       ImageObserver.ALLBITS) != 0);
+    GtkImage i = (GtkImage) image;
+
+    if (i.isLoaded ()) return true;
+
+    class PrepareImage extends Thread
+    {
+      GtkImage image;
+      ImageObserver observer;
+
+      PrepareImage (GtkImage image, ImageObserver observer)
+      {
+	this.image = image;
+	image.setObserver (observer);
+      }
+      
+      public void run ()
+      {
+	image.source.startProduction (image);
+      }
+    }
 
-    /* Assume anything else is too */
-    return true;
+    new PrepareImage (i, observer).start ();
+    return false;
   }
 
   public native void sync();
