Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c,v retrieving revision 1.21 diff -u -r1.21 gnu_java_awt_peer_gtk_GdkGraphics.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 19 Jan 2005 08:10:27 -0000 1.21 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 1 Feb 2005 22:31:53 -0000 @@ -46,7 +46,7 @@ GdkPoint * translate_points (JNIEnv *env, jintArray xpoints, jintArray ypoints, jint npoints, jint x_offset, jint y_offset); -static void realize_cb (GtkWidget *widget, jobject peer); +static void realize_cb (GtkWidget *widget, jobject *peer); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_copyState @@ -133,13 +133,18 @@ (JNIEnv *env, jobject obj, jobject peer) { void *ptr; + jobject *graphics; + + graphics = (jobject *) malloc (sizeof (jobject)); + g_assert (graphics != NULL); + *graphics = (*env)->NewGlobalRef (env, obj); ptr = NSA_GET_PTR (env, peer); gdk_threads_enter (); g_signal_connect_after (G_OBJECT (ptr), "realize", - G_CALLBACK (realize_cb), obj); + G_CALLBACK (realize_cb), graphics); gdk_threads_leave (); } @@ -676,11 +681,16 @@ } static void realize_cb (GtkWidget *widget __attribute__ ((unused)), - jobject peer) + jobject *peer) { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, initComponentGraphicsID); + g_assert (peer != NULL); + + (*gdk_env())->CallVoidMethod (gdk_env(), *peer, initComponentGraphicsID); + + (*gdk_env())->DeleteGlobalRef (gdk_env(), *peer); + free (peer); gdk_threads_enter (); } Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c,v retrieving revision 1.13 diff -u -r1.13 gnu_java_awt_peer_gtk_GtkChoicePeer.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c 19 Jan 2005 08:10:27 -0000 1.13 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c 1 Feb 2005 22:31:53 -0000 @@ -39,22 +39,24 @@ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkChoicePeer.h" -static void selection_changed (GtkComboBox *combobox, gpointer data); +static void selection_changed (GtkComboBox *combobox, jobject peer); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create (JNIEnv *env, jobject obj) { GtkWidget *combobox; + jobject *gref; NSA_SET_GLOBAL_REF (env, obj); + gref = NSA_GET_GLOBAL_REF (env, obj); gdk_threads_enter (); combobox = gtk_combo_box_new_text (); g_signal_connect (combobox, "changed", - G_CALLBACK (selection_changed), obj); + G_CALLBACK (selection_changed), *gref); gdk_threads_leave (); @@ -175,7 +177,7 @@ return index; } -void selection_changed (GtkComboBox *combobox, jobject peer) +static void selection_changed (GtkComboBox *combobox, jobject peer) { jstring label; GtkTreeModel *model; Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c,v retrieving revision 1.4 diff -u -r1.4 gnu_java_awt_peer_gtk_GtkGenericPeer.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c 18 Jan 2005 09:43:46 -0000 1.4 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c 1 Feb 2005 22:31:53 -0000 @@ -45,9 +45,7 @@ { void *ptr; - /* Remove entries from state tables */ - NSA_DEL_GLOBAL_REF (env, obj); - ptr = NSA_DEL_PTR (env, obj); + ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); @@ -57,6 +55,10 @@ gdk_threads_leave (); + /* Remove entries from state tables */ + NSA_DEL_GLOBAL_REF (env, obj); + NSA_DEL_PTR (env, obj); + /* * Wake up the main thread, to make sure it re-checks the window * destruction condition.