* 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
This commit is contained in:
parent
0fcd5ddaa8
commit
b6fa901bc9
8 changed files with 146 additions and 30 deletions
|
@ -1,3 +1,24 @@
|
|||
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.
|
||||
|
|
|
@ -39,6 +39,7 @@ exception statement from your version. */
|
|||
package gnu.java.awt.peer.gtk;
|
||||
import java.awt.peer.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
public class GtkTextComponentPeer extends GtkComponentPeer
|
||||
implements TextComponentPeer
|
||||
|
@ -51,32 +52,14 @@ public class GtkTextComponentPeer extends GtkComponentPeer
|
|||
}
|
||||
|
||||
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
|
||||
|
@ -91,4 +74,21 @@ public class GtkTextComponentPeer extends GtkComponentPeer
|
|||
{
|
||||
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 ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ exception statement from your version. */
|
|||
|
||||
|
||||
package gnu.java.awt.peer.gtk;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.peer.*;
|
||||
import java.awt.*;
|
||||
|
||||
|
@ -102,4 +103,18 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer
|
|||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -205,7 +205,7 @@ public class ActionEvent extends AWTEvent
|
|||
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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue