From 7ecd45764f643c7c99b3100b50879ac69ec80113 Mon Sep 17 00:00:00 2001 From: Fernando Nasser Date: Sat, 13 Dec 2003 01:15:47 +0000 Subject: [PATCH] gtkpeer.h: Extend NSA set of macros to handle a second native state table --... 2003-12-12 Fernando Nasser * jni/gtk-peer/gtkpeer.h: Extend NSA set of macros to handle a second native state table -- native_global_ref_table. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c: Define native_global_ref_table pointer. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c (Java_gnu_java_awt_peer_gtk_GtkGenericPeer_dispose): Make sure JNI global reference is deleted and memory allocated for pointer freed. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): Use saved JNI global reference instead of JNI local reference. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (pre_event_handler): Remove compilation warning. (connect_awt_hook): Use saved JNI global reference instead of creating a new one. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c (Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create): Save JNI global reference to the Java object. (Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals): Remove unused variable declaration and add comment. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c (Java_gnu_java_awt_peer_gtk_GtkCanvasPeer_create): Save JNI global reference to the Java object. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c (Java_gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer_create): Ditto. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeCreate): Ditto. (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals): Use saved JNI global reference instead of JNI local reference. (item_toggled): Add debug statement. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c (Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create): Save JNI global reference to the Java object. (connect_choice_item_selectable_hook): Use saved JNI global references instead of JNI local reference. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c (Java_gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer_create): Save JNI global reference to the Java object. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c (Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create): Save JNI global reference to the Java object. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c (Java_gnu_java_awt_peer_gtk_GtkLabelPeer_create): Ditto. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c (Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_create): Ditto. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c (Java_gnu_java_awt_peer_gtk_GtkMenuPeer_create): Ditto. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c (Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_create): Ditto. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c (Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create): Ditto. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c (Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_create): Ditto. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c (Java_gnu_java_awt_peer_gtk_GtkListPeer_create): Ditto. (Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals): Use saved JNI global reference instead of JNI local reference. (item_selected): Add debug statement. (item_unselected): Add debug statement. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c (Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_create): Save JNI global reference to the Java object. Connect "activate" signal handler using global JNI reference. (connect_activate_hook): Removed in favor of inline code. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c (Java_gnu_java_awt_peer_gtk_GtkPanelPeer_create): Save JNI global reference to the Java object. (Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals): Use saved JNI global reference instead of JNI local reference. Add FIXME comment. (Java_gnu_java_awt_peer_gtk_GtkPanelPeer_gtkPanelNew): Save JNI global reference to the Java object. Add FIXME comment. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c (Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create): Save JNI global reference to the Java object. (Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals): Use saved JNI global reference instead of JNI local reference. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c (Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals): Use saved JNI global reference instead of JNI local reference. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c (Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create): Save JNI global reference to the Java object. (Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals): Use saved JNI global reference instead of JNI local reference. From-SVN: r74593 --- libjava/ChangeLog | 85 +++++++++++++++++++ .../gnu_java_awt_peer_gtk_GtkButtonPeer.c | 9 +- .../gnu_java_awt_peer_gtk_GtkCanvasPeer.c | 5 ++ ...ava_awt_peer_gtk_GtkCheckboxMenuItemPeer.c | 5 ++ .../gnu_java_awt_peer_gtk_GtkCheckboxPeer.c | 9 +- .../gnu_java_awt_peer_gtk_GtkChoicePeer.c | 15 +++- .../gnu_java_awt_peer_gtk_GtkComponentPeer.c | 16 ++-- ..._java_awt_peer_gtk_GtkEmbeddedWindowPeer.c | 5 +- .../gnu_java_awt_peer_gtk_GtkEvents.c | 17 ++-- .../gnu_java_awt_peer_gtk_GtkFileDialogPeer.c | 5 ++ .../gnu_java_awt_peer_gtk_GtkLabelPeer.c | 5 +- .../gnu_java_awt_peer_gtk_GtkListPeer.c | 21 +++-- .../gnu_java_awt_peer_gtk_GtkMainThread.c | 1 + .../gnu_java_awt_peer_gtk_GtkMenuBarPeer.c | 5 ++ .../gnu_java_awt_peer_gtk_GtkMenuItemPeer.c | 28 +++--- .../gnu_java_awt_peer_gtk_GtkMenuPeer.c | 5 ++ .../gnu_java_awt_peer_gtk_GtkPanelPeer.c | 23 ++++- .../gnu_java_awt_peer_gtk_GtkScrollBarPeer.c | 15 ++-- .../gnu_java_awt_peer_gtk_GtkScrollPanePeer.c | 5 ++ .../gnu_java_awt_peer_gtk_GtkTextAreaPeer.c | 5 +- ...u_java_awt_peer_gtk_GtkTextComponentPeer.c | 20 ++--- .../gnu_java_awt_peer_gtk_GtkTextFieldPeer.c | 5 ++ .../gnu_java_awt_peer_gtk_GtkWindowPeer.c | 22 +++-- libjava/jni/gtk-peer/gtkpeer.h | 19 ++++- 24 files changed, 280 insertions(+), 70 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 6f5d46a7e65..42219ad80f4 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,88 @@ +2003-12-12 Fernando Nasser + + * jni/gtk-peer/gtkpeer.h: Extend NSA set of macros to handle a second + native state table -- native_global_ref_table. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c: Define + native_global_ref_table pointer. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c + (Java_gnu_java_awt_peer_gtk_GtkGenericPeer_dispose): Make sure JNI + global reference is deleted and memory allocated for pointer freed. + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): Use saved + JNI global reference instead of JNI local reference. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c + (pre_event_handler): Remove compilation warning. + (connect_awt_hook): Use saved JNI global reference instead of creating + a new one. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c + (Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create): Save JNI global + reference to the Java object. + (Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals): Remove + unused variable declaration and add comment. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c + (Java_gnu_java_awt_peer_gtk_GtkCanvasPeer_create): Save JNI global + reference to the Java object. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c + (Java_gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer_create): Ditto. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c + (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeCreate): Ditto. + (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals): Use saved + JNI global reference instead of JNI local reference. + (item_toggled): Add debug statement. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c + (Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create): Save JNI global + reference to the Java object. + (connect_choice_item_selectable_hook): Use saved JNI global references + instead of JNI local reference. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c + (Java_gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer_create): Save JNI + global reference to the Java object. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c + (Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create): Save JNI global + reference to the Java object. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c + (Java_gnu_java_awt_peer_gtk_GtkLabelPeer_create): Ditto. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c + (Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_create): Ditto. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c + (Java_gnu_java_awt_peer_gtk_GtkMenuPeer_create): Ditto. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c + (Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_create): Ditto. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c + (Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create): Ditto. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c + (Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_create): Ditto. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c + (Java_gnu_java_awt_peer_gtk_GtkListPeer_create): Ditto. + (Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals): Use saved + JNI global reference instead of JNI local reference. + (item_selected): Add debug statement. + (item_unselected): Add debug statement. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c + (Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_create): Save JNI global + reference to the Java object. + Connect "activate" signal handler using global JNI reference. + (connect_activate_hook): Removed in favor of inline code. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c + (Java_gnu_java_awt_peer_gtk_GtkPanelPeer_create): Save JNI global + reference to the Java object. + (Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals): Use saved + JNI global reference instead of JNI local reference. Add FIXME comment. + (Java_gnu_java_awt_peer_gtk_GtkPanelPeer_gtkPanelNew): Save JNI global + reference to the Java object. Add FIXME comment. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c + (Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create): Save JNI global + reference to the Java object. + (Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals): Use saved + JNI global reference instead of JNI local reference. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c + (Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals): Use + saved JNI global reference instead of JNI local reference. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c + (Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create): Save JNI global + reference to the Java object. + (Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals): Use saved + JNI global reference instead of JNI local reference. + 2003-12-11 Michael Koch * java/text/Format.java (serialVersionUID): Fixed value. diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c index bce87371202..e16b2d457d6 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c @@ -46,10 +46,16 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create { GtkWidget *button; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + button = gtk_button_new(); gtk_widget_show (button); + gdk_threads_leave (); + NSA_SET_PTR (env, obj, button); } @@ -74,7 +80,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals (JNIEnv *env, jobject obj) { - void *ptr = NSA_GET_PTR (env, obj); + /* FIXME: Do we need to connect any signals here? Otherwise just do not + override parent method. */ /* Connect the superclass signals. */ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c index 6559c5baf70..6a1a90ce170 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c @@ -44,8 +44,13 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCanvasPeer_create { gpointer widget; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + widget = gtk_type_new (gtk_drawing_area_get_type ()); + gdk_threads_leave (); NSA_SET_PTR (env, obj, widget); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c index 94b13666776..71600c082ca 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c @@ -46,12 +46,17 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer_create GtkWidget *widget; const char *str; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + str = (*env)->GetStringUTFChars (env, label, NULL); gdk_threads_enter (); + widget = gtk_check_menu_item_new_with_label (str); gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (widget), 1); gtk_widget_show (widget); + gdk_threads_leave (); (*env)->ReleaseStringUTFChars (env, label, str); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c index 9789569ddad..b6b329d41d9 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c @@ -82,6 +82,9 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeCreate { GtkWidget *button; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); if (group == NULL) @@ -98,6 +101,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeCreate } } gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), state); + gdk_threads_leave (); NSA_SET_PTR (env, obj, button); @@ -108,11 +112,13 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals (JNIEnv *env, jobject obj) { void *ptr = NSA_GET_PTR (env, obj); + jobject *gref = NSA_GET_GLOBAL_REF (env, obj); + g_assert (gref); gdk_threads_enter (); g_signal_connect (G_OBJECT (ptr), "toggled", - GTK_SIGNAL_FUNC (item_toggled), obj); + GTK_SIGNAL_FUNC (item_toggled), *gref); gdk_threads_leave (); @@ -161,6 +167,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeSetCheckboxGroup static void item_toggled (GtkToggleButton *item, jobject peer) { + //g_print ("toggled\n"); (*gdk_env)->CallVoidMethod (gdk_env, peer, postItemEventID, peer, diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c index 7e915c876ba..c57cfd1217c 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c @@ -51,7 +51,11 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create GtkOptionMenu *option_menu; GtkRequisition child_requisition; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + option_menu = GTK_OPTION_MENU (gtk_option_menu_new ()); menu = gtk_menu_new (); gtk_widget_show (menu); @@ -193,12 +197,19 @@ connect_choice_item_selectable_hook (JNIEnv *env, jobject peer_obj, GtkItem *item, jobject item_obj) { struct item_event_hook_info *ie; + jobject *peer_objGlobPtr; + jobject *item_objGlobPtr; ie = (struct item_event_hook_info *) malloc (sizeof (struct item_event_hook_info)); - ie->peer_obj = (*env)->NewGlobalRef (env, peer_obj); - ie->item_obj = (*env)->NewGlobalRef (env, item_obj); + peer_objGlobPtr = NSA_GET_GLOBAL_REF (env, peer_obj); + g_assert (peer_objGlobPtr); + item_objGlobPtr = NSA_GET_GLOBAL_REF (env, item_obj); + g_assert (item_objGlobPtr); + + ie->peer_obj = *peer_objGlobPtr; + ie->item_obj = *item_objGlobPtr; g_signal_connect (G_OBJECT (item), "activate", GTK_SIGNAL_FUNC (item_activate), ie); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c index ee44ccc11fc..6336636ec11 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c @@ -48,12 +48,16 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkGenericPeer_dispose { void *ptr; + /* Remove entries from state tables */ + NSA_DEL_GLOBAL_REF (env, obj); ptr = NSA_DEL_PTR (env, obj); + gdk_threads_enter (); + /* For now the native state for any object must be a widget. However, a subclass could override dispose() if required. */ - gdk_threads_enter (); gtk_widget_destroy (GTK_WIDGET (ptr)); + gdk_threads_leave (); } @@ -548,11 +552,11 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObjec } JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals - (JNIEnv *env, jobject peer_obj) + (JNIEnv *env, jobject obj) { - void *ptr; - - ptr = NSA_GET_PTR (env, peer_obj); + void *ptr = NSA_GET_PTR (env, obj); + jobject *gref = NSA_GET_GLOBAL_REF (env, obj); + g_assert (gref); gdk_threads_enter (); @@ -567,7 +571,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignal /* Connect EVENT signal, which happens _before_ any specific signal. */ g_signal_connect (GTK_OBJECT (ptr), "event", - G_CALLBACK (pre_event_handler), peer_obj); + G_CALLBACK (pre_event_handler), *gref); gdk_threads_leave (); } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c index 604193aa24e..bf4035dcb7f 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c @@ -47,8 +47,11 @@ Java_gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer_create GtkWidget *window; GtkWidget *vbox, *layout; - gdk_threads_enter (); + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + window = gtk_plug_new (window_id); vbox = gtk_vbox_new (0, 0); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c index 3a7ad6277b7..75eeaf7ce14 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c @@ -1037,15 +1037,17 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) case GDK_KEY_PRESS: case GDK_KEY_RELEASE: { - GtkWindow *window; GdkWindow *obj_window; jobject *focus_obj_ptr = NULL; + int generates_key_typed = 0; /* A widget with a grab will get key events */ if (!GTK_IS_WINDOW (widget)) *focus_obj_ptr = peer; else { + GtkWindow *window; + /* Check if we have an enabled focused widget in this window. If not don't handle the event. */ window = GTK_WINDOW (widget); @@ -1079,6 +1081,9 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) /* If the window has no jobject attached we can't send anything */ if (!focus_obj_ptr) return FALSE; + + /* Should we generate an AWT_KEY_TYPED event? */ + generates_key_typed = generates_key_typed_event (event, window->focus_widget); } if (event->type == GDK_KEY_PRESS) @@ -1092,7 +1097,7 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) keyevent_to_awt_keychar (event), keysym_to_awt_keylocation (event)); - if (generates_key_typed_event (event, window->focus_widget)) + if (generates_key_typed) { (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr, postKeyEventID, @@ -1159,10 +1164,11 @@ connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...) { va_list ap; jobject *obj; +void *ptr = NSA_GET_PTR (env, peer_obj); - obj = (jobject *) malloc (sizeof (jobject)); - *obj = (*env)->NewGlobalRef (env, peer_obj); - //g_print("Connection obj %p\n", peer_obj); + obj = NSA_GET_GLOBAL_REF (env, peer_obj); + //g_print("Connection obj %s\n", gtk_widget_get_name (GTK_WIDGET (ptr))); + g_assert (obj); va_start (ap, nwindows); { @@ -1170,7 +1176,6 @@ connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...) for (i = 0; i < nwindows; i++) { GdkWindow* attach = (va_arg (ap, GdkWindow *)); - //g_print("attach peer obj %p and %p\n", peer_obj, attach); attach_jobject(attach, obj); } } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c index cb065d51894..47a08ae8eed 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c @@ -49,8 +49,13 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create { gpointer widget; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + widget = gtk_type_new (gtk_file_selection_get_type ()); + gdk_threads_leave (); NSA_SET_PTR (env, obj, widget); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c index 0e88a9aeda4..0865f63160b 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c @@ -48,10 +48,13 @@ Java_gnu_java_awt_peer_gtk_GtkLabelPeer_create GtkContainer *ebox_container; const char *str; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + str = (*env)->GetStringUTFChars (env, text, 0); gdk_threads_enter (); - + ebox = gtk_event_box_new (); ebox_container = GTK_CONTAINER (ebox); label = gtk_label_new (str); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c index 7bc4c6dabb1..ac6f389f8d8 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c @@ -58,7 +58,11 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_create { GtkWidget *list, *sw; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + list = gtk_clist_new (1); gtk_widget_show (list); sw = gtk_scrolled_window_new (NULL, NULL); @@ -66,6 +70,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_create GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (sw), list); + gdk_threads_leave (); NSA_SET_PTR (env, obj, sw); @@ -90,12 +95,12 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_connectJObject JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals - (JNIEnv *env, jobject peer_obj) + (JNIEnv *env, jobject obj) { GtkCList *list; - void *ptr; - - ptr = NSA_GET_PTR (env, peer_obj); + void *ptr = NSA_GET_PTR (env, obj); + jobject *gref = NSA_GET_GLOBAL_REF (env, obj); + g_assert (gref); gdk_threads_enter (); @@ -106,17 +111,17 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals list = CLIST_FROM_SW (ptr); g_signal_connect (G_OBJECT (list), "select_row", - GTK_SIGNAL_FUNC (item_select), peer_obj); + GTK_SIGNAL_FUNC (item_select), *gref); g_signal_connect (G_OBJECT (list), "unselect_row", - GTK_SIGNAL_FUNC (item_unselect), peer_obj); + GTK_SIGNAL_FUNC (item_unselect), *gref); /* Connect the superclass signals. */ /* FIXME: Cannot do that here or it will get the sw and not the list. We must a generic way of doing this. */ /* Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, peer_obj); */ g_signal_connect (GTK_OBJECT (list), "event", - G_CALLBACK (pre_event_handler), peer_obj); + G_CALLBACK (pre_event_handler), *gref); gdk_threads_leave (); } @@ -319,6 +324,7 @@ item_select (GtkCList *list __attribute__((unused)), GdkEventButton *event __attribute__((unused)), jobject peer_obj) { + //g_print ("select_row\n"); (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, postListItemEventID, row, @@ -332,6 +338,7 @@ item_unselect (GtkCList *list __attribute__((unused)), GdkEventButton *event __attribute__((unused)), jobject peer_obj) { + //g_print ("unselect_row\n"); (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, postListItemEventID, row, diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c index 5d144f8ec65..ed6107b3729 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c @@ -42,6 +42,7 @@ exception statement from your version. */ #ifdef JVM_SUN struct state_table *native_state_table; + struct state_table *native_global_ref_table; #endif jmethodID setBoundsCallbackID; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c index 89818e05fb1..48509a5d341 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c @@ -44,9 +44,14 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_create { GtkWidget *widget; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + widget = gtk_menu_bar_new (); gtk_widget_show (widget); + gdk_threads_leave (); NSA_SET_PTR (env, obj, widget); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c index f7c704110b7..4984760f917 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c @@ -40,26 +40,35 @@ exception statement from your version. */ #include "gnu_java_awt_peer_gtk_GtkMenuItemPeer.h" #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" -static void -connect_activate_hook (JNIEnv *, jobject, GtkMenuItem *); +static void item_activate (GtkMenuItem *item __attribute__((unused)), + jobject *peer_obj); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_create (JNIEnv *env, jobject obj, jstring label) { GtkWidget *widget; const char *str; + jobject *gref; + + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gref = NSA_GET_GLOBAL_REF (env, obj); str = (*env)->GetStringUTFChars (env, label, NULL); gdk_threads_enter (); - + if (strcmp (str, "-") == 0) /* "-" signals that we need a separator */ widget = gtk_menu_item_new (); else widget = gtk_menu_item_new_with_label (str); - connect_activate_hook (env, obj, GTK_MENU_ITEM (widget)); + /* Connect activate hook */ + g_signal_connect (G_OBJECT (widget), "activate", + GTK_SIGNAL_FUNC (item_activate), *gref); + gtk_widget_show (widget); + gdk_threads_leave (); (*env)->ReleaseStringUTFChars (env, label, str); @@ -101,14 +110,3 @@ item_activate (GtkMenuItem *item __attribute__((unused)), jobject *peer_obj) postMenuActionEventID); } -static void -connect_activate_hook (JNIEnv *env, jobject peer_obj, GtkMenuItem *item) -{ - jobject *obj; - - obj = (jobject *) malloc (sizeof (jobject)); - *obj = (*env)->NewGlobalRef (env, peer_obj); - - g_signal_connect (G_OBJECT (item), "activate", - GTK_SIGNAL_FUNC (item_activate), obj); -} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c index 3de02d54f85..63e6a740158 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c @@ -92,9 +92,13 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_create GtkWidget *menu_title, *menu; const char *str; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + str = (*env)->GetStringUTFChars (env, label, NULL); gdk_threads_enter (); + menu = gtk_menu_new (); menu_title = gtk_menu_item_new_with_label (str); @@ -104,6 +108,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_create gtk_widget_show (menu_title); NSA_SET_PTR (env, obj, menu_title); + gdk_threads_leave (); (*env)->ReleaseStringUTFChars (env, label, str); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c index 72a96c61736..62fff4d8afe 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c @@ -46,8 +46,13 @@ Java_gnu_java_awt_peer_gtk_GtkPanelPeer_create { gpointer widget; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + widget = gtk_layout_new (NULL, NULL); + gdk_threads_leave (); NSA_SET_PTR (env, obj, widget); @@ -80,13 +85,14 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals (JNIEnv *env, jobject obj) { - void *ptr; - - ptr = NSA_GET_PTR (env, obj); + void *ptr = NSA_GET_PTR (env, obj); + jobject *gref = NSA_GET_GLOBAL_REF (env, obj); + g_assert (gref); gdk_threads_enter (); gtk_widget_realize (GTK_WIDGET (ptr)); + /* FIXME: If we don't need this then remove this method. */ /* g_signal_connect (G_OBJECT (ptr), "size_request", GTK_SIGNAL_FUNC (sr), */ /* NULL); */ gdk_threads_leave (); @@ -95,6 +101,8 @@ Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); } +/* FIXME: The following doesn't seem to be used. + Is not declared as a native function in GtkPanelPeer.java */ /* * Make a new panel. */ @@ -105,19 +113,26 @@ Java_gnu_java_awt_peer_gtk_GtkPanelPeer_gtkPanelNew GtkWidget *layout; void *parent; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + parent = NSA_GET_PTR (env, parent_obj); gdk_threads_enter (); + layout = gtk_layout_new (NULL, NULL); set_parent (layout, GTK_CONTAINER (parent)); gtk_widget_realize (layout); + connect_awt_hook (env, obj, 1, GTK_LAYOUT (layout)->bin_window); + set_visible (layout, 1); - NSA_SET_PTR (env, obj, layout); gdk_threads_leave (); + + NSA_SET_PTR (env, obj, layout); } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c index 1b56d08317f..be7e2d0a4e2 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c @@ -108,13 +108,18 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create GtkWidget *sb; GtkObject *adj; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + adj = gtk_adjustment_new (value, min, max, step_incr, page_incr, visible_amount); sb = (orientation) ? gtk_vscrollbar_new (GTK_ADJUSTMENT (adj)) : gtk_hscrollbar_new (GTK_ADJUSTMENT (adj)); + gdk_threads_leave (); NSA_SET_PTR (env, obj, sb); @@ -141,19 +146,19 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals (JNIEnv *env, jobject obj) { - void *ptr; struct range_scrollbar *rs; + void *ptr = NSA_GET_PTR (env, obj); + jobject *gref = NSA_GET_GLOBAL_REF (env, obj); + g_assert (gref); rs = (struct range_scrollbar *) malloc (sizeof (struct range_scrollbar)); - ptr = NSA_GET_PTR (env, obj); - gdk_threads_enter (); + gtk_widget_realize (GTK_WIDGET (ptr)); rs->range = GTK_RANGE (ptr); - rs->scrollbar = (jobject *) malloc (sizeof (jobject)); - *(rs->scrollbar) = (*env)->NewGlobalRef (env, obj); + rs->scrollbar = gref; g_signal_connect (G_OBJECT (GTK_RANGE (ptr)), "move-slider", diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c index 08ae7e5cf63..516797e7eb4 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c @@ -45,8 +45,13 @@ Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_create { gpointer window; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + window = gtk_scrolled_window_new (NULL, NULL); + gdk_threads_leave (); NSA_SET_PTR (env, obj, window); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c index c6d97d57620..71a789ed37f 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c @@ -46,8 +46,11 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create { GtkWidget *text, *sw; - gdk_threads_enter (); + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + text = gtk_text_view_new (); gtk_widget_show (text); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c index 69e8b0abc49..2ec87f012ea 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c @@ -51,26 +51,26 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals (JNIEnv *env, jobject obj) { - void *ptr; GtkTextView *text = NULL; GtkTextBuffer *buf; - - ptr = NSA_GET_PTR (env, obj); + void *ptr = NSA_GET_PTR (env, obj); + jobject *gref = NSA_GET_GLOBAL_REF (env, obj); + g_assert (gref); gdk_threads_enter (); if (GTK_IS_ENTRY(ptr)) { g_signal_connect (GTK_ENTRY (ptr)->im_context, "commit", - G_CALLBACK (textcomponent_commit_cb), obj); + G_CALLBACK (textcomponent_commit_cb), *gref); g_signal_connect (GTK_EDITABLE (ptr), "changed", - G_CALLBACK (textcomponent_changed_cb), obj); + G_CALLBACK (textcomponent_changed_cb), *gref); gdk_threads_leave (); /* Connect the superclass signals. */ - Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); + Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, *gref); } else { @@ -86,20 +86,20 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals if (text) { g_signal_connect (text->im_context, "commit", - G_CALLBACK (textcomponent_commit_cb), obj); + G_CALLBACK (textcomponent_commit_cb), *gref); buf = gtk_text_view_get_buffer (text); if (buf) g_signal_connect (buf, "changed", - G_CALLBACK (textcomponent_changed_cb), obj); + G_CALLBACK (textcomponent_changed_cb), *gref); /* Connect the superclass signals. */ /* FIXME: Cannot do that here or it will get the sw and not the list. We must a generic way of doing this. */ /* Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, - peer_obj); */ + obj); */ g_signal_connect (GTK_OBJECT (text), "event", - G_CALLBACK (pre_event_handler), obj); + G_CALLBACK (pre_event_handler), *gref); gdk_threads_leave (); } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c index a7bbb02f8a9..5379635b88b 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c @@ -45,8 +45,13 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_create { GtkWidget *widget; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + widget = gtk_entry_new (); + gdk_threads_leave (); NSA_SET_PTR (env, obj, widget); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c index 3986a1fd22c..022677b06a9 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c @@ -74,7 +74,11 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create void *window_parent; GtkWidget *vbox, *layout; + /* Create global reference and save it for future use */ + NSA_SET_GLOBAL_REF (env, obj); + gdk_threads_enter (); + window_widget = gtk_window_new (GTK_WINDOW_TOPLEVEL); window = GTK_WINDOW (window_widget); @@ -179,9 +183,9 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals (JNIEnv *env, jobject obj) { - void *ptr; - - ptr = NSA_GET_PTR (env, obj); + void *ptr = NSA_GET_PTR (env, obj); + jobject *gref = NSA_GET_GLOBAL_REF (env, obj); + g_assert (gref); gdk_threads_enter (); @@ -189,22 +193,22 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals /* Connect signals for window event support. */ g_signal_connect (G_OBJECT (ptr), "delete-event", - G_CALLBACK (window_delete_cb), obj); + G_CALLBACK (window_delete_cb), *gref); g_signal_connect (G_OBJECT (ptr), "destroy-event", - G_CALLBACK (window_destroy_cb), obj); + G_CALLBACK (window_destroy_cb), *gref); g_signal_connect (G_OBJECT (ptr), "show", - G_CALLBACK (window_show_cb), obj); + G_CALLBACK (window_show_cb), *gref); g_signal_connect (G_OBJECT (ptr), "focus-in-event", - G_CALLBACK (window_focus_in_cb), obj); + G_CALLBACK (window_focus_in_cb), *gref); g_signal_connect (G_OBJECT (ptr), "focus-out-event", - G_CALLBACK (window_focus_out_cb), obj); + G_CALLBACK (window_focus_out_cb), *gref); g_signal_connect (G_OBJECT (ptr), "window-state-event", - G_CALLBACK (window_window_state_cb), obj); + G_CALLBACK (window_window_state_cb), *gref); gdk_threads_leave (); diff --git a/libjava/jni/gtk-peer/gtkpeer.h b/libjava/jni/gtk-peer/gtkpeer.h index 55d5e3dce21..a35c99b69e0 100644 --- a/libjava/jni/gtk-peer/gtkpeer.h +++ b/libjava/jni/gtk-peer/gtkpeer.h @@ -61,9 +61,11 @@ exception statement from your version. */ #ifdef JVM_SUN extern struct state_table *native_state_table; +extern struct state_table *native_global_ref_table; #define NSA_INIT(env, clazz) \ - native_state_table = init_state_table (env, clazz) + do {native_state_table = init_state_table (env, clazz); \ + native_global_ref_table = init_state_table (env, clazz);} while (0) #define NSA_GET_PTR(env, obj) \ get_state (env, obj, native_state_table) @@ -74,6 +76,21 @@ extern struct state_table *native_state_table; #define NSA_DEL_PTR(env, obj) \ remove_state_slot (env, obj, native_state_table) +#define NSA_GET_GLOBAL_REF(env, obj) \ + get_state (env, obj, native_global_ref_table) + +#define NSA_SET_GLOBAL_REF(env, obj) \ + do {jobject *globRefPtr; \ + globRefPtr = (jobject *) malloc (sizeof (jobject)); \ + *globRefPtr = (*env)->NewGlobalRef (env, obj); \ + set_state (env, obj, native_global_ref_table, (void *)globRefPtr);} while (0) + +#define NSA_DEL_GLOBAL_REF(env, obj) \ + do {jobject *globRefPtr = get_state (env, obj, native_global_ref_table); \ + remove_state_slot (env, obj, native_global_ref_table); \ + (*env)->DeleteGlobalRef (env, *globRefPtr); \ + free (globRefPtr);} while (0) + #endif /* JVM_SUN */ struct graphics -- 2.30.2