diff options
author | Fernando Nasser <fnasser@redhat.com> | 2003-12-23 19:24:00 +0000 |
---|---|---|
committer | Fernando Nasser <fnasser@gcc.gnu.org> | 2003-12-23 19:24:00 +0000 |
commit | baba70d019dcf4ce9cbd6544465b25154eaed5e0 (patch) | |
tree | 29c9440c1526ef9518e40450118087067dad5e4d /libjava/jni | |
parent | 459ac19fa525d64829e364d549814deb09854c2a (diff) | |
download | gcc-baba70d019dcf4ce9cbd6544465b25154eaed5e0.zip gcc-baba70d019dcf4ce9cbd6544465b25154eaed5e0.tar.gz gcc-baba70d019dcf4ce9cbd6544465b25154eaed5e0.tar.bz2 |
GtkChoicePeer.java (postItemEvent): Rename to...
2003-12-22 Fernando Nasser <fnasser@redhat.com>
* gnu/java/awt/peer/gtk/GtkChoicePeer.java (postItemEvent): Rename to... (choicePostItemEvent): Change signature to more specific String object.
* java/awt/Choice.java (add): Generate ItemEvent for the first item
added.
(insert): Generate ItemEvent if insertion caused
selection to change.
(remove): Generate ItemEvent if removal cause selection to change.
(removeAll): Change algorithm to prevent generation of ItemEvents.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
(connect_choice_item_selectable_hook): Change argument type.
Fix argument value.
Make sure resources are feed by registering callback.
(Java_gnu_java_awt_peer_gtk_GtkChoicePeer_append): Adjust call to the
above function.
(Java_gnu_java_awt_peer_gtk_GtkChoicePeer_add): Ditto.
(item_activate): Ditto.
(Java_gnu_java_awt_peer_gtk_GtkChoicePeer_remove): Destroy removed
menuitem.
(item_removed): New function. Free resources.
* jni/gtk-peer/gtkpeer.h (item_event_hook_info): Change member type and
name.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
(Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit): Obtain MethodID for
choicePostItemEvent.
From-SVN: r74979
Diffstat (limited to 'libjava/jni')
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c | 55 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c | 8 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gtkpeer.h | 3 |
3 files changed, 45 insertions, 21 deletions
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 c57cfd1..068cf1e 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 @@ -41,8 +41,9 @@ exception statement from your version. */ static void connect_choice_item_selectable_hook (JNIEnv *env, jobject peer_obj, - GtkItem *item, - jobject item_obj); + GtkItem *menuitem, + const char *label); + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create (JNIEnv *env, jobject obj) @@ -101,14 +102,13 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_append label = (*env)->GetStringUTFChars (env, item, NULL); menuitem = gtk_menu_item_new_with_label (label); - - (*env)->ReleaseStringUTFChars (env, item, label); - gtk_menu_append (menu, menuitem); gtk_widget_show (menuitem); connect_choice_item_selectable_hook (env, obj, - GTK_ITEM (menuitem), item); + GTK_ITEM (menuitem), label); + + (*env)->ReleaseStringUTFChars (env, item, label); } if (need_set_history) @@ -139,7 +139,8 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_add menuitem = gtk_menu_item_new_with_label (label); gtk_menu_insert (GTK_MENU (menu), menuitem, index); gtk_widget_show (menuitem); - connect_choice_item_selectable_hook (env, obj, GTK_ITEM (menuitem), item); + + connect_choice_item_selectable_hook (env, obj, GTK_ITEM (menuitem), label); if (need_set_history) gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0); @@ -155,14 +156,19 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_remove { void *ptr; GtkContainer *menu; + GtkWidget *menuitem; GList *children; ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); + menu = GTK_CONTAINER (gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr))); children = gtk_container_children (menu); - gtk_container_remove (menu, GTK_WIDGET (g_list_nth (children, index)->data)); + menuitem = GTK_WIDGET (g_list_nth (children, index)->data); + gtk_container_remove (menu, menuitem); + gtk_widget_destroy (menuitem); + gdk_threads_leave (); } @@ -179,38 +185,49 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_select gdk_threads_leave (); } - static void item_activate (GtkItem *item __attribute__((unused)), struct item_event_hook_info *ie) { gdk_threads_leave (); + + jstring label = (*gdk_env)->NewStringUTF (gdk_env, ie->label); (*gdk_env)->CallVoidMethod (gdk_env, ie->peer_obj, - postItemEventID, - ie->item_obj, + choicePostItemEventID, + label, (jint) AWT_ITEM_SELECTED); gdk_threads_enter (); } static void -connect_choice_item_selectable_hook (JNIEnv *env, jobject peer_obj, - GtkItem *item, jobject item_obj) +item_removed (gpointer data, + GClosure gc __attribute__((unused))) +{ + struct item_event_hook_info *ie = data; + + free (ie->label); + free (ie); +} + +static void +connect_choice_item_selectable_hook (JNIEnv *env, + jobject peer_obj, + GtkItem *menuitem, + const char *label) { 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)); 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; + ie->label = strdup (label); - g_signal_connect (G_OBJECT (item), "activate", - GTK_SIGNAL_FUNC (item_activate), ie); + g_signal_connect_data (G_OBJECT (menuitem), "activate", + GTK_SIGNAL_FUNC (item_activate), ie, + (GClosureNotify) item_removed, 0); } 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 ed6107b..bad4a51 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 @@ -56,6 +56,7 @@ jmethodID postKeyEventID; jmethodID postFocusEventID; jmethodID postAdjustmentEventID; jmethodID postItemEventID; +jmethodID choicePostItemEventID; jmethodID postListItemEventID; jmethodID postTextEventID; jmethodID postWindowEventID; @@ -80,7 +81,7 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz) char **argv; char *homedir, *rcpath = NULL; /* jclass gtkgenericpeer; */ - jclass gtkcomponentpeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer, + jclass gtkcomponentpeer, gtkchoicepeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer, gtkmenuitempeer, gtktextcomponentpeer, window; NSA_INIT (env, clazz); @@ -139,6 +140,8 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz) gtkcomponentpeer = (*env)->FindClass (env, "gnu/java/awt/peer/gtk/GtkComponentPeer"); + gtkchoicepeer = (*env)->FindClass (env, + "gnu/java/awt/peer/gtk/GtkChoicePeer"); gtkwindowpeer = (*env)->FindClass (env, "gnu/java/awt/peer/gtk/GtkWindowPeer"); gtkscrollbarpeer = (*env)->FindClass (env, @@ -181,6 +184,9 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz) postItemEventID = (*env)->GetMethodID (env, gtkcomponentpeer, "postItemEvent", "(Ljava/lang/Object;I)V"); + choicePostItemEventID = (*env)->GetMethodID (env, gtkchoicepeer, + "choicePostItemEvent", + "(Ljava/lang/String;I)V"); postListItemEventID = (*env)->GetMethodID (env, gtklistpeer, "postItemEvent", "(II)V"); diff --git a/libjava/jni/gtk-peer/gtkpeer.h b/libjava/jni/gtk-peer/gtkpeer.h index a35c99b..d552e68 100644 --- a/libjava/jni/gtk-peer/gtkpeer.h +++ b/libjava/jni/gtk-peer/gtkpeer.h @@ -395,6 +395,7 @@ extern jmethodID postExposeEventID; extern jmethodID postKeyEventID; extern jmethodID postFocusEventID; extern jmethodID postAdjustmentEventID; +extern jmethodID choicePostItemEventID; extern jmethodID postItemEventID; extern jmethodID postListItemEventID; extern jmethodID postTextEventID; @@ -424,7 +425,7 @@ jint keyevent_state_to_awt_mods (GdkEvent *event); struct item_event_hook_info { jobject peer_obj; - jobject item_obj; + const char *label; }; #endif /* __GTKPEER_H */ |