Commit 434566e7 by Thomas Fitzsimmons Committed by 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.

From-SVN: r69728
parent 118545ec
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> 2003-07-23 Tom Tromey <tromey@redhat.com>
* java/lang/natSystem.cc (arraycopy): Check for overflow. * java/lang/natSystem.cc (arraycopy): Check for overflow.
......
...@@ -56,6 +56,7 @@ public class GtkTextComponentPeer extends GtkComponentPeer ...@@ -56,6 +56,7 @@ public class GtkTextComponentPeer extends GtkComponentPeer
setText (tc.getText ()); setText (tc.getText ());
} }
public native void connectHooks ();
public native int getCaretPosition (); public native int getCaretPosition ();
public native void setCaretPosition (int pos); public native void setCaretPosition (int pos);
public native int getSelectionStart (); public native int getSelectionStart ();
...@@ -84,16 +85,4 @@ public class GtkTextComponentPeer extends GtkComponentPeer ...@@ -84,16 +85,4 @@ public class GtkTextComponentPeer extends GtkComponentPeer
{ {
q.postEvent (new TextEvent (awtComponent, TextEvent.TEXT_VALUE_CHANGED)); 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 ();
}
}
} }
...@@ -52,7 +52,6 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer ...@@ -52,7 +52,6 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer
// native void create (ComponentPeer parent, String text); // native void create (ComponentPeer parent, String text);
native void create (); native void create ();
native void createHooks ();
native void gtkEntryGetSize (int cols, int dims[]); native void gtkEntryGetSize (int cols, int dims[]);
......
...@@ -232,22 +232,18 @@ keysym_to_awt_keycode (guint keyval) ...@@ -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 static int
generates_key_typed_event (guint keyval) generates_key_typed_event (guint keyval, GtkWidget *source)
{ {
guint vk; return (keyval == GDK_BackSpace
|| keyval == GDK_Delete
vk = gdk_keyval_to_upper (keyval); || keyval == GDK_Return
|| (keyval == GDK_Tab
if ((vk >= 0x20 && vk <= 0x7e) /* Most printable keysyms on a && GTK_IS_TEXT_VIEW(source))) ? 1 : 0;
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 void
...@@ -465,6 +461,8 @@ awt_event_handler (GdkEvent *event) ...@@ -465,6 +461,8 @@ awt_event_handler (GdkEvent *event)
{ {
GtkWidget *widget; GtkWidget *widget;
GtkWindow *window; GtkWindow *window;
/* The window to which the Java peer is attached. */
GdkWindow *obj_window;
gdk_window_get_user_data (event->any.window, (void **) &widget); gdk_window_get_user_data (event->any.window, (void **) &widget);
...@@ -477,7 +475,16 @@ awt_event_handler (GdkEvent *event) ...@@ -477,7 +475,16 @@ awt_event_handler (GdkEvent *event)
&& window->focus_widget->window) && window->focus_widget->window)
{ {
gtk_widget_activate (window->focus_widget); 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 ("_GNU_GTKAWT_ADDR", FALSE),
gdk_atom_intern ("CARDINAL", FALSE), gdk_atom_intern ("CARDINAL", FALSE),
0, 0,
...@@ -500,15 +507,16 @@ awt_event_handler (GdkEvent *event) ...@@ -500,15 +507,16 @@ awt_event_handler (GdkEvent *event)
event->key.string[0] : event->key.string[0] :
AWT_KEY_CHAR_UNDEFINED); AWT_KEY_CHAR_UNDEFINED);
if (event->key.length if (generates_key_typed_event (event->key.keyval, window->focus_widget))
&& generates_key_typed_event(event->key.keyval))
(*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr,
postKeyEventID, postKeyEventID,
(jint) AWT_KEY_TYPED, (jint) AWT_KEY_TYPED,
(jlong) event->key.time, (jlong) event->key.time,
state_to_awt_mods (event->key.state), state_to_awt_mods (event->key.state),
VK_UNDEFINED, VK_UNDEFINED,
(jchar) event->key.string[0]); (jchar) (event->key.length) ?
event->key.string[0] :
AWT_KEY_CHAR_UNDEFINED);
} }
} }
break; break;
...@@ -516,6 +524,7 @@ awt_event_handler (GdkEvent *event) ...@@ -516,6 +524,7 @@ awt_event_handler (GdkEvent *event)
{ {
GtkWidget *widget; GtkWidget *widget;
GtkWindow *window; GtkWindow *window;
GdkWindow *obj_window;
gdk_window_get_user_data (event->any.window, (void **) &widget); gdk_window_get_user_data (event->any.window, (void **) &widget);
...@@ -528,7 +537,13 @@ awt_event_handler (GdkEvent *event) ...@@ -528,7 +537,13 @@ awt_event_handler (GdkEvent *event)
&& window->focus_widget->window) && window->focus_widget->window)
{ {
gtk_widget_activate (window->focus_widget); 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 ("_GNU_GTKAWT_ADDR", FALSE),
gdk_atom_intern ("CARDINAL", FALSE), gdk_atom_intern ("CARDINAL", FALSE),
0, 0,
......
...@@ -39,6 +39,62 @@ exception statement from your version. */ ...@@ -39,6 +39,62 @@ exception statement from your version. */
#include "gtkpeer.h" #include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkTextComponentPeer.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 JNIEXPORT jint JNICALL
Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getCaretPosition Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getCaretPosition
(JNIEnv *env, jobject obj) (JNIEnv *env, jobject obj)
...@@ -371,18 +427,6 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText ...@@ -371,18 +427,6 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText
if (GTK_IS_EDITABLE (ptr)) if (GTK_IS_EDITABLE (ptr))
{ {
gtk_entry_set_text (GTK_ENTRY (ptr), str); 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 else
{ {
...@@ -406,3 +450,36 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText ...@@ -406,3 +450,36 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText
(*env)->ReleaseStringUTFChars (env, contents, str); (*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);
}
...@@ -53,22 +53,6 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_create ...@@ -53,22 +53,6 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_create
} }
JNIEXPORT void JNICALL 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 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkEntryGetSize
(JNIEnv *env, jobject obj, jint cols, jintArray jdims) (JNIEnv *env, jobject obj, jint cols, jintArray jdims)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment