aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorThomas Fitzsimmons <fitzsim@redhat.com>2003-07-23 22:26:35 +0000
committerThomas Fitzsimmons <fitzsim@gcc.gnu.org>2003-07-23 22:26:35 +0000
commit434566e7e261a479a631a1635725695486ebd8ad (patch)
treef323cf6b1c52677c2158122c5985db87dd047a98 /libjava
parent118545ec26eb2c3cfe966f552b30860e35c416d3 (diff)
downloadgcc-434566e7e261a479a631a1635725695486ebd8ad.zip
gcc-434566e7e261a479a631a1635725695486ebd8ad.tar.gz
gcc-434566e7e261a479a631a1635725695486ebd8ad.tar.bz2
* 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
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog17
-rw-r--r--libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java13
-rw-r--r--libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java1
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c53
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c101
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c16
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 <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.
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)
{