+2003-07-07 Thomas Fitzsimmons <fitzsim@redhat.com>
+
+ * 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.
+
2003-07-07 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* configure.in: Check for usleep declaration.
package gnu.java.awt.peer.gtk;
import java.awt.peer.*;
import java.awt.*;
+import java.awt.event.*;
public class GtkTextComponentPeer extends GtkComponentPeer
implements TextComponentPeer
}
public native int getCaretPosition ();
- public void setCaretPosition (int pos)
- {
- set ("text_position", pos);
- }
+ public native void setCaretPosition (int pos);
public native int getSelectionStart ();
public native int getSelectionEnd ();
public native String getText ();
public native void select (int start, int end);
-
- public void setEditable (boolean state)
- {
- set ("editable", state);
- }
-
+ public native void setEditable (boolean state);
public native void setText (String text);
-
- public void getArgs (Component component, GtkArgList args)
- {
- super.getArgs (component, args);
-
- TextComponent tc = (TextComponent) component;
-
- args.add ("text_position", tc.getCaretPosition ());
- args.add ("editable", tc.isEditable ());
- }
-
+
public int getIndexAtPoint(int x, int y)
{
return 0; // FIXME
{
return filter; // FIXME
}
+
+ protected void postTextEvent ()
+ {
+ 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 ();
+ }
+ }
}
package gnu.java.awt.peer.gtk;
+import java.awt.event.KeyEvent;
import java.awt.peer.*;
import java.awt.*;
{
gtkSetFont(((GtkFontPeer)f.getPeer()).getXLFD(), f.getSize());
}
+
+ public void handleEvent (AWTEvent e)
+ {
+ if (e.getID () == KeyEvent.KEY_PRESSED)
+ {
+ KeyEvent ke = (KeyEvent)e;
+
+ if (!ke.isConsumed()
+ && ke.getKeyCode() == KeyEvent.VK_ENTER)
+ postActionEvent (getText(), ke.getModifiers ());
+ }
+
+ super.handleEvent (e);
+ }
}
StringBuffer s = new StringBuffer(id == ACTION_PERFORMED
? "ACTION_PERFORMED,cmd="
: "unknown type,cmd=");
- s.append(actionCommand).append(",when=").append(when).append("modifiers");
+ s.append(actionCommand).append(",when=").append(when).append(",modifiers");
int len = s.length();
s.setLength(len + 1);
if ((modifiers & META_MASK) != 0)
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)
}
}
+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)
{
|| 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,
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,
jmethodID postAdjustmentEventID;
jmethodID postItemEventID;
jmethodID postListItemEventID;
+jmethodID postTextEventID;
JNIEnv *gdk_env;
#ifdef PORTABLE_NATIVE_SYNC
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);
"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"); */
postListItemEventID = (*env)->GetMethodID (env, gtklistpeer,
"postItemEvent",
"(II)V");
+ postTextEventID = (*env)->GetMethodID (env, gtktextcomponentpeer,
+ "postTextEvent",
+ "()V");
}
/*
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);
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
{
extern jmethodID postAdjustmentEventID;
extern jmethodID postItemEventID;
extern jmethodID postListItemEventID;
+extern jmethodID postTextEventID;
extern jmethodID syncAttrsID;
extern jclass gdkColor;
extern jmethodID gdkColorID;