aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libjava/ChangeLog85
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c9
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c5
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c5
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c9
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c15
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c16
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c5
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c17
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c5
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c5
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c21
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c1
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c5
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c28
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c5
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c23
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c15
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c5
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c5
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c20
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c5
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c22
-rw-r--r--libjava/jni/gtk-peer/gtkpeer.h19
24 files changed, 280 insertions, 70 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 6f5d46a..42219ad 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -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.
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 bce8737..e16b2d4 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 6559c5b..6a1a90c 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 94b1366..71600c0 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 9789569..b6b329d 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 7e915c8..c57cfd1 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 ee44ccc..6336636e 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 604193a..bf4035d 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 3a7ad62..75eeaf7 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 cb065d5..47a08ae 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 0e88a9a..0865f63 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 7bc4c6d..ac6f389 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 5d144f8..ed6107b 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 89818e0..48509a5 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 f7c7041..4984760 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 3de02d5..63e6a74 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 72a96c6..62fff4d 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 1b56d08..be7e2d0 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 08ae7e5..516797e 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 c6d97d5..71a789e 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 69e8b0a..2ec87f0 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 a7bbb02..5379635 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 3986a1f..022677b 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 55d5e3d..a35c99b 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