From 434566e7e261a479a631a1635725695486ebd8ad Mon Sep 17 00:00:00 2001 From: Thomas Fitzsimmons Date: Wed, 23 Jul 2003 22:26:35 +0000 Subject: [PATCH] * 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. From-SVN: r69728 --- libjava/ChangeLog | 17 ++++ .../java/awt/peer/gtk/GtkTextComponentPeer.java | 13 +-- .../gnu/java/awt/peer/gtk/GtkTextFieldPeer.java | 1 - .../jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c | 53 +++++++---- .../gnu_java_awt_peer_gtk_GtkTextComponentPeer.c | 101 ++++++++++++++++++--- .../gnu_java_awt_peer_gtk_GtkTextFieldPeer.c | 16 ---- 6 files changed, 141 insertions(+), 60 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 0364546..5372dfc 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,20 @@ +2003-07-23 Thomas Fitzsimmons + + * 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 * java/lang/natSystem.cc (arraycopy): Check for overflow. diff --git a/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java index fd99d1d..7439f20 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java @@ -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 (); - } - } } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java index 51f17b8..efc3ff7 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java @@ -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[]); 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 3c400114..de18166 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 @@ -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, 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 de59035..009eb35 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 @@ -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); +} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c index 69b3e52..7836bb3 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c @@ -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) { -- 2.7.4