Hi,

These are some cleanups for the GtkImage and setIconImage code. If an
GtkImage wasn't properly loaded and you tried to set it as Icon on a
Frame we could crash.

2007-04-04  Mark Wielaard  <[EMAIL PROTECTED]>

       * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
       (cp_gtk_image_get_pixbuf): Return NULL when pointer is NULL.
       * gnu/java/awt/peer/gtk/GtkImage.java (setImage): Set loaded and
       call deliver() after pixels have been set.
       * gnu/java/awt/peer/gtk/GtkFramePeer.java (setIconImage): Only
       set icon when image has been properly loaded.

Christian, this hopefully solves the issue you reported on irc with
MegaMek. Could you test?

Thanks & Committed,

Mark
Index: gnu/java/awt/peer/gtk/GtkFramePeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkFramePeer.java,v
retrieving revision 1.50
diff -u -r1.50 GtkFramePeer.java
--- gnu/java/awt/peer/gtk/GtkFramePeer.java	12 Feb 2007 21:39:20 -0000	1.50
+++ gnu/java/awt/peer/gtk/GtkFramePeer.java	4 Apr 2007 22:34:01 -0000
@@ -1,5 +1,5 @@
 /* GtkFramePeer.java -- Implements FramePeer with GTK
-   Copyright (C) 1999, 2002, 2004, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2004, 2006, 2007 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -178,10 +178,14 @@
   {
     if (image != null)
       {
+        GtkImage gtkImage;
         if (image instanceof GtkImage)
-          nativeSetIconImage((GtkImage) image);
-        else
-          nativeSetIconImage(new GtkImage(image.getSource()));
+          gtkImage = (GtkImage) image;
+	else
+	  gtkImage = new GtkImage(image.getSource());
+
+        if (gtkImage.isLoaded && ! gtkImage.errorLoading)
+          nativeSetIconImage(gtkImage);
       }
   }
 
Index: gnu/java/awt/peer/gtk/GtkImage.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkImage.java,v
retrieving revision 1.36
diff -u -r1.36 GtkImage.java
--- gnu/java/awt/peer/gtk/GtkImage.java	12 Feb 2007 21:39:20 -0000	1.36
+++ gnu/java/awt/peer/gtk/GtkImage.java	4 Apr 2007 22:34:01 -0000
@@ -374,13 +374,13 @@
         return;
       }
 
-    isLoaded = true;
-    deliver();
     synchronized(pixbufLock)
       {
         createPixbuf();
         setPixels(pixels);
       }
+    isLoaded = true;
+    deliver();
   }
 
   // java.awt.Image methods ////////////////////////////////////////////////
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c,v
retrieving revision 1.26
diff -u -r1.26 gnu_java_awt_peer_gtk_GtkImage.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c	28 Jun 2006 19:47:42 -0000	1.26
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c	4 Apr 2007 22:34:04 -0000
@@ -1,5 +1,5 @@
 /* gtkimage.c
-   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -368,6 +368,9 @@
   g_assert (data_fid != 0);
   data = (*env)->GetObjectField (env, obj, data_fid);
 
+  if (data == NULL)
+    return NULL;
+
   return (GdkPixbuf *)JCL_GetRawData (env, data);
 }
 

Reply via email to