aboutsummaryrefslogtreecommitdiff
path: root/libjava/jni
diff options
context:
space:
mode:
authorThomas Fitzsimmons <fitzsim@redhat.com>2003-07-07 19:56:04 +0000
committerThomas Fitzsimmons <fitzsim@gcc.gnu.org>2003-07-07 19:56:04 +0000
commitb6fa901bc961f54ec9b24c77538f159ad6736d20 (patch)
treebdfd6dd308f68b299b088d16dcb5e0de8da7b995 /libjava/jni
parent0fcd5ddaa80596940cb2accd8a74f4ceae75fea5 (diff)
downloadgcc-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')
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c74
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c8
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c13
-rw-r--r--libjava/jni/gtk-peer/gtkpeer.h1
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;