From 834b1209074da1983d7688ba5eebb54e9c9920ef Mon Sep 17 00:00:00 2001 From: Fernando Nasser Date: Thu, 11 Dec 2003 13:50:51 +0000 Subject: [PATCH] gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler): Most coded moved to pre_event_handler, with the modifications mentioned below. 2003-12-08 Fernando Nasser * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler): Most coded moved to pre_event_handler, with the modifications mentioned below. (pre_event_handler): New function. Called on the Gtk "event" signal. Do not retrieve the jobject from the window property as it is already available as user data in the signal. Do not try and find the grab widget as it is already done by Gtk at this point. Do not search for Window ancestor as Gtk already sends the signal to it. Do not meddle with the activation state of peer widgets on each key press or release. Add CList to the special handling when looking for the focused widget. * jni/gtk-peer/gtkpeer.h: Add declaration for pre_event_handler. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c (connectJObject): New function. (connectSignals): New function. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c (connectHooks): Rename to... (connectSignals): New name. Get rid of NewGlobalRef call. Use g_signal_connect instead of deprecated gtk_signal_connect. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c (connect_choice_item_selectable_hook): Use g_signal_connect instead of deprecated gtk_signal_connect. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c (Java_gnu_java_awt_peer_gtk_GtkClipboard_initNativeState): Ditto. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove function. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New function. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New function. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove function. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New function. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove function. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New function. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New function. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_old_create): Remove dead code. (item_select): Remove indirection. (item_unselect): Ditto. (connect_selectable_hook): Folded into connectSignals. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove function. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New function. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New function. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c: Ditto. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove function. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New function. * gnu/java/awt/peer/gtk/GtkComponentPeer.java: Declare and call connectJObject and connectSignals instead of connectHooks. * gnu/java/awt/peer/gtk/GtkButtonPeer.java: Declare connectJObject and connectSignals. * gnu/java/awt/peer/gtk/GtkCheckboxPeer.java: Declare connectSignals and not connectHooks. * gnu/java/awt/peer/gtk/GtkTextComponentPeer.java: Ditto. * gnu/java/awt/peer/gtk/GtkFileDialogPeer.java: Declare connectJObject and not connectHooks. * gnu/java/awt/peer/gtk/GtkListPeer.java: Declare connectJObject and connectSignals instead of connectHooks. * gnu/java/awt/peer/gtk/GtkPanelPeer.java: Ditto. * gnu/java/awt/peer/gtk/GtkScrollbarPeer.java: Ditto. * gnu/java/awt/peer/gtk/GtkWindowPeer.java: Ditto. From-SVN: r74536 --- libjava/ChangeLog | 82 +++ .../gnu/java/awt/peer/gtk/GtkButtonPeer.java | 2 + .../java/awt/peer/gtk/GtkCheckboxPeer.java | 2 +- .../java/awt/peer/gtk/GtkComponentPeer.java | 6 +- .../java/awt/peer/gtk/GtkFileDialogPeer.java | 2 +- .../gnu/java/awt/peer/gtk/GtkListPeer.java | 3 +- .../gnu/java/awt/peer/gtk/GtkPanelPeer.java | 3 +- .../java/awt/peer/gtk/GtkScrollbarPeer.java | 3 +- .../awt/peer/gtk/GtkTextComponentPeer.java | 2 +- .../gnu/java/awt/peer/gtk/GtkWindowPeer.java | 3 +- .../gnu_java_awt_peer_gtk_GtkButtonPeer.c | 31 +- .../gnu_java_awt_peer_gtk_GtkCheckboxPeer.c | 15 +- .../gnu_java_awt_peer_gtk_GtkChoicePeer.c | 2 +- .../gnu_java_awt_peer_gtk_GtkClipboard.c | 6 +- .../gnu_java_awt_peer_gtk_GtkComponentPeer.c | 34 +- .../gnu_java_awt_peer_gtk_GtkEvents.c | 616 ++++++++---------- .../gnu_java_awt_peer_gtk_GtkFileDialogPeer.c | 4 +- .../gnu_java_awt_peer_gtk_GtkListPeer.c | 125 ++-- .../gnu_java_awt_peer_gtk_GtkMenuItemPeer.c | 2 +- .../gnu_java_awt_peer_gtk_GtkMenuPeer.c | 2 +- .../gnu_java_awt_peer_gtk_GtkPanelPeer.c | 22 +- .../gnu_java_awt_peer_gtk_GtkScrollBarPeer.c | 30 +- ...u_java_awt_peer_gtk_GtkTextComponentPeer.c | 22 +- .../gnu_java_awt_peer_gtk_GtkWindowPeer.c | 25 +- libjava/jni/gtk-peer/gtkpeer.h | 4 + 25 files changed, 564 insertions(+), 484 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index fa81c2a0ce63..09b1e9862c4b 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,85 @@ +2003-12-08 Fernando Nasser + + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler): + Most coded moved to pre_event_handler, with the modifications + mentioned below. + (pre_event_handler): New function. Called on the Gtk "event" signal. + Do not retrieve the jobject from the window property as it is already + available as user data in the signal. + Do not try and find the grab widget as it is already done by Gtk at + this point. + Do not search for Window ancestor as Gtk already sends the signal to it. + Do not meddle with the activation state of peer widgets on each + key press or release. + Add CList to the special handling when looking for the focused widget. + * jni/gtk-peer/gtkpeer.h: Add declaration for pre_event_handler. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c (connectJObject): + New function. + (connectSignals): New function. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c (connectHooks): + Rename to... + (connectSignals): New name. Get rid of NewGlobalRef call. + Use g_signal_connect instead of deprecated gtk_signal_connect. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c + (connect_choice_item_selectable_hook): Use g_signal_connect instead of + deprecated gtk_signal_connect. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c + (Java_gnu_java_awt_peer_gtk_GtkClipboard_initNativeState): Ditto. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove + function. + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New + function. + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New + function. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove + function. + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New + function. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove + function. + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New + function. + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New + function. + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_old_create): Remove dead + code. + (item_select): Remove indirection. + (item_unselect): Ditto. + (connect_selectable_hook): Folded into connectSignals. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove + function. + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject): New + function. + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New + function. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c: Ditto. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks): Remove + function. + (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals): New + function. + * gnu/java/awt/peer/gtk/GtkComponentPeer.java: Declare and call + connectJObject and connectSignals instead of connectHooks. + * gnu/java/awt/peer/gtk/GtkButtonPeer.java: Declare connectJObject and + connectSignals. + * gnu/java/awt/peer/gtk/GtkCheckboxPeer.java: Declare connectSignals + and not connectHooks. + * gnu/java/awt/peer/gtk/GtkTextComponentPeer.java: Ditto. + * gnu/java/awt/peer/gtk/GtkFileDialogPeer.java: Declare connectJObject + and not connectHooks. + * gnu/java/awt/peer/gtk/GtkListPeer.java: Declare connectJObject and + connectSignals instead of connectHooks. + * gnu/java/awt/peer/gtk/GtkPanelPeer.java: Ditto. + * gnu/java/awt/peer/gtk/GtkScrollbarPeer.java: Ditto. + * gnu/java/awt/peer/gtk/GtkWindowPeer.java: Ditto. + 2003-12-09 Michael Koch * Makefile.am (nat_headers_install): New variable with header files to diff --git a/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java index 0801f9c6ec0e..9a832265b34b 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java @@ -50,6 +50,8 @@ public class GtkButtonPeer extends GtkComponentPeer implements ButtonPeer { native void create (); + public native void connectJObject (); + public native void connectSignals (); native void gtkSetFont(String name, int style, int size); native void gtkWidgetSetForeground (int red, int green, int blue); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java index 174a16923dea..fba8c8ff8f9d 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java @@ -54,7 +54,7 @@ public class GtkCheckboxPeer extends GtkComponentPeer public native void nativeCreate (GtkCheckboxGroupPeer group, boolean state); public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group); - public native void connectHooks (); + public native void connectSignals (); public GtkCheckboxPeer (Checkbox c) { diff --git a/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java index 80feebdcabb7..4e216f8770e1 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java @@ -99,7 +99,8 @@ public class GtkComponentPeer extends GtkGenericPeer insets = new Insets (0, 0, 0, 0); } - native void connectHooks (); + native void connectJObject (); + native void connectSignals (); protected GtkComponentPeer (Component awtComponent) { @@ -114,7 +115,8 @@ public class GtkComponentPeer extends GtkGenericPeer getArgs (awtComponent, args); args.setArgs (this); - connectHooks (); + connectJObject (); + connectSignals (); if (awtComponent.getForeground () != null) setForeground (awtComponent.getForeground ()); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java index 64e73c68a86b..07422ace79b0 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java @@ -58,7 +58,7 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer } public native void setFile (String file); - public native void connectHooks (); + public native void connectJObject (); public void setFilenameFilter (FilenameFilter filter) { diff --git a/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java index 31f98525f23d..e06e079ae0be 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java @@ -51,7 +51,8 @@ public class GtkListPeer extends GtkComponentPeer // native void create (ComponentPeer parent, String [] items, boolean mode); native void create (); - native void connectHooks (); + native void connectJObject (); + native void connectSignals (); native void getSize (int rows, int dims[]); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkPanelPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkPanelPeer.java index cf7a9e1badef..4f77994931d5 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkPanelPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkPanelPeer.java @@ -45,7 +45,8 @@ public class GtkPanelPeer extends GtkContainerPeer implements PanelPeer { native void create (); - native void connectHooks (); + native void connectJObject (); + native void connectSignals (); public GtkPanelPeer (Panel p) { diff --git a/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java index d13e34edfe87..0e1b65137d7c 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java @@ -60,7 +60,8 @@ public class GtkScrollbarPeer extends GtkComponentPeer int min, int max, int stepIncr, int pageIncr, int visibleAmount); - native void connectHooks (); + native void connectJObject (); + native void connectSignals (); public GtkScrollbarPeer (Scrollbar s) { diff --git a/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java index b3199d87c9a7..8bc4bdf3eee4 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java @@ -56,7 +56,7 @@ public class GtkTextComponentPeer extends GtkComponentPeer setText (tc.getText ()); } - public native void connectHooks (); + public native void connectSignals (); public native int getCaretPosition (); public native void setCaretPosition (int pos); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java index 821afa929f1e..4a2d50805a1e 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java @@ -93,7 +93,8 @@ public class GtkWindowPeer extends GtkContainerPeer create (GDK_WINDOW_TYPE_HINT_NORMAL, false); } - native void connectHooks (); + native void connectJObject (); + native void connectSignals (); public GtkWindowPeer (Window window) { 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 a52f54ce35ff..bce873712029 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 @@ -37,9 +37,11 @@ exception statement from your version. */ #include "gtkpeer.h" +#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" #include "gnu_java_awt_peer_gtk_GtkButtonPeer.h" -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create (JNIEnv *env, jobject obj) { GtkWidget *button; @@ -51,6 +53,33 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create NSA_SET_PTR (env, obj, button); } +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectJObject + (JNIEnv *env, jobject obj) +{ + void *ptr; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); + + gtk_widget_realize (GTK_WIDGET (ptr)); + + connect_awt_hook (env, obj, 1, GTK_BUTTON(ptr)->event_window); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals + (JNIEnv *env, jobject obj) +{ + void *ptr = NSA_GET_PTR (env, obj); + + /* Connect the superclass signals. */ + Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); +} + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetFont (JNIEnv *env, jobject obj, jstring name, jint style, jint size) 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 d0d95f9fab73..9789569ddad0 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 @@ -104,25 +104,20 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeCreate } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectHooks +Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals (JNIEnv *env, jobject obj) { void *ptr = NSA_GET_PTR (env, obj); - jobject peer; gdk_threads_enter (); - peer = (*env)->NewGlobalRef (env, obj); - - /* FIXME: when the widget goes away, we should get rid of the global - reference. */ - gtk_signal_connect (GTK_OBJECT (ptr), "toggled", - GTK_SIGNAL_FUNC (item_toggled), peer); + g_signal_connect (G_OBJECT (ptr), "toggled", + GTK_SIGNAL_FUNC (item_toggled), obj); gdk_threads_leave (); - /* Connect the superclass hooks. */ - Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks (env, obj); + /* Connect the superclass signals. */ + Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); } JNIEXPORT void JNICALL 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 b0130408c6be..7e915c876ba6 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 @@ -200,6 +200,6 @@ connect_choice_item_selectable_hook (JNIEnv *env, jobject peer_obj, ie->peer_obj = (*env)->NewGlobalRef (env, peer_obj); ie->item_obj = (*env)->NewGlobalRef (env, item_obj); - gtk_signal_connect (GTK_OBJECT (item), "activate", + 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_GtkClipboard.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c index cf197115aa59..a13274003358 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c @@ -75,16 +75,16 @@ Java_gnu_java_awt_peer_gtk_GtkClipboard_initNativeState (JNIEnv *env, gdk_threads_enter (); clipboard = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_signal_connect (GTK_OBJECT(clipboard), "selection_received", + g_signal_connect (G_OBJECT(clipboard), "selection_received", GTK_SIGNAL_FUNC (selection_received), NULL); - gtk_signal_connect (GTK_OBJECT(clipboard), "selection_clear_event", + g_signal_connect (G_OBJECT(clipboard), "selection_clear_event", GTK_SIGNAL_FUNC (selection_clear), NULL); gtk_selection_add_target (clipboard, GDK_SELECTION_PRIMARY, GDK_TARGET_STRING, 0); - gtk_signal_connect (GTK_OBJECT(clipboard), "selection_get", + g_signal_connect (G_OBJECT(clipboard), "selection_get", GTK_SIGNAL_FUNC (selection_get), NULL); gdk_threads_leave (); 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 70aabf0cad97..ee44ccc11fc6 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 @@ -531,7 +531,7 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_O (*env)->ReleaseStringUTFChars (env, jname, name); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject (JNIEnv *env, jobject obj) { void *ptr; @@ -539,12 +539,36 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); + gtk_widget_realize (GTK_WIDGET (ptr)); - if(GTK_IS_BUTTON(ptr)) - connect_awt_hook (env, obj, 1, GTK_BUTTON(ptr)->event_window); - else - connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); + connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals + (JNIEnv *env, jobject peer_obj) +{ + void *ptr; + + ptr = NSA_GET_PTR (env, peer_obj); + + gdk_threads_enter (); + + gtk_widget_realize (GTK_WIDGET (ptr)); + + /* FIXME: We could check here if this is a scrolled window with a + single child that does not have an associated jobject. This + means that it is one of our wrapped widgets like List or TextArea + and thus we could connect the signal to the child without having + to specialize this method. */ + + /* Connect EVENT signal, which happens _before_ any specific signal. */ + + g_signal_connect (GTK_OBJECT (ptr), "event", + G_CALLBACK (pre_event_handler), peer_obj); + gdk_threads_leave (); } 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 0411352c7ca0..3a7ad6277b7b 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 @@ -813,21 +813,35 @@ generates_key_typed_event (GdkEvent *event, GtkWidget *source) void awt_event_handler (GdkEvent *event) { - jobject *event_obj_ptr = NULL; + /* keep synthetic AWT events from being processed recursively */ + if (event->type & SYNTHETIC_EVENT_MASK && event->type != GDK_NOTHING) + { + event->type ^= SYNTHETIC_EVENT_MASK; + } + + gtk_main_do_event (event); +} + +gboolean +pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) +{ + GtkWidget *event_widget; static guint32 button_click_time = 0; static GdkWindow *button_window = NULL; static guint button_number = -1; static jint click_count = 1; - /* keep synthetic AWT events from being processed recursively */ - if (event->type & SYNTHETIC_EVENT_MASK && event->type != GDK_NOTHING) - { - event->type ^= SYNTHETIC_EVENT_MASK; - gtk_main_do_event (event); - return; - } + /* If it is not a focus change event, the widget must be realized already. + If not, ignore the event (Gtk+ will do the same). */ + if (!(event->type == GDK_FOCUS_CHANGE || GTK_WIDGET_REALIZED(widget))) + return FALSE; + + /* Do not handle propagated events. AWT has its own propagation rules */ + gdk_window_get_user_data (event->any.window, (void **) &event_widget); + if (event_widget != widget) + return FALSE; - /* If it is not an input event, let the main loop handle it */ + /* We only care about input events */ if (!(event->type == GDK_BUTTON_PRESS || event->type == GDK_BUTTON_RELEASE || event->type == GDK_ENTER_NOTIFY @@ -839,12 +853,18 @@ awt_event_handler (GdkEvent *event) || event->type == GDK_FOCUS_CHANGE || event->type == GDK_MOTION_NOTIFY)) { - gtk_main_do_event (event); - return; + return FALSE; } + /* g_print("event %u widget %s peer %p\n", + event->type, gtk_widget_get_name (widget), peer); */ + + /* If it has no jobject associated we can send no AWT event */ + if (!peer) + return FALSE; + + /* for all input events, which have a window with a jobject attached, + send the AWT input event corresponding to the Gtk event off to Java */ - /* Handle input events */ - /* keep track of clickCount ourselves, since the AWT allows more than a triple click to occur */ if (event->type == GDK_BUTTON_PRESS) @@ -861,376 +881,247 @@ awt_event_handler (GdkEvent *event) button_number = event->button.button; } - /* for all input events, which have a window with a jobject attached, - send the input event off to Java before GTK has a chance to process - the event. Note that the jobject may be in the parent for widgets - that are always inside a scrolled window, like List */ - if (!gdk_property_get (event->any.window, - gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), - gdk_atom_intern ("CARDINAL", FALSE), - 0, - sizeof (jobject), - FALSE, - NULL, - NULL, - NULL, - (guchar **)&event_obj_ptr)) + switch (event->type) { - /* See if is contained in a scrolled pane */ - GtkWidget *widget; - gdk_window_get_user_data (event->any.window, (void **) &widget); - - if ((gtk_widget_get_parent (widget) != NULL) - && (gtk_widget_get_parent (widget)->window != NULL)) - { - GtkWidget *parent = gtk_widget_get_parent (widget); - - if (GTK_IS_SCROLLED_WINDOW (parent)) - gdk_property_get (gtk_widget_get_parent (widget)->window, - gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), - gdk_atom_intern ("CARDINAL", FALSE), - 0, - sizeof (jobject), - FALSE, - NULL, - NULL, - NULL, - (guchar **)&event_obj_ptr); - } - } - - if (event_obj_ptr) - { - GtkWidget *event_widget; - GtkWidget *grab_widget; - jobject *grab_obj_ptr = NULL; - void *ptr; - - /* Implement modality using GTK grabs. */ - g_assert (global_gtk_window_group); - if (global_gtk_window_group->grabs) - { - grab_widget = global_gtk_window_group->grabs->data; - g_assert (grab_widget); - - ptr = NSA_GET_PTR (gdk_env, *event_obj_ptr); - event_widget = GTK_WIDGET(ptr); - - /* Don't need to do this if it is the same widget as we - * already got the jobject above. - * Also, don't do it for the BUTTON_PRESS as the focus may be - * changing and the event widget is the one that must - * receive it (again, we have the jobject already) - */ - if ((event_widget != grab_widget) - && (event->type != GDK_BUTTON_PRESS)) - { - /* If the grab widget is an ancestor of the event widget - * then we send the event to the original event widget. - * This is the key to implementing modality. - * Unless the widget is disabled, in this case the grab - * widget still gets the event. - * XXX: But the grab widget may not be an ancestor!!! - */ - if (!GTK_WIDGET_IS_SENSITIVE (event_widget) - || !gtk_widget_is_ancestor (event_widget, grab_widget)) - { - gdk_property_get (grab_widget->window, - gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), - gdk_atom_intern ("CARDINAL", FALSE), - 0, - sizeof (jobject), - FALSE, - NULL, - NULL, - NULL, - (guchar **)&grab_obj_ptr); - - } - } - } - - if (!grab_obj_ptr) - grab_obj_ptr = event_obj_ptr; - else - g_free (event_obj_ptr); - - switch (event->type) - { - case GDK_BUTTON_PRESS: - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postMouseEventID, - AWT_MOUSE_PRESSED, - (jlong)event->button.time, - state_to_awt_mods (event->button.state) | - button_to_awt_mods (event->button.button), - (jint)event->button.x, - (jint)event->button.y, - click_count, - (event->button.button == 3) ? JNI_TRUE : - JNI_FALSE); - - /* grab_counter++; - gdk_pointer_grab (event->any.window, - FALSE, - GDK_POINTER_MOTION_MASK | - GDK_BUTTON_MOTION_MASK | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_ENTER_NOTIFY_MASK | - GDK_LEAVE_NOTIFY_MASK, - NULL, - NULL, - event->button.time);*/ - break; - case GDK_BUTTON_RELEASE: - { - int width, height; - - /* only ungrab if no other buttons are pressed down */ - /* if (--grab_counter == 0) - gdk_pointer_ungrab (event->button.time); - */ - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, - postMouseEventID, - AWT_MOUSE_RELEASED, - (jlong)event->button.time, - state_to_awt_mods (event->button.state) | - button_to_awt_mods (event->button.button), - (jint)event->button.x, - (jint)event->button.y, - click_count, JNI_FALSE); - - /* check to see if the release occured in the window it was pressed - in, and if so, generate an AWT click event */ - gdk_window_get_size (event->any.window, &width, &height); - if (event->button.x >= 0 - && event->button.y >= 0 - && event->button.x <= width - && event->button.y <= height) - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, - postMouseEventID, - AWT_MOUSE_CLICKED, - (jlong)event->button.time, - state_to_awt_mods (event->button.state) | + case GDK_BUTTON_PRESS: + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postMouseEventID, + AWT_MOUSE_PRESSED, + (jlong)event->button.time, + state_to_awt_mods (event->button.state) | button_to_awt_mods (event->button.button), - (jint)event->button.x, - (jint)event->button.y, - click_count, JNI_FALSE); - - } - break; - case GDK_MOTION_NOTIFY: - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postMouseEventID, - AWT_MOUSE_MOVED, + (jint)event->button.x, + (jint)event->button.y, + click_count, + (event->button.button == 3) ? JNI_TRUE : + JNI_FALSE); + break; + case GDK_BUTTON_RELEASE: + { + int width, height; + + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postMouseEventID, + AWT_MOUSE_RELEASED, + (jlong)event->button.time, + state_to_awt_mods (event->button.state) | + button_to_awt_mods (event->button.button), + (jint)event->button.x, + (jint)event->button.y, + click_count, + JNI_FALSE); + + /* check to see if the release occured in the window it was pressed + in, and if so, generate an AWT click event */ + gdk_window_get_size (event->any.window, &width, &height); + if (event->button.x >= 0 + && event->button.y >= 0 + && event->button.x <= width + && event->button.y <= height) + { + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postMouseEventID, + AWT_MOUSE_CLICKED, + (jlong)event->button.time, + state_to_awt_mods (event->button.state) | + button_to_awt_mods (event->button.button), + (jint)event->button.x, + (jint)event->button.y, + click_count, + JNI_FALSE); + } + } + break; + case GDK_MOTION_NOTIFY: + (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, + AWT_MOUSE_MOVED, + (jlong)event->motion.time, + state_to_awt_mods (event->motion.state), + (jint)event->motion.x, + (jint)event->motion.y, + 0, + JNI_FALSE); + + if (event->motion.state & (GDK_BUTTON1_MASK + | GDK_BUTTON2_MASK + | GDK_BUTTON3_MASK + | GDK_BUTTON4_MASK + | GDK_BUTTON5_MASK)) + { + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postMouseEventID, + AWT_MOUSE_DRAGGED, (jlong)event->motion.time, state_to_awt_mods (event->motion.state), (jint)event->motion.x, (jint)event->motion.y, - 0, JNI_FALSE); - - if (event->motion.state & (GDK_BUTTON1_MASK - | GDK_BUTTON2_MASK - | GDK_BUTTON3_MASK - | GDK_BUTTON4_MASK - | GDK_BUTTON5_MASK)) - { - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, - postMouseEventID, - AWT_MOUSE_DRAGGED, - (jlong)event->motion.time, - state_to_awt_mods (event->motion.state), - (jint)event->motion.x, - (jint)event->motion.y, - 0, JNI_FALSE); - } - break; - case GDK_ENTER_NOTIFY: - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postMouseEventID, - AWT_MOUSE_ENTERED, - (jlong)event->crossing.time, - state_to_awt_mods (event->crossing.state), - (jint)event->crossing.x, - (jint)event->crossing.y, - 0, JNI_FALSE); - break; - case GDK_LEAVE_NOTIFY: - if (event->crossing.mode == GDK_CROSSING_NORMAL) - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, - postMouseEventID, - AWT_MOUSE_EXITED, - (jlong)event->crossing.time, + 0, + JNI_FALSE); + } + break; + case GDK_ENTER_NOTIFY: + (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, + AWT_MOUSE_ENTERED, + (jlong)event->crossing.time, + state_to_awt_mods (event->crossing.state), + (jint)event->crossing.x, + (jint)event->crossing.y, + 0, + JNI_FALSE); + break; + case GDK_LEAVE_NOTIFY: + if (event->crossing.mode == GDK_CROSSING_NORMAL) + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postMouseEventID, + AWT_MOUSE_EXITED, + (jlong)event->crossing.time, state_to_awt_mods (event->crossing.state), - (jint)event->crossing.x, - (jint)event->crossing.y, - 0, JNI_FALSE); - break; - case GDK_CONFIGURE: - { - GtkWidget *widget; + (jint)event->crossing.x, + (jint)event->crossing.y, + 0, + JNI_FALSE); + break; + case GDK_CONFIGURE: + { + /* GtkWidget *widget; - gdk_window_get_user_data (event->any.window, (void **) &widget); + gdk_window_get_user_data (event->any.window, (void **) &widget); */ - if (widget && GTK_WIDGET_TOPLEVEL (widget)) - { - gint top, left, right, bottom; - - /* Configure events are not posted to the AWT event - queue, and as such, the gdk/gtk peer functions will - be called back before postConfigureEvent - returns. */ - gdk_threads_leave (); - - /* FIXME: hard-code these values for now. */ - top = 20; - left = 6; - bottom = 6; - right = 6; - - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, - postConfigureEventID, - (jint) event->configure.x, - (jint) event->configure.y, - (jint) event->configure.width, - (jint) event->configure.height, - (jint) top, - (jint) left, - (jint) bottom, - (jint) right); - gdk_threads_enter (); - } - } - break; - case GDK_EXPOSE: + if (widget && GTK_WIDGET_TOPLEVEL (widget)) { - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, - postExposeEventID, - (jint)event->expose.area.x, - (jint)event->expose.area.y, - (jint)event->expose.area.width, - (jint)event->expose.area.height); + gint top, left, right, bottom; + + /* Configure events are not posted to the AWT event + queue, and as such, the gdk/gtk peer functions will + be called back before postConfigureEvent + returns. */ + gdk_threads_leave (); + + /* FIXME: hard-code these values for now. */ + top = 20; + left = 6; + bottom = 6; + right = 6; + + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postConfigureEventID, + (jint) event->configure.x, + (jint) event->configure.y, + (jint) event->configure.width, + (jint) event->configure.height, + (jint) top, + (jint) left, + (jint) bottom, + (jint) right); + gdk_threads_enter (); } - break; + } + break; + case GDK_EXPOSE: + { + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postExposeEventID, + (jint)event->expose.area.x, + (jint)event->expose.area.y, + (jint)event->expose.area.width, + (jint)event->expose.area.height); + } + break; + case GDK_FOCUS_CHANGE: + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postFocusEventID, + (jint) (event->focus_change.in) ? + AWT_FOCUS_GAINED : AWT_FOCUS_LOST, + JNI_FALSE); + break; + case GDK_KEY_PRESS: + case GDK_KEY_RELEASE: + { + GtkWindow *window; + GdkWindow *obj_window; + jobject *focus_obj_ptr = NULL; - case GDK_KEY_PRESS: + /* A widget with a grab will get key events */ + if (!GTK_IS_WINDOW (widget)) + *focus_obj_ptr = peer; + else { - GtkWidget *widget; - GtkWindow *window; - /* The window to which the Java peer is attached. */ - GdkWindow *obj_window; + /* Check if we have an enabled focused widget in this window. + If not don't handle the event. */ + window = GTK_WINDOW (widget); + if (!window->focus_widget + || !GTK_WIDGET_IS_SENSITIVE (window->focus_widget) + || !window->focus_widget->window) + return FALSE; + + /* TextArea peers are attached to the scrolled window + that contains the GtkTextView, not to the text view + itself. Same for List. */ + if (GTK_IS_TEXT_VIEW (window->focus_widget) + || GTK_IS_CLIST (window->focus_widget)) + { + obj_window = gtk_widget_get_parent (window->focus_widget)->window; + } + else + obj_window = window->focus_widget->window; - gdk_window_get_user_data (event->any.window, (void **) &widget); + gdk_property_get (obj_window, + gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), + gdk_atom_intern ("CARDINAL", FALSE), + 0, + sizeof (jobject), + FALSE, + NULL, + NULL, + NULL, + (guchar **)&focus_obj_ptr); - window = GTK_WINDOW (gtk_widget_get_ancestor (widget, - GTK_TYPE_WINDOW)); - if (window - && GTK_WIDGET_IS_SENSITIVE (window) - && window->focus_widget - && GTK_WIDGET_IS_SENSITIVE (window->focus_widget) - && window->focus_widget->window) - { - gtk_widget_activate (window->focus_widget); + /* If the window has no jobject attached we can't send anything */ + if (!focus_obj_ptr) + return FALSE; + } - /* TextArea peers are attached to the scrolled window - that contains the GtkTextView, not to the text view - itself. */ - if (GTK_IS_TEXT_VIEW (window->focus_widget) - || GTK_IS_CLIST (window->focus_widget)) - obj_window = gtk_widget_get_parent (window->focus_widget)->window; - else - obj_window = window->focus_widget->window; - - gdk_property_get (obj_window, - gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), - gdk_atom_intern ("CARDINAL", FALSE), - 0, - sizeof (jobject), - FALSE, - NULL, - NULL, - NULL, - (guchar **)&grab_obj_ptr); - - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, - postKeyEventID, - (jint) AWT_KEY_PRESSED, - (jlong) event->key.time, - keyevent_state_to_awt_mods (event), - keysym_to_awt_keycode (event), - keyevent_to_awt_keychar (event), - keysym_to_awt_keylocation (event)); - - if (generates_key_typed_event (event, window->focus_widget)) - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, - postKeyEventID, - (jint) AWT_KEY_TYPED, - (jlong) event->key.time, - state_to_awt_mods (event->key.state), - VK_UNDEFINED, - keyevent_to_awt_keychar (event), - AWT_KEY_LOCATION_UNKNOWN); - } - } - break; - case GDK_KEY_RELEASE: + if (event->type == GDK_KEY_PRESS) { - GtkWidget *widget; - GtkWindow *window; - GdkWindow *obj_window; + (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr, + postKeyEventID, + (jint) AWT_KEY_PRESSED, + (jlong) event->key.time, + keyevent_state_to_awt_mods (event), + keysym_to_awt_keycode (event), + keyevent_to_awt_keychar (event), + keysym_to_awt_keylocation (event)); - gdk_window_get_user_data (event->any.window, (void **) &widget); - - window = GTK_WINDOW (gtk_widget_get_ancestor (widget, - GTK_TYPE_WINDOW)); - if (window - && GTK_WIDGET_IS_SENSITIVE (window) - && window->focus_widget - && GTK_WIDGET_IS_SENSITIVE (window->focus_widget) - && window->focus_widget->window) - { - gtk_widget_activate (window->focus_widget); - - if (GTK_IS_TEXT_VIEW (window->focus_widget) - || GTK_IS_CLIST (window->focus_widget)) - obj_window = gtk_widget_get_parent (window->focus_widget)->window; - else - obj_window = window->focus_widget->window; - - gdk_property_get (obj_window, - gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), - gdk_atom_intern ("CARDINAL", FALSE), - 0, - sizeof (jobject), - FALSE, - NULL, - NULL, - NULL, - (guchar **)&grab_obj_ptr); - - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, - postKeyEventID, - (jint) AWT_KEY_RELEASED, - (jlong) event->key.time, - keyevent_state_to_awt_mods (event), - keysym_to_awt_keycode (event), - keyevent_to_awt_keychar (event), - keysym_to_awt_keylocation (event)); + if (generates_key_typed_event (event, window->focus_widget)) + { + (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr, + postKeyEventID, + (jint) AWT_KEY_TYPED, + (jlong) event->key.time, + state_to_awt_mods (event->key.state), + VK_UNDEFINED, + keyevent_to_awt_keychar (event), + AWT_KEY_LOCATION_UNKNOWN); } } - break; - case GDK_FOCUS_CHANGE: - (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, - postFocusEventID, - (jint) (event->focus_change.in) ? - AWT_FOCUS_GAINED : AWT_FOCUS_LOST, - JNI_FALSE); - break; - default: - break; - } - g_free (grab_obj_ptr); + else /* GDK_KEY_RELEASE */ + { + (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr, + postKeyEventID, + (jint) AWT_KEY_RELEASED, + (jlong) event->key.time, + keyevent_state_to_awt_mods (event), + keysym_to_awt_keycode (event), + keyevent_to_awt_keychar (event), + keysym_to_awt_keylocation (event)); + } + } + break; + default: + break; } - - gtk_main_do_event (event); + + return FALSE; } static void @@ -1285,3 +1176,4 @@ connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...) } va_end (ap); } + 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 2308d1100edd..cb065d51894f 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 @@ -57,15 +57,15 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectHooks +Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectJObject (JNIEnv *env, jobject obj) { void *ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); - /* NOTE: we don't call the superclass connect method here. */ gtk_widget_realize (GTK_WIDGET (ptr)); + connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); gdk_threads_leave (); 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 94c303e0cdd8..7bc4c6dabb15 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 @@ -37,10 +37,18 @@ exception statement from your version. */ #include "gtkpeer.h" +#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" #include "gnu_java_awt_peer_gtk_GtkListPeer.h" -static void -connect_selectable_hook (JNIEnv *env, jobject peer_obj, GtkCList *list); +static void item_select (GtkCList *list __attribute__((unused)), + int row, int col __attribute__((unused)), + GdkEventButton *event __attribute__((unused)), + jobject peer_obj); +static void item_unselect (GtkCList *list __attribute__((unused)), + int row, + int col __attribute__((unused)), + GdkEventButton *event __attribute__((unused)), + jobject peer_obj); #define CLIST_FROM_SW(obj) (GTK_CLIST(GTK_SCROLLED_WINDOW (obj)->container.child)) @@ -64,7 +72,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_create } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkListPeer_connectHooks +Java_gnu_java_awt_peer_gtk_GtkListPeer_connectJObject (JNIEnv *env, jobject obj) { void *ptr; @@ -72,9 +80,44 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_connectHooks ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); + gtk_widget_realize (GTK_WIDGET (ptr)); - connect_selectable_hook (env, obj, CLIST_FROM_SW (ptr)); + connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals + (JNIEnv *env, jobject peer_obj) +{ + GtkCList *list; + void *ptr; + + ptr = NSA_GET_PTR (env, peer_obj); + + gdk_threads_enter (); + + gtk_widget_realize (GTK_WIDGET (ptr)); + + /* connect selectable hook */ + + list = CLIST_FROM_SW (ptr); + + g_signal_connect (G_OBJECT (list), "select_row", + GTK_SIGNAL_FUNC (item_select), peer_obj); + + g_signal_connect (G_OBJECT (list), "unselect_row", + GTK_SIGNAL_FUNC (item_unselect), peer_obj); + + /* 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); + gdk_threads_leave (); } @@ -108,58 +151,6 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_append gdk_threads_leave (); } - -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkListPeer_old_create - (JNIEnv *env, jobject obj, jobject parent_obj, - jobjectArray items, jboolean mode) -{ - GtkWidget *list, *sw, *parent; - jsize count, i; - - parent = NSA_GET_PTR (env, parent_obj); - - count = (*env)->GetArrayLength (env, items); - - gdk_threads_enter (); - - list = gtk_clist_new (1); - gtk_widget_show (list); - - sw = gtk_scrolled_window_new (NULL, NULL); - set_parent (sw, GTK_CONTAINER (parent)); - gtk_widget_realize (sw); - - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (sw), list); - - connect_selectable_hook (env, obj, GTK_CLIST (list)); - connect_awt_hook (env, obj, 1, list->window); - - gtk_clist_set_selection_mode (GTK_CLIST (list), - mode ? GTK_SELECTION_MULTIPLE : - GTK_SELECTION_SINGLE); - - for (i = 0; i < count; i++) - { - const char *text; - jobject item; - - item = (*env)->GetObjectArrayElement (env, items, i); - - text = (*env)->GetStringUTFChars (env, item, NULL); - gtk_clist_append (GTK_CLIST (list), (char **)&text); - (*env)->ReleaseStringUTFChars (env, item, text); - } - - gtk_clist_columns_autosize (GTK_CLIST (list)); - gdk_threads_leave (); - - NSA_SET_PTR (env, obj, sw); -} - JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkListPeer_add (JNIEnv *env, jobject obj, jstring text, jint index) @@ -326,9 +317,9 @@ static void item_select (GtkCList *list __attribute__((unused)), int row, int col __attribute__((unused)), GdkEventButton *event __attribute__((unused)), - jobject *peer_obj) + jobject peer_obj) { - (*gdk_env)->CallVoidMethod (gdk_env, *peer_obj, + (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, postListItemEventID, row, (jint) AWT_ITEM_SELECTED); @@ -339,25 +330,11 @@ item_unselect (GtkCList *list __attribute__((unused)), int row, int col __attribute__((unused)), GdkEventButton *event __attribute__((unused)), - jobject *peer_obj) + jobject peer_obj) { - (*gdk_env)->CallVoidMethod (gdk_env, *peer_obj, + (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, postListItemEventID, row, (jint) AWT_ITEM_DESELECTED); } -static void -connect_selectable_hook (JNIEnv *env, jobject peer_obj, GtkCList *list) -{ - jobject *obj; - - obj = (jobject *) malloc (sizeof (jobject)); - *obj = (*env)->NewGlobalRef (env, peer_obj); - - gtk_signal_connect (GTK_OBJECT (list), "select_row", - GTK_SIGNAL_FUNC (item_select), obj); - - gtk_signal_connect (GTK_OBJECT (list), "unselect_row", - GTK_SIGNAL_FUNC (item_unselect), obj); -} 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 10c9e4cab745..f7c704110b7d 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 @@ -109,6 +109,6 @@ connect_activate_hook (JNIEnv *env, jobject peer_obj, GtkMenuItem *item) obj = (jobject *) malloc (sizeof (jobject)); *obj = (*env)->NewGlobalRef (env, peer_obj); - gtk_signal_connect (GTK_OBJECT (item), "activate", + 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 e8cd78cb11da..3de02d54f852 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 @@ -66,7 +66,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_setupAccelGroup if (GTK_WIDGET_REALIZED (GTK_WIDGET (ptr1))) accel_attach (GTK_MENU_ITEM (ptr1), NULL); else - gtk_signal_connect (GTK_OBJECT (ptr1), + g_signal_connect (G_OBJECT (ptr1), "realize", GTK_SIGNAL_FUNC (accel_attach), NULL); 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 5d3898954568..72a96c617366 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 @@ -37,6 +37,7 @@ exception statement from your version. */ #include "gtkpeer.h" +#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" #include "gnu_java_awt_peer_gtk_GtkPanelPeer.h" JNIEXPORT void JNICALL @@ -61,7 +62,7 @@ struct _GtkLayoutChild { }; JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectHooks +Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectJObject (JNIEnv *env, jobject obj) { void *ptr; @@ -72,9 +73,26 @@ Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectHooks gtk_widget_realize (GTK_WIDGET (ptr)); connect_awt_hook (env, obj, 1, GTK_LAYOUT (ptr)->bin_window); -/* gtk_signal_connect (GTK_OBJECT (ptr), "size_request", GTK_SIGNAL_FUNC (sr), */ + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals + (JNIEnv *env, jobject obj) +{ + void *ptr; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); + gtk_widget_realize (GTK_WIDGET (ptr)); + +/* g_signal_connect (G_OBJECT (ptr), "size_request", GTK_SIGNAL_FUNC (sr), */ /* NULL); */ gdk_threads_leave (); + + /* 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_GtkScrollBarPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c index 2bd3df8cf353..1b56d08317f1 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 @@ -37,6 +37,7 @@ exception statement from your version. */ #include "gtkpeer.h" +#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" #include "gnu_java_awt_peer_gtk_GtkScrollbarPeer.h" struct range_scrollbar @@ -120,7 +121,24 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectHooks +Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectJObject + (JNIEnv *env, jobject obj) +{ + void *ptr; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); + + gtk_widget_realize (GTK_WIDGET (ptr)); + + connect_awt_hook (env, obj, 1, GTK_SCROLLBAR (ptr)->range); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals (JNIEnv *env, jobject obj) { void *ptr; @@ -136,17 +154,19 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectHooks rs->range = GTK_RANGE (ptr); rs->scrollbar = (jobject *) malloc (sizeof (jobject)); *(rs->scrollbar) = (*env)->NewGlobalRef (env, obj); - gtk_signal_connect (GTK_OBJECT (GTK_RANGE (ptr)), + + g_signal_connect (G_OBJECT (GTK_RANGE (ptr)), "move-slider", GTK_SIGNAL_FUNC (post_adjustment_event), rs); - gtk_signal_connect (GTK_OBJECT (GTK_RANGE (ptr)), + g_signal_connect (G_OBJECT (GTK_RANGE (ptr)), "value-changed", GTK_SIGNAL_FUNC (post_change_event), rs); - - connect_awt_hook (env, obj, 1, GTK_SCROLLBAR (ptr)->range); gdk_threads_leave (); + + /* 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_GtkTextComponentPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c index b4a00e1288d5..69e8b0abc49e 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 @@ -48,7 +48,7 @@ static void textcomponent_changed_cb (GtkEditable *editable, jobject peer); JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectHooks +Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals (JNIEnv *env, jobject obj) { void *ptr; @@ -66,6 +66,11 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectHooks g_signal_connect (GTK_EDITABLE (ptr), "changed", G_CALLBACK (textcomponent_changed_cb), obj); + + gdk_threads_leave (); + + /* Connect the superclass signals. */ + Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); } else { @@ -87,13 +92,18 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectHooks if (buf) g_signal_connect (buf, "changed", G_CALLBACK (textcomponent_changed_cb), obj); + + /* 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 (text), "event", + G_CALLBACK (pre_event_handler), obj); + + gdk_threads_leave (); } } - - gdk_threads_leave (); - - /* Connect the superclass hooks. */ - Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks (env, obj); } JNIEXPORT jint JNICALL 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 d71f36a42982..3986a1fd22c0 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 @@ -37,6 +37,7 @@ exception statement from your version. */ #include "gtkpeer.h" +#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" #include "gnu_java_awt_peer_gtk_GtkWindowPeer.h" #include "gnu_java_awt_peer_gtk_GtkFramePeer.h" #include @@ -116,7 +117,8 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create NSA_SET_PTR (env, obj, window_widget); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible (JNIEnv *env, jobject obj, jboolean visible) { void *ptr; @@ -135,7 +137,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectHooks +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectJObject (JNIEnv *env, jobject obj) { void *ptr; @@ -169,6 +172,21 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectHooks connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals + (JNIEnv *env, jobject obj) +{ + void *ptr; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); + + gtk_widget_realize (ptr); + /* Connect signals for window event support. */ g_signal_connect (G_OBJECT (ptr), "delete-event", G_CALLBACK (window_delete_cb), obj); @@ -189,6 +207,9 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectHooks G_CALLBACK (window_window_state_cb), obj); gdk_threads_leave (); + + /* Connect the superclass signals. */ + Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); } /* diff --git a/libjava/jni/gtk-peer/gtkpeer.h b/libjava/jni/gtk-peer/gtkpeer.h index 8f8ec40c08cc..55d5e3dce21b 100644 --- a/libjava/jni/gtk-peer/gtkpeer.h +++ b/libjava/jni/gtk-peer/gtkpeer.h @@ -392,6 +392,10 @@ extern GtkWindowGroup *global_gtk_window_group; void awt_event_handler (GdkEvent *event); +gboolean pre_event_handler (GtkWidget *widget, + GdkEvent *event, + jobject peer); + void connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...); void set_visible (GtkWidget *widget, jboolean visible);