Commit 7ecd4576 by Fernando Nasser Committed by Fernando Nasser

gtkpeer.h: Extend NSA set of macros to handle a second native state table --...

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.

From-SVN: r74593
parent b944d187
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.
......
......@@ -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);
......
......@@ -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);
......
......@@ -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);
......
......@@ -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,
......
......@@ -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);
......
......@@ -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 ();
}
......
......@@ -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);
......
......@@ -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);
}
}
......
......@@ -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);
......
......@@ -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);
......
......@@ -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,
......
......@@ -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;
......
......@@ -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);
......
......@@ -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);
}
......@@ -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);
......
......@@ -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);
}
......@@ -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",
......
......@@ -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);
......
......@@ -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);
......
......@@ -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 ();
}
......
......@@ -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);
......
......@@ -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 ();
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment