diff options
author | Thomas Fitzsimmons <fitzsim@redhat.com> | 2003-07-07 19:56:04 +0000 |
---|---|---|
committer | Thomas Fitzsimmons <fitzsim@gcc.gnu.org> | 2003-07-07 19:56:04 +0000 |
commit | b6fa901bc961f54ec9b24c77538f159ad6736d20 (patch) | |
tree | bdfd6dd308f68b299b088d16dcb5e0de8da7b995 /libjava/jni | |
parent | 0fcd5ddaa80596940cb2accd8a74f4ceae75fea5 (diff) | |
download | gcc-b6fa901bc961f54ec9b24c77538f159ad6736d20.zip gcc-b6fa901bc961f54ec9b24c77538f159ad6736d20.tar.gz gcc-b6fa901bc961f54ec9b24c77538f159ad6736d20.tar.bz2 |
* gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
(setCaretPosition, setEditable): Rely entirely on native
implementation.
(getArgs): Remove.
(postTextEvent): New method.
(handleEvent): New method.
* gnu/java/awt/peer/gtk/GtkTextFieldPeer.java (handleEvent): New
method.
* java/awt/event/ActionEvent.java (paramString): Fix formatting.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
(keysym_to_awt_keycode): Fix range checks.
(generates_key_typed_event): New function.
(awt_event_handler): Post AWT_KEY_RELEASED events to event
queue.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
(gtkInit): Store TextComponent's postTextEvent method ID.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
(setText): Post TEXT_VALUE_CHANGED event to event queue.
From-SVN: r69054
Diffstat (limited to 'libjava/jni')
4 files changed, 88 insertions, 8 deletions
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 2573a18..3c400114 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 @@ -90,10 +90,10 @@ keysym_to_awt_keycode (guint keyval) vk = gdk_keyval_to_upper (keyval); - if (vk <= 0x41 && vk <= 0x5A) /* VK_A through VK_Z */ + if (vk >= 0x41 && vk <= 0x5A) /* VK_A through VK_Z */ return vk; - if (vk <= 0x30 && vk <= 39) /* VK_0 through VK_9 */ + if (vk >= 0x30 && vk <= 0x39) /* VK_0 through VK_9 */ return vk; switch (vk) @@ -232,6 +232,24 @@ keysym_to_awt_keycode (guint keyval) } } +static int +generates_key_typed_event (guint keyval) +{ + 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; +} + void awt_event_handler (GdkEvent *event) { @@ -275,6 +293,7 @@ awt_event_handler (GdkEvent *event) || event->type == GDK_CONFIGURE || event->type == GDK_EXPOSE || event->type == GDK_KEY_PRESS + || event->type == GDK_KEY_RELEASE || event->type == GDK_FOCUS_CHANGE || event->type == GDK_MOTION_NOTIFY) && gdk_property_get (event->any.window, @@ -468,29 +487,70 @@ awt_event_handler (GdkEvent *event) NULL, NULL, (guchar **)&obj_ptr); - + /* if (grab && GTK_WIDGET_HAS_DEFAULT (widget) ) */ /* { */ (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postKeyEventID, (jint) AWT_KEY_PRESSED, (jlong) event->key.time, - state_to_awt_mods (event->key.state), - keysym_to_awt_keycode (event->key.keyval), + state_to_awt_mods (event->key.state), + keysym_to_awt_keycode (event->key.keyval), (jchar) (event->key.length) ? event->key.string[0] : AWT_KEY_CHAR_UNDEFINED); - if (event->key.length) + + if (event->key.length + && generates_key_typed_event(event->key.keyval)) (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postKeyEventID, (jint) AWT_KEY_TYPED, (jlong) event->key.time, - state_to_awt_mods (event->key.state), + state_to_awt_mods (event->key.state), VK_UNDEFINED, (jchar) event->key.string[0]); } } break; + case GDK_KEY_RELEASE: + { + GtkWidget *widget; + GtkWindow *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); + gdk_property_get (window->focus_widget->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, + postKeyEventID, + (jint) AWT_KEY_RELEASED, + (jlong) event->key.time, + state_to_awt_mods (event->key.state), + keysym_to_awt_keycode (event->key.keyval), + (jchar) (event->key.length) ? + event->key.string[0] : + AWT_KEY_CHAR_UNDEFINED); + } + } + break; case GDK_FOCUS_CHANGE: (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postFocusEventID, diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c index cd4d7e2..83fab1c 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c @@ -54,6 +54,7 @@ jmethodID postFocusEventID; jmethodID postAdjustmentEventID; jmethodID postItemEventID; jmethodID postListItemEventID; +jmethodID postTextEventID; JNIEnv *gdk_env; #ifdef PORTABLE_NATIVE_SYNC @@ -72,7 +73,8 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz) char **argv; char *homedir, *rcpath = NULL; /* jclass gtkgenericpeer; */ - jclass gtkcomponentpeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer, gtkmenuitempeer; + jclass gtkcomponentpeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer, + gtkmenuitempeer, gtktextcomponentpeer; NSA_INIT (env, clazz); @@ -133,6 +135,7 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz) "gnu/java/awt/peer/gtk/GtkScrollbarPeer"); gtklistpeer = (*env)->FindClass (env, "gnu/java/awt/peer/gtk/GtkListPeer"); gtkmenuitempeer = (*env)->FindClass (env, "gnu/java/awt/peer/gtk/GtkMenuItemPeer"); + gtktextcomponentpeer = (*env)->FindClass (env, "gnu/java/awt/peer/gtk/GtkTextComponentPeer"); /* gdkColor = (*env)->FindClass (env, */ /* "gnu/java/awt/peer/gtk/GdkColor"); */ /* gdkColorID = (*env)->GetMethodID (env, gdkColor, "<init>", "(III)V"); */ @@ -162,6 +165,9 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz) postListItemEventID = (*env)->GetMethodID (env, gtklistpeer, "postItemEvent", "(II)V"); + postTextEventID = (*env)->GetMethodID (env, gtktextcomponentpeer, + "postTextEvent", + "()V"); } /* 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 8cdff34..de59035 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 @@ -361,6 +361,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText const char *str; GtkWidget *text = NULL; // type of GtkTextView (TextArea) GtkTextBuffer *buf; + jobject *obj_ptr; ptr = NSA_GET_PTR (env, obj); str = (*env)->GetStringUTFChars (env, contents, NULL); @@ -370,6 +371,18 @@ 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 { diff --git a/libjava/jni/gtk-peer/gtkpeer.h b/libjava/jni/gtk-peer/gtkpeer.h index fa1f19b..1cfa6c4 100644 --- a/libjava/jni/gtk-peer/gtkpeer.h +++ b/libjava/jni/gtk-peer/gtkpeer.h @@ -266,6 +266,7 @@ extern jmethodID postFocusEventID; extern jmethodID postAdjustmentEventID; extern jmethodID postItemEventID; extern jmethodID postListItemEventID; +extern jmethodID postTextEventID; extern jmethodID syncAttrsID; extern jclass gdkColor; extern jmethodID gdkColorID; |