* gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
authorThomas Fitzsimmons <fitzsim@redhat.com>
Wed, 23 Jul 2003 22:26:35 +0000 (22:26 +0000)
committerThomas Fitzsimmons <fitzsim@gcc.gnu.org>
Wed, 23 Jul 2003 22:26:35 +0000 (22:26 +0000)
(connectHooks): New method.
(handleEvent): Remove.
* gnu/java/awt/peer/gtk/GtkTextFieldPeer.java
(createHooks): Remove declaration.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
(generates_key_typed_event): Change to handle only certain
keyvals.
(awt_event_handler): Add special handling for GtkTextView.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
(textcomponent_commit_cb): New function.
(textcomponent_changed_cb): Likewise.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
(connectHooks): Remove.

From-SVN: r69728

libjava/ChangeLog
libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c

index 0364546..5372dfc 100644 (file)
@@ -1,3 +1,20 @@
+2003-07-23  Thomas Fitzsimmons  <fitzsim@redhat.com>
+
+       * gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
+       (connectHooks): New method.
+       (handleEvent): Remove.
+       * gnu/java/awt/peer/gtk/GtkTextFieldPeer.java
+       (createHooks): Remove declaration.
+       * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
+       (generates_key_typed_event): Change to handle only certain
+       keyvals.
+       (awt_event_handler): Add special handling for GtkTextView.
+       * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
+       (textcomponent_commit_cb): New function.
+       (textcomponent_changed_cb): Likewise.
+       * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
+       (connectHooks): Remove.
+
 2003-07-23  Tom Tromey  <tromey@redhat.com>
 
        * java/lang/natSystem.cc (arraycopy): Check for overflow.
index fd99d1d..7439f20 100644 (file)
@@ -56,6 +56,7 @@ public class GtkTextComponentPeer extends GtkComponentPeer
     setText (tc.getText ());
   }
   
+  public native void connectHooks ();
   public native int getCaretPosition ();
   public native void setCaretPosition (int pos);
   public native int getSelectionStart ();
@@ -84,16 +85,4 @@ public class GtkTextComponentPeer extends GtkComponentPeer
   {
     q.postEvent (new TextEvent (awtComponent, TextEvent.TEXT_VALUE_CHANGED));
   }
-
-  public void handleEvent (AWTEvent e)
-  {
-    if (e.getID () == KeyEvent.KEY_TYPED
-        && ((TextComponent)e.getSource()).isEditable())
-      {
-        KeyEvent ke = (KeyEvent)e;
-
-        if (!ke.isConsumed())
-          postTextEvent ();
-      }
-  }
 }
index 51f17b8..efc3ff7 100644 (file)
@@ -52,7 +52,6 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer
 //    native void create (ComponentPeer parent, String text);
 
   native void create ();
-  native void createHooks ();
 
   native void gtkEntryGetSize (int cols, int dims[]);
 
index 3c40011..de18166 100644 (file)
@@ -232,22 +232,18 @@ keysym_to_awt_keycode (guint keyval)
     }
 }
 
+/* Checks if keyval triggers a KEY_TYPED event on the source widget.
+   This function identifies special keyvals that don't trigger
+   GtkIMContext "commit" signals, but that do trigger Java KEY_TYPED
+   events. */
 static int
-generates_key_typed_event (guint keyval)
+generates_key_typed_event (guint keyval, GtkWidget *source)
 {
-  guint vk;
-
-  vk = gdk_keyval_to_upper (keyval);
-
-  if ((vk >= 0x20 && vk <= 0x7e)       /* Most printable keysyms on a
-                                           standard US keyboard. */
-      || (vk >= 0xFF9F && vk <= 0xFFB9) /* Numeric Keypad keysyms. */
-      || vk == GDK_BackSpace
-      || vk == GDK_Delete
-      || vk == GDK_Return)
-    return 1;
-  else
-    return 0;
+  return (keyval == GDK_BackSpace
+          || keyval == GDK_Delete
+          || keyval == GDK_Return
+          || (keyval == GDK_Tab
+              && GTK_IS_TEXT_VIEW(source))) ? 1 : 0;
 }
 
 void
@@ -465,6 +461,8 @@ awt_event_handler (GdkEvent *event)
          {
            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);
 
@@ -477,7 +475,16 @@ awt_event_handler (GdkEvent *event)
                && window->focus_widget->window)
              {
                gtk_widget_activate (window->focus_widget);
-               gdk_property_get (window->focus_widget->window,
+
+                /* 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))
+                  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,
@@ -500,15 +507,16 @@ awt_event_handler (GdkEvent *event)
                                            event->key.string[0] : 
                                            AWT_KEY_CHAR_UNDEFINED);
 
-               if (event->key.length
-                    && generates_key_typed_event(event->key.keyval))
+                if (generates_key_typed_event (event->key.keyval, window->focus_widget))
                  (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr,
                                              postKeyEventID,
                                              (jint) AWT_KEY_TYPED,
                                              (jlong) event->key.time,
                                               state_to_awt_mods (event->key.state),
                                              VK_UNDEFINED,
-                                             (jchar) event->key.string[0]);
+                                              (jchar) (event->key.length) ?
+                                              event->key.string[0] :
+                                              AWT_KEY_CHAR_UNDEFINED);
              }
          }
          break;
@@ -516,6 +524,7 @@ awt_event_handler (GdkEvent *event)
          {
            GtkWidget *widget;
            GtkWindow *window;
+            GdkWindow *obj_window;
 
            gdk_window_get_user_data (event->any.window, (void **) &widget);
 
@@ -528,7 +537,13 @@ awt_event_handler (GdkEvent *event)
                && window->focus_widget->window)
              {
                gtk_widget_activate (window->focus_widget);
-               gdk_property_get (window->focus_widget->window,
+
+                if (GTK_IS_TEXT_VIEW (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,
index de59035..009eb35 100644 (file)
@@ -39,6 +39,62 @@ exception statement from your version. */
 #include "gtkpeer.h"
 #include "gnu_java_awt_peer_gtk_GtkTextComponentPeer.h"
 
+static void textcomponent_commit_cb (GtkIMContext *context,
+                                 const gchar  *str,
+                                 jobject peer);
+
+static void textcomponent_changed_cb (GtkEditable *editable,
+                                  jobject peer);
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectHooks
+  (JNIEnv *env, jobject obj)
+{
+  void *ptr;
+  GtkTextView *text = NULL;
+  GtkTextBuffer *buf;
+
+  ptr = NSA_GET_PTR (env, obj);
+
+  gdk_threads_enter ();
+
+  if (GTK_IS_ENTRY(ptr))
+    {
+      g_signal_connect (GTK_ENTRY (ptr)->im_context, "commit",
+                        G_CALLBACK (textcomponent_commit_cb), obj);
+
+      g_signal_connect (GTK_EDITABLE (ptr), "changed",
+                        G_CALLBACK (textcomponent_changed_cb), obj);
+    }
+  else
+    {
+      if (GTK_IS_SCROLLED_WINDOW (ptr))
+       {
+          text = GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child);
+       }
+      else if (GTK_IS_TEXT_VIEW (ptr))
+       {
+         text = GTK_TEXT_VIEW (ptr);
+       }
+
+      if (text)
+       {
+          g_signal_connect (text->im_context, "commit",
+                            G_CALLBACK (textcomponent_commit_cb), obj);
+
+          buf = gtk_text_view_get_buffer (text);
+          if (buf)
+            g_signal_connect (buf, "changed",
+                              G_CALLBACK (textcomponent_changed_cb), obj);
+       }
+    }
+
+  gdk_threads_leave ();
+
+  /* Connect the superclass hooks.  */
+  Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks (env, obj);
+}
+
 JNIEXPORT jint JNICALL 
 Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getCaretPosition
   (JNIEnv *env, jobject obj)
@@ -371,18 +427,6 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText
   if (GTK_IS_EDITABLE (ptr))
     {
       gtk_entry_set_text (GTK_ENTRY (ptr), str);
-
-      if (gdk_property_get (GTK_WIDGET(ptr)->window,
-                            gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
-                            gdk_atom_intern ("CARDINAL", FALSE),
-                            0,
-                            sizeof (jobject),
-                            FALSE,
-                            NULL,
-                            NULL,
-                            NULL,
-                            (guchar **)&obj_ptr))
-        (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postTextEventID);
     }
   else
     {
@@ -406,3 +450,36 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText
 
   (*env)->ReleaseStringUTFChars (env, contents, str);
 }
+
+static void
+textcomponent_commit_cb (GtkIMContext *context,
+                         const gchar  *str,
+                         jobject peer)
+{
+  void *ptr;
+
+  /* str is a \0-terminated UTF-8 encoded character. */
+  gunichar2 *jc = g_utf8_to_utf16 (str, -1, NULL, NULL, NULL);
+
+  if (jc)
+    (*gdk_env)->CallVoidMethod (gdk_env, peer,
+                                postKeyEventID,
+                                (jint) AWT_KEY_TYPED,
+                                /* We don't have access to the event
+                                   that caused this commit signal to
+                                   be fired.  So approximate the event
+                                   time... */
+                                (jlong) gdk_event_get_time (NULL),
+                                /* ... and assume no modifiers. */
+                                0,
+                                VK_UNDEFINED,
+                                (jchar) jc[0]);
+  g_free (jc);
+}
+
+static void
+textcomponent_changed_cb (GtkEditable *editable,
+                      jobject peer)
+{
+  (*gdk_env)->CallVoidMethod (gdk_env, peer, postTextEventID);
+}
index 69b3e52..7836bb3 100644 (file)
@@ -53,22 +53,6 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_create
 }
 
 JNIEXPORT void JNICALL 
-Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_connectHooks
-  (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, 2, 
-                   GTK_WIDGET (ptr)->window, 
-                   GTK_ENTRY (ptr)->text_area);
-  gdk_threads_leave ();
-}
-
-JNIEXPORT void JNICALL 
 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkEntryGetSize
   (JNIEnv *env, jobject obj, jint cols, jintArray jdims)
 {