2003-12-12 Fernando Nasser <fnasser@redhat.com>
authorfnasser <fnasser@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 13 Dec 2003 01:15:47 +0000 (01:15 +0000)
committerfnasser <fnasser@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 13 Dec 2003 01:15:47 +0000 (01:15 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@74593 138bc75d-0d04-0410-961f-82ee72b054a4

24 files changed:
libjava/ChangeLog
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
libjava/jni/gtk-peer/gtkpeer.h

index 6f5d46a..42219ad 100644 (file)
@@ -1,3 +1,88 @@
+2003-12-12  Fernando Nasser  <fnasser@redhat.com>
+
+       * 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  <konqueror@gmx.de>
 
        * java/text/Format.java (serialVersionUID): Fixed value.
index bce8737..e16b2d4 100644 (file)
@@ -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);
index 6559c5b..6a1a90c 100644 (file)
@@ -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);
index 94b1366..71600c0 100644 (file)
@@ -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);
index 9789569..b6b329d 100644 (file)
@@ -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,
index 7e915c8..c57cfd1 100644 (file)
@@ -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);
index ee44ccc..6336636 100644 (file)
@@ -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 ();
 }
index 604193a..bf4035d 100644 (file)
@@ -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);
index 3a7ad62..75eeaf7 100644 (file)
@@ -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);
     }
   }
index cb065d5..47a08ae 100644 (file)
@@ -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);
index 0e88a9a..0865f63 100644 (file)
@@ -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);
index 7bc4c6d..ac6f389 100644 (file)
@@ -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,
index 5d144f8..ed6107b 100644 (file)
@@ -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;
index 89818e0..48509a5 100644 (file)
@@ -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);
index f7c7041..4984760 100644 (file)
@@ -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);
-}
index 3de02d5..63e6a74 100644 (file)
@@ -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);
index 72a96c6..62fff4d 100644 (file)
@@ -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);
 }
 
 
index 1b56d08..be7e2d0 100644 (file)
@@ -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", 
index 08ae7e5..516797e 100644 (file)
@@ -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);
index c6d97d5..71a789e 100644 (file)
@@ -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);
 
index 69e8b0a..2ec87f0 100644 (file)
@@ -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 ();
        }
index a7bbb02..5379635 100644 (file)
@@ -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);
index 3986a1f..022677b 100644 (file)
@@ -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 ();
 
index 55d5e3d..a35c99b 100644 (file)
@@ -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