gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler): Most coded moved to pre_event_...
authorFernando Nasser <fnasser@redhat.com>
Thu, 11 Dec 2003 13:50:51 +0000 (13:50 +0000)
committerFernando Nasser <fnasser@gcc.gnu.org>
Thu, 11 Dec 2003 13:50:51 +0000 (13:50 +0000)
2003-12-08  Fernando Nasser  <fnasser@redhat.com>

        * 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

25 files changed:
libjava/ChangeLog
libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java
libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java
libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java
libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java
libjava/gnu/java/awt/peer/gtk/GtkListPeer.java
libjava/gnu/java/awt/peer/gtk/GtkPanelPeer.java
libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java
libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
libjava/jni/gtk-peer/gtkpeer.h

index fa81c2a0ce63cda84c56e2341d995ebbbbc5c8d7..09b1e9862c4b25d13aaed2da1b3f64f4de097ef5 100644 (file)
@@ -1,3 +1,85 @@
+2003-12-08  Fernando Nasser  <fnasser@redhat.com>
+
+       * 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  <konqueror@gmx.de>
 
        * Makefile.am (nat_headers_install): New variable with header files to
index 0801f9c6ec0ec4b1eed9919bc16bb78f617901d9..9a832265b34bd318922b5c038147d435bab889e4 100644 (file)
@@ -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);
index 174a16923deabdf1cbf9fa583207fc5d8a4f9dc4..fba8c8ff8f9d82145c5c4d57a6adac59fb9f7a06 100644 (file)
@@ -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)
   {
index 80feebdcabb75c2e36b472734b347718d9ad9562..4e216f8770e1c5a0cd848aadb3367bdd42046933 100644 (file)
@@ -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 ());
index 64e73c68a86ba7ff92624b5370753a5cb19a6cca..07422ace79b0a8998afec2541fee336e7004381b 100644 (file)
@@ -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)
   {
index 31f98525f23d5a6159129910ef1837c49fdc3977..e06e079ae0be569750f3a4b561f20fa61c8a553e 100644 (file)
@@ -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[]);
 
index cf7a9e1badefbe49d37d3436cdacff4cc0aaf0cb..4f77994931d54110909b4e1420c24ad1439026dd 100644 (file)
@@ -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)
   {
index d13e34edfe873a4f2ab6782d90dba4c5356f9425..0e1b65137d7cbdc4f0ed3c85b141725a0260bbc9 100644 (file)
@@ -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)
   {
index b3199d87c9a775557de73e8410086ad8dd51facf..8bc4bdf3eee4dc7eb240fbd693ee29fac1ef4530 100644 (file)
@@ -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);
index 821afa929f1eac5bf862e5c918ef30ab4fa7351a..4a2d50805a1e9dd1d726790660ff7c1ec665d8c2 100644 (file)
@@ -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)
   {
index a52f54ce35ffb39d367b6a93b5d86403e7e8b0d4..bce873712029ed9d3667c42d562ce92679e8ba4a 100644 (file)
@@ -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)
index d0d95f9fab73418e7689875da51f3e8ff36863df..9789569ddad05ced9675d735d17fcc43a27b666f 100644 (file)
@@ -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 
index b0130408c6be139f2658cf2652463ca89af04032..7e915c876ba6b9350e3235b3e1c4ed4c18fa14c9 100644 (file)
@@ -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);
 }
index cf197115aa5960bd35097d44741c1555d3771003..a1327400335886c5965bf166215c59e5f312d229 100644 (file)
@@ -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 ();
index 70aabf0cad976397eff856487e38f795b7c4b8bf..ee44ccc11fc6257fe18220511e4bef0acf2a6754 100644 (file)
@@ -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 ();
 }
 
index 0411352c7ca0ba37a5fd876e93cd5c42e154156d..3a7ad6277b7b4dc5fa798ce631b0019d408c315a 100644 (file)
@@ -813,21 +813,35 @@ generates_key_typed_event (GdkEvent *event, GtkWidget *source)
 void
 awt_event_handler (GdkEvent *event)
 {
-  jobject *event_obj_ptr = NULL;
-  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 an input event, let the main loop handle it */
+  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;
+
+  /* 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;
+
+  /* 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,
+    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, 
+                                 (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, *grab_obj_ptr,
-                                         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, *grab_obj_ptr, postMouseEventID,
-                                     AWT_MOUSE_MOVED,
+                                   (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;
-
-           gdk_window_get_user_data (event->any.window, (void **) &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); */
            
-           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;
-
-       case GDK_KEY_PRESS:
+      }
+      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;
+
+        /* 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;
-
-           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);
-
-                /* 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:
+            /* 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_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);
+
+            /* If the window has no jobject attached we can't send anything */
+           if (!focus_obj_ptr)
+             return FALSE;
+         }     
+
+       if (event->type == GDK_KEY_PRESS)       
          {
-           GtkWidget *widget;
-           GtkWindow *window;
-            GdkWindow *obj_window;
-
-           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));
+            (*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));
+
+            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);
 }
+
index 2308d1100eddaaa4391a3e36953ffe98650164e3..cb065d51894fa203f2d3c4fc2deb4a0f47b723fe 100644 (file)
@@ -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 ();
index 94c303e0cdd876600d0e7ab2be9346b453ebfd35..7bc4c6dabb1553001423a85fa44c7b446ba19675 100644 (file)
@@ -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,76 +80,61 @@ 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_append 
-  (JNIEnv *env, jobject obj, jobjectArray items)
+Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals
+  (JNIEnv *env, jobject peer_obj)
 {
-  void *ptr;
   GtkCList *list;
-  jint count, i;
-
-  ptr = NSA_GET_PTR (env, obj);
+  void *ptr;
 
-  count = (*env)->GetArrayLength (env, items);
+  ptr = NSA_GET_PTR (env, peer_obj);
 
   gdk_threads_enter ();
+
+  gtk_widget_realize (GTK_WIDGET (ptr));
+
+  /* connect selectable hook */
+  
   list = CLIST_FROM_SW (ptr);
-  for (i = 0; i < count; i++) 
-    {
-      const char *text;
-      jobject item;
 
-      item = (*env)->GetObjectArrayElement (env, items, i);
+  g_signal_connect (G_OBJECT (list), "select_row", 
+                     GTK_SIGNAL_FUNC (item_select), peer_obj);
 
-      text = (*env)->GetStringUTFChars (env, item, NULL);
-      gtk_clist_append (list, (char **)&text);
-      (*env)->ReleaseStringUTFChars (env, item, text);
-    }
+  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);
 
-  gtk_clist_columns_autosize (list);
   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)
+Java_gnu_java_awt_peer_gtk_GtkListPeer_append 
+  (JNIEnv *env, jobject obj, jobjectArray items)
 {
-  GtkWidget *list, *sw, *parent;
-  jsize count, i;
+  void *ptr;
+  GtkCList *list;
+  jint count, i;
 
-  parent = NSA_GET_PTR (env, parent_obj);
+  ptr = NSA_GET_PTR (env, 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);
-  
+  list = CLIST_FROM_SW (ptr);
   for (i = 0; i < count; i++) 
     {
       const char *text;
@@ -150,14 +143,12 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_old_create
       item = (*env)->GetObjectArrayElement (env, items, i);
 
       text = (*env)->GetStringUTFChars (env, item, NULL);
-      gtk_clist_append (GTK_CLIST (list), (char **)&text);
+      gtk_clist_append (list, (char **)&text);
       (*env)->ReleaseStringUTFChars (env, item, text);
     }
 
-  gtk_clist_columns_autosize (GTK_CLIST (list));
+  gtk_clist_columns_autosize (list);
   gdk_threads_leave ();
-
-  NSA_SET_PTR (env, obj, sw);
 }
 
 JNIEXPORT void JNICALL
@@ -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);
-}
index 10c9e4cab7458a63afdccdb31b15b041063b622a..f7c704110b7db41609b5769c92afc6c4c50109f6 100644 (file)
@@ -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);
 }
index e8cd78cb11da8c0944aecf6b9919e97d54b601fd..3de02d54f852f8595139d05cc8c99769e68ca695 100644 (file)
@@ -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);
index 5d389895456892f506b0c71dbe18d46d26ff3fd5..72a96c6173666d77cd2620e017ec1e91161544b6 100644 (file)
@@ -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);
 }
 
 /*
index 2bd3df8cf3534fa380fecfaed41e128140aadd9e..1b56d08317f110d80dc8b1f37f9b10ecd524bc1a 100644 (file)
@@ -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);
 }
 
 
index b4a00e1288d5f18bb859b192b3b252d9a69825be..69e8b0abc49e30112e3ddd40d454bb7d11db629a 100644 (file)
@@ -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);
-       }
-    }
 
-  gdk_threads_leave ();
+          /* 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);
 
-  /* Connect the superclass hooks.  */
-  Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks (env, obj);
+          gdk_threads_leave ();
+       }
+    }
 }
 
 JNIEXPORT jint JNICALL 
index d71f36a42982d8edaf8c7f9744b88ab15ab44c4f..3986a1fd22c04029ee155955f1cf1821be67a9a2 100644 (file)
@@ -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 <gdk/gdkprivate.h>
@@ -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);
 }
 
 /*
index 8f8ec40c08cc18ad1da5337a904706b82da121dc..55d5e3dce21b27ffef5547afa070443f6650fb2b 100644 (file)
@@ -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);