diff options
author | Thomas Fitzsimmons <fitzsim@redhat.com> | 2005-07-14 22:07:01 +0000 |
---|---|---|
committer | Thomas Fitzsimmons <fitzsim@redhat.com> | 2005-07-14 22:07:01 +0000 |
commit | d0d32bc1ec2dbe0aea6ae720e1de0c256d8e45e9 (patch) | |
tree | 4c52c21989847b6d58d5e1ecde82d78d5f76cc53 | |
parent | da95b185bbbfb0430e72b0a736e23d446569ced7 (diff) | |
download | classpath-d0d32bc1ec2dbe0aea6ae720e1de0c256d8e45e9.tar.gz |
2005-07-14 Thomas Fitzsimmons <fitzsim@redhat.com>
* gnu/java/awt/peer/gtk/GtkChoicePeer.java (choicePostItemEvent):
Rename to postChoiceItemEvent.
* gnu/java/awt/peer/gtk/GtkComponentPeer.java (realize): New method.
(setNativeEventMask): Likewise.
* gnu/java/awt/peer/gtk/GtkGenericPeer.java (printCurrentThread): New method.
* gnu/java/awt/peer/gtk/GtkWindowPeer.java (realize): New method.
* include/gnu_java_awt_peer_gtk_GtkComponentPeer.h: Regenerate.
* include/gnu_java_awt_peer_gtk_GtkWindowPeer.h: Likewise.
* native/jni/gtk-peer/gtkpeer.h: Move widget-specific macro,
variable and function declarations into the widget-specific file.
Add cp_gtk_ namespace prefix to external symbols.
(cp_gtk_graphics2d_init_jni): New function.
(cp_gtk_graphics_init_jni): Likewise.
(cp_gtk_button_init_jni): Likewise.
(cp_gtk_checkbox_init_jni): Likewise.
(cp_gtk_choice_init_jni): Likewise.
(cp_gtk_component_init_jni): Likewise.
(cp_gtk_list_init_jni): Likewise.
(cp_gtk_menuitem_init_jni): Likewise.
(cp_gtk_scrollbar_init_jni): Likewise.
(cp_gtk_textcomponent_init_jni): Likewise.
(cp_gtk_window_init_jni): Likewise.
(cp_gtk_component_connect_expose_signals): Likewise.
(cp_gtk_component_connect_focus_signals): Likewise.
(cp_gtk_component_connect_mouse_signals): Likewise.
(cp_gtk_component_connect_signals): Likewise.
(cp_gtk_textcomponent_connect_signals): Likewise.
(cp_gtk_print_current_thread): Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c: Remove
file. Move widget-specific functions into the widget-specific
files. Break main event handler into multiple widget-specific
callbacks.
* native/jni/gtk-peer/Makefile.am (libgtkpeer_la_SOURCES): Remove
gnu_java_awt_peer_gtk_GtkEvents.c.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c: Add
cp_gtk_ namespace prefix to external symbols. Add widget-specific
macros, variables and function declarations from
gnu_java_awt_peer_gtk_GtkEvents.c. Add widget-specific callbacks
to replace main event handling loop.
* native/jni/classpath/native_state.c: Likewise.
* native/jni/classpath/native_state.h: Likewise.
* native/jni/gtk-peer/gdkfont.h: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c: Likewise.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c: Likewise.
* native/jni/gtk-peer/gthread-jni.c: Likewise.
* native/jni/gtk-peer/gthread-jni.h: Likewise.
41 files changed, 2497 insertions, 2384 deletions
@@ -1,3 +1,76 @@ +2005-07-14 Thomas Fitzsimmons <fitzsim@redhat.com> + + * gnu/java/awt/peer/gtk/GtkChoicePeer.java (choicePostItemEvent): + Rename to postChoiceItemEvent. + * gnu/java/awt/peer/gtk/GtkComponentPeer.java (realize): New method. + (setNativeEventMask): Likewise. + * gnu/java/awt/peer/gtk/GtkGenericPeer.java (printCurrentThread): New method. + * gnu/java/awt/peer/gtk/GtkWindowPeer.java (realize): New method. + * include/gnu_java_awt_peer_gtk_GtkComponentPeer.h: Regenerate. + * include/gnu_java_awt_peer_gtk_GtkWindowPeer.h: Likewise. + * native/jni/gtk-peer/gtkpeer.h: Move widget-specific macro, + variable and function declarations into the widget-specific file. + Add cp_gtk_ namespace prefix to external symbols. + (cp_gtk_graphics2d_init_jni): New function. + (cp_gtk_graphics_init_jni): Likewise. + (cp_gtk_button_init_jni): Likewise. + (cp_gtk_checkbox_init_jni): Likewise. + (cp_gtk_choice_init_jni): Likewise. + (cp_gtk_component_init_jni): Likewise. + (cp_gtk_list_init_jni): Likewise. + (cp_gtk_menuitem_init_jni): Likewise. + (cp_gtk_scrollbar_init_jni): Likewise. + (cp_gtk_textcomponent_init_jni): Likewise. + (cp_gtk_window_init_jni): Likewise. + (cp_gtk_component_connect_expose_signals): Likewise. + (cp_gtk_component_connect_focus_signals): Likewise. + (cp_gtk_component_connect_mouse_signals): Likewise. + (cp_gtk_component_connect_signals): Likewise. + (cp_gtk_textcomponent_connect_signals): Likewise. + (cp_gtk_print_current_thread): Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c: Remove + file. Move widget-specific functions into the widget-specific + files. Break main event handler into multiple widget-specific + callbacks. + * native/jni/gtk-peer/Makefile.am (libgtkpeer_la_SOURCES): Remove + gnu_java_awt_peer_gtk_GtkEvents.c. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c: Add + cp_gtk_ namespace prefix to external symbols. Add widget-specific + macros, variables and function declarations from + gnu_java_awt_peer_gtk_GtkEvents.c. Add widget-specific callbacks + to replace main event handling loop. + * native/jni/classpath/native_state.c: Likewise. + * native/jni/classpath/native_state.h: Likewise. + * native/jni/gtk-peer/gdkfont.h: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c: Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c: Likewise. + * native/jni/gtk-peer/gthread-jni.c: Likewise. + * native/jni/gtk-peer/gthread-jni.h: Likewise. + 2005-07-14 Lillian Angel <langel@redhat.com> * javax/swing/plaf/basic/BasicTreeUI.java (paintControlIcons): Changed so root does not have control icon. @@ -62,9 +135,6 @@ 2005-07-13 Roman Kennke <roman@kennke.org> * javax/swing/BoundedRangeModel.java: -2005-07-13 Roman Kennke <roman@kennke.org> - - * javax/swing/BoundedRangeModel.java: Added/Fixed interface API documentation. * javax/swing/ButtonModel.java: Added/Fixed interface API documentation. diff --git a/gnu/java/awt/peer/gtk/GtkChoicePeer.java b/gnu/java/awt/peer/gtk/GtkChoicePeer.java index 16eedda47..5028ea779 100644 --- a/gnu/java/awt/peer/gtk/GtkChoicePeer.java +++ b/gnu/java/awt/peer/gtk/GtkChoicePeer.java @@ -120,7 +120,7 @@ public class GtkChoicePeer extends GtkComponentPeer add (item, position); } - protected void choicePostItemEvent (String label, int stateChange) + protected void postChoiceItemEvent (String label, int stateChange) { // Must set our state before notifying listeners if (stateChange == ItemEvent.SELECTED) diff --git a/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/gnu/java/awt/peer/gtk/GtkComponentPeer.java index 099b7252d..1578a9cfc 100644 --- a/gnu/java/awt/peer/gtk/GtkComponentPeer.java +++ b/gnu/java/awt/peer/gtk/GtkComponentPeer.java @@ -105,6 +105,13 @@ public class GtkComponentPeer extends GtkGenericPeer native boolean isRealized (); + void realize () + { + // Default implementation does nothing + } + + native void setNativeEventMask (); + void create () { throw new RuntimeException (); @@ -137,6 +144,10 @@ public class GtkComponentPeer extends GtkGenericPeer if (awtComponent instanceof Window || (parent != null && ! parent.isShowing ())) setParentAndBounds (); + + setNativeEventMask (); + + realize (); } void setParentAndBounds () diff --git a/gnu/java/awt/peer/gtk/GtkGenericPeer.java b/gnu/java/awt/peer/gtk/GtkGenericPeer.java index 669268e92..705eed235 100644 --- a/gnu/java/awt/peer/gtk/GtkGenericPeer.java +++ b/gnu/java/awt/peer/gtk/GtkGenericPeer.java @@ -90,4 +90,9 @@ public class GtkGenericPeer } native void gtkWidgetModifyFont (String name, int style, int size); + + static void printCurrentThread () + { + System.out.println ("gtkgenericpeer, thread: " + Thread.currentThread ()); + } } diff --git a/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/gnu/java/awt/peer/gtk/GtkWindowPeer.java index bd16f3c76..71e05a87d 100644 --- a/gnu/java/awt/peer/gtk/GtkWindowPeer.java +++ b/gnu/java/awt/peer/gtk/GtkWindowPeer.java @@ -63,6 +63,8 @@ public class GtkWindowPeer extends GtkContainerPeer native void gtkWindowSetResizable (boolean resizable); native void gtkWindowSetModal (boolean modal); + native void realize (); + int getWidth () { return awtComponent.getWidth(); diff --git a/include/gnu_java_awt_peer_gtk_GtkComponentPeer.h b/include/gnu_java_awt_peer_gtk_GtkComponentPeer.h index bc7672999..ea0e8224c 100644 --- a/include/gnu_java_awt_peer_gtk_GtkComponentPeer.h +++ b/include/gnu_java_awt_peer_gtk_GtkComponentPeer.h @@ -25,6 +25,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetP JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetRequestFocus (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetDispatchKeyEvent (JNIEnv *env, jobject, jint, jlong, jint, jint, jint); JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isRealized (JNIEnv *env, jobject); +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeEventMask (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeBounds (JNIEnv *env, jobject, jint, jint, jint, jint); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_hide (JNIEnv *env, jobject); diff --git a/include/gnu_java_awt_peer_gtk_GtkWindowPeer.h b/include/gnu_java_awt_peer_gtk_GtkWindowPeer.h index d228bc8bb..56fa79c27 100644 --- a/include/gnu_java_awt_peer_gtk_GtkWindowPeer.h +++ b/include/gnu_java_awt_peer_gtk_GtkWindowPeer.h @@ -13,6 +13,7 @@ extern "C" JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_gtkWindowSetTitle (JNIEnv *env, jobject, jstring); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_gtkWindowSetResizable (JNIEnv *env, jobject, jboolean); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_gtkWindowSetModal (JNIEnv *env, jobject, jboolean); +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_realize (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create (JNIEnv *env, jobject, jint, jboolean, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toBack (JNIEnv *env, jobject); diff --git a/native/jni/classpath/native_state.c b/native/jni/classpath/native_state.c index c99a21ee3..3c11b8343 100644 --- a/native/jni/classpath/native_state.c +++ b/native/jni/classpath/native_state.c @@ -42,7 +42,7 @@ exception statement from your version. */ #define DEFAULT_TABLE_SIZE 97 struct state_table * -init_state_table_with_size (JNIEnv * env, jclass clazz, jint size) +cp_gtk_init_state_table_with_size (JNIEnv * env, jclass clazz, jint size) { struct state_table *table; jfieldID hash; @@ -67,9 +67,9 @@ init_state_table_with_size (JNIEnv * env, jclass clazz, jint size) } struct state_table * -init_state_table (JNIEnv * env, jclass clazz) +cp_gtk_init_state_table (JNIEnv * env, jclass clazz) { - return init_state_table_with_size (env, clazz, DEFAULT_TABLE_SIZE); + return cp_gtk_init_state_table_with_size (env, clazz, DEFAULT_TABLE_SIZE); } static void * @@ -166,7 +166,7 @@ add_node (struct state_node **head, jint obj_id, void *state) } void -set_state_oid (JNIEnv * env, jobject lock, struct state_table *table, +cp_gtk_set_state_oid (JNIEnv * env, jobject lock, struct state_table *table, jint obj_id, void *state) { jint hash; @@ -179,7 +179,7 @@ set_state_oid (JNIEnv * env, jobject lock, struct state_table *table, } void * -get_state_oid (JNIEnv * env, jobject lock, struct state_table *table, +cp_gtk_get_state_oid (JNIEnv * env, jobject lock, struct state_table *table, jint obj_id) { jint hash; @@ -195,7 +195,7 @@ get_state_oid (JNIEnv * env, jobject lock, struct state_table *table, } void * -remove_state_oid (JNIEnv * env, jobject lock, struct state_table *table, +cp_gtk_remove_state_oid (JNIEnv * env, jobject lock, struct state_table *table, jint obj_id) { jint hash; @@ -211,7 +211,7 @@ remove_state_oid (JNIEnv * env, jobject lock, struct state_table *table, } int -set_state (JNIEnv * env, jobject obj, struct state_table *table, void *state) +cp_gtk_set_state (JNIEnv * env, jobject obj, struct state_table *table, void *state) { jint obj_id; obj_id = (*env)->GetIntField (env, obj, table->hash); @@ -219,12 +219,12 @@ set_state (JNIEnv * env, jobject obj, struct state_table *table, void *state) if ((*env)->ExceptionOccurred (env) != NULL) return -1; - set_state_oid (env, table->clazz, table, obj_id, state); + cp_gtk_set_state_oid (env, table->clazz, table, obj_id, state); return 0; } void * -get_state (JNIEnv * env, jobject obj, struct state_table *table) +cp_gtk_get_state (JNIEnv * env, jobject obj, struct state_table *table) { jint obj_id; obj_id = (*env)->GetIntField (env, obj, table->hash); @@ -232,11 +232,11 @@ get_state (JNIEnv * env, jobject obj, struct state_table *table) if ((*env)->ExceptionOccurred (env) != NULL) return NULL; - return get_state_oid (env, table->clazz, table, obj_id); + return cp_gtk_get_state_oid (env, table->clazz, table, obj_id); } void * -remove_state_slot (JNIEnv * env, jobject obj, struct state_table *table) +cp_gtk_remove_state_slot (JNIEnv * env, jobject obj, struct state_table *table) { jint obj_id; obj_id = (*env)->GetIntField (env, obj, table->hash); @@ -244,5 +244,5 @@ remove_state_slot (JNIEnv * env, jobject obj, struct state_table *table) if ((*env)->ExceptionOccurred (env) != NULL) return NULL; - return remove_state_oid (env, table->clazz, table, obj_id); + return cp_gtk_remove_state_oid (env, table->clazz, table, obj_id); } diff --git a/native/jni/classpath/native_state.h b/native/jni/classpath/native_state.h index 2422fd2a0..641e58882 100644 --- a/native/jni/classpath/native_state.h +++ b/native/jni/classpath/native_state.h @@ -55,17 +55,17 @@ struct state_node struct state_node *next; }; -struct state_table *init_state_table_with_size (JNIEnv *, jclass, jint); -struct state_table *init_state_table (JNIEnv *, jclass); +struct state_table *cp_gtk_init_state_table_with_size (JNIEnv *, jclass, jint); +struct state_table *cp_gtk_init_state_table (JNIEnv *, jclass); /* lowlevel api */ -void set_state_oid (JNIEnv *, jobject, struct state_table *, jint, void *); -void *get_state_oid (JNIEnv *, jobject, struct state_table *, jint); -void *remove_state_oid (JNIEnv *, jobject, struct state_table *, jint); +void cp_gtk_set_state_oid (JNIEnv *, jobject, struct state_table *, jint, void *); +void *cp_gtk_get_state_oid (JNIEnv *, jobject, struct state_table *, jint); +void *cp_gtk_remove_state_oid (JNIEnv *, jobject, struct state_table *, jint); /* highlevel api */ -int set_state (JNIEnv *, jobject, struct state_table *, void *); -void *get_state (JNIEnv *, jobject, struct state_table *); -void *remove_state_slot (JNIEnv *, jobject, struct state_table *); +int cp_gtk_set_state (JNIEnv *, jobject, struct state_table *, void *); +void *cp_gtk_get_state (JNIEnv *, jobject, struct state_table *); +void *cp_gtk_remove_state_slot (JNIEnv *, jobject, struct state_table *); #endif diff --git a/native/jni/gtk-peer/Makefile.am b/native/jni/gtk-peer/Makefile.am index dcd1d8864..f4e7bdfcc 100644 --- a/native/jni/gtk-peer/Makefile.am +++ b/native/jni/gtk-peer/Makefile.am @@ -25,7 +25,6 @@ libgtkpeer_la_SOURCES = $(gtk_cairo_c_source_files) \ gnu_java_awt_peer_gtk_GtkClipboard.c \ gnu_java_awt_peer_gtk_GtkComponentPeer.c \ gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c \ - gnu_java_awt_peer_gtk_GtkEvents.c \ gnu_java_awt_peer_gtk_GtkFileDialogPeer.c \ gnu_java_awt_peer_gtk_GtkFramePeer.c \ gnu_java_awt_peer_gtk_GtkGenericPeer.c \ diff --git a/native/jni/gtk-peer/gdkfont.h b/native/jni/gtk-peer/gdkfont.h index 1ed08582f..cf2333015 100644 --- a/native/jni/gtk-peer/gdkfont.h +++ b/native/jni/gtk-peer/gdkfont.h @@ -45,47 +45,47 @@ #include <pango/pango-fontmap.h> #include <pango/pangoft2.h> -extern struct state_table *native_font_state_table; +extern struct state_table *cp_gtk_native_font_state_table; extern struct state_table *native_glyphvector_state_table; -extern struct state_table *native_text_layout_state_table; +extern struct state_table *cp_gtk_native_text_layout_state_table; #define NSA_FONT_INIT(env, clazz) \ - native_font_state_table = init_state_table (env, clazz) + cp_gtk_native_font_state_table = cp_gtk_init_state_table (env, clazz) #define NSA_GET_FONT_PTR(env, obj) \ - get_state (env, obj, native_font_state_table) + cp_gtk_get_state (env, obj, cp_gtk_native_font_state_table) #define NSA_SET_FONT_PTR(env, obj, ptr) \ - set_state (env, obj, native_font_state_table, (void *)ptr) + cp_gtk_set_state (env, obj, cp_gtk_native_font_state_table, (void *)ptr) #define NSA_DEL_FONT_PTR(env, obj) \ - remove_state_slot (env, obj, native_font_state_table) + cp_gtk_remove_state_slot (env, obj, cp_gtk_native_font_state_table) #define NSA_GV_INIT(env, clazz) \ - native_glyphvector_state_table = init_state_table (env, clazz) + native_glyphvector_state_table = cp_gtk_init_state_table (env, clazz) #define NSA_GET_GV_PTR(env, obj) \ - get_state (env, obj, native_glyphvector_state_table) + cp_gtk_get_state (env, obj, native_glyphvector_state_table) #define NSA_SET_GV_PTR(env, obj, ptr) \ - set_state (env, obj, native_glyphvector_state_table, (void *)ptr) + cp_gtk_set_state (env, obj, native_glyphvector_state_table, (void *)ptr) #define NSA_DEL_GV_PTR(env, obj) \ - remove_state_slot (env, obj, native_glyphvector_state_table) + cp_gtk_remove_state_slot (env, obj, native_glyphvector_state_table) #define NSA_TEXT_LAYOUT_INIT(env, clazz) \ - native_text_layout_state_table = init_state_table (env, clazz) + cp_gtk_native_text_layout_state_table = cp_gtk_init_state_table (env, clazz) #define NSA_GET_TEXT_LAYOUT_PTR(env, obj) \ - get_state (env, obj, native_text_layout_state_table) + cp_gtk_get_state (env, obj, cp_gtk_native_text_layout_state_table) #define NSA_SET_TEXT_LAYOUT_PTR(env, obj, ptr) \ - set_state (env, obj, native_text_layout_state_table, (void *)ptr) + cp_gtk_set_state (env, obj, cp_gtk_native_text_layout_state_table, (void *)ptr) #define NSA_DEL_TEXT_LAYOUT_PTR(env, obj) \ - remove_state_slot (env, obj, native_text_layout_state_table) + cp_gtk_remove_state_slot (env, obj, cp_gtk_native_text_layout_state_table) #define FONT_METRICS_ASCENT 0 #define FONT_METRICS_MAX_ASCENT 1 diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c index ba5c23a0c..401d62337 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c @@ -38,7 +38,7 @@ #include "gdkfont.h" #include "gnu_java_awt_peer_gtk_GdkFontPeer.h" -struct state_table *native_font_state_table; +struct state_table *cp_gtk_native_font_state_table; enum java_awt_font_style { java_awt_font_PLAIN = 0, @@ -134,7 +134,7 @@ Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, self); g_assert (pfont != NULL); - len = (*gdk_env())->GetStringUTFLength (env, chars); + len = (*cp_gtk_gdk_env())->GetStringUTFLength (env, chars); str = (gchar *)(*env)->GetStringUTFChars (env, chars, NULL); g_assert (str != NULL); @@ -150,8 +150,12 @@ Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector if (i == NULL) { + gdk_threads_leave (); + java_extents = (*env)->NewDoubleArray (env, 0); java_codes = (*env)->NewIntArray (env, 0); + + gdk_threads_enter (); } else { @@ -173,8 +177,13 @@ Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector int x = 0; double scale = ((double) PANGO_SCALE); + gdk_threads_leave (); + java_extents = (*env)->NewDoubleArray (env, glyphs->num_glyphs * NUM_GLYPH_METRICS); java_codes = (*env)->NewIntArray (env, glyphs->num_glyphs); + + gdk_threads_enter (); + native_extents = (*env)->GetDoubleArrayElements (env, java_extents, NULL); native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL); @@ -380,8 +389,8 @@ Java_gnu_java_awt_peer_gtk_GdkFontPeer_setFont else { /* GDK uses a slightly different DPI setting. */ - pango_font_description_set_size (pfont->desc, - size * dpi_conversion_factor); + pango_font_description_set_size (pfont->desc, + size * cp_gtk_dpi_conversion_factor); if (pfont->ctx == NULL) pfont->ctx = gdk_pango_context_get(); } diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c index fe9ac8e66..9b2f16e71 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c @@ -41,11 +41,26 @@ exception statement from your version. */ #include <gdk/gdkprivate.h> #include <gdk/gdkx.h> +static jmethodID initComponentGraphicsID; + +void +cp_gtk_graphics_init_jni (void) +{ + jclass gdkgraphics; + + gdkgraphics = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), + "gnu/java/awt/peer/gtk/GdkGraphics"); + + initComponentGraphicsID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gdkgraphics, + "initComponentGraphics", + "()V"); +} + #define GDK_STABLE_IS_PIXMAP(d) (GDK_IS_PIXMAP(d)) -GdkPoint * -translate_points (JNIEnv *env, jintArray xpoints, jintArray ypoints, - jint npoints, jint x_offset, jint y_offset); +static GdkPoint *translate_points (JNIEnv *env, jintArray xpoints, + jintArray ypoints, jint npoints, + jint x_offset, jint y_offset); static void realize_cb (GtkWidget *widget, jobject jgraphics); JNIEXPORT void JNICALL @@ -108,7 +123,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_initFromImage gdk_threads_enter (); - pixmap = gnu_java_awt_peer_gtk_GtkImage_getPixmap(env, source); + pixmap = cp_gtk_image_get_pixmap (env, source); g_assert(pixmap != NULL); gdk_pixmap_ref (pixmap); @@ -441,7 +456,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_drawArc gdk_threads_leave (); } -GdkPoint * +static GdkPoint * translate_points (JNIEnv *env, jintArray xpoints, jintArray ypoints, jint npoints, jint x_offset, jint y_offset) { @@ -619,9 +634,9 @@ realize_cb (GtkWidget *widget __attribute__ ((unused)), jobject jgraphics) { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), jgraphics, initComponentGraphicsID); + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), jgraphics, initComponentGraphicsID); - NSA_DEL_GLOBAL_REF (gdk_env(), jgraphics); + NSA_DEL_GLOBAL_REF (cp_gtk_gdk_env(), jgraphics); gdk_threads_enter (); } diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c index 4176b836c..b4bd676e7 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c @@ -52,19 +52,34 @@ #include <stdio.h> #include <stdlib.h> -struct state_table *native_graphics2d_state_table; +static jmethodID initComponentGraphics2DID; + +void +cp_gtk_graphics2d_init_jni (void) +{ + jclass gdkgraphics2d; + + gdkgraphics2d = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), + "gnu/java/awt/peer/gtk/GdkGraphics2D"); + + initComponentGraphics2DID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gdkgraphics2d, + "initComponentGraphics2D", + "()V"); +} + +static struct state_table *native_graphics2d_state_table; #define NSA_G2D_INIT(env, clazz) \ - native_graphics2d_state_table = init_state_table (env, clazz) + native_graphics2d_state_table = cp_gtk_init_state_table (env, clazz) #define NSA_GET_G2D_PTR(env, obj) \ - get_state (env, obj, native_graphics2d_state_table) + cp_gtk_get_state (env, obj, native_graphics2d_state_table) #define NSA_SET_G2D_PTR(env, obj, ptr) \ - set_state (env, obj, native_graphics2d_state_table, (void *)ptr) + cp_gtk_set_state (env, obj, native_graphics2d_state_table, (void *)ptr) #define NSA_DEL_G2D_PTR(env, obj) \ - remove_state_slot (env, obj, native_graphics2d_state_table) + cp_gtk_remove_state_slot (env, obj, native_graphics2d_state_table) JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initStaticState @@ -356,7 +371,7 @@ realize_cb (GtkWidget *widget __attribute__ ((unused)), jobject peer) { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, initComponentGraphics2DID); + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, initComponentGraphics2DID); gdk_threads_enter (); } diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c index 7f1678717..648cd6603 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c @@ -48,7 +48,19 @@ #include <string.h> #include <stdlib.h> -struct state_table *native_pixbufdecoder_state_table; +static struct state_table *native_pixbufdecoder_state_table; + +#define NSA_PB_INIT(env, clazz) \ + native_pixbufdecoder_state_table = cp_gtk_init_state_table (env, clazz) + +#define NSA_GET_PB_PTR(env, obj) \ + cp_gtk_get_state (env, obj, native_pixbufdecoder_state_table) + +#define NSA_SET_PB_PTR(env, obj, ptr) \ + cp_gtk_set_state (env, obj, native_pixbufdecoder_state_table, (void *)ptr) + +#define NSA_DEL_PB_PTR(env, obj) \ + cp_gtk_remove_state_slot (env, obj, native_pixbufdecoder_state_table) /* Union used for type punning. */ union env_union @@ -130,7 +142,13 @@ area_updated_cb (GdkPixbufLoader *loader, e.jni_env = &env; (*vm)->GetEnv (vm, e.void_env, JNI_VERSION_1_1); + + gdk_threads_leave (); + jpixels = (*env)->NewIntArray (env, n_pixels); + + gdk_threads_enter (); + java_pixels = (*env)->GetIntArrayElements (env, jpixels, NULL); memcpy (java_pixels, diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c index 4868ce0bf..8c0ac6ce3 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c @@ -205,7 +205,8 @@ Java_gnu_java_awt_peer_gtk_GdkRobotPeer_keyPress display = gdk_display_get_default (); xdisplay = GDK_DISPLAY_XDISPLAY (display); - lookup_keyval = awt_keycode_to_keysym (keycode, AWT_KEY_LOCATION_LEFT); + lookup_keyval = cp_gtk_awt_keycode_to_keysym (keycode, + AWT_KEY_LOCATION_LEFT); if (!gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (), lookup_keyval, @@ -249,7 +250,8 @@ Java_gnu_java_awt_peer_gtk_GdkRobotPeer_keyRelease display = gdk_display_get_default (); xdisplay = GDK_DISPLAY_XDISPLAY (display); - lookup_keyval = awt_keycode_to_keysym (keycode, AWT_KEY_LOCATION_LEFT); + lookup_keyval = cp_gtk_awt_keycode_to_keysym (keycode, + AWT_KEY_LOCATION_LEFT); if (!gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (), lookup_keyval, @@ -309,7 +311,12 @@ Java_gnu_java_awt_peer_gtk_GdkRobotPeer_nativeGetRGBPixels n_pixels = height * stride_pixels; gdk_pixels = gdk_pixbuf_get_pixels (pixbuf); + gdk_threads_leave (); + jpixels = (*env)->NewIntArray (env, n_pixels); + + gdk_threads_enter (); + java_pixels = (*env)->GetIntArrayElements (env, jpixels, NULL); memcpy (java_pixels, diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c index 5966f8947..918ecfd0a 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c @@ -42,7 +42,7 @@ #include "gdkfont.h" #include "gnu_java_awt_peer_gtk_GdkTextLayout.h" -struct state_table *native_text_layout_state_table; +struct state_table *cp_gtk_native_text_layout_state_table; JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkTextLayout_initStaticState diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c index 827123d4d..5e8ab26c3 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c @@ -39,12 +39,24 @@ exception statement from your version. */ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkButtonPeer.h" -static gboolean focus_in_cb (GtkWidget *widget, - GdkEventFocus *event, - jobject peer); -static gboolean focus_out_cb (GtkWidget *widget, - GdkEventFocus *event, - jobject peer); +static jmethodID beginNativeRepaintID; +static jmethodID endNativeRepaintID; + +void +cp_gtk_button_init_jni (void) +{ + jclass gtkbuttonpeer; + + gtkbuttonpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), + "gnu/java/awt/peer/gtk/GtkButtonPeer"); + + beginNativeRepaintID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkbuttonpeer, + "beginNativeRepaint", + "()V"); + + endNativeRepaintID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkbuttonpeer, + "endNativeRepaint", "()V"); +} static void block_expose_event_cb (GtkWidget *widget, jobject peer); @@ -89,24 +101,16 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals button = gtk_bin_get_child (GTK_BIN (ptr)); - g_signal_connect (G_OBJECT (ptr), "event", - G_CALLBACK (pre_event_handler), *gref); - - g_signal_connect (G_OBJECT (button), "event", - G_CALLBACK (pre_event_handler), *gref); - - g_signal_connect (G_OBJECT (button), "focus-in-event", - G_CALLBACK (focus_in_cb), *gref); - - g_signal_connect (G_OBJECT (button), "focus-out-event", - G_CALLBACK (focus_out_cb), *gref); - + /* Button signals */ g_signal_connect_after (G_OBJECT (button), "pressed", G_CALLBACK (block_expose_event_cb), *gref); g_signal_connect_after (G_OBJECT (button), "released", G_CALLBACK (block_expose_event_cb), *gref); + /* Component signals */ + cp_gtk_component_connect_signals (G_OBJECT (button), gref); + gdk_threads_leave (); } @@ -154,7 +158,8 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetModifyFont label = gtk_bin_get_child (GTK_BIN (button)); font_desc = pango_font_description_from_string (font_name); - pango_font_description_set_size (font_desc, size * dpi_conversion_factor); + pango_font_description_set_size (font_desc, + size * cp_gtk_dpi_conversion_factor); if (style & AWT_STYLE_BOLD) pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); @@ -312,40 +317,12 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_setNativeBounds gdk_threads_leave (); } -static gboolean -focus_in_cb (GtkWidget *widget __attribute((unused)), - GdkEventFocus *event __attribute((unused)), - jobject peer) -{ - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postFocusEventID, - AWT_FOCUS_GAINED, - JNI_FALSE); - gdk_threads_enter (); - return FALSE; -} - -static gboolean -focus_out_cb (GtkWidget *widget __attribute((unused)), - GdkEventFocus *event __attribute((unused)), - jobject peer) -{ - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postFocusEventID, - AWT_FOCUS_LOST, - JNI_FALSE); - gdk_threads_enter (); - return FALSE; -} - static void block_expose_event_cb (GtkWidget *widget, jobject peer) { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, beginNativeRepaintID); gdk_threads_enter (); @@ -354,7 +331,7 @@ block_expose_event_cb (GtkWidget *widget, jobject peer) gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, endNativeRepaintID); gdk_threads_enter (); diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c index f06f0ddd1..cf883dd33 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c @@ -40,6 +40,21 @@ exception statement from your version. */ #include "gnu_java_awt_peer_gtk_GtkCheckboxPeer.h" #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" +static jmethodID postItemEventID; + +void +cp_gtk_checkbox_init_jni (void) +{ + jclass gtkcheckboxpeer; + + gtkcheckboxpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), + "gnu/java/awt/peer/gtk/GtkCheckboxPeer"); + + postItemEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcheckboxpeer, + "postItemEvent", + "(Ljava/lang/Object;I)V"); +} + static void item_toggled_cb (GtkToggleButton *item, jobject peer); JNIEXPORT void JNICALL @@ -83,13 +98,14 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals ptr = NSA_GET_PTR (env, obj); gref = NSA_GET_GLOBAL_REF (env, obj); + /* Checkbox signals */ g_signal_connect (G_OBJECT (ptr), "toggled", G_CALLBACK (item_toggled_cb), *gref); - gdk_threads_leave (); + /* Component signals */ + cp_gtk_component_connect_signals (G_OBJECT (ptr), gref); - /* Connect the superclass signals. */ - Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); + gdk_threads_leave (); } JNIEXPORT void JNICALL @@ -168,7 +184,8 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkWidgetModifyFont font_name = (*env)->GetStringUTFChars (env, name, NULL); font_desc = pango_font_description_from_string (font_name); - pango_font_description_set_size (font_desc, size * dpi_conversion_factor); + pango_font_description_set_size (font_desc, + size * cp_gtk_dpi_conversion_factor); if (style & AWT_STYLE_BOLD) pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); @@ -212,7 +229,7 @@ item_toggled_cb (GtkToggleButton *item, jobject peer) { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postItemEventID, peer, item->active ? diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c index fb9f5c709..ed9df5433 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c @@ -39,6 +39,21 @@ exception statement from your version. */ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkChoicePeer.h" +static jmethodID postChoiceItemEventID; + +void +cp_gtk_choice_init_jni (void) +{ + jclass gtkchoicepeer; + + gtkchoicepeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), + "gnu/java/awt/peer/gtk/GtkChoicePeer"); + + postChoiceItemEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkchoicepeer, + "postChoiceItemEvent", + "(Ljava/lang/String;I)V"); +} + static void selection_changed_cb (GtkComboBox *combobox, jobject peer); JNIEXPORT void JNICALL @@ -72,9 +87,13 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_connectSignals ptr = NSA_GET_PTR (env, obj); gref = NSA_GET_GLOBAL_REF (env, obj); + /* Choice signals */ g_signal_connect (G_OBJECT (ptr), "changed", G_CALLBACK (selection_changed_cb), *gref); + /* Component signals */ + cp_gtk_component_connect_signals (G_OBJECT (ptr), gref); + gdk_threads_leave (); } @@ -215,14 +234,14 @@ static void selection_changed_cb (GtkComboBox *combobox, jobject peer) model = gtk_combo_box_get_model (combobox); gtk_combo_box_get_active_iter (combobox, &iter); gtk_tree_model_get (model, &iter, 0, &selected, -1); - label = (*gdk_env())->NewStringUTF (gdk_env(), selected); + label = (*cp_gtk_gdk_env())->NewStringUTF (cp_gtk_gdk_env(), selected); gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - choicePostItemEventID, - label, - (jint) AWT_ITEM_SELECTED); + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, + postChoiceItemEventID, + label, + (jint) AWT_ITEM_SELECTED); gdk_threads_enter (); } diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c index cfb21f494..dea9d4cc7 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c @@ -39,16 +39,18 @@ exception statement from your version. */ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkClipboard.h" -jmethodID stringSelectionReceivedID; -jmethodID stringSelectionHandlerID; -jmethodID selectionClearID; +static jmethodID stringSelectionReceivedID; +static jmethodID stringSelectionHandlerID; +static jmethodID selectionClearID; -void selection_received_cb (GtkWidget *, GtkSelectionData *, guint, gpointer); -void selection_get_cb (GtkWidget *, GtkSelectionData *, guint, guint, gpointer); -gint selection_clear_cb (GtkWidget *, GdkEventSelection *); +static void selection_received_cb (GtkWidget *, GtkSelectionData *, + guint, gpointer); +static void selection_get_cb (GtkWidget *, GtkSelectionData *, guint, + guint, gpointer); +static gint selection_clear_cb (GtkWidget *, GdkEventSelection *); -GtkWidget *clipboard; -jobject cb_obj; +static GtkWidget *clipboard; +static jobject cb_obj; JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkClipboard_initNativeState (JNIEnv *env, @@ -77,16 +79,16 @@ Java_gnu_java_awt_peer_gtk_GtkClipboard_initNativeState (JNIEnv *env, clipboard = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT(clipboard), "selection_received", - GTK_SIGNAL_FUNC (selection_received_cb), NULL); + G_CALLBACK (selection_received_cb), NULL); g_signal_connect (G_OBJECT(clipboard), "selection_clear_event", - GTK_SIGNAL_FUNC (selection_clear_cb), NULL); + G_CALLBACK (selection_clear_cb), NULL); gtk_selection_add_target (clipboard, GDK_SELECTION_PRIMARY, GDK_TARGET_STRING, 0); g_signal_connect (G_OBJECT(clipboard), "selection_get", - GTK_SIGNAL_FUNC (selection_get_cb), NULL); + G_CALLBACK (selection_get_cb), NULL); gdk_threads_leave (); } @@ -103,7 +105,7 @@ Java_gnu_java_awt_peer_gtk_GtkClipboard_requestStringConversion gdk_threads_leave (); } -void +static void selection_received_cb (GtkWidget *widget __attribute__((unused)), GtkSelectionData *selection_data __attribute__((unused)), guint time __attribute__((unused)), @@ -115,7 +117,7 @@ selection_received_cb (GtkWidget *widget __attribute__((unused)), { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), cb_obj, stringSelectionReceivedID, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), cb_obj, stringSelectionReceivedID, NULL); gdk_threads_enter (); @@ -126,8 +128,8 @@ selection_received_cb (GtkWidget *widget __attribute__((unused)), gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), cb_obj, stringSelectionReceivedID, - (*gdk_env())->NewStringUTF (gdk_env(), str)); + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), cb_obj, stringSelectionReceivedID, + (*cp_gtk_gdk_env())->NewStringUTF (cp_gtk_gdk_env(), str)); gdk_threads_enter (); } @@ -135,7 +137,7 @@ selection_received_cb (GtkWidget *widget __attribute__((unused)), return; } -void +static void selection_get_cb (GtkWidget *widget __attribute__((unused)), GtkSelectionData *selection_data, guint info __attribute__((unused)), @@ -148,7 +150,7 @@ selection_get_cb (GtkWidget *widget __attribute__((unused)), gdk_threads_leave (); - jstr = (*gdk_env())->CallObjectMethod (gdk_env(), cb_obj, + jstr = (*cp_gtk_gdk_env())->CallObjectMethod (cp_gtk_gdk_env(), cb_obj, stringSelectionHandlerID); gdk_threads_enter (); @@ -160,13 +162,13 @@ selection_get_cb (GtkWidget *widget __attribute__((unused)), return; } - utflen = (*gdk_env())->GetStringUTFLength (gdk_env(), jstr); - utf = (*gdk_env())->GetStringUTFChars (gdk_env(), jstr, NULL); + utflen = (*cp_gtk_gdk_env())->GetStringUTFLength (cp_gtk_gdk_env(), jstr); + utf = (*cp_gtk_gdk_env())->GetStringUTFChars (cp_gtk_gdk_env(), jstr, NULL); gtk_selection_data_set (selection_data, GDK_TARGET_STRING, 8, (const unsigned char*)utf, utflen); - (*gdk_env())->ReleaseStringUTFChars (gdk_env(), jstr, utf); + (*cp_gtk_gdk_env())->ReleaseStringUTFChars (cp_gtk_gdk_env(), jstr, utf); } JNIEXPORT void JNICALL @@ -188,13 +190,13 @@ Java_gnu_java_awt_peer_gtk_GtkClipboard_selectionGet gdk_threads_leave (); } -gint +static gint selection_clear_cb (GtkWidget *widget __attribute__((unused)), GdkEventSelection *event __attribute__((unused))) { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), cb_obj, selectionClearID); + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), cb_obj, selectionClearID); gdk_threads_enter (); diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c index 1b8cdb2fd..bd9dde392 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c @@ -40,370 +40,145 @@ exception statement from your version. */ #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" #include <gtk/gtkprivate.h> -#include <gdk/gdkkeysyms.h> + +#define AWT_DEFAULT_CURSOR 0 +#define AWT_CROSSHAIR_CURSOR 1 +#define AWT_TEXT_CURSOR 2 +#define AWT_WAIT_CURSOR 3 +#define AWT_SW_RESIZE_CURSOR 4 +#define AWT_SE_RESIZE_CURSOR 5 +#define AWT_NW_RESIZE_CURSOR 6 +#define AWT_NE_RESIZE_CURSOR 7 +#define AWT_N_RESIZE_CURSOR 8 +#define AWT_S_RESIZE_CURSOR 9 +#define AWT_W_RESIZE_CURSOR 10 +#define AWT_E_RESIZE_CURSOR 11 +#define AWT_HAND_CURSOR 12 +#define AWT_MOVE_CURSOR 13 + +#define AWT_BUTTON1_DOWN_MASK (1 << 10) +#define AWT_BUTTON2_DOWN_MASK (1 << 11) +#define AWT_BUTTON3_DOWN_MASK (1 << 12) + +/* FIXME: use gtk-double-click-time, gtk-double-click-distance */ +#define MULTI_CLICK_TIME 250 +/* as opposed to a MULTI_PASS_TIME :) */ + +#define AWT_MOUSE_CLICKED 500 +#define AWT_MOUSE_PRESSED 501 +#define AWT_MOUSE_RELEASED 502 +#define AWT_MOUSE_MOVED 503 +#define AWT_MOUSE_ENTERED 504 +#define AWT_MOUSE_EXITED 505 +#define AWT_MOUSE_DRAGGED 506 + +#define AWT_FOCUS_GAINED 1004 +#define AWT_FOCUS_LOST 1005 static GtkWidget *find_fg_color_widget (GtkWidget *widget); static GtkWidget *find_bg_color_widget (GtkWidget *widget); -static gboolean focus_in_cb (GtkWidget *widget, - GdkEventFocus *event, - jobject peer); -static gboolean focus_out_cb (GtkWidget *widget, - GdkEventFocus *event, - jobject peer); -/* - * This method returns a GDK keyval that corresponds to one of the - * keysyms in the X keymap table. The return value is only used to - * determine the keyval's corresponding hardware keycode, and doesn't - * reflect an accurate translation of a Java virtual key value to a - * GDK keyval. - */ -#ifdef __GNUC__ -__inline -#endif -guint -awt_keycode_to_keysym (jint keyCode, jint keyLocation) -{ - /* GDK_A through GDK_Z */ - if (keyCode >= VK_A && keyCode <= VK_Z) - return gdk_keyval_to_lower (keyCode); +static jmethodID postMouseEventID; +static jmethodID setCursorID; +static jmethodID postExposeEventID; +static jmethodID postFocusEventID; + +void +cp_gtk_component_init_jni (void) + { + jclass gtkcomponentpeer; - /* GDK_0 through GDK_9 */ - if (keyCode >= VK_0 && keyCode <= VK_9) - return keyCode; + gtkcomponentpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), + "gnu/java/awt/peer/gtk/GtkComponentPeer"); - switch (keyCode) + postMouseEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer, + "postMouseEvent", "(IJIIIIZ)V"); + + setCursorID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer, + "setCursor", "()V"); + + postExposeEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer, + "postExposeEvent", "(IIII)V"); + + postFocusEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer, + "postFocusEvent", "(IZ)V"); +} + +static gboolean component_button_press_cb (GtkWidget *widget, + GdkEventButton *event, + jobject peer); +static gboolean component_button_release_cb (GtkWidget *widget, + GdkEventButton *event, + jobject peer); +static gboolean component_motion_notify_cb (GtkWidget *widget, + GdkEventMotion *event, + jobject peer); +static gboolean component_enter_notify_cb (GtkWidget *widget, + GdkEventCrossing *event, + jobject peer); +static gboolean component_leave_notify_cb (GtkWidget *widget, + GdkEventCrossing *event, + jobject peer); +static gboolean component_expose_cb (GtkWidget *widget, + GdkEventExpose *event, + jobject peer); +static gboolean component_focus_in_cb (GtkWidget *widget, + GdkEventFocus *event, + jobject peer); +static gboolean component_focus_out_cb (GtkWidget *widget, + GdkEventFocus *event, + jobject peer); + +static jint +button_to_awt_mods (int button) +{ + switch (button) { - case VK_ENTER: - return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Enter : GDK_Return; - case VK_BACK_SPACE: - return GDK_BackSpace; - case VK_TAB: - return GDK_Tab; - case VK_CANCEL: - return GDK_Cancel; - case VK_CLEAR: - return GDK_Clear; - case VK_SHIFT: - return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Shift_L : GDK_Shift_R; - case VK_CONTROL: - return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Control_L : GDK_Control_R; - case VK_ALT: - return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Alt_L : GDK_Alt_R; - case VK_PAUSE: - return GDK_Pause; - case VK_CAPS_LOCK: - return GDK_Caps_Lock; - case VK_ESCAPE: - return GDK_Escape; - case VK_SPACE: - return GDK_space; - case VK_PAGE_UP: - return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Page_Up : GDK_Page_Up; - case VK_PAGE_DOWN: - return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Page_Down : GDK_Page_Down; - case VK_END: - return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_End : GDK_End; - case VK_HOME: - return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Home : GDK_Home; - case VK_LEFT: - return GDK_Left; - case VK_UP: - return GDK_Up; - case VK_RIGHT: - return GDK_Right; - case VK_DOWN: - return GDK_Down; - case VK_COMMA: - return GDK_comma; - case VK_MINUS: - return GDK_minus; - case VK_PERIOD: - return GDK_period; - case VK_SLASH: - return GDK_slash; - /* - case VK_0: - case VK_1: - case VK_2: - case VK_3: - case VK_4: - case VK_5: - case VK_6: - case VK_7: - case VK_8: - case VK_9: - */ - case VK_SEMICOLON: - return GDK_semicolon; - case VK_EQUALS: - return GDK_equal; - /* - case VK_A: - case VK_B: - case VK_C: - case VK_D: - case VK_E: - case VK_F: - case VK_G: - case VK_H: - case VK_I: - case VK_J: - case VK_K: - case VK_L: - case VK_M: - case VK_N: - case VK_O: - case VK_P: - case VK_Q: - case VK_R: - case VK_S: - case VK_T: - case VK_U: - case VK_V: - case VK_W: - case VK_X: - case VK_Y: - case VK_Z: - */ - case VK_OPEN_BRACKET: - return GDK_bracketleft; - case VK_BACK_SLASH: - return GDK_backslash; - case VK_CLOSE_BRACKET: - return GDK_bracketright; - case VK_NUMPAD0: - return GDK_KP_0; - case VK_NUMPAD1: - return GDK_KP_1; - case VK_NUMPAD2: - return GDK_KP_2; - case VK_NUMPAD3: - return GDK_KP_3; - case VK_NUMPAD4: - return GDK_KP_4; - case VK_NUMPAD5: - return GDK_KP_5; - case VK_NUMPAD6: - return GDK_KP_6; - case VK_NUMPAD7: - return GDK_KP_7; - case VK_NUMPAD8: - return GDK_KP_8; - case VK_NUMPAD9: - return GDK_KP_9; - case VK_MULTIPLY: - return GDK_KP_Multiply; - case VK_ADD: - return GDK_KP_Add; - /* - case VK_SEPARATER: - */ - case VK_SEPARATOR: - return GDK_KP_Separator; - case VK_SUBTRACT: - return GDK_KP_Subtract; - case VK_DECIMAL: - return GDK_KP_Decimal; - case VK_DIVIDE: - return GDK_KP_Divide; - case VK_DELETE: - return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Delete : GDK_Delete; - case VK_NUM_LOCK: - return GDK_Num_Lock; - case VK_SCROLL_LOCK: - return GDK_Scroll_Lock; - case VK_F1: - return GDK_F1; - case VK_F2: - return GDK_F2; - case VK_F3: - return GDK_F3; - case VK_F4: - return GDK_F4; - case VK_F5: - return GDK_F5; - case VK_F6: - return GDK_F6; - case VK_F7: - return GDK_F7; - case VK_F8: - return GDK_F8; - case VK_F9: - return GDK_F9; - case VK_F10: - return GDK_F10; - case VK_F11: - return GDK_F11; - case VK_F12: - return GDK_F12; - case VK_F13: - return GDK_F13; - case VK_F14: - return GDK_F14; - case VK_F15: - return GDK_F15; - case VK_F16: - return GDK_F16; - case VK_F17: - return GDK_F17; - case VK_F18: - return GDK_F18; - case VK_F19: - return GDK_F19; - case VK_F20: - return GDK_F20; - case VK_F21: - return GDK_F21; - case VK_F22: - return GDK_F22; - case VK_F23: - return GDK_F23; - case VK_F24: - return GDK_F24; - case VK_PRINTSCREEN: - return GDK_Print; - case VK_INSERT: - return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Insert : GDK_Insert; - case VK_HELP: - return GDK_Help; - case VK_META: - return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Meta_L : GDK_Meta_R; - case VK_BACK_QUOTE: - return GDK_grave; - case VK_QUOTE: - return GDK_apostrophe; - case VK_KP_UP: - return GDK_KP_Up; - case VK_KP_DOWN: - return GDK_KP_Down; - case VK_KP_LEFT: - return GDK_KP_Left; - case VK_KP_RIGHT: - return GDK_KP_Right; - case VK_DEAD_GRAVE: - return GDK_dead_grave; - case VK_DEAD_ACUTE: - return GDK_dead_acute; - case VK_DEAD_CIRCUMFLEX: - return GDK_dead_circumflex; - case VK_DEAD_TILDE: - return GDK_dead_tilde; - case VK_DEAD_MACRON: - return GDK_dead_macron; - case VK_DEAD_BREVE: - return GDK_dead_breve; - case VK_DEAD_ABOVEDOT: - return GDK_dead_abovedot; - case VK_DEAD_DIAERESIS: - return GDK_dead_diaeresis; - case VK_DEAD_ABOVERING: - return GDK_dead_abovering; - case VK_DEAD_DOUBLEACUTE: - return GDK_dead_doubleacute; - case VK_DEAD_CARON: - return GDK_dead_caron; - case VK_DEAD_CEDILLA: - return GDK_dead_cedilla; - case VK_DEAD_OGONEK: - return GDK_dead_ogonek; - case VK_DEAD_IOTA: - return GDK_dead_iota; - case VK_DEAD_VOICED_SOUND: - return GDK_dead_voiced_sound; - case VK_DEAD_SEMIVOICED_SOUND: - return GDK_dead_semivoiced_sound; - case VK_AMPERSAND: - return GDK_ampersand; - case VK_ASTERISK: - return GDK_asterisk; - case VK_QUOTEDBL: - return GDK_quotedbl; - case VK_LESS: - return GDK_less; - case VK_GREATER: - return GDK_greater; - case VK_BRACELEFT: - return GDK_braceleft; - case VK_BRACERIGHT: - return GDK_braceright; - case VK_AT: - return GDK_at; - case VK_COLON: - return GDK_colon; - case VK_CIRCUMFLEX: - return GDK_asciicircum; - case VK_DOLLAR: - return GDK_dollar; - case VK_EURO_SIGN: - return GDK_EuroSign; - case VK_EXCLAMATION_MARK: - return GDK_exclam; - case VK_INVERTED_EXCLAMATION_MARK: - return GDK_exclamdown; - case VK_LEFT_PARENTHESIS: - return GDK_parenleft; - case VK_NUMBER_SIGN: - return GDK_numbersign; - case VK_PLUS: - return GDK_plus; - case VK_RIGHT_PARENTHESIS: - return GDK_parenright; - case VK_UNDERSCORE: - return GDK_underscore; - /* - case VK_FINAL: - case VK_CONVERT: - case VK_NONCONVERT: - case VK_ACCEPT: - */ - case VK_MODECHANGE: - return GDK_Mode_switch; - /* - case VK_KANA: - */ - case VK_KANJI: - return GDK_Kanji; - /* - case VK_ALPHANUMERIC: - */ - case VK_KATAKANA: - return GDK_Katakana; - case VK_HIRAGANA: - return GDK_Hiragana; - /* - case VK_FULL_WIDTH: - case VK_HALF_WIDTH: - case VK_ROMAN_CHARACTERS: - case VK_ALL_CANDIDATES: - */ - case VK_PREVIOUS_CANDIDATE: - return GDK_PreviousCandidate; - case VK_CODE_INPUT: - return GDK_Codeinput; - /* - case VK_JAPANESE_KATAKANA: - case VK_JAPANESE_HIRAGANA: - case VK_JAPANESE_ROMAN: - */ - case VK_KANA_LOCK: - return GDK_Kana_Lock; - /* - case VK_INPUT_METHOD_ON_OFF: - case VK_CUT: - case VK_COPY: - case VK_PASTE: - case VK_UNDO: - case VK_AGAIN: - case VK_FIND: - case VK_PROPS: - case VK_STOP: - case VK_COMPOSE: - case VK_ALT_GRAPH: - */ - default: - return GDK_VoidSymbol; + case 1: + return AWT_BUTTON1_MASK; + case 2: + return AWT_BUTTON2_MASK; + case 3: + return AWT_BUTTON3_MASK; } + + return 0; +} + +static jint +state_to_awt_mods (guint state) +{ + jint result = 0; + + if (state & GDK_SHIFT_MASK) + result |= AWT_SHIFT_DOWN_MASK; + if (state & GDK_CONTROL_MASK) + result |= AWT_CTRL_DOWN_MASK; + if (state & GDK_MOD1_MASK) + result |= AWT_ALT_DOWN_MASK; + + return result; +} + +static jint +state_to_awt_mods_with_button_states (guint state) +{ + jint result = 0; + + if (state & GDK_SHIFT_MASK) + result |= AWT_SHIFT_DOWN_MASK; + if (state & GDK_CONTROL_MASK) + result |= AWT_CTRL_DOWN_MASK; + if (state & GDK_MOD1_MASK) + result |= AWT_ALT_DOWN_MASK; + if (state & GDK_BUTTON1_MASK) + result |= AWT_BUTTON1_DOWN_MASK; + if (state & GDK_BUTTON2_MASK) + result |= AWT_BUTTON2_DOWN_MASK; + if (state & GDK_BUTTON3_MASK) + result |= AWT_BUTTON3_DOWN_MASK; + + return result; } JNIEXPORT void JNICALL @@ -619,7 +394,7 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetDispatchKeyEvent event->key.length = 0; event->key.string = NULL; - lookup_keyval = awt_keycode_to_keysym (keyCode, keyLocation); + lookup_keyval = cp_gtk_awt_keycode_to_keysym (keyCode, keyLocation); if (!gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (), lookup_keyval, @@ -827,7 +602,12 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetBackground bg = GTK_WIDGET (ptr)->style->bg[GTK_STATE_NORMAL]; + gdk_threads_leave (); + array = (*env)->NewIntArray (env, 3); + + gdk_threads_enter (); + rgb = (*env)->GetIntArrayElements (env, array, NULL); /* convert color data from 16 bit values down to 8 bit values */ rgb[0] = bg.red >> 8; @@ -855,7 +635,12 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetForeground fg = GTK_WIDGET (ptr)->style->fg[GTK_STATE_NORMAL]; + gdk_threads_leave (); + array = (*env)->NewIntArray (env, 3); + + gdk_threads_enter (); + rgb = (*env)->GetIntArrayElements (env, array, NULL); /* convert color data from 16 bit values down to 8 bit values */ rgb[0] = fg.red >> 8; @@ -1017,23 +802,39 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals { void *ptr; jobject *gref; + + gdk_threads_enter (); + ptr = NSA_GET_PTR (env, obj); gref = NSA_GET_GLOBAL_REF (env, obj); - gdk_threads_enter (); + cp_gtk_component_connect_signals (ptr, gref); - /* Connect EVENT signal, which happens _before_ any specific signal. */ - g_signal_connect (GTK_OBJECT (ptr), "event", - G_CALLBACK (pre_event_handler), *gref); + gdk_threads_leave (); +} - g_signal_connect (G_OBJECT (ptr), "focus-in-event", - G_CALLBACK (focus_in_cb), *gref); +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeEventMask + (JNIEnv *env, jobject obj) +{ + void *ptr; - g_signal_connect (G_OBJECT (ptr), "focus-out-event", - G_CALLBACK (focus_out_cb), *gref); + gdk_threads_enter (); - g_signal_connect_after (G_OBJECT (ptr), "realize", - G_CALLBACK (connect_awt_hook_cb), *gref); + ptr = NSA_GET_PTR (env, obj); + + gtk_widget_add_events (GTK_WIDGET (ptr), + GDK_POINTER_MOTION_MASK + | GDK_BUTTON_MOTION_MASK + | GDK_BUTTON_PRESS_MASK + | GDK_BUTTON_RELEASE_MASK + | GDK_KEY_PRESS_MASK + | GDK_KEY_RELEASE_MASK + | GDK_ENTER_NOTIFY_MASK + | GDK_LEAVE_NOTIFY_MASK + | GDK_STRUCTURE_MASK + | GDK_KEY_PRESS_MASK + | GDK_FOCUS_CHANGE_MASK); gdk_threads_leave (); } @@ -1065,45 +866,26 @@ find_bg_color_widget (GtkWidget *widget) return bg_color_widget; } -static gboolean -focus_in_cb (GtkWidget *widget __attribute((unused)), - GdkEventFocus *event __attribute((unused)), - jobject peer) +void +cp_gtk_component_connect_expose_signals (GObject *ptr, jobject *gref) { - gdk_threads_leave (); - - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postFocusEventID, - AWT_FOCUS_GAINED, - JNI_FALSE); - - gdk_threads_enter (); - - return FALSE; + g_signal_connect (G_OBJECT (ptr), "expose-event", + G_CALLBACK (component_expose_cb), *gref); } -static gboolean -focus_out_cb (GtkWidget *widget __attribute((unused)), - GdkEventFocus *event __attribute((unused)), - jobject peer) +void +cp_gtk_component_connect_focus_signals (GObject *ptr, jobject *gref) { - gdk_threads_leave (); - - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postFocusEventID, - AWT_FOCUS_LOST, - JNI_FALSE); - - gdk_threads_enter (); - - return FALSE; + g_signal_connect (G_OBJECT (ptr), "focus-in-event", + G_CALLBACK (component_focus_in_cb), *gref); + + g_signal_connect (G_OBJECT (ptr), "focus-out-event", + G_CALLBACK (component_focus_out_cb), *gref); } void -classpath_gtk_component_connect_nonfocus_signals (GObject *ptr __attribute__((unused)), jobject *gref __attribute__((unused))) - { - /* FIXME */ -#if 0 +cp_gtk_component_connect_mouse_signals (GObject *ptr, jobject *gref) +{ g_signal_connect (G_OBJECT (ptr), "button-press-event", G_CALLBACK (component_button_press_cb), *gref); @@ -1113,28 +895,267 @@ classpath_gtk_component_connect_nonfocus_signals (GObject *ptr __attribute__((un g_signal_connect (G_OBJECT (ptr), "enter-notify-event", G_CALLBACK (component_enter_notify_cb), *gref); - g_signal_connect (G_OBJECT (ptr), "expose-event", - G_CALLBACK (component_expose_cb), *gref); - g_signal_connect (G_OBJECT (ptr), "leave-notify-event", G_CALLBACK (component_leave_notify_cb), *gref); g_signal_connect (G_OBJECT (ptr), "motion-notify-event", G_CALLBACK (component_motion_notify_cb), *gref); -#endif } void -classpath_gtk_component_connect_signals (GObject *ptr __attribute__((unused)), jobject *gref __attribute__((unused))) +cp_gtk_component_connect_signals (GObject *ptr, jobject *gref) { - /* FIXME */ -#if 0 - classpath_gtk_component_connect_nonfocus_signals (ptr, gref); - - g_signal_connect (G_OBJECT (ptr), "focus-in-event", - G_CALLBACK (component_focus_in_cb), *gref); + cp_gtk_component_connect_expose_signals (ptr, gref); + cp_gtk_component_connect_focus_signals (ptr, gref); + cp_gtk_component_connect_mouse_signals (ptr, gref); +} + +/* These variables are used to keep track of click counts. The AWT + allows more than a triple click to occur but GTK doesn't report + more-than-triple clicks. */ +static jint click_count = 1; +static guint32 button_click_time = 0; +static GdkWindow *button_window = NULL; +static guint button_number = -1; +static int hasBeenDragged; + +static gboolean +component_button_press_cb (GtkWidget *widget __attribute__((unused)), + GdkEventButton *event, + jobject peer) +{ + /* Ignore double and triple click events. */ + if (event->type == GDK_2BUTTON_PRESS + || event->type == GDK_3BUTTON_PRESS) + return FALSE; + + if ((event->time < (button_click_time + MULTI_CLICK_TIME)) + && (event->window == button_window) + && (event->button == button_number)) + click_count++; + else + click_count = 1; + + button_click_time = event->time; + button_window = event->window; + button_number = event->button; + + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, + postMouseEventID, + AWT_MOUSE_PRESSED, + (jlong)event->time, + state_to_awt_mods (event->state) + | button_to_awt_mods (event->button), + (jint)event->x, + (jint)event->y, + click_count, + (event->button == 3) ? JNI_TRUE : + JNI_FALSE); + + gdk_threads_enter (); + + hasBeenDragged = FALSE; + + return FALSE; +} + +static gboolean +component_button_release_cb (GtkWidget *widget __attribute__((unused)), + GdkEventButton *event, + jobject peer) +{ + int width, height; + + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, + postMouseEventID, + AWT_MOUSE_RELEASED, + (jlong)event->time, + state_to_awt_mods (event->state) + | button_to_awt_mods (event->button), + (jint)event->x, + (jint)event->y, + click_count, + JNI_FALSE); + + gdk_threads_enter (); + + /* Generate an AWT click event only if the release occured in the + window it was pressed in, and the mouse has not been dragged since + the last time it was pressed. */ + gdk_window_get_size (event->window, &width, &height); + if (! hasBeenDragged + && event->x >= 0 + && event->y >= 0 + && event->x <= width + && event->y <= height) + { + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, + postMouseEventID, + AWT_MOUSE_CLICKED, + (jlong)event->time, + state_to_awt_mods (event->state) + | button_to_awt_mods (event->button), + (jint)event->x, + (jint)event->y, + click_count, + JNI_FALSE); + + gdk_threads_enter (); + } + return FALSE; +} - g_signal_connect (G_OBJECT (ptr), "focus-out-event", - G_CALLBACK (component_focus_out_cb), *gref); -#endif +static gboolean +component_motion_notify_cb (GtkWidget *widget __attribute__((unused)), + GdkEventMotion *event, + jobject peer) +{ + if (event->state & (GDK_BUTTON1_MASK + | GDK_BUTTON2_MASK + | GDK_BUTTON3_MASK + | GDK_BUTTON4_MASK + | GDK_BUTTON5_MASK)) + { + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, + postMouseEventID, + AWT_MOUSE_DRAGGED, + (jlong)event->time, + state_to_awt_mods_with_button_states (event->state), + (jint)event->x, + (jint)event->y, + 0, + JNI_FALSE); + + gdk_threads_enter (); + + hasBeenDragged = TRUE; + } + else + { + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postMouseEventID, + AWT_MOUSE_MOVED, + (jlong)event->time, + state_to_awt_mods (event->state), + (jint)event->x, + (jint)event->y, + 0, + JNI_FALSE); + + gdk_threads_enter (); + } + return FALSE; +} + +static gboolean +component_enter_notify_cb (GtkWidget *widget __attribute__((unused)), + GdkEventCrossing *event, + jobject peer) +{ + /* We are not interested in enter events that are due to + grab/ungrab and not to actually crossing boundaries */ + if (event->mode == GDK_CROSSING_NORMAL) + { + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postMouseEventID, + AWT_MOUSE_ENTERED, + (jlong)event->time, + state_to_awt_mods_with_button_states (event->state), + (jint)event->x, + (jint)event->y, + 0, + JNI_FALSE); + + gdk_threads_enter (); + } + return FALSE; +} + +static gboolean +component_leave_notify_cb (GtkWidget *widget __attribute__((unused)), + GdkEventCrossing *event, + jobject peer) +{ + /* We are not interested in leave events that are due to + grab/ungrab and not to actually crossing boundaries */ + if (event->mode == GDK_CROSSING_NORMAL) + { + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, + postMouseEventID, + AWT_MOUSE_EXITED, + (jlong)event->time, + state_to_awt_mods_with_button_states (event->state), + (jint)event->x, + (jint)event->y, + 0, + JNI_FALSE); + + gdk_threads_enter (); + } + return FALSE; +} + +static gboolean +component_expose_cb (GtkWidget *widget __attribute__((unused)), + GdkEventExpose *event, + jobject peer) +{ + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, + postExposeEventID, + (jint)event->area.x, + (jint)event->area.y, + (jint)event->area.width, + (jint)event->area.height); + + gdk_threads_enter (); + + return FALSE; +} + +static gboolean +component_focus_in_cb (GtkWidget *widget __attribute((unused)), + GdkEventFocus *event __attribute((unused)), + jobject peer) +{ + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, + postFocusEventID, + AWT_FOCUS_GAINED, + JNI_FALSE); + + gdk_threads_enter (); + + return FALSE; +} + +static gboolean +component_focus_out_cb (GtkWidget *widget __attribute((unused)), + GdkEventFocus *event __attribute((unused)), + jobject peer) +{ + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, + postFocusEventID, + AWT_FOCUS_LOST, + JNI_FALSE); + + gdk_threads_enter (); + + return FALSE; } diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c deleted file mode 100644 index c45c672fe..000000000 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c +++ /dev/null @@ -1,1176 +0,0 @@ -/* gtkevents.c -- GDK/GTK event handlers - Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU Classpath is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - - -#include "gtkpeer.h" -#include <X11/Xlib.h> -#include <gdk/gdkkeysyms.h> -#include <stdarg.h> -#include <assert.h> - -/* A widget can be composed of multipled windows, so we need to hook - events on all of them. */ -struct event_hook_info -{ - jobject *peer_obj; - int nwindows; - /* array of pointers to (GdkWindow *) */ - GdkWindow ***windows; -}; - -static jint -button_to_awt_mods (int button) -{ - switch (button) - { - case 1: - return AWT_BUTTON1_MASK; - case 2: - return AWT_BUTTON2_MASK; - case 3: - return AWT_BUTTON3_MASK; - } - - return 0; -} - -static jint -state_to_awt_mods (guint state) -{ - jint result = 0; - - if (state & GDK_SHIFT_MASK) - result |= AWT_SHIFT_DOWN_MASK; - if (state & GDK_CONTROL_MASK) - result |= AWT_CTRL_DOWN_MASK; - if (state & GDK_MOD1_MASK) - result |= AWT_ALT_DOWN_MASK; - - return result; -} - -static jint -state_to_awt_mods_with_button_states (guint state) -{ - jint result = 0; - - if (state & GDK_SHIFT_MASK) - result |= AWT_SHIFT_DOWN_MASK; - if (state & GDK_CONTROL_MASK) - result |= AWT_CTRL_DOWN_MASK; - if (state & GDK_MOD1_MASK) - result |= AWT_ALT_DOWN_MASK; - if (state & GDK_BUTTON1_MASK) - result |= AWT_BUTTON1_DOWN_MASK; - if (state & GDK_BUTTON2_MASK) - result |= AWT_BUTTON2_DOWN_MASK; - if (state & GDK_BUTTON3_MASK) - result |= AWT_BUTTON3_DOWN_MASK; - - return result; -} - -/* Modifier key events need special treatment. In Sun's peer - implementation, when a modifier key is pressed, the KEY_PRESSED - event has that modifier in its modifiers list. The corresponding - KEY_RELEASED event's modifier list does not contain the modifier. - For example, pressing and releasing the shift key will produce a - key press event with modifiers=Shift, and a key release event with - no modifiers. GDK's key events behave in the exact opposite way, - so this translation code is needed. */ -jint -keyevent_state_to_awt_mods (GdkEvent *event) -{ - jint result = 0; - guint state; - - if (event->type == GDK_KEY_PRESS) - { - state = event->key.state; - - if (event->key.keyval == GDK_Shift_L - || event->key.keyval == GDK_Shift_R) - result |= AWT_SHIFT_DOWN_MASK; - else - { - if (state & GDK_SHIFT_MASK) - result |= AWT_SHIFT_DOWN_MASK; - } - - if (event->key.keyval == GDK_Control_L - || event->key.keyval == GDK_Control_R) - result |= AWT_CTRL_DOWN_MASK; - else - { - if (state & GDK_CONTROL_MASK) - result |= AWT_CTRL_DOWN_MASK; - } - - if (event->key.keyval == GDK_Alt_L - || event->key.keyval == GDK_Alt_R) - result |= AWT_ALT_DOWN_MASK; - else - { - if (state & GDK_MOD1_MASK) - result |= AWT_ALT_DOWN_MASK; - } - } - else if (event->type == GDK_KEY_RELEASE) - { - state = event->key.state; - - if (event->key.keyval != GDK_Shift_L - && event->key.keyval != GDK_Shift_R) - { - if (state & GDK_SHIFT_MASK) - result |= AWT_SHIFT_DOWN_MASK; - } - if (event->key.keyval != GDK_Control_L - && event->key.keyval != GDK_Control_R) - { - if (state & GDK_CONTROL_MASK) - result |= AWT_CTRL_DOWN_MASK; - } - - if (event->key.keyval != GDK_Alt_L - && event->key.keyval != GDK_Alt_R) - { - if (state & GDK_MOD1_MASK) - result |= AWT_ALT_DOWN_MASK; - } - } - - return result; -} - -/* Get the first keyval in the keymap for this event's keycode. The - first keyval corresponds roughly to Java's notion of a virtual - key. Returns the uppercase version of the first keyval. */ -static guint -get_first_keyval_from_keymap (GdkEvent *event) -{ - guint keyval; - guint *keyvals; - gint n_entries; - - if (!gdk_keymap_get_entries_for_keycode (NULL, - event->key.hardware_keycode, - NULL, - &keyvals, - &n_entries)) - { - g_warning ("No keyval found for hardware keycode %d\n", - event->key.hardware_keycode); - /* Try to recover by using the keyval in the event structure. */ - keyvals = &(event->key.keyval); - } - keyval = keyvals[0]; - g_free (keyvals); - - return gdk_keyval_to_upper (keyval); -} - -#ifdef __GNUC__ -__inline -#endif -static jint -keysym_to_awt_keycode (GdkEvent *event) -{ - guint ukeyval; - guint state; - - ukeyval = get_first_keyval_from_keymap (event); - state = event->key.state; - - /* VK_A through VK_Z */ - if (ukeyval >= GDK_A && ukeyval <= GDK_Z) - return ukeyval; - - /* VK_0 through VK_9 */ - if (ukeyval >= GDK_0 && ukeyval <= GDK_9) - return ukeyval; - - switch (ukeyval) - { - case GDK_Return: - case GDK_KP_Enter: - return VK_ENTER; - case GDK_BackSpace: - return VK_BACK_SPACE; - case GDK_Tab: - return VK_TAB; - case GDK_Cancel: - return VK_CANCEL; - case GDK_Clear: - return VK_CLEAR; - case GDK_Shift_L: - case GDK_Shift_R: - return VK_SHIFT; - case GDK_Control_L: - case GDK_Control_R: - return VK_CONTROL; - case GDK_Alt_L: - case GDK_Alt_R: - return VK_ALT; - case GDK_Pause: - return VK_PAUSE; - case GDK_Caps_Lock: - return VK_CAPS_LOCK; - case GDK_Escape: - return VK_ESCAPE; - case GDK_space: - return VK_SPACE; - case GDK_KP_Page_Up: - /* For keys on the numeric keypad, the JVM produces one of two - virtual keys, depending on the num lock state. */ - if (state & GDK_MOD2_MASK) - return VK_NUMPAD9; - else - return VK_PAGE_UP; - case GDK_Page_Up: - return VK_PAGE_UP; - case GDK_KP_Page_Down: - if (state & GDK_MOD2_MASK) - return VK_NUMPAD3; - else - return VK_PAGE_DOWN; - case GDK_Page_Down: - return VK_PAGE_DOWN; - case GDK_KP_End: - if (state & GDK_MOD2_MASK) - return VK_NUMPAD1; - else - return VK_END; - case GDK_End: - return VK_END; - case GDK_KP_Home: - if (state & GDK_MOD2_MASK) - return VK_NUMPAD7; - else - return VK_HOME; - case GDK_Home: - return VK_HOME; - case GDK_KP_Begin: - if (state & GDK_MOD2_MASK) - return VK_NUMPAD5; - else - return VK_UNDEFINED; - case GDK_Left: - return VK_LEFT; - case GDK_Up: - return VK_UP; - case GDK_Right: - return VK_RIGHT; - case GDK_Down: - return VK_DOWN; - case GDK_comma: - return VK_COMMA; - case GDK_minus: - return VK_MINUS; - case GDK_period: - return VK_PERIOD; - case GDK_slash: - return VK_SLASH; - /* - return VK_0; - return VK_1; - return VK_2; - return VK_3; - return VK_4; - return VK_5; - return VK_6; - return VK_7; - return VK_8; - return VK_9; - */ - case GDK_semicolon: - return VK_SEMICOLON; - case GDK_equal: - return VK_EQUALS; - /* - return VK_A; - return VK_B; - return VK_C; - return VK_D; - return VK_E; - return VK_F; - return VK_G; - return VK_H; - return VK_I; - return VK_J; - return VK_K; - return VK_L; - return VK_M; - return VK_N; - return VK_O; - return VK_P; - return VK_Q; - return VK_R; - return VK_S; - return VK_T; - return VK_U; - return VK_V; - return VK_W; - return VK_X; - return VK_Y; - return VK_Z; - */ - case GDK_bracketleft: - return VK_OPEN_BRACKET; - case GDK_backslash: - return VK_BACK_SLASH; - case GDK_bracketright: - return VK_CLOSE_BRACKET; - case GDK_KP_0: - return VK_NUMPAD0; - case GDK_KP_1: - return VK_NUMPAD1; - case GDK_KP_2: - return VK_NUMPAD2; - case GDK_KP_3: - return VK_NUMPAD3; - case GDK_KP_4: - return VK_NUMPAD4; - case GDK_KP_5: - return VK_NUMPAD5; - case GDK_KP_6: - return VK_NUMPAD6; - case GDK_KP_7: - return VK_NUMPAD7; - case GDK_KP_8: - return VK_NUMPAD8; - case GDK_KP_9: - return VK_NUMPAD9; - case GDK_KP_Multiply: - return VK_MULTIPLY; - case GDK_KP_Add: - return VK_ADD; - /* - return VK_SEPARATER; - */ - case GDK_KP_Separator: - return VK_SEPARATOR; - case GDK_KP_Subtract: - return VK_SUBTRACT; - case GDK_KP_Decimal: - return VK_DECIMAL; - case GDK_KP_Divide: - return VK_DIVIDE; - case GDK_KP_Delete: - if (state & GDK_MOD2_MASK) - return VK_DECIMAL; - else - return VK_DELETE; - case GDK_Delete: - return VK_DELETE; - case GDK_Num_Lock: - return VK_NUM_LOCK; - case GDK_Scroll_Lock: - return VK_SCROLL_LOCK; - case GDK_F1: - return VK_F1; - case GDK_F2: - return VK_F2; - case GDK_F3: - return VK_F3; - case GDK_F4: - return VK_F4; - case GDK_F5: - return VK_F5; - case GDK_F6: - return VK_F6; - case GDK_F7: - return VK_F7; - case GDK_F8: - return VK_F8; - case GDK_F9: - return VK_F9; - case GDK_F10: - return VK_F10; - case GDK_F11: - return VK_F11; - case GDK_F12: - return VK_F12; - case GDK_F13: - return VK_F13; - case GDK_F14: - return VK_F14; - case GDK_F15: - return VK_F15; - case GDK_F16: - return VK_F16; - case GDK_F17: - return VK_F17; - case GDK_F18: - return VK_F18; - case GDK_F19: - return VK_F19; - case GDK_F20: - return VK_F20; - case GDK_F21: - return VK_F21; - case GDK_F22: - return VK_F22; - case GDK_F23: - return VK_F23; - case GDK_F24: - return VK_F24; - case GDK_Print: - return VK_PRINTSCREEN; - case GDK_KP_Insert: - if (state & GDK_MOD2_MASK) - return VK_NUMPAD0; - else - return VK_INSERT; - case GDK_Insert: - return VK_INSERT; - case GDK_Help: - return VK_HELP; - case GDK_Meta_L: - case GDK_Meta_R: - return VK_META; - case GDK_grave: - return VK_BACK_QUOTE; - case GDK_apostrophe: - return VK_QUOTE; - case GDK_KP_Up: - if (state & GDK_MOD2_MASK) - return VK_NUMPAD8; - else - return VK_KP_UP; - case GDK_KP_Down: - if (state & GDK_MOD2_MASK) - return VK_NUMPAD2; - else - return VK_KP_DOWN; - case GDK_KP_Left: - if (state & GDK_MOD2_MASK) - return VK_NUMPAD4; - else - return VK_KP_LEFT; - case GDK_KP_Right: - if (state & GDK_MOD2_MASK) - return VK_NUMPAD6; - else - return VK_KP_RIGHT; - case GDK_dead_grave: - return VK_DEAD_GRAVE; - case GDK_dead_acute: - return VK_DEAD_ACUTE; - case GDK_dead_circumflex: - return VK_DEAD_CIRCUMFLEX; - case GDK_dead_tilde: - return VK_DEAD_TILDE; - case GDK_dead_macron: - return VK_DEAD_MACRON; - case GDK_dead_breve: - return VK_DEAD_BREVE; - case GDK_dead_abovedot: - return VK_DEAD_ABOVEDOT; - case GDK_dead_diaeresis: - return VK_DEAD_DIAERESIS; - case GDK_dead_abovering: - return VK_DEAD_ABOVERING; - case GDK_dead_doubleacute: - return VK_DEAD_DOUBLEACUTE; - case GDK_dead_caron: - return VK_DEAD_CARON; - case GDK_dead_cedilla: - return VK_DEAD_CEDILLA; - case GDK_dead_ogonek: - return VK_DEAD_OGONEK; - case GDK_dead_iota: - return VK_DEAD_IOTA; - case GDK_dead_voiced_sound: - return VK_DEAD_VOICED_SOUND; - case GDK_dead_semivoiced_sound: - return VK_DEAD_SEMIVOICED_SOUND; - case GDK_ampersand: - return VK_AMPERSAND; - case GDK_asterisk: - return VK_ASTERISK; - case GDK_quotedbl: - return VK_QUOTEDBL; - case GDK_less: - return VK_LESS; - case GDK_greater: - return VK_GREATER; - case GDK_braceleft: - return VK_BRACELEFT; - case GDK_braceright: - return VK_BRACERIGHT; - case GDK_at: - return VK_AT; - case GDK_colon: - return VK_COLON; - case GDK_asciicircum: - return VK_CIRCUMFLEX; - case GDK_dollar: - return VK_DOLLAR; - case GDK_EuroSign: - return VK_EURO_SIGN; - case GDK_exclam: - return VK_EXCLAMATION_MARK; - case GDK_exclamdown: - return VK_INVERTED_EXCLAMATION_MARK; - case GDK_parenleft: - return VK_LEFT_PARENTHESIS; - case GDK_numbersign: - return VK_NUMBER_SIGN; - case GDK_plus: - return VK_PLUS; - case GDK_parenright: - return VK_RIGHT_PARENTHESIS; - case GDK_underscore: - return VK_UNDERSCORE; - /* - return VK_FINAL; - return VK_CONVERT; - return VK_NONCONVERT; - return VK_ACCEPT; - */ - case GDK_Mode_switch: - return VK_MODECHANGE; - /* - return VK_KANA; - */ - case GDK_Kanji: - return VK_KANJI; - /* - return VK_ALPHANUMERIC; - */ - case GDK_Katakana: - return VK_KATAKANA; - case GDK_Hiragana: - return VK_HIRAGANA; - /* - return VK_FULL_WIDTH; - return VK_HALF_WIDTH; - return VK_ROMAN_CHARACTERS; - return VK_ALL_CANDIDATES; - */ - case GDK_PreviousCandidate: - return VK_PREVIOUS_CANDIDATE; - case GDK_Codeinput: - return VK_CODE_INPUT; - /* - return VK_JAPANESE_KATAKANA; - return VK_JAPANESE_HIRAGANA; - return VK_JAPANESE_ROMAN; - */ - case GDK_Kana_Lock: - return VK_KANA_LOCK; - /* - return VK_INPUT_METHOD_ON_OFF; - return VK_CUT; - return VK_COPY; - return VK_PASTE; - return VK_UNDO; - return VK_AGAIN; - return VK_FIND; - return VK_PROPS; - return VK_STOP; - return VK_COMPOSE; - return VK_ALT_GRAPH; - */ - default: - return VK_UNDEFINED; - } -} - -static jint -keysym_to_awt_keylocation (GdkEvent *event) -{ - guint ukeyval; - - ukeyval = get_first_keyval_from_keymap (event); - - /* VK_A through VK_Z */ - if (ukeyval >= GDK_A && ukeyval <= GDK_Z) - return AWT_KEY_LOCATION_STANDARD; - - /* VK_0 through VK_9 */ - if (ukeyval >= GDK_0 && ukeyval <= GDK_9) - return AWT_KEY_LOCATION_STANDARD; - - switch (ukeyval) - { - case GDK_Shift_L: - case GDK_Control_L: - case GDK_Alt_L: - case GDK_Meta_L: - return AWT_KEY_LOCATION_LEFT; - - case GDK_Shift_R: - case GDK_Control_R: - case GDK_Alt_R: - case GDK_Meta_R: - return AWT_KEY_LOCATION_RIGHT; - - case GDK_Return: - case GDK_BackSpace: - case GDK_Tab: - case GDK_Cancel: - case GDK_Clear: - case GDK_Pause: - case GDK_Caps_Lock: - case GDK_Escape: - case GDK_space: - case GDK_Page_Up: - case GDK_Page_Down: - case GDK_End: - case GDK_Home: - case GDK_Left: - case GDK_Up: - case GDK_Right: - case GDK_Down: - case GDK_comma: - case GDK_minus: - case GDK_period: - case GDK_slash: - case GDK_semicolon: - case GDK_equal: - case GDK_bracketleft: - case GDK_backslash: - case GDK_bracketright: - case GDK_Delete: - case GDK_Scroll_Lock: - case GDK_F1: - case GDK_F2: - case GDK_F3: - case GDK_F4: - case GDK_F5: - case GDK_F6: - case GDK_F7: - case GDK_F8: - case GDK_F9: - case GDK_F10: - case GDK_F11: - case GDK_F12: - case GDK_F13: - case GDK_F14: - case GDK_F15: - case GDK_F16: - case GDK_F17: - case GDK_F18: - case GDK_F19: - case GDK_F20: - case GDK_F21: - case GDK_F22: - case GDK_F23: - case GDK_F24: - case GDK_Print: - case GDK_Insert: - case GDK_Help: - case GDK_grave: - case GDK_apostrophe: - case GDK_dead_grave: - case GDK_dead_acute: - case GDK_dead_circumflex: - case GDK_dead_tilde: - case GDK_dead_macron: - case GDK_dead_breve: - case GDK_dead_abovedot: - case GDK_dead_diaeresis: - case GDK_dead_abovering: - case GDK_dead_doubleacute: - case GDK_dead_caron: - case GDK_dead_cedilla: - case GDK_dead_ogonek: - case GDK_dead_iota: - case GDK_dead_voiced_sound: - case GDK_dead_semivoiced_sound: - case GDK_ampersand: - case GDK_asterisk: - case GDK_quotedbl: - case GDK_less: - case GDK_greater: - case GDK_braceleft: - case GDK_braceright: - case GDK_at: - case GDK_colon: - case GDK_asciicircum: - case GDK_dollar: - case GDK_EuroSign: - case GDK_exclam: - case GDK_exclamdown: - case GDK_parenleft: - case GDK_numbersign: - case GDK_plus: - case GDK_parenright: - case GDK_underscore: - case GDK_Mode_switch: - case GDK_Kanji: - case GDK_Katakana: - case GDK_Hiragana: - case GDK_PreviousCandidate: - case GDK_Codeinput: - case GDK_Kana_Lock: - return AWT_KEY_LOCATION_STANDARD; - - case GDK_KP_Enter: - case GDK_KP_Page_Up: - case GDK_KP_Page_Down: - case GDK_KP_End: - case GDK_KP_Home: - case GDK_KP_Begin: - case GDK_KP_0: - case GDK_KP_1: - case GDK_KP_2: - case GDK_KP_3: - case GDK_KP_4: - case GDK_KP_5: - case GDK_KP_6: - case GDK_KP_7: - case GDK_KP_8: - case GDK_KP_9: - case GDK_KP_Multiply: - case GDK_KP_Add: - case GDK_KP_Separator: - case GDK_KP_Subtract: - case GDK_KP_Decimal: - case GDK_KP_Divide: - case GDK_KP_Delete: - case GDK_Num_Lock: - case GDK_KP_Insert: - case GDK_KP_Up: - case GDK_KP_Down: - case GDK_KP_Left: - case GDK_KP_Right: - return AWT_KEY_LOCATION_NUMPAD; - - default: - return AWT_KEY_LOCATION_UNKNOWN; - } -} - -static jchar -keyevent_to_awt_keychar (GdkEvent *event) -{ - if (event->key.length > 0) - { - /* Translate GDK carriage return to Java linefeed. */ - if (event->key.string[0] == 13) - return VK_ENTER; - else - return event->key.string[0]; - } - else - { - switch (event->key.keyval) - { - case GDK_BackSpace: - return VK_BACK_SPACE; - case GDK_Tab: - return VK_TAB; - case GDK_Delete: - case GDK_KP_Delete: - return VK_DELETE; - default: - return AWT_KEY_CHAR_UNDEFINED; - } - } -} - -void -awt_event_handler (GdkEvent *event) -{ - /* keep synthetic AWT events from being processed recursively */ - if (event->type & SYNTHETIC_EVENT_MASK && event->type != GDK_NOTHING) - { - event->type ^= SYNTHETIC_EVENT_MASK; - } - - gtk_main_do_event (event); -} - -gboolean -pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) -{ - GtkWidget *event_widget; - static guint32 button_click_time = 0; - static GdkWindow *button_window = NULL; - static guint button_number = -1; - static jint click_count = 1; - static int hasBeenDragged; - union widget_union w; - - /* If it is not a focus change event, the widget must be realized already. - If not, ignore the event (Gtk+ will do the same). */ - if (!(event->type == GDK_FOCUS_CHANGE || GTK_WIDGET_REALIZED(widget))) - return FALSE; - - /* Do not handle propagated events. AWT has its own propagation rules */ - w.widget = &event_widget; - gdk_window_get_user_data (event->any.window, w.void_widget); - if (event_widget != widget) - return FALSE; - - /* We only care about input events */ - if (!(event->type == GDK_BUTTON_PRESS - || event->type == GDK_BUTTON_RELEASE - || event->type == GDK_ENTER_NOTIFY - || event->type == GDK_LEAVE_NOTIFY - || 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)) - { - return FALSE; - } - /* g_print("event %u widget %s peer %p\n", - event->type, gtk_widget_get_name (widget), peer); */ - - /* If it has no jobject associated we can send no AWT event */ - if (!peer) - return FALSE; - - /* for all input events, which have a window with a jobject attached, - send the AWT input event corresponding to the Gtk event off to Java */ - - /* keep track of clickCount ourselves, since the AWT allows more - than a triple click to occur */ - if (event->type == GDK_BUTTON_PRESS) - { - if ((event->button.time < (button_click_time + MULTI_CLICK_TIME)) - && (event->button.window == button_window) - && (event->button.button == button_number)) - click_count++; - else - click_count = 1; - - button_click_time = event->button.time; - button_window = event->button.window; - button_number = event->button.button; - } - - switch (event->type) - { - case GDK_BUTTON_PRESS: - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postMouseEventID, - AWT_MOUSE_PRESSED, - (jlong)event->button.time, - state_to_awt_mods (event->button.state) - | button_to_awt_mods (event->button.button), - (jint)event->button.x, - (jint)event->button.y, - click_count, - (event->button.button == 3) ? JNI_TRUE : - JNI_FALSE); - gdk_threads_enter (); - hasBeenDragged = FALSE; - break; - case GDK_BUTTON_RELEASE: - { - int width, height; - - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postMouseEventID, - AWT_MOUSE_RELEASED, - (jlong)event->button.time, - state_to_awt_mods (event->button.state) - | button_to_awt_mods (event->button.button), - (jint)event->button.x, - (jint)event->button.y, - click_count, - JNI_FALSE); - gdk_threads_enter (); - - /* Generate an AWT click event only if the release occured in the - window it was pressed in, and the mouse has not been dragged since - the last time it was pressed. */ - gdk_window_get_size (event->any.window, &width, &height); - if (! hasBeenDragged - && event->button.x >= 0 - && event->button.y >= 0 - && event->button.x <= width - && event->button.y <= height) - { - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postMouseEventID, - AWT_MOUSE_CLICKED, - (jlong)event->button.time, - state_to_awt_mods (event->button.state) - | button_to_awt_mods (event->button.button), - (jint)event->button.x, - (jint)event->button.y, - click_count, - JNI_FALSE); - gdk_threads_enter (); - } - } - break; - case GDK_MOTION_NOTIFY: - if (event->motion.state & (GDK_BUTTON1_MASK - | GDK_BUTTON2_MASK - | GDK_BUTTON3_MASK - | GDK_BUTTON4_MASK - | GDK_BUTTON5_MASK)) - { - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postMouseEventID, - AWT_MOUSE_DRAGGED, - (jlong)event->motion.time, - state_to_awt_mods_with_button_states (event->motion.state), - (jint)event->motion.x, - (jint)event->motion.y, - 0, - JNI_FALSE); - gdk_threads_enter (); - hasBeenDragged = TRUE; - } - else - { - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, postMouseEventID, - AWT_MOUSE_MOVED, - (jlong)event->motion.time, - state_to_awt_mods (event->motion.state), - (jint)event->motion.x, - (jint)event->motion.y, - 0, - JNI_FALSE); - gdk_threads_enter (); - } - - break; - case GDK_ENTER_NOTIFY: - /* We are not interested in enter events that are due to - grab/ungrab and not to actually crossing boundaries */ - if (event->crossing.mode == GDK_CROSSING_NORMAL) - { - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, postMouseEventID, - AWT_MOUSE_ENTERED, - (jlong)event->crossing.time, - state_to_awt_mods_with_button_states (event->crossing.state), - (jint)event->crossing.x, - (jint)event->crossing.y, - 0, - JNI_FALSE); - gdk_threads_enter (); - } - break; - case GDK_LEAVE_NOTIFY: - /* We are not interested in leave events that are due to - grab/ungrab and not to actually crossing boundaries */ - if (event->crossing.mode == GDK_CROSSING_NORMAL) - { - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postMouseEventID, - AWT_MOUSE_EXITED, - (jlong)event->crossing.time, - state_to_awt_mods_with_button_states (event->crossing.state), - (jint)event->crossing.x, - (jint)event->crossing.y, - 0, - JNI_FALSE); - gdk_threads_enter (); - } - break; - case GDK_CONFIGURE: - { - /* Only send configure events to visible top-level windows. */ - if (widget && GTK_WIDGET_TOPLEVEL (widget) - && GTK_WIDGET_VISIBLE (widget)) - { - /* Configure events are not posted to the AWT event - queue, and as such, the gdk/gtk peer functions will - be called back before postConfigureEvent - returns. */ - gdk_threads_leave (); - - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postConfigureEventID, - (jint) event->configure.x, - (jint) event->configure.y, - (jint) event->configure.width, - (jint) event->configure.height); - gdk_threads_enter (); - } - } - break; - case GDK_EXPOSE: - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postExposeEventID, - (jint)event->expose.area.x, - (jint)event->expose.area.y, - (jint)event->expose.area.width, - (jint)event->expose.area.height); - gdk_threads_enter (); - break; - - case GDK_FOCUS_CHANGE: - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postFocusEventID, - (jint) (event->focus_change.in) ? - AWT_FOCUS_GAINED : AWT_FOCUS_LOST, - JNI_FALSE); - gdk_threads_enter (); - break; - case GDK_KEY_PRESS: - if (GTK_IS_WINDOW (widget)) - { - /* GdkEventKey *keyevent = (GdkEventKey *) event; */ - /* g_printerr ("key press event: sent: %d time: %d state: %d keyval: %d length: %d string: %s hardware_keycode: %d group: %d\n", keyevent->send_event, keyevent->time, keyevent->state, keyevent->keyval, keyevent->length, keyevent->string, keyevent->hardware_keycode, keyevent->group); */ - - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postKeyEventID, - (jint) AWT_KEY_PRESSED, - (jlong) event->key.time, - keyevent_state_to_awt_mods (event), - keysym_to_awt_keycode (event), - keyevent_to_awt_keychar (event), - keysym_to_awt_keylocation (event)); - gdk_threads_enter (); - /* FIXME: generation of key typed events needs to be moved - to GtkComponentPeer.postKeyEvent. If the key in a key - press event is not an "action" key - (KeyEvent.isActionKey) and is not a modifier key, then - it should generate a key typed event. */ - return TRUE; - } - else - return FALSE; - break; - case GDK_KEY_RELEASE: - if (GTK_IS_WINDOW (widget)) - { - gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, - postKeyEventID, - (jint) AWT_KEY_RELEASED, - (jlong) event->key.time, - keyevent_state_to_awt_mods (event), - keysym_to_awt_keycode (event), - keyevent_to_awt_keychar (event), - keysym_to_awt_keylocation (event)); - gdk_threads_enter (); - return TRUE; - } - else - return FALSE; - break; - default: - break; - } - - return FALSE; -} - -static void -attach_jobject (GdkWindow *window, jobject *obj) -{ - GdkAtom addr_atom = gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE); - GdkAtom type_atom = gdk_atom_intern ("CARDINAL", FALSE); - - gdk_window_set_events (window, - gdk_window_get_events (window) - | GDK_POINTER_MOTION_MASK - | GDK_BUTTON_MOTION_MASK - | GDK_BUTTON_PRESS_MASK - | GDK_BUTTON_RELEASE_MASK - | GDK_KEY_PRESS_MASK - | GDK_KEY_RELEASE_MASK - | GDK_ENTER_NOTIFY_MASK - | GDK_LEAVE_NOTIFY_MASK - | GDK_STRUCTURE_MASK - | GDK_KEY_PRESS_MASK - | GDK_FOCUS_CHANGE_MASK); - - gdk_property_change (window, - addr_atom, - type_atom, - 8, - GDK_PROP_MODE_REPLACE, - (guchar *)obj, - sizeof (jobject)); -} - -void -connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...) -{ - va_list ap; - jobject *obj; - - obj = NSA_GET_GLOBAL_REF (env, peer_obj); - g_assert (obj); - - va_start (ap, nwindows); - { - int i; - for (i = 0; i < nwindows; i++) - { - GdkWindow* attach = (va_arg (ap, GdkWindow *)); - attach_jobject(attach, obj); - } - } - va_end (ap); -} - -/* - * Attach a Java object that is backed by widget. This callback is - * called after the widget's window has been realized. That way, we - * can be sure that widget->window is non-NULL, and so can have data - * connected to it. - */ -void connect_awt_hook_cb (GtkWidget *widget __attribute__((unused)), - jobject peer) -{ - void *ptr; - - ptr = NSA_GET_PTR (gdk_env(), peer); - - connect_awt_hook (gdk_env(), peer, 1, GTK_WIDGET (ptr)->window); - - gdk_threads_leave (); - - (*gdk_env())->CallVoidMethod (gdk_env(), peer, setCursorID); - - gdk_threads_enter (); -} diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c index d5400b318..48478d3b9 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c @@ -79,7 +79,7 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create /* We must add this window to the group so input in the others are disable while it is being shown */ - gtk_window_group_add_window (global_gtk_window_group, + gtk_window_group_add_window (cp_gtk_global_window_group, GTK_WINDOW (widget)); NSA_SET_PTR (env, obj, widget); @@ -100,11 +100,11 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectSignals gref = NSA_GET_GLOBAL_REF (env, obj); /* FileDialog signals */ - g_signal_connect (G_OBJECT (ptr), "response", - GTK_SIGNAL_FUNC (handle_response_cb), *gref); + g_signal_connect (G_OBJECT (ptr), "response", + G_CALLBACK (handle_response_cb), *gref); /* Component signals */ - classpath_gtk_component_connect_signals (G_OBJECT (ptr), gref); + cp_gtk_component_connect_signals (G_OBJECT (ptr), gref); gdk_threads_leave (); } @@ -140,15 +140,15 @@ static gboolean filenameFilterCallback (const GtkFileFilterInfo *filter_info, jstring *filename; gboolean accepted; - cx = (*gdk_env())->GetObjectClass (gdk_env(), (jobject) obj); - id = (*gdk_env())->GetMethodID (gdk_env(), cx, "filenameFilterCallback", + cx = (*cp_gtk_gdk_env())->GetObjectClass (cp_gtk_gdk_env(), (jobject) obj); + id = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), cx, "filenameFilterCallback", "(Ljava/lang/String;)Z"); - filename = (*gdk_env())->NewStringUTF(gdk_env(), filter_info->filename); + filename = (*cp_gtk_gdk_env())->NewStringUTF(cp_gtk_gdk_env(), filter_info->filename); gdk_threads_leave(); - accepted = (*gdk_env())->CallBooleanMethod(gdk_env(), obj, id, filename); + accepted = (*cp_gtk_gdk_env())->CallBooleanMethod(cp_gtk_gdk_env(), obj, id, filename); gdk_threads_enter(); @@ -236,20 +236,20 @@ handle_response_cb (GtkDialog *dialog __attribute__((unused)), && responseId != GTK_RESPONSE_CANCEL) return; - ptr = NSA_GET_PTR (gdk_env(), peer_obj); + ptr = NSA_GET_PTR (cp_gtk_gdk_env(), peer_obj); if (responseId == GTK_RESPONSE_DELETE_EVENT) { if (!isDisposeIDSet) { - jclass cx = (*gdk_env())->GetObjectClass (gdk_env(), peer_obj); - disposeID = (*gdk_env())->GetMethodID (gdk_env(), cx, "gtkDisposeFileDialog", "()V"); + jclass cx = (*cp_gtk_gdk_env())->GetObjectClass (cp_gtk_gdk_env(), peer_obj); + disposeID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), cx, "gtkDisposeFileDialog", "()V"); isDisposeIDSet = 1; } /* We can dispose of the dialog now (and unblock show) */ gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer_obj, disposeID); + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj, disposeID); gdk_threads_enter (); return; @@ -257,24 +257,24 @@ handle_response_cb (GtkDialog *dialog __attribute__((unused)), if (responseId == GTK_RESPONSE_ACCEPT) { fileName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (GTK_WIDGET (ptr))); - str_fileName = (*gdk_env())->NewStringUTF (gdk_env(), fileName); + str_fileName = (*cp_gtk_gdk_env())->NewStringUTF (cp_gtk_gdk_env(), fileName); } if (!isIDSet) { - jclass cx = (*gdk_env())->GetObjectClass (gdk_env(), peer_obj); - hideID = (*gdk_env())->GetMethodID (gdk_env(), cx, "gtkHideFileDialog", "()V"); - gtkSetFilenameID = (*gdk_env())->GetMethodID (gdk_env(), cx, + jclass cx = (*cp_gtk_gdk_env())->GetObjectClass (cp_gtk_gdk_env(), peer_obj); + hideID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), cx, "gtkHideFileDialog", "()V"); + gtkSetFilenameID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), cx, "gtkSetFilename", "(Ljava/lang/String;)V"); isIDSet = 1; } /* Set the Java object field 'file' with this value. */ gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer_obj, gtkSetFilenameID, str_fileName); + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj, gtkSetFilenameID, str_fileName); /* We can hide the dialog now (and unblock show) */ - (*gdk_env())->CallVoidMethod (gdk_env(), peer_obj, hideID); + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj, hideID); gdk_threads_enter (); } diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c index 9fb43a57b..41dfcea67 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c @@ -38,10 +38,6 @@ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkFramePeer.h" -/* lives in GtkImage.c */ -GdkPixbuf *gnu_java_awt_peer_gtk_GtkImage_getPixbuf(JNIEnv *env, jobject obj); -jboolean gnu_java_awt_peer_gtk_GtkImage_isOffScreen(JNIEnv *env, jobject obj); - JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkFramePeer_removeMenuBarPeer (JNIEnv *env, jobject obj) @@ -168,7 +164,7 @@ Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImage gdk_threads_enter (); - pixbuf = gnu_java_awt_peer_gtk_GtkImage_getPixbuf(env, gtkimage); + pixbuf = cp_gtk_image_get_pixbuf (env, gtkimage); g_assert (pixbuf != NULL); ptr = NSA_GET_PTR (env, obj); @@ -177,7 +173,7 @@ Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImage /* if the GtkImage is offscreen, this is a temporary pixbuf which should be thrown out. */ - if(gnu_java_awt_peer_gtk_GtkImage_isOffScreen(env, gtkimage) == JNI_TRUE) + if(cp_gtk_image_is_offscreen (env, gtkimage) == JNI_TRUE) gdk_pixbuf_unref (pixbuf); gdk_threads_leave (); diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c index 9a3ab9364..0fae1da42 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c @@ -82,7 +82,8 @@ Java_gnu_java_awt_peer_gtk_GtkGenericPeer_gtkWidgetModifyFont font_name = (*env)->GetStringUTFChars (env, name, NULL); font_desc = pango_font_description_from_string (font_name); - pango_font_description_set_size (font_desc, size * dpi_conversion_factor); + pango_font_description_set_size (font_desc, + size * cp_gtk_dpi_conversion_factor); if (style & AWT_STYLE_BOLD) pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c index e6c1dbe15..86cad1487 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c @@ -71,7 +71,10 @@ Java_gnu_java_awt_peer_gtk_GtkImage_loadPixbuf filename = (*env)->GetStringUTFChars (env, name, 0); if (filename == NULL) - return JNI_FALSE; + { + gdk_threads_leave (); + return JNI_FALSE; + } pixbuf = gdk_pixbuf_new_from_file (filename, NULL); if (pixbuf == NULL) @@ -108,18 +111,26 @@ Java_gnu_java_awt_peer_gtk_GtkImage_getPixels(JNIEnv *env, jobject obj) gdk_threads_enter (); - pixbuf = gnu_java_awt_peer_gtk_GtkImage_getPixbuf(env, obj); + pixbuf = cp_gtk_image_get_pixbuf (env, obj); width = gdk_pixbuf_get_width (pixbuf); height = gdk_pixbuf_get_height (pixbuf); rowstride = gdk_pixbuf_get_rowstride (pixbuf); + /* Must release the GDK lock before allocating memory through the + JVM, since some JVMs use the same lock for allocations and + finalization. Deadlock can occur on those JVMs. */ + gdk_threads_leave (); + result_array = (*env)->NewIntArray (env, (width * height)); + + gdk_threads_enter (); + dst = result_array_iter = (*env)->GetIntArrayElements (env, result_array, NULL); + pixeldata = gdk_pixbuf_get_pixels (pixbuf); - /* FIXME: handle more bit depths here? */ g_assert (gdk_pixbuf_get_bits_per_sample (pixbuf) == 8); if (gdk_pixbuf_get_has_alpha (pixbuf)) @@ -266,7 +277,7 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createScaledPixmap(JNIEnv *env, g_assert (field != 0); height = (*env)->GetIntField (env, destination, field); - pixbuf = gnu_java_awt_peer_gtk_GtkImage_getPixbuf(env, source); + pixbuf = cp_gtk_image_get_pixbuf (env, source); dst = gdk_pixbuf_scale_simple(pixbuf, width, height, @@ -457,7 +468,7 @@ Java_gnu_java_awt_peer_gtk_GtkImage_drawPixelsScaledFlipped /** * Used by GtkFramePeer */ -GdkPixbuf *gnu_java_awt_peer_gtk_GtkImage_getPixbuf(JNIEnv *env, jobject obj) +GdkPixbuf *cp_gtk_image_get_pixbuf (JNIEnv *env, jobject obj) { int width, height; GdkPixbuf *pixbuf; @@ -491,14 +502,14 @@ GdkPixbuf *gnu_java_awt_peer_gtk_GtkImage_getPixbuf(JNIEnv *env, jobject obj) /** * Used by GdkGraphics */ -GdkPixmap *gnu_java_awt_peer_gtk_GtkImage_getPixmap(JNIEnv *env, jobject obj) +GdkPixmap *cp_gtk_image_get_pixmap (JNIEnv *env, jobject obj) { if (offScreen (env, obj) == JNI_FALSE) return NULL; return (GdkPixmap *)getData (env, obj); } -jboolean gnu_java_awt_peer_gtk_GtkImage_isOffScreen(JNIEnv *env, jobject obj) +jboolean cp_gtk_image_is_offscreen (JNIEnv *env, jobject obj) { return offScreen(env, obj); } diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c index fc785d87d..7968ca773 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c @@ -84,10 +84,14 @@ Java_gnu_java_awt_peer_gtk_GtkLabelPeer_gtkWidgetModifyFont label = gtk_bin_get_child (GTK_BIN (ptr)); if (!label) - return; + { + gdk_threads_leave (); + return; + } font_desc = pango_font_description_from_string (font_name); - pango_font_description_set_size (font_desc, size * dpi_conversion_factor); + pango_font_description_set_size (font_desc, + size * cp_gtk_dpi_conversion_factor); if (style & AWT_STYLE_BOLD) pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c index c864d1283..d513176be 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c @@ -38,6 +38,21 @@ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkListPeer.h" +static jmethodID postListItemEventID; + +void +cp_gtk_list_init_jni (void) +{ + jclass gtklistpeer; + + gtklistpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), + "gnu/java/awt/peer/gtk/GtkListPeer"); + + postListItemEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtklistpeer, + "postItemEvent", + "(II)V"); +} + enum { COLUMN_STRING, @@ -133,7 +148,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals gtk_tree_selection_set_select_function (selection, item_highlighted_cb, *gref, NULL); - classpath_gtk_component_connect_signals (G_OBJECT (list), gref); + cp_gtk_component_connect_signals (G_OBJECT (list), gref); gdk_threads_leave (); } @@ -156,7 +171,8 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_gtkWidgetModifyFont font_name = (*env)->GetStringUTFChars (env, name, NULL); font_desc = pango_font_description_from_string (font_name); - pango_font_description_set_size (font_desc, size * dpi_conversion_factor); + pango_font_description_set_size (font_desc, + size * cp_gtk_dpi_conversion_factor); if (style & AWT_STYLE_BOLD) pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); @@ -407,7 +423,12 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_getSelectedIndexes { current_row = rows = gtk_tree_selection_get_selected_rows (selection, NULL); + gdk_threads_leave (); + result_array = (*env)->NewIntArray (env, count); + + gdk_threads_enter (); + result_array_iter = (*env)->GetIntArrayElements (env, result_array, NULL); for (i = 0; i < count; i++) @@ -493,19 +514,23 @@ item_highlighted_cb (GtkTreeSelection *selection __attribute__((unused)), if (!path_currently_selected) { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postListItemEventID, row, (jint) AWT_ITEM_SELECTED); + gdk_threads_enter (); } else { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postListItemEventID, row, (jint) AWT_ITEM_DESELECTED); + gdk_threads_enter (); } } diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c index 5bd4ba0a1..2746f1e4a 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c @@ -40,6 +40,22 @@ exception statement from your version. */ #include "gnu_java_awt_peer_gtk_GtkMenuItemPeer.h" #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" +static jmethodID postMenuActionEventID; + +void +cp_gtk_menuitem_init_jni (void) +{ + jclass gtkmenuitempeer; + + gtkmenuitempeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), + "gnu/java/awt/peer/gtk/GtkMenuItemPeer"); + + postMenuActionEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), + gtkmenuitempeer, + "postMenuActionEvent", + "()V"); +} + static void item_activate_cb (GtkMenuItem *item __attribute__((unused)), jobject peer_obj); @@ -109,7 +125,8 @@ Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_gtkWidgetModifyFont if (label) { font_desc = pango_font_description_from_string (font_name); - pango_font_description_set_size (font_desc, size * dpi_conversion_factor); + pango_font_description_set_size (font_desc, + size * cp_gtk_dpi_conversion_factor); if (style & AWT_STYLE_BOLD) pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); @@ -170,7 +187,7 @@ static void item_activate_cb (GtkMenuItem *item __attribute__((unused)), jobject peer_obj) { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer_obj, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj, postMenuActionEventID); gdk_threads_enter (); } diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c index e86acfc1d..16018f001 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c @@ -95,7 +95,7 @@ Java_gnu_java_awt_peer_gtk_GtkMenuPeer_create toplevel = gtk_widget_get_toplevel (menu); if (GTK_IS_WINDOW (toplevel)) { - gtk_window_group_add_window (global_gtk_window_group, + gtk_window_group_add_window (cp_gtk_global_window_group, GTK_WINDOW(toplevel)); } diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c index 934dde1ed..8a130e1a4 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c @@ -88,7 +88,9 @@ Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals g_signal_connect (G_OBJECT (ptr), "focus-out-event", G_CALLBACK (panel_focus_out_cb), *gref); - classpath_gtk_component_connect_nonfocus_signals (G_OBJECT (ptr), gref); + /* Component signals. Exclude focus signals. */ + cp_gtk_component_connect_expose_signals (ptr, gref); + cp_gtk_component_connect_mouse_signals (ptr, gref); gdk_threads_leave (); } @@ -108,4 +110,3 @@ panel_focus_out_cb (GtkWidget * widget __attribute__((unused)), { return TRUE; } - diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c index 6ecfb8166..1445cec55 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c @@ -39,6 +39,10 @@ exception statement from your version. */ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkScrollPanePeer.h" +#define AWT_SCROLLPANE_SCROLLBARS_AS_NEEDED 0 +#define AWT_SCROLLPANE_SCROLLBARS_ALWAYS 1 +#define AWT_SCROLLPANE_SCROLLBARS_NEVER 2 + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_create (JNIEnv *env, jobject obj, int width, int height) diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c index 4ca048502..396862710 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c @@ -41,14 +41,36 @@ exception statement from your version. */ #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" #include "gnu_java_awt_peer_gtk_GtkScrollbarPeer.h" +#define AWT_ADJUSTMENT_UNIT_INCREMENT 1 +#define AWT_ADJUSTMENT_UNIT_DECREMENT 2 +#define AWT_ADJUSTMENT_BLOCK_DECREMENT 3 +#define AWT_ADJUSTMENT_BLOCK_INCREMENT 4 +#define AWT_ADJUSTMENT_TRACK 5 + +static jmethodID postAdjustmentEventID; + +void +cp_gtk_scrollbar_init_jni (void) +{ + jclass gtkscrollbarpeer; + + gtkscrollbarpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), + "gnu/java/awt/peer/gtk/GtkScrollbarPeer"); + + postAdjustmentEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), + gtkscrollbarpeer, + "postAdjustmentEvent", + "(II)V"); +} + #if GTK_MINOR_VERSION > 4 static gboolean slider_moved_cb (GtkRange *range, GtkScrollType scroll, gdouble value, jobject obj); #else -static void post_change_event (GtkRange *range, - jobject peer); +static void post_change_event_cb (GtkRange *range, + jobject peer); #endif JNIEXPORT void JNICALL @@ -97,18 +119,19 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals gdk_threads_enter (); + /* Scrollbar signals */ #if GTK_MINOR_VERSION > 4 g_signal_connect (G_OBJECT (ptr), "change-value", - GTK_SIGNAL_FUNC (slider_moved_cb), *gref); + G_CALLBACK (slider_moved_cb), *gref); #else g_signal_connect (G_OBJECT (ptr), "value-changed", - G_CALLBACK (post_change_event), *gref); + G_CALLBACK (post_change_event_cb), *gref); #endif - gdk_threads_leave (); + /* Component signals */ + cp_gtk_component_connect_signals (G_OBJECT (ptr), gref); - /* Connect the superclass signals. */ - Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); + gdk_threads_leave (); } JNIEXPORT void JNICALL @@ -195,28 +218,28 @@ slider_moved_cb (GtkRange *range, switch (scroll) { case GTK_SCROLL_STEP_BACKWARD: - (*gdk_env())->CallVoidMethod (gdk_env(), obj, postAdjustmentEventID, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), obj, postAdjustmentEventID, AWT_ADJUSTMENT_UNIT_DECREMENT, (jint) value); break; case GTK_SCROLL_STEP_FORWARD: - (*gdk_env())->CallVoidMethod (gdk_env(), obj, postAdjustmentEventID, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), obj, postAdjustmentEventID, AWT_ADJUSTMENT_UNIT_INCREMENT, (jint) value); break; case GTK_SCROLL_PAGE_BACKWARD: - (*gdk_env())->CallVoidMethod (gdk_env(), obj, postAdjustmentEventID, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), obj, postAdjustmentEventID, AWT_ADJUSTMENT_BLOCK_DECREMENT, (jint) value); break; case GTK_SCROLL_PAGE_FORWARD: - (*gdk_env())->CallVoidMethod (gdk_env(), obj, postAdjustmentEventID, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), obj, postAdjustmentEventID, AWT_ADJUSTMENT_BLOCK_INCREMENT, (jint) value); break; default: /* GTK_SCROLL_JUMP: */ - (*gdk_env())->CallVoidMethod (gdk_env(), obj, postAdjustmentEventID, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), obj, postAdjustmentEventID, AWT_ADJUSTMENT_TRACK, (jint) value); break; @@ -225,11 +248,11 @@ slider_moved_cb (GtkRange *range, } #else static void -post_change_event (GtkRange *range, jobject peer) +post_change_event_cb (GtkRange *range, jobject peer) { GtkAdjustment *adj; adj = gtk_range_get_adjustment (range); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, postAdjustmentEventID, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postAdjustmentEventID, AWT_ADJUSTMENT_TRACK, (jint) adj->value); } #endif diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c index 4e34a367d..9af88a026 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c @@ -39,6 +39,10 @@ exception statement from your version. */ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkTextAreaPeer.h" +#define AWT_TEXTAREA_SCROLLBARS_BOTH 0 +#define AWT_TEXTAREA_SCROLLBARS_VERTICAL_ONLY 1 +#define AWT_TEXTAREA_SCROLLBARS_HORIZONTAL_ONLY 2 + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create (JNIEnv *env, jobject obj, @@ -100,10 +104,10 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_connectSignals buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text)); /* TextComponent signals */ - classpath_gtk_textcomponent_connect_signals (G_OBJECT (buf), gref); + cp_gtk_textcomponent_connect_signals (G_OBJECT (buf), gref); /* Component signals */ - classpath_gtk_component_connect_signals (G_OBJECT (text), gref); + cp_gtk_component_connect_signals (G_OBJECT (text), gref); gdk_threads_leave (); } @@ -186,7 +190,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkWidgetModifyFont font_desc = pango_font_description_from_string (font_name); pango_font_description_set_size (font_desc, - size * dpi_conversion_factor); + size * cp_gtk_dpi_conversion_factor); if (style & AWT_STYLE_BOLD) pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c index 810bcd10c..eb658339d 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c @@ -45,15 +45,17 @@ exception statement from your version. */ #define BB_GREEN 26985 #define BB_BLUE 31611 +static jmethodID postTextEventID; + void -classpath_gtk_textcomponent_init_jni (void) +cp_gtk_textcomponent_init_jni (void) { jclass gtkcomponentpeer; - gtkcomponentpeer = (*gdk_env())->FindClass (gdk_env(), + gtkcomponentpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), "gnu/java/awt/peer/gtk/GtkComponentPeer"); - postTextEventID = (*gdk_env())->GetMethodID (gdk_env(), gtkcomponentpeer, + postTextEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer, "postTextEvent", "()V"); } @@ -95,10 +97,10 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_connectSignals gref = NSA_GET_GLOBAL_REF (env, obj); /* TextComponent signals */ - classpath_gtk_textcomponent_connect_signals (G_OBJECT (ptr), gref); + cp_gtk_textcomponent_connect_signals (G_OBJECT (ptr), gref); /* Component signals */ - classpath_gtk_component_connect_signals (G_OBJECT (ptr), gref); + cp_gtk_component_connect_signals (G_OBJECT (ptr), gref); gdk_threads_leave (); } @@ -238,7 +240,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetModifyFont font_desc = pango_font_description_from_string (font_name); pango_font_description_set_size (font_desc, - size * dpi_conversion_factor); + size * cp_gtk_dpi_conversion_factor); if (style & AWT_STYLE_BOLD) pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); @@ -405,7 +407,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setText } void -classpath_gtk_textcomponent_connect_signals (GObject *ptr, jobject *gref) +cp_gtk_textcomponent_connect_signals (GObject *ptr, jobject *gref) { g_signal_connect (G_OBJECT(ptr), "changed", G_CALLBACK (textcomponent_changed_cb), *gref); @@ -416,6 +418,6 @@ textcomponent_changed_cb (GtkEditable *editable __attribute__((unused)), jobject peer) { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, postTextEventID); + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postTextEventID); gdk_threads_enter (); } diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c index 605e9d52e..a8e1957ee 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c @@ -43,40 +43,43 @@ exception statement from your version. */ #include <sys/time.h> -#ifdef JVM_SUN - struct state_table *native_state_table; - struct state_table *native_global_ref_table; -#endif - -jmethodID setBoundsCallbackID; - -jmethodID postActionEventID; -jmethodID postMenuActionEventID; -jmethodID postMouseEventID; -jmethodID postConfigureEventID; -jmethodID postExposeEventID; -jmethodID postKeyEventID; -jmethodID postFocusEventID; -jmethodID postAdjustmentEventID; -jmethodID postItemEventID; -jmethodID choicePostItemEventID; -jmethodID postListItemEventID; -jmethodID postTextEventID; -jmethodID postWindowEventID; -jmethodID postInsetsChangedEventID; -jmethodID windowGetWidthID; -jmethodID windowGetHeightID; - -jmethodID beginNativeRepaintID; -jmethodID endNativeRepaintID; - -jmethodID initComponentGraphicsID; -#ifdef GTK_CAIRO -jmethodID initComponentGraphics2DID; -#endif -jmethodID setCursorID; - -JavaVM *java_vm; +#define RC_FILE ".classpath-gtkrc" + +/* From java.awt.SystemColor */ +#define AWT_DESKTOP 0 +#define AWT_ACTIVE_CAPTION 1 +#define AWT_ACTIVE_CAPTION_TEXT 2 +#define AWT_ACTIVE_CAPTION_BORDER 3 +#define AWT_INACTIVE_CAPTION 4 +#define AWT_INACTIVE_CAPTION_TEXT 5 +#define AWT_INACTIVE_CAPTION_BORDER 6 +#define AWT_WINDOW 7 +#define AWT_WINDOW_BORDER 8 +#define AWT_WINDOW_TEXT 9 +#define AWT_MENU 10 +#define AWT_MENU_TEXT 11 +#define AWT_TEXT 12 +#define AWT_TEXT_TEXT 13 +#define AWT_TEXT_HIGHLIGHT 14 +#define AWT_TEXT_HIGHLIGHT_TEXT 15 +#define AWT_TEXT_INACTIVE_TEXT 16 +#define AWT_CONTROL 17 +#define AWT_CONTROL_TEXT 18 +#define AWT_CONTROL_HIGHLIGHT 19 +#define AWT_CONTROL_LT_HIGHLIGHT 20 +#define AWT_CONTROL_SHADOW 21 +#define AWT_CONTROL_DK_SHADOW 22 +#define AWT_SCROLLBAR 23 +#define AWT_INFO 24 +#define AWT_INFO_TEXT 25 +#define AWT_NUM_COLORS 26 + +struct state_table *cp_gtk_native_state_table; +struct state_table *cp_gtk_native_global_ref_table; + +static jclass gtkgenericpeer; +static JavaVM *java_vm; +static jmethodID printCurrentThreadID; union env_union { @@ -85,7 +88,7 @@ union env_union }; JNIEnv * -gdk_env() +cp_gtk_gdk_env() { union env_union tmp; g_assert((*java_vm)->GetEnv(java_vm, &tmp.void_env, JNI_VERSION_1_2) == JNI_OK); @@ -93,12 +96,11 @@ gdk_env() } -GtkWindowGroup *global_gtk_window_group; +GtkWindowGroup *cp_gtk_global_window_group; +double cp_gtk_dpi_conversion_factor; static void init_glib_threads(JNIEnv *, jint); -double dpi_conversion_factor; - static void init_dpi_conversion_factor (void); static void dpi_changed_cb (GtkSettings *settings, GParamSpec *pspec); @@ -132,29 +134,20 @@ Java_gnu_java_awt_peer_gtk_GtkToolkit_gtkInit (JNIEnv *env, char **argv; char *homedir, *rcpath = NULL; - jclass gtkgenericpeer, gtkcomponentpeer, gtkchoicepeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer, - gtkmenuitempeer, window, gdkgraphics; -#ifdef GTK_CAIRO - jclass gdkgraphics2d; -#endif - gtkgenericpeer = (*env)->FindClass(env, "gnu/java/awt/peer/gtk/GtkGenericPeer"); + printCurrentThreadID = (*env)->GetStaticMethodID (env, gtkgenericpeer, + "printCurrentThread", "()V"); + NSA_INIT (env, gtkgenericpeer); g_assert((*env)->GetJavaVM(env, &java_vm) == 0); /* GTK requires a program's argc and argv variables, and requires that they - be valid. Set it up. */ + be valid. Set it up. */ argv = (char **) g_malloc (sizeof (char *) * 2); argv[0] = (char *) g_malloc(1); -#if 1 - strcpy(argv[0], ""); -#else /* The following is a more efficient alternative, but less intuitively - * expresses what we are trying to do. This code is only run once, so - * I'm going for intuitive. */ argv[0][0] = '\0'; -#endif argv[1] = NULL; init_glib_threads(env, portableNativeSync); @@ -172,8 +165,6 @@ Java_gnu_java_awt_peer_gtk_GtkToolkit_gtkInit (JNIEnv *env, we're shutting down. */ atexit (gdk_threads_enter); - gdk_event_handler_set ((GdkEventFunc)awt_event_handler, NULL, NULL); - if ((homedir = getenv ("HOME"))) { rcpath = (char *) g_malloc (strlen (homedir) + strlen (RC_FILE) + 2); @@ -191,87 +182,21 @@ Java_gnu_java_awt_peer_gtk_GtkToolkit_gtkInit (JNIEnv *env, old_glog_func = g_log_set_default_handler (&glog_func, NULL); #endif - /* setup cached IDs for posting GTK events to Java */ - - window = (*env)->FindClass (env, "java/awt/Window"); - - gtkcomponentpeer = (*env)->FindClass (env, - "gnu/java/awt/peer/gtk/GtkComponentPeer"); - gtkchoicepeer = (*env)->FindClass (env, - "gnu/java/awt/peer/gtk/GtkChoicePeer"); - gtkwindowpeer = (*env)->FindClass (env, - "gnu/java/awt/peer/gtk/GtkWindowPeer"); - gtkscrollbarpeer = (*env)->FindClass (env, - "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"); - gdkgraphics = (*env)->FindClass (env, - "gnu/java/awt/peer/gtk/GdkGraphics"); -#ifdef GTK_CAIRO - gdkgraphics2d = (*env)->FindClass (env, - "gnu/java/awt/peer/gtk/GdkGraphics2D"); +#if GTK_CAIRO + cp_gtk_graphics2d_init_jni (); #endif - setBoundsCallbackID = (*env)->GetMethodID (env, window, - "setBoundsCallback", - "(IIII)V"); - - postMenuActionEventID = (*env)->GetMethodID (env, gtkmenuitempeer, - "postMenuActionEvent", - "()V"); - postMouseEventID = (*env)->GetMethodID (env, gtkcomponentpeer, - "postMouseEvent", "(IJIIIIZ)V"); - setCursorID = (*env)->GetMethodID (env, gtkcomponentpeer, - "setCursor", "()V"); - beginNativeRepaintID = (*env)->GetMethodID (env, gtkcomponentpeer, - "beginNativeRepaint", "()V"); - - endNativeRepaintID = (*env)->GetMethodID (env, gtkcomponentpeer, - "endNativeRepaint", "()V"); - - postConfigureEventID = (*env)->GetMethodID (env, gtkwindowpeer, - "postConfigureEvent", "(IIII)V"); - postWindowEventID = (*env)->GetMethodID (env, gtkwindowpeer, - "postWindowEvent", - "(ILjava/awt/Window;I)V"); - postInsetsChangedEventID = (*env)->GetMethodID (env, gtkwindowpeer, - "postInsetsChangedEvent", - "(IIII)V"); - windowGetWidthID = (*env)->GetMethodID (env, gtkwindowpeer, - "getWidth", "()I"); - windowGetHeightID = (*env)->GetMethodID (env, gtkwindowpeer, - "getHeight", "()I"); - - postExposeEventID = (*env)->GetMethodID (env, gtkcomponentpeer, - "postExposeEvent", "(IIII)V"); - postKeyEventID = (*env)->GetMethodID (env, gtkcomponentpeer, - "postKeyEvent", "(IJIICI)V"); - postFocusEventID = (*env)->GetMethodID (env, gtkcomponentpeer, - "postFocusEvent", "(IZ)V"); - postAdjustmentEventID = (*env)->GetMethodID (env, gtkscrollbarpeer, - "postAdjustmentEvent", - "(II)V"); - postItemEventID = (*env)->GetMethodID (env, gtkcomponentpeer, - "postItemEvent", - "(Ljava/lang/Object;I)V"); - choicePostItemEventID = (*env)->GetMethodID (env, gtkchoicepeer, - "choicePostItemEvent", - "(Ljava/lang/String;I)V"); - postListItemEventID = (*env)->GetMethodID (env, gtklistpeer, - "postItemEvent", - "(II)V"); - postTextEventID = (*env)->GetMethodID (env, gtkcomponentpeer, - "postTextEvent", - "()V"); - initComponentGraphicsID = (*env)->GetMethodID (env, gdkgraphics, - "initComponentGraphics", - "()V"); -#ifdef GTK_CAIRO - initComponentGraphics2DID = (*env)->GetMethodID (env, gdkgraphics2d, - "initComponentGraphics2D", - "()V"); -#endif - global_gtk_window_group = gtk_window_group_new (); + cp_gtk_graphics_init_jni (); + cp_gtk_button_init_jni (); + cp_gtk_checkbox_init_jni (); + cp_gtk_choice_init_jni (); + cp_gtk_component_init_jni (); + cp_gtk_list_init_jni (); + cp_gtk_menuitem_init_jni (); + cp_gtk_scrollbar_init_jni (); + cp_gtk_textcomponent_init_jni (); + cp_gtk_window_init_jni (); + + cp_gtk_global_window_group = gtk_window_group_new (); init_dpi_conversion_factor (); } @@ -295,11 +220,11 @@ init_glib_threads(JNIEnv *env, jint portableNativeSync) #endif } - (*env)->GetJavaVM( env, &the_vm ); + (*env)->GetJavaVM( env, &cp_gtk_the_vm ); if (!g_thread_supported ()) { if (portableNativeSync) - g_thread_init ( &portable_native_sync_jni_functions ); + g_thread_init ( &cp_gtk_portable_native_sync_jni_functions ); else g_thread_init ( NULL ); } @@ -317,6 +242,11 @@ init_glib_threads(JNIEnv *env, jint portableNativeSync) /* printf("called gthread init\n"); */ } +void +cp_gtk_print_current_thread (void) +{ + (*cp_gtk_gdk_env())->CallStaticVoidMethod (cp_gtk_gdk_env(), gtkgenericpeer, printCurrentThreadID); +} /* This is a big hack, needed until this pango bug is resolved: http://bugzilla.gnome.org/show_bug.cgi?id=119081. @@ -336,16 +266,17 @@ init_dpi_conversion_factor () /* If int_dpi == -1 gtk-xft-dpi returns the default value. So we have to do approximate calculation here. */ if (int_dpi < 0) - dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.; + cp_gtk_dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.; else - dpi_conversion_factor = PANGO_SCALE * 72.0 / (int_dpi / PANGO_SCALE); + cp_gtk_dpi_conversion_factor = + PANGO_SCALE * 72.0 / (int_dpi / PANGO_SCALE); g_signal_connect (settings, "notify::gtk-xft-dpi", G_CALLBACK (dpi_changed_cb), NULL); } else /* Approximate. */ - dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.; + cp_gtk_dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.; } static void @@ -355,9 +286,10 @@ dpi_changed_cb (GtkSettings *settings, int int_dpi; g_object_get (settings, "gtk-xft-dpi", &int_dpi, NULL); if (int_dpi < 0) - dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.; + cp_gtk_dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.; else - dpi_conversion_factor = PANGO_SCALE * 72.0 / (int_dpi / PANGO_SCALE); + cp_gtk_dpi_conversion_factor = + PANGO_SCALE * 72.0 / (int_dpi / PANGO_SCALE); } static int @@ -386,7 +318,7 @@ glog_func (const gchar *log_domain, | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING)) { - JNIEnv *env = gdk_env (); + JNIEnv *env = cp_gtk_gdk_env (); jthrowable *exc = (*env)->ExceptionOccurred(env); gchar *detail = g_strconcat (log_domain, ": ", message, NULL); JCL_ThrowException (env, "java/lang/InternalError", detail); diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c index d5681f585..650d9b603 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c @@ -41,6 +41,971 @@ exception statement from your version. */ #include <gdk/gdkprivate.h> #include <gdk/gdkx.h> #include <X11/Xatom.h> +#include <gdk/gdkkeysyms.h> + +#define AWT_WINDOW_OPENED 200 +#define AWT_WINDOW_CLOSING 201 +#define AWT_WINDOW_CLOSED 202 +#define AWT_WINDOW_ICONIFIED 203 +#define AWT_WINDOW_DEICONIFIED 204 +#define AWT_WINDOW_ACTIVATED 205 +#define AWT_WINDOW_DEACTIVATED 206 +#define AWT_WINDOW_GAINED_FOCUS 207 +#define AWT_WINDOW_LOST_FOCUS 208 +#define AWT_WINDOW_STATE_CHANGED 209 + +/* Virtual Keys */ +/* This list should be kept in the same order as the VK_ field + declarations in KeyEvent.java. */ +#define VK_ENTER '\n' +#define VK_BACK_SPACE '\b' +#define VK_TAB '\t' +#define VK_CANCEL 3 +#define VK_CLEAR 12 +#define VK_SHIFT 16 +#define VK_CONTROL 17 +#define VK_ALT 18 +#define VK_PAUSE 19 +#define VK_CAPS_LOCK 20 +#define VK_ESCAPE 27 +#define VK_SPACE ' ' +#define VK_PAGE_UP 33 +#define VK_PAGE_DOWN 34 +#define VK_END 35 +#define VK_HOME 36 +#define VK_LEFT 37 +#define VK_UP 38 +#define VK_RIGHT 39 +#define VK_DOWN 40 +#define VK_COMMA ',' +#define VK_MINUS '-' +#define VK_PERIOD '.' +#define VK_SLASH '/' +#define VK_0 '0' +#define VK_1 '1' +#define VK_2 '2' +#define VK_3 '3' +#define VK_4 '4' +#define VK_5 '5' +#define VK_6 '6' +#define VK_7 '7' +#define VK_8 '8' +#define VK_9 '9' +#define VK_SEMICOLON ';' +#define VK_EQUALS '=' +#define VK_A 'A' +#define VK_B 'B' +#define VK_C 'C' +#define VK_D 'D' +#define VK_E 'E' +#define VK_F 'F' +#define VK_G 'G' +#define VK_H 'H' +#define VK_I 'I' +#define VK_J 'J' +#define VK_K 'K' +#define VK_L 'L' +#define VK_M 'M' +#define VK_N 'N' +#define VK_O 'O' +#define VK_P 'P' +#define VK_Q 'Q' +#define VK_R 'R' +#define VK_S 'S' +#define VK_T 'T' +#define VK_U 'U' +#define VK_V 'V' +#define VK_W 'W' +#define VK_X 'X' +#define VK_Y 'Y' +#define VK_Z 'Z' +#define VK_OPEN_BRACKET '[' +#define VK_BACK_SLASH '\\' +#define VK_CLOSE_BRACKET ']' +/* See gtkpeer.h */ +/* #define VK_NUMPAD0 96 */ +/* #define VK_NUMPAD1 97 */ +/* #define VK_NUMPAD2 98 */ +/* #define VK_NUMPAD3 99 */ +/* #define VK_NUMPAD4 100 */ +/* #define VK_NUMPAD5 101 */ +/* #define VK_NUMPAD6 102 */ +/* #define VK_NUMPAD7 103 */ +/* #define VK_NUMPAD8 104 */ +/* #define VK_NUMPAD9 105 */ +#define VK_MULTIPLY 106 +#define VK_ADD 107 +#define VK_SEPARATER 108 +#define VK_SEPARATOR 108 +#define VK_SUBTRACT 109 +/* See gtkpeer.h */ +/* #define VK_DECIMAL 110 */ +#define VK_DIVIDE 111 +#define VK_DELETE 127 +#define VK_NUM_LOCK 144 +#define VK_SCROLL_LOCK 145 +#define VK_F1 112 +#define VK_F2 113 +#define VK_F3 114 +#define VK_F4 115 +#define VK_F5 116 +#define VK_F6 117 +#define VK_F7 118 +#define VK_F8 119 +#define VK_F9 120 +#define VK_F10 121 +#define VK_F11 122 +#define VK_F12 123 +#define VK_F13 61440 +#define VK_F14 61441 +#define VK_F15 61442 +#define VK_F16 61443 +#define VK_F17 61444 +#define VK_F18 61445 +#define VK_F19 61446 +#define VK_F20 61447 +#define VK_F21 61448 +#define VK_F22 61449 +#define VK_F23 61450 +#define VK_F24 61451 +#define VK_PRINTSCREEN 154 +#define VK_INSERT 155 +#define VK_HELP 156 +#define VK_META 157 +#define VK_BACK_QUOTE 192 +#define VK_QUOTE 222 +#define VK_KP_UP 224 +#define VK_KP_DOWN 225 +#define VK_KP_LEFT 226 +#define VK_KP_RIGHT 227 +#define VK_DEAD_GRAVE 128 +#define VK_DEAD_ACUTE 129 +#define VK_DEAD_CIRCUMFLEX 130 +#define VK_DEAD_TILDE 131 +#define VK_DEAD_MACRON 132 +#define VK_DEAD_BREVE 133 +#define VK_DEAD_ABOVEDOT 134 +#define VK_DEAD_DIAERESIS 135 +#define VK_DEAD_ABOVERING 136 +#define VK_DEAD_DOUBLEACUTE 137 +#define VK_DEAD_CARON 138 +#define VK_DEAD_CEDILLA 139 +#define VK_DEAD_OGONEK 140 +#define VK_DEAD_IOTA 141 +#define VK_DEAD_VOICED_SOUND 142 +#define VK_DEAD_SEMIVOICED_SOUND 143 +#define VK_AMPERSAND 150 +#define VK_ASTERISK 151 +#define VK_QUOTEDBL 152 +#define VK_LESS 153 +#define VK_GREATER 160 +#define VK_BRACELEFT 161 +#define VK_BRACERIGHT 162 +#define VK_AT 512 +#define VK_COLON 513 +#define VK_CIRCUMFLEX 514 +#define VK_DOLLAR 515 +#define VK_EURO_SIGN 516 +#define VK_EXCLAMATION_MARK 517 +#define VK_INVERTED_EXCLAMATION_MARK 518 +#define VK_LEFT_PARENTHESIS 519 +#define VK_NUMBER_SIGN 520 +#define VK_PLUS 521 +#define VK_RIGHT_PARENTHESIS 522 +#define VK_UNDERSCORE 523 +#define VK_FINAL 24 +#define VK_CONVERT 28 +#define VK_NONCONVERT 29 +#define VK_ACCEPT 30 +#define VK_MODECHANGE 31 +#define VK_KANA 21 +#define VK_KANJI 25 +#define VK_ALPHANUMERIC 240 +#define VK_KATAKANA 241 +#define VK_HIRAGANA 242 +#define VK_FULL_WIDTH 243 +#define VK_HALF_WIDTH 244 +#define VK_ROMAN_CHARACTERS 245 +#define VK_ALL_CANDIDATES 256 +#define VK_PREVIOUS_CANDIDATE 257 +#define VK_CODE_INPUT 258 +#define VK_JAPANESE_KATAKANA 259 +#define VK_JAPANESE_HIRAGANA 260 +#define VK_JAPANESE_ROMAN 261 +#define VK_KANA_LOCK 262 +#define VK_INPUT_METHOD_ON_OFF 263 +#define VK_CUT 65489 +#define VK_COPY 65485 +#define VK_PASTE 65487 +#define VK_UNDO 65483 +#define VK_AGAIN 65481 +#define VK_FIND 65488 +#define VK_PROPS 65482 +#define VK_STOP 65480 +#define VK_COMPOSE 65312 +#define VK_ALT_GRAPH 65406 +#define VK_UNDEFINED 0 + +#define AWT_KEY_CHAR_UNDEFINED 0 + +#define AWT_FRAME_STATE_NORMAL 0 +#define AWT_FRAME_STATE_ICONIFIED 1 +#define AWT_FRAME_STATE_MAXIMIZED_HORIZ 2 +#define AWT_FRAME_STATE_MAXIMIZED_VERT 4 +#define AWT_FRAME_STATE_MAXIMIZED_BOTH 6 + +static jmethodID postKeyEventID; +static jmethodID postWindowEventID; +static jmethodID postConfigureEventID; +static jmethodID postInsetsChangedEventID; +static jmethodID windowGetWidthID; +static jmethodID windowGetHeightID; +static jmethodID setBoundsCallbackID; + +void +cp_gtk_window_init_jni (void) +{ + jclass window; + jclass gtkwindowpeer; + + window = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), "java/awt/Window"); + + setBoundsCallbackID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), window, + "setBoundsCallback", + "(IIII)V"); + + gtkwindowpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), + "gnu/java/awt/peer/gtk/GtkWindowPeer"); + + postKeyEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkwindowpeer, + "postKeyEvent", "(IJIICI)V"); + + postWindowEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkwindowpeer, + "postWindowEvent", + "(ILjava/awt/Window;I)V"); + + postConfigureEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkwindowpeer, + "postConfigureEvent", "(IIII)V"); + + postInsetsChangedEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkwindowpeer, + "postInsetsChangedEvent", + "(IIII)V"); + + windowGetWidthID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkwindowpeer, + "getWidth", "()I"); + + windowGetHeightID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkwindowpeer, + "getHeight", "()I"); + + gtkwindowpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), + "gnu/java/awt/peer/gtk/GtkWindowPeer"); +} + +/* Get the first keyval in the keymap for this event's keycode. The + first keyval corresponds roughly to Java's notion of a virtual + key. Returns the uppercase version of the first keyval. */ +static guint +get_first_keyval_from_keymap (GdkEventKey *event) +{ + guint keyval; + guint *keyvals; + gint n_entries; + + if (!gdk_keymap_get_entries_for_keycode (NULL, + event->hardware_keycode, + NULL, + &keyvals, + &n_entries)) + { + g_warning ("No keyval found for hardware keycode %d\n", + event->hardware_keycode); + /* Try to recover by using the keyval in the event structure. */ + keyvals = &(event->keyval); + } + keyval = keyvals[0]; + g_free (keyvals); + + return gdk_keyval_to_upper (keyval); +} + +#ifdef __GNUC__ +__inline +#endif +static jint +keysym_to_awt_keycode (GdkEventKey *event) +{ + guint ukeyval; + guint state; + + ukeyval = get_first_keyval_from_keymap (event); + state = event->state; + + /* VK_A through VK_Z */ + if (ukeyval >= GDK_A && ukeyval <= GDK_Z) + return ukeyval; + + /* VK_0 through VK_9 */ + if (ukeyval >= GDK_0 && ukeyval <= GDK_9) + return ukeyval; + + switch (ukeyval) + { + case GDK_Return: + case GDK_KP_Enter: + return VK_ENTER; + case GDK_BackSpace: + return VK_BACK_SPACE; + case GDK_Tab: + return VK_TAB; + case GDK_Cancel: + return VK_CANCEL; + case GDK_Clear: + return VK_CLEAR; + case GDK_Shift_L: + case GDK_Shift_R: + return VK_SHIFT; + case GDK_Control_L: + case GDK_Control_R: + return VK_CONTROL; + case GDK_Alt_L: + case GDK_Alt_R: + return VK_ALT; + case GDK_Pause: + return VK_PAUSE; + case GDK_Caps_Lock: + return VK_CAPS_LOCK; + case GDK_Escape: + return VK_ESCAPE; + case GDK_space: + return VK_SPACE; + case GDK_KP_Page_Up: + /* For keys on the numeric keypad, the JVM produces one of two + virtual keys, depending on the num lock state. */ + if (state & GDK_MOD2_MASK) + return VK_NUMPAD9; + else + return VK_PAGE_UP; + case GDK_Page_Up: + return VK_PAGE_UP; + case GDK_KP_Page_Down: + if (state & GDK_MOD2_MASK) + return VK_NUMPAD3; + else + return VK_PAGE_DOWN; + case GDK_Page_Down: + return VK_PAGE_DOWN; + case GDK_KP_End: + if (state & GDK_MOD2_MASK) + return VK_NUMPAD1; + else + return VK_END; + case GDK_End: + return VK_END; + case GDK_KP_Home: + if (state & GDK_MOD2_MASK) + return VK_NUMPAD7; + else + return VK_HOME; + case GDK_Home: + return VK_HOME; + case GDK_KP_Begin: + if (state & GDK_MOD2_MASK) + return VK_NUMPAD5; + else + return VK_UNDEFINED; + case GDK_Left: + return VK_LEFT; + case GDK_Up: + return VK_UP; + case GDK_Right: + return VK_RIGHT; + case GDK_Down: + return VK_DOWN; + case GDK_comma: + return VK_COMMA; + case GDK_minus: + return VK_MINUS; + case GDK_period: + return VK_PERIOD; + case GDK_slash: + return VK_SLASH; + /* + return VK_0; + return VK_1; + return VK_2; + return VK_3; + return VK_4; + return VK_5; + return VK_6; + return VK_7; + return VK_8; + return VK_9; + */ + case GDK_semicolon: + return VK_SEMICOLON; + case GDK_equal: + return VK_EQUALS; + /* + return VK_A; + return VK_B; + return VK_C; + return VK_D; + return VK_E; + return VK_F; + return VK_G; + return VK_H; + return VK_I; + return VK_J; + return VK_K; + return VK_L; + return VK_M; + return VK_N; + return VK_O; + return VK_P; + return VK_Q; + return VK_R; + return VK_S; + return VK_T; + return VK_U; + return VK_V; + return VK_W; + return VK_X; + return VK_Y; + return VK_Z; + */ + case GDK_bracketleft: + return VK_OPEN_BRACKET; + case GDK_backslash: + return VK_BACK_SLASH; + case GDK_bracketright: + return VK_CLOSE_BRACKET; + case GDK_KP_0: + return VK_NUMPAD0; + case GDK_KP_1: + return VK_NUMPAD1; + case GDK_KP_2: + return VK_NUMPAD2; + case GDK_KP_3: + return VK_NUMPAD3; + case GDK_KP_4: + return VK_NUMPAD4; + case GDK_KP_5: + return VK_NUMPAD5; + case GDK_KP_6: + return VK_NUMPAD6; + case GDK_KP_7: + return VK_NUMPAD7; + case GDK_KP_8: + return VK_NUMPAD8; + case GDK_KP_9: + return VK_NUMPAD9; + case GDK_KP_Multiply: + return VK_MULTIPLY; + case GDK_KP_Add: + return VK_ADD; + /* + return VK_SEPARATER; + */ + case GDK_KP_Separator: + return VK_SEPARATOR; + case GDK_KP_Subtract: + return VK_SUBTRACT; + case GDK_KP_Decimal: + return VK_DECIMAL; + case GDK_KP_Divide: + return VK_DIVIDE; + case GDK_KP_Delete: + if (state & GDK_MOD2_MASK) + return VK_DECIMAL; + else + return VK_DELETE; + case GDK_Delete: + return VK_DELETE; + case GDK_Num_Lock: + return VK_NUM_LOCK; + case GDK_Scroll_Lock: + return VK_SCROLL_LOCK; + case GDK_F1: + return VK_F1; + case GDK_F2: + return VK_F2; + case GDK_F3: + return VK_F3; + case GDK_F4: + return VK_F4; + case GDK_F5: + return VK_F5; + case GDK_F6: + return VK_F6; + case GDK_F7: + return VK_F7; + case GDK_F8: + return VK_F8; + case GDK_F9: + return VK_F9; + case GDK_F10: + return VK_F10; + case GDK_F11: + return VK_F11; + case GDK_F12: + return VK_F12; + case GDK_F13: + return VK_F13; + case GDK_F14: + return VK_F14; + case GDK_F15: + return VK_F15; + case GDK_F16: + return VK_F16; + case GDK_F17: + return VK_F17; + case GDK_F18: + return VK_F18; + case GDK_F19: + return VK_F19; + case GDK_F20: + return VK_F20; + case GDK_F21: + return VK_F21; + case GDK_F22: + return VK_F22; + case GDK_F23: + return VK_F23; + case GDK_F24: + return VK_F24; + case GDK_Print: + return VK_PRINTSCREEN; + case GDK_KP_Insert: + if (state & GDK_MOD2_MASK) + return VK_NUMPAD0; + else + return VK_INSERT; + case GDK_Insert: + return VK_INSERT; + case GDK_Help: + return VK_HELP; + case GDK_Meta_L: + case GDK_Meta_R: + return VK_META; + case GDK_grave: + return VK_BACK_QUOTE; + case GDK_apostrophe: + return VK_QUOTE; + case GDK_KP_Up: + if (state & GDK_MOD2_MASK) + return VK_NUMPAD8; + else + return VK_KP_UP; + case GDK_KP_Down: + if (state & GDK_MOD2_MASK) + return VK_NUMPAD2; + else + return VK_KP_DOWN; + case GDK_KP_Left: + if (state & GDK_MOD2_MASK) + return VK_NUMPAD4; + else + return VK_KP_LEFT; + case GDK_KP_Right: + if (state & GDK_MOD2_MASK) + return VK_NUMPAD6; + else + return VK_KP_RIGHT; + case GDK_dead_grave: + return VK_DEAD_GRAVE; + case GDK_dead_acute: + return VK_DEAD_ACUTE; + case GDK_dead_circumflex: + return VK_DEAD_CIRCUMFLEX; + case GDK_dead_tilde: + return VK_DEAD_TILDE; + case GDK_dead_macron: + return VK_DEAD_MACRON; + case GDK_dead_breve: + return VK_DEAD_BREVE; + case GDK_dead_abovedot: + return VK_DEAD_ABOVEDOT; + case GDK_dead_diaeresis: + return VK_DEAD_DIAERESIS; + case GDK_dead_abovering: + return VK_DEAD_ABOVERING; + case GDK_dead_doubleacute: + return VK_DEAD_DOUBLEACUTE; + case GDK_dead_caron: + return VK_DEAD_CARON; + case GDK_dead_cedilla: + return VK_DEAD_CEDILLA; + case GDK_dead_ogonek: + return VK_DEAD_OGONEK; + case GDK_dead_iota: + return VK_DEAD_IOTA; + case GDK_dead_voiced_sound: + return VK_DEAD_VOICED_SOUND; + case GDK_dead_semivoiced_sound: + return VK_DEAD_SEMIVOICED_SOUND; + case GDK_ampersand: + return VK_AMPERSAND; + case GDK_asterisk: + return VK_ASTERISK; + case GDK_quotedbl: + return VK_QUOTEDBL; + case GDK_less: + return VK_LESS; + case GDK_greater: + return VK_GREATER; + case GDK_braceleft: + return VK_BRACELEFT; + case GDK_braceright: + return VK_BRACERIGHT; + case GDK_at: + return VK_AT; + case GDK_colon: + return VK_COLON; + case GDK_asciicircum: + return VK_CIRCUMFLEX; + case GDK_dollar: + return VK_DOLLAR; + case GDK_EuroSign: + return VK_EURO_SIGN; + case GDK_exclam: + return VK_EXCLAMATION_MARK; + case GDK_exclamdown: + return VK_INVERTED_EXCLAMATION_MARK; + case GDK_parenleft: + return VK_LEFT_PARENTHESIS; + case GDK_numbersign: + return VK_NUMBER_SIGN; + case GDK_plus: + return VK_PLUS; + case GDK_parenright: + return VK_RIGHT_PARENTHESIS; + case GDK_underscore: + return VK_UNDERSCORE; + /* + return VK_FINAL; + return VK_CONVERT; + return VK_NONCONVERT; + return VK_ACCEPT; + */ + case GDK_Mode_switch: + return VK_MODECHANGE; + /* + return VK_KANA; + */ + case GDK_Kanji: + return VK_KANJI; + /* + return VK_ALPHANUMERIC; + */ + case GDK_Katakana: + return VK_KATAKANA; + case GDK_Hiragana: + return VK_HIRAGANA; + /* + return VK_FULL_WIDTH; + return VK_HALF_WIDTH; + return VK_ROMAN_CHARACTERS; + return VK_ALL_CANDIDATES; + */ + case GDK_PreviousCandidate: + return VK_PREVIOUS_CANDIDATE; + case GDK_Codeinput: + return VK_CODE_INPUT; + /* + return VK_JAPANESE_KATAKANA; + return VK_JAPANESE_HIRAGANA; + return VK_JAPANESE_ROMAN; + */ + case GDK_Kana_Lock: + return VK_KANA_LOCK; + /* + return VK_INPUT_METHOD_ON_OFF; + return VK_CUT; + return VK_COPY; + return VK_PASTE; + return VK_UNDO; + return VK_AGAIN; + return VK_FIND; + return VK_PROPS; + return VK_STOP; + return VK_COMPOSE; + return VK_ALT_GRAPH; + */ + default: + return VK_UNDEFINED; + } +} + +static jint +keysym_to_awt_keylocation (GdkEventKey *event) +{ + guint ukeyval; + + ukeyval = get_first_keyval_from_keymap (event); + + /* VK_A through VK_Z */ + if (ukeyval >= GDK_A && ukeyval <= GDK_Z) + return AWT_KEY_LOCATION_STANDARD; + + /* VK_0 through VK_9 */ + if (ukeyval >= GDK_0 && ukeyval <= GDK_9) + return AWT_KEY_LOCATION_STANDARD; + + switch (ukeyval) + { + case GDK_Shift_L: + case GDK_Control_L: + case GDK_Alt_L: + case GDK_Meta_L: + return AWT_KEY_LOCATION_LEFT; + + case GDK_Shift_R: + case GDK_Control_R: + case GDK_Alt_R: + case GDK_Meta_R: + return AWT_KEY_LOCATION_RIGHT; + + case GDK_Return: + case GDK_BackSpace: + case GDK_Tab: + case GDK_Cancel: + case GDK_Clear: + case GDK_Pause: + case GDK_Caps_Lock: + case GDK_Escape: + case GDK_space: + case GDK_Page_Up: + case GDK_Page_Down: + case GDK_End: + case GDK_Home: + case GDK_Left: + case GDK_Up: + case GDK_Right: + case GDK_Down: + case GDK_comma: + case GDK_minus: + case GDK_period: + case GDK_slash: + case GDK_semicolon: + case GDK_equal: + case GDK_bracketleft: + case GDK_backslash: + case GDK_bracketright: + case GDK_Delete: + case GDK_Scroll_Lock: + case GDK_F1: + case GDK_F2: + case GDK_F3: + case GDK_F4: + case GDK_F5: + case GDK_F6: + case GDK_F7: + case GDK_F8: + case GDK_F9: + case GDK_F10: + case GDK_F11: + case GDK_F12: + case GDK_F13: + case GDK_F14: + case GDK_F15: + case GDK_F16: + case GDK_F17: + case GDK_F18: + case GDK_F19: + case GDK_F20: + case GDK_F21: + case GDK_F22: + case GDK_F23: + case GDK_F24: + case GDK_Print: + case GDK_Insert: + case GDK_Help: + case GDK_grave: + case GDK_apostrophe: + case GDK_dead_grave: + case GDK_dead_acute: + case GDK_dead_circumflex: + case GDK_dead_tilde: + case GDK_dead_macron: + case GDK_dead_breve: + case GDK_dead_abovedot: + case GDK_dead_diaeresis: + case GDK_dead_abovering: + case GDK_dead_doubleacute: + case GDK_dead_caron: + case GDK_dead_cedilla: + case GDK_dead_ogonek: + case GDK_dead_iota: + case GDK_dead_voiced_sound: + case GDK_dead_semivoiced_sound: + case GDK_ampersand: + case GDK_asterisk: + case GDK_quotedbl: + case GDK_less: + case GDK_greater: + case GDK_braceleft: + case GDK_braceright: + case GDK_at: + case GDK_colon: + case GDK_asciicircum: + case GDK_dollar: + case GDK_EuroSign: + case GDK_exclam: + case GDK_exclamdown: + case GDK_parenleft: + case GDK_numbersign: + case GDK_plus: + case GDK_parenright: + case GDK_underscore: + case GDK_Mode_switch: + case GDK_Kanji: + case GDK_Katakana: + case GDK_Hiragana: + case GDK_PreviousCandidate: + case GDK_Codeinput: + case GDK_Kana_Lock: + return AWT_KEY_LOCATION_STANDARD; + + case GDK_KP_Enter: + case GDK_KP_Page_Up: + case GDK_KP_Page_Down: + case GDK_KP_End: + case GDK_KP_Home: + case GDK_KP_Begin: + case GDK_KP_0: + case GDK_KP_1: + case GDK_KP_2: + case GDK_KP_3: + case GDK_KP_4: + case GDK_KP_5: + case GDK_KP_6: + case GDK_KP_7: + case GDK_KP_8: + case GDK_KP_9: + case GDK_KP_Multiply: + case GDK_KP_Add: + case GDK_KP_Separator: + case GDK_KP_Subtract: + case GDK_KP_Decimal: + case GDK_KP_Divide: + case GDK_KP_Delete: + case GDK_Num_Lock: + case GDK_KP_Insert: + case GDK_KP_Up: + case GDK_KP_Down: + case GDK_KP_Left: + case GDK_KP_Right: + return AWT_KEY_LOCATION_NUMPAD; + + default: + return AWT_KEY_LOCATION_UNKNOWN; + } +} + +static jchar +keyevent_to_awt_keychar (GdkEventKey *event) +{ + if (event->length > 0) + { + /* Translate GDK carriage return to Java linefeed. */ + if (event->string[0] == 13) + return VK_ENTER; + else + return event->string[0]; + } + else + { + switch (event->keyval) + { + case GDK_BackSpace: + return VK_BACK_SPACE; + case GDK_Tab: + return VK_TAB; + case GDK_Delete: + case GDK_KP_Delete: + return VK_DELETE; + default: + return AWT_KEY_CHAR_UNDEFINED; + } + } +} + +/* Modifier key events need special treatment. In Sun's peer + implementation, when a modifier key is pressed, the KEY_PRESSED + event has that modifier in its modifiers list. The corresponding + KEY_RELEASED event's modifier list does not contain the modifier. + For example, pressing and releasing the shift key will produce a + key press event with modifiers=Shift, and a key release event with + no modifiers. GDK's key events behave in the exact opposite way, + so this translation code is needed. */ +static jint +keyevent_state_to_awt_mods (GdkEventKey *event) +{ + jint result = 0; + guint state; + + if (event->type == GDK_KEY_PRESS) + { + state = event->state; + + if (event->keyval == GDK_Shift_L + || event->keyval == GDK_Shift_R) + result |= AWT_SHIFT_DOWN_MASK; + else + { + if (state & GDK_SHIFT_MASK) + result |= AWT_SHIFT_DOWN_MASK; + } + + if (event->keyval == GDK_Control_L + || event->keyval == GDK_Control_R) + result |= AWT_CTRL_DOWN_MASK; + else + { + if (state & GDK_CONTROL_MASK) + result |= AWT_CTRL_DOWN_MASK; + } + + if (event->keyval == GDK_Alt_L + || event->keyval == GDK_Alt_R) + result |= AWT_ALT_DOWN_MASK; + else + { + if (state & GDK_MOD1_MASK) + result |= AWT_ALT_DOWN_MASK; + } + } + else if (event->type == GDK_KEY_RELEASE) + { + state = event->state; + + if (event->keyval != GDK_Shift_L + && event->keyval != GDK_Shift_R) + { + if (state & GDK_SHIFT_MASK) + result |= AWT_SHIFT_DOWN_MASK; + } + if (event->keyval != GDK_Control_L + && event->keyval != GDK_Control_R) + { + if (state & GDK_CONTROL_MASK) + result |= AWT_CTRL_DOWN_MASK; + } + + if (event->keyval != GDK_Alt_L + && event->keyval != GDK_Alt_R) + { + if (state & GDK_MOD1_MASK) + result |= AWT_ALT_DOWN_MASK; + } + } + + return result; +} + +static gboolean window_configure_cb (GtkWidget *widget, + GdkEventConfigure *event, + jobject peer); /* FIXME: we're currently seeing the double-activation that occurs with metacity and GTK. See @@ -82,6 +1047,73 @@ static gboolean window_property_changed_cb (GtkWidget *widget, jobject peer); static void realize_cb (GtkWidget *widget, jobject peer); +static gboolean +window_configure_cb (GtkWidget *widget __attribute__((unused)), + GdkEventConfigure *event, + jobject peer) +{ + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, + postConfigureEventID, + (jint) event->x, + (jint) event->y, + (jint) event->width, + (jint) event->height); + + gdk_threads_enter (); + + return FALSE; +} + +static gboolean +key_press_cb (GtkWidget *widget __attribute__((unused)), + GdkEventKey *event, + jobject peer) +{ + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, + postKeyEventID, + (jint) AWT_KEY_PRESSED, + (jlong) event->time, + keyevent_state_to_awt_mods (event), + keysym_to_awt_keycode (event), + keyevent_to_awt_keychar (event), + keysym_to_awt_keylocation (event)); + + gdk_threads_enter (); + + /* FIXME: generation of key typed events needs to be moved + to GtkComponentPeer.postKeyEvent. If the key in a key + press event is not an "action" key + (KeyEvent.isActionKey) and is not a modifier key, then + it should generate a key typed event. */ + return TRUE; +} + + +static gboolean +key_release_cb (GtkWidget *widget __attribute__((unused)), + GdkEventKey *event, + jobject peer) +{ + gdk_threads_leave (); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, + postKeyEventID, + (jint) AWT_KEY_RELEASED, + (jlong) event->time, + keyevent_state_to_awt_mods (event), + keysym_to_awt_keycode (event), + keyevent_to_awt_keychar (event), + keysym_to_awt_keylocation (event)); + + gdk_threads_enter (); + + return TRUE; +} + /* Union used for type punning. */ union extents_union { @@ -122,9 +1154,10 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create gtk_window_set_type_hint (window, type); - gtk_window_group_add_window (global_gtk_window_group, window); + gtk_window_group_add_window (cp_gtk_global_window_group, window); fixed = gtk_fixed_new (); + gtk_container_add (GTK_CONTAINER (window_widget), fixed); gtk_widget_show (fixed); @@ -216,9 +1249,6 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals ptr = NSA_GET_PTR (env, obj); gref = NSA_GET_GLOBAL_REF (env, obj); - g_signal_connect (G_OBJECT (ptr), "event", - G_CALLBACK (pre_event_handler), *gref); - g_signal_connect (G_OBJECT (ptr), "delete-event", G_CALLBACK (window_delete_cb), *gref); @@ -249,14 +1279,38 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals g_signal_connect_after (G_OBJECT (ptr), "realize", G_CALLBACK (realize_cb), *gref); - g_signal_connect_after (G_OBJECT (ptr), "realize", - G_CALLBACK (connect_awt_hook_cb), *gref); + g_signal_connect (G_OBJECT (ptr), "key-press-event", + G_CALLBACK (key_press_cb), *gref); + + g_signal_connect (G_OBJECT (ptr), "key-release-event", + G_CALLBACK (key_release_cb), *gref); + g_signal_connect_after (G_OBJECT (ptr), "window-state-event", + G_CALLBACK (window_window_state_cb), *gref); + + g_signal_connect (G_OBJECT (ptr), "configure-event", + G_CALLBACK (window_configure_cb), *gref); + + cp_gtk_component_connect_expose_signals (ptr, gref); + cp_gtk_component_connect_mouse_signals (ptr, gref); + + /* FIXME: override focus signals here to prevent child fixed repaint? */ + + gdk_threads_leave (); +} + +/* Realize the window here so that its frame extents are known now. + That way Window.pack can operate with the accurate insets returned + by the window manager rather than the default estimates. */ +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkWindowPeer_realize (JNIEnv *env, jobject obj) +{ + void *ptr; + + gdk_threads_enter (); + + ptr = NSA_GET_PTR (env, obj); - /* Realize the window here so that its frame extents are known now. - That way Window.pack can operate with the accurate insets - returned by the window manager rather than the default - estimates. */ gtk_widget_realize (GTK_WIDGET (ptr)); gdk_threads_leave (); @@ -301,7 +1355,7 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setBoundsCallback { /* Circumvent package-private access to call Window's setBoundsCallback method. */ - (*gdk_env())->CallVoidMethod (gdk_env(), window, setBoundsCallbackID, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), window, setBoundsCallbackID, x, y, width, height); } @@ -479,7 +1533,7 @@ window_delete_cb (GtkWidget *widget __attribute__((unused)), { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_CLOSING, (jobject) NULL, (jint) 0); @@ -500,7 +1554,7 @@ window_destroy_cb (GtkWidget *widget __attribute__((unused)), { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_CLOSED, (jobject) NULL, (jint) 0); @@ -514,7 +1568,7 @@ window_show_cb (GtkWidget *widget __attribute__((unused)), { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_OPENED, (jobject) NULL, (jint) 0); @@ -533,12 +1587,12 @@ window_active_state_change_cb (GtkWidget *widget __attribute__((unused)), gdk_threads_leave (); if (GTK_WINDOW (widget)->is_active) - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_GAINED_FOCUS, (jobject) NULL, (jint) 0); else - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_DEACTIVATED, (jobject) NULL, (jint) 0); @@ -555,12 +1609,12 @@ window_focus_state_change_cb (GtkWidget *widget, gdk_threads_leave (); if (GTK_WINDOW (widget)->has_toplevel_focus) - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_ACTIVATED, (jobject) NULL, (jint) 0); else - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_DEACTIVATED, (jobject) NULL, (jint) 0); @@ -575,7 +1629,7 @@ window_focus_in_cb (GtkWidget * widget __attribute__((unused)), { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_GAINED_FOCUS, (jobject) NULL, (jint) 0); @@ -592,7 +1646,7 @@ window_focus_out_cb (GtkWidget * widget __attribute__((unused)), { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_LOST_FOCUS, (jobject) NULL, (jint) 0); @@ -618,7 +1672,7 @@ window_window_state_cb (GtkWidget *widget, /* We've been iconified. */ gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_ICONIFIED, (jobject) NULL, (jint) 0); @@ -630,7 +1684,7 @@ window_window_state_cb (GtkWidget *widget, /* We've been deiconified. */ gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_DEICONIFIED, (jobject) NULL, (jint) 0); @@ -650,7 +1704,7 @@ window_window_state_cb (GtkWidget *widget, gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_STATE_CHANGED, (jobject) NULL, new_state); @@ -724,7 +1778,7 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)), { gdk_threads_leave (); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postInsetsChangedEventID, (jint) extents[2], /* top */ (jint) extents[0], /* left */ @@ -748,12 +1802,12 @@ realize_cb (GtkWidget *widget, jobject peer) jint width = 0; jint height = 0; - width = (*gdk_env())->CallIntMethod (gdk_env(), peer, windowGetWidthID); - height = (*gdk_env())->CallIntMethod (gdk_env(), peer, windowGetHeightID); + width = (*cp_gtk_gdk_env())->CallIntMethod (cp_gtk_gdk_env(), peer, windowGetWidthID); + height = (*cp_gtk_gdk_env())->CallIntMethod (cp_gtk_gdk_env(), peer, windowGetHeightID); window_get_frame_extents (widget, &top, &left, &bottom, &right); - (*gdk_env())->CallVoidMethod (gdk_env(), peer, + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postInsetsChangedEventID, top, left, bottom, right); @@ -770,3 +1824,358 @@ realize_cb (GtkWidget *widget, jobject peer) MAX (1, width - left - right), MAX (1, height - top - bottom)); } + +/* + * This method returns a GDK keyval that corresponds to one of the + * keysyms in the X keymap table. The return value is only used to + * determine the keyval's corresponding hardware keycode, and doesn't + * reflect an accurate translation of a Java virtual key value to a + * GDK keyval. + */ +#ifdef __GNUC__ +__inline +#endif +guint +cp_gtk_awt_keycode_to_keysym (jint keyCode, jint keyLocation) +{ + /* GDK_A through GDK_Z */ + if (keyCode >= VK_A && keyCode <= VK_Z) + return gdk_keyval_to_lower (keyCode); + + /* GDK_0 through GDK_9 */ + if (keyCode >= VK_0 && keyCode <= VK_9) + return keyCode; + + switch (keyCode) + { + case VK_ENTER: + return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Enter : GDK_Return; + case VK_BACK_SPACE: + return GDK_BackSpace; + case VK_TAB: + return GDK_Tab; + case VK_CANCEL: + return GDK_Cancel; + case VK_CLEAR: + return GDK_Clear; + case VK_SHIFT: + return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Shift_L : GDK_Shift_R; + case VK_CONTROL: + return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Control_L : GDK_Control_R; + case VK_ALT: + return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Alt_L : GDK_Alt_R; + case VK_PAUSE: + return GDK_Pause; + case VK_CAPS_LOCK: + return GDK_Caps_Lock; + case VK_ESCAPE: + return GDK_Escape; + case VK_SPACE: + return GDK_space; + case VK_PAGE_UP: + return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Page_Up : GDK_Page_Up; + case VK_PAGE_DOWN: + return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Page_Down : GDK_Page_Down; + case VK_END: + return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_End : GDK_End; + case VK_HOME: + return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Home : GDK_Home; + case VK_LEFT: + return GDK_Left; + case VK_UP: + return GDK_Up; + case VK_RIGHT: + return GDK_Right; + case VK_DOWN: + return GDK_Down; + case VK_COMMA: + return GDK_comma; + case VK_MINUS: + return GDK_minus; + case VK_PERIOD: + return GDK_period; + case VK_SLASH: + return GDK_slash; + /* + case VK_0: + case VK_1: + case VK_2: + case VK_3: + case VK_4: + case VK_5: + case VK_6: + case VK_7: + case VK_8: + case VK_9: + */ + case VK_SEMICOLON: + return GDK_semicolon; + case VK_EQUALS: + return GDK_equal; + /* + case VK_A: + case VK_B: + case VK_C: + case VK_D: + case VK_E: + case VK_F: + case VK_G: + case VK_H: + case VK_I: + case VK_J: + case VK_K: + case VK_L: + case VK_M: + case VK_N: + case VK_O: + case VK_P: + case VK_Q: + case VK_R: + case VK_S: + case VK_T: + case VK_U: + case VK_V: + case VK_W: + case VK_X: + case VK_Y: + case VK_Z: + */ + case VK_OPEN_BRACKET: + return GDK_bracketleft; + case VK_BACK_SLASH: + return GDK_backslash; + case VK_CLOSE_BRACKET: + return GDK_bracketright; + case VK_NUMPAD0: + return GDK_KP_0; + case VK_NUMPAD1: + return GDK_KP_1; + case VK_NUMPAD2: + return GDK_KP_2; + case VK_NUMPAD3: + return GDK_KP_3; + case VK_NUMPAD4: + return GDK_KP_4; + case VK_NUMPAD5: + return GDK_KP_5; + case VK_NUMPAD6: + return GDK_KP_6; + case VK_NUMPAD7: + return GDK_KP_7; + case VK_NUMPAD8: + return GDK_KP_8; + case VK_NUMPAD9: + return GDK_KP_9; + case VK_MULTIPLY: + return GDK_KP_Multiply; + case VK_ADD: + return GDK_KP_Add; + /* + case VK_SEPARATER: + */ + case VK_SEPARATOR: + return GDK_KP_Separator; + case VK_SUBTRACT: + return GDK_KP_Subtract; + case VK_DECIMAL: + return GDK_KP_Decimal; + case VK_DIVIDE: + return GDK_KP_Divide; + case VK_DELETE: + return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Delete : GDK_Delete; + case VK_NUM_LOCK: + return GDK_Num_Lock; + case VK_SCROLL_LOCK: + return GDK_Scroll_Lock; + case VK_F1: + return GDK_F1; + case VK_F2: + return GDK_F2; + case VK_F3: + return GDK_F3; + case VK_F4: + return GDK_F4; + case VK_F5: + return GDK_F5; + case VK_F6: + return GDK_F6; + case VK_F7: + return GDK_F7; + case VK_F8: + return GDK_F8; + case VK_F9: + return GDK_F9; + case VK_F10: + return GDK_F10; + case VK_F11: + return GDK_F11; + case VK_F12: + return GDK_F12; + case VK_F13: + return GDK_F13; + case VK_F14: + return GDK_F14; + case VK_F15: + return GDK_F15; + case VK_F16: + return GDK_F16; + case VK_F17: + return GDK_F17; + case VK_F18: + return GDK_F18; + case VK_F19: + return GDK_F19; + case VK_F20: + return GDK_F20; + case VK_F21: + return GDK_F21; + case VK_F22: + return GDK_F22; + case VK_F23: + return GDK_F23; + case VK_F24: + return GDK_F24; + case VK_PRINTSCREEN: + return GDK_Print; + case VK_INSERT: + return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Insert : GDK_Insert; + case VK_HELP: + return GDK_Help; + case VK_META: + return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Meta_L : GDK_Meta_R; + case VK_BACK_QUOTE: + return GDK_grave; + case VK_QUOTE: + return GDK_apostrophe; + case VK_KP_UP: + return GDK_KP_Up; + case VK_KP_DOWN: + return GDK_KP_Down; + case VK_KP_LEFT: + return GDK_KP_Left; + case VK_KP_RIGHT: + return GDK_KP_Right; + case VK_DEAD_GRAVE: + return GDK_dead_grave; + case VK_DEAD_ACUTE: + return GDK_dead_acute; + case VK_DEAD_CIRCUMFLEX: + return GDK_dead_circumflex; + case VK_DEAD_TILDE: + return GDK_dead_tilde; + case VK_DEAD_MACRON: + return GDK_dead_macron; + case VK_DEAD_BREVE: + return GDK_dead_breve; + case VK_DEAD_ABOVEDOT: + return GDK_dead_abovedot; + case VK_DEAD_DIAERESIS: + return GDK_dead_diaeresis; + case VK_DEAD_ABOVERING: + return GDK_dead_abovering; + case VK_DEAD_DOUBLEACUTE: + return GDK_dead_doubleacute; + case VK_DEAD_CARON: + return GDK_dead_caron; + case VK_DEAD_CEDILLA: + return GDK_dead_cedilla; + case VK_DEAD_OGONEK: + return GDK_dead_ogonek; + case VK_DEAD_IOTA: + return GDK_dead_iota; + case VK_DEAD_VOICED_SOUND: + return GDK_dead_voiced_sound; + case VK_DEAD_SEMIVOICED_SOUND: + return GDK_dead_semivoiced_sound; + case VK_AMPERSAND: + return GDK_ampersand; + case VK_ASTERISK: + return GDK_asterisk; + case VK_QUOTEDBL: + return GDK_quotedbl; + case VK_LESS: + return GDK_less; + case VK_GREATER: + return GDK_greater; + case VK_BRACELEFT: + return GDK_braceleft; + case VK_BRACERIGHT: + return GDK_braceright; + case VK_AT: + return GDK_at; + case VK_COLON: + return GDK_colon; + case VK_CIRCUMFLEX: + return GDK_asciicircum; + case VK_DOLLAR: + return GDK_dollar; + case VK_EURO_SIGN: + return GDK_EuroSign; + case VK_EXCLAMATION_MARK: + return GDK_exclam; + case VK_INVERTED_EXCLAMATION_MARK: + return GDK_exclamdown; + case VK_LEFT_PARENTHESIS: + return GDK_parenleft; + case VK_NUMBER_SIGN: + return GDK_numbersign; + case VK_PLUS: + return GDK_plus; + case VK_RIGHT_PARENTHESIS: + return GDK_parenright; + case VK_UNDERSCORE: + return GDK_underscore; + /* + case VK_FINAL: + case VK_CONVERT: + case VK_NONCONVERT: + case VK_ACCEPT: + */ + case VK_MODECHANGE: + return GDK_Mode_switch; + /* + case VK_KANA: + */ + case VK_KANJI: + return GDK_Kanji; + /* + case VK_ALPHANUMERIC: + */ + case VK_KATAKANA: + return GDK_Katakana; + case VK_HIRAGANA: + return GDK_Hiragana; + /* + case VK_FULL_WIDTH: + case VK_HALF_WIDTH: + case VK_ROMAN_CHARACTERS: + case VK_ALL_CANDIDATES: + */ + case VK_PREVIOUS_CANDIDATE: + return GDK_PreviousCandidate; + case VK_CODE_INPUT: + return GDK_Codeinput; + /* + case VK_JAPANESE_KATAKANA: + case VK_JAPANESE_HIRAGANA: + case VK_JAPANESE_ROMAN: + */ + case VK_KANA_LOCK: + return GDK_Kana_Lock; + /* + case VK_INPUT_METHOD_ON_OFF: + case VK_CUT: + case VK_COPY: + case VK_PASTE: + case VK_UNDO: + case VK_AGAIN: + case VK_FIND: + case VK_PROPS: + case VK_STOP: + case VK_COMPOSE: + case VK_ALT_GRAPH: + */ + default: + return GDK_VoidSymbol; + } +} diff --git a/native/jni/gtk-peer/gthread-jni.c b/native/jni/gtk-peer/gthread-jni.c index be822cefd..e673de07d 100644 --- a/native/jni/gtk-peer/gthread-jni.c +++ b/native/jni/gtk-peer/gthread-jni.c @@ -245,7 +245,7 @@ exception statement from your version. */ /* The VM handle. This is set in Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit */ -JavaVM *the_vm; +JavaVM *cp_gtk_the_vm; /* Unions used for type punning. */ union env_union @@ -403,8 +403,8 @@ tracing (const char fmt[], ...) /* Cached info for Exception-wrapping */ -jclass runtimeException_class; /* java.lang.RuntimeException */ -jmethodID runtimeException_ctor; /* constructor for it */ +static jclass runtimeException_class; /* java.lang.RuntimeException */ +static jmethodID runtimeException_ctor; /* constructor for it */ /* Throw a new RuntimeException. It may wrap around an existing exception. @@ -1456,7 +1456,7 @@ mutex_new_jni_impl (void) tracing ("mutex_new_jni_impl()"); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) { @@ -1488,7 +1488,7 @@ mutex_lock_jni_impl (GMutex * mutex) assert (mutexObj); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; @@ -1526,7 +1526,7 @@ mutex_trylock_jni_impl (GMutex * gmutex) assert (mutexObj); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; HIDE_OLD_TROUBLE (env); @@ -1597,7 +1597,7 @@ mutex_unlock_jni_impl (GMutex * gmutex) tracing ("mutex_unlock_jni_impl(mutexObj=%p)", mutexObj); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; HIDE_OLD_TROUBLE (env); @@ -1629,7 +1629,7 @@ mutex_free_jni_impl (GMutex * mutex) union env_union e; e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (TRACE_API_CALLS) tracing ("mutex_free_jni_impl(%p)", mutexObj); @@ -1659,7 +1659,7 @@ cond_new_jni_impl (void) tracing ("mutex_free_jni_impl()"); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); condObj = allocatePlainObject (env); @@ -1683,7 +1683,7 @@ cond_signal_jni_impl (GCond * gcond) tracing ("cond_signal_jni_impl(condObj = %p)", condObj); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; HIDE_OLD_TROUBLE (env); @@ -1725,7 +1725,7 @@ cond_broadcast_jni_impl (GCond * gcond) tracing ("cond_broadcast_jni_impl(condObj=%p)", condObj); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; HIDE_OLD_TROUBLE (env); @@ -1772,7 +1772,7 @@ cond_wait_jni_impl (GCond * gcond, GMutex * gmutex) condObj, mutexObj); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; HIDE_OLD_TROUBLE (env); @@ -1851,7 +1851,7 @@ cond_timed_wait_jni_impl (GCond * gcond, GMutex * gmutex, GTimeVal * end_time) e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; HIDE_OLD_TROUBLE (env); @@ -1942,7 +1942,7 @@ cond_free_jni_impl (GCond * cond) if (TRACE_API_CALLS) tracing ("cond_free_jni_impl(condObj = %p)", condObj); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); freeObject (env, condObj); @@ -1974,7 +1974,7 @@ private_new_jni_impl (GDestroyNotify notify __attribute__ ((unused))) tracing ("private_new_jni_impl()"); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; HIDE_OLD_TROUBLE (env); @@ -2023,7 +2023,7 @@ private_get_jni_impl (GPrivate * gkey) tracing ("private_get_jni_impl(keyObj=%p)", keyObj); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; HIDE_OLD_TROUBLE (env); @@ -2079,7 +2079,7 @@ private_set_jni_impl (GPrivate * gkey, gpointer thread_specific_data) keyObj, thread_specific_data); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; HIDE_OLD_TROUBLE (env); @@ -2173,7 +2173,7 @@ thread_create_jni_impl (GThreadFunc func, } e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) { /* The failed call to setup the cache is certainly not recoverable; @@ -2247,7 +2247,7 @@ thread_yield_jni_impl (void) tracing ("thread_yield_jni_impl()"); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; HIDE_OLD_TROUBLE (env); @@ -2275,7 +2275,7 @@ thread_join_jni_impl (gpointer threadID) tracing ("thread_join_jni_impl(threadID=%p) ", threadID); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; HIDE_OLD_TROUBLE (env); @@ -2323,7 +2323,7 @@ thread_exit_jni_impl (void) tracing ("thread_exit_jni_impl() "); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; @@ -2412,7 +2412,7 @@ thread_set_priority_jni_impl (gpointer gThreadID, GThreadPriority gpriority) gThreadID, gpriority); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) goto done; @@ -2469,7 +2469,7 @@ thread_self_jni_impl (/* Another confusing glib prototype. This is tracing ("thread_self_jni_impl(my_thread_IDp=%p)", my_thread_IDp); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) return; @@ -2514,7 +2514,7 @@ thread_equal_jni_impl (gpointer thread1, gpointer thread2) threadID1, threadID2); e.jni_env = &env; - (*the_vm)->GetEnv (the_vm, e.void_env, JNI_VERSION_1_1); + (*cp_gtk_the_vm)->GetEnv (cp_gtk_the_vm, e.void_env, JNI_VERSION_1_1); if (setup_cache (env) < 0) { ret = FALSE; /* what is safer? We really don't ever want @@ -2556,7 +2556,7 @@ done: /************************************************************************/ /* set of function pointers to give to glib. */ -GThreadFunctions portable_native_sync_jni_functions = { +GThreadFunctions cp_gtk_portable_native_sync_jni_functions = { mutex_new_jni_impl, /* mutex_new */ mutex_lock_jni_impl, /* mutex_lock */ mutex_trylock_jni_impl, /* mutex_trylock */ diff --git a/native/jni/gtk-peer/gthread-jni.h b/native/jni/gtk-peer/gthread-jni.h index e7b33a611..3d052dc10 100644 --- a/native/jni/gtk-peer/gthread-jni.h +++ b/native/jni/gtk-peer/gthread-jni.h @@ -42,7 +42,7 @@ exception statement from your version. */ #include <glib.h> #include "gtkpeer.h" -extern GThreadFunctions portable_native_sync_jni_functions; -extern JavaVM *the_vm; +extern GThreadFunctions cp_gtk_portable_native_sync_jni_functions; +extern JavaVM *cp_gtk_the_vm; #endif /* __GTHREADJNI_H__ */ diff --git a/native/jni/gtk-peer/gtkpeer.h b/native/jni/gtk-peer/gtkpeer.h index 08bdbe180..f291d82ef 100644 --- a/native/jni/gtk-peer/gtkpeer.h +++ b/native/jni/gtk-peer/gtkpeer.h @@ -45,12 +45,6 @@ exception statement from your version. */ #include <jni.h> -#define RC_FILE ".classpath-gtkrc" -#define JVM_SUN -/* - #define JVM_JAPHAR -*/ - #ifndef __GTKPEER_H__ #define __GTKPEER_H__ @@ -58,55 +52,37 @@ exception statement from your version. */ #define __attribute__(x) /* nothing */ #endif -#ifdef JVM_SUN - -extern struct state_table *native_state_table; -extern struct state_table *native_global_ref_table; +extern struct state_table *cp_gtk_native_state_table; +extern struct state_table *cp_gtk_native_global_ref_table; #define NSA_INIT(env, clazz) \ - do {native_state_table = init_state_table (env, clazz); \ - native_global_ref_table = init_state_table (env, clazz);} while (0) + do {cp_gtk_native_state_table = cp_gtk_init_state_table (env, clazz); \ + cp_gtk_native_global_ref_table = cp_gtk_init_state_table (env, clazz);} while (0) #define NSA_GET_PTR(env, obj) \ - get_state (env, obj, native_state_table) + cp_gtk_get_state (env, obj, cp_gtk_native_state_table) #define NSA_SET_PTR(env, obj, ptr) \ - set_state (env, obj, native_state_table, (void *)ptr) + cp_gtk_set_state (env, obj, cp_gtk_native_state_table, (void *)ptr) #define NSA_DEL_PTR(env, obj) \ - remove_state_slot (env, obj, native_state_table) + cp_gtk_remove_state_slot (env, obj, cp_gtk_native_state_table) #define NSA_GET_GLOBAL_REF(env, obj) \ - get_state (env, obj, native_global_ref_table) + cp_gtk_get_state (env, obj, cp_gtk_native_global_ref_table) #define NSA_SET_GLOBAL_REF(env, obj) \ do {jobject *globRefPtr; \ globRefPtr = (jobject *) malloc (sizeof (jobject)); \ *globRefPtr = (*env)->NewGlobalRef (env, obj); \ - set_state (env, obj, native_global_ref_table, (void *)globRefPtr);} while (0) + cp_gtk_set_state (env, obj, cp_gtk_native_global_ref_table, (void *)globRefPtr);} while (0) #define NSA_DEL_GLOBAL_REF(env, obj) \ - do {jobject *globRefPtr = get_state (env, obj, native_global_ref_table); \ - remove_state_slot (env, obj, native_global_ref_table); \ + do {jobject *globRefPtr = cp_gtk_get_state (env, obj, cp_gtk_native_global_ref_table); \ + cp_gtk_remove_state_slot (env, obj, cp_gtk_native_global_ref_table); \ (*env)->DeleteGlobalRef (env, *globRefPtr); \ free (globRefPtr);} while (0) -extern struct state_table *native_pixbufdecoder_state_table; - -#define NSA_PB_INIT(env, clazz) \ - native_pixbufdecoder_state_table = init_state_table (env, clazz) - -#define NSA_GET_PB_PTR(env, obj) \ - get_state (env, obj, native_pixbufdecoder_state_table) - -#define NSA_SET_PB_PTR(env, obj, ptr) \ - set_state (env, obj, native_pixbufdecoder_state_table, (void *)ptr) - -#define NSA_DEL_PB_PTR(env, obj) \ - remove_state_slot (env, obj, native_pixbufdecoder_state_table) - -#endif /* JVM_SUN */ - #define SWAPU32(w) \ (((w) << 24) | (((w) & 0xff00) << 8) | (((w) >> 8) & 0xff00) | ((w) >> 24)) @@ -121,65 +97,15 @@ struct graphics jint x_offset, y_offset; }; -#define AWT_DEFAULT_CURSOR 0 -#define AWT_CROSSHAIR_CURSOR 1 -#define AWT_TEXT_CURSOR 2 -#define AWT_WAIT_CURSOR 3 -#define AWT_SW_RESIZE_CURSOR 4 -#define AWT_SE_RESIZE_CURSOR 5 -#define AWT_NW_RESIZE_CURSOR 6 -#define AWT_NE_RESIZE_CURSOR 7 -#define AWT_N_RESIZE_CURSOR 8 -#define AWT_S_RESIZE_CURSOR 9 -#define AWT_W_RESIZE_CURSOR 10 -#define AWT_E_RESIZE_CURSOR 11 -#define AWT_HAND_CURSOR 12 -#define AWT_MOVE_CURSOR 13 - -#define SYNTHETIC_EVENT_MASK (1 << 10) - #define AWT_SHIFT_DOWN_MASK (1 << 6) #define AWT_CTRL_DOWN_MASK (1 << 7) #define AWT_META_DOWN_MASK (1 << 8) #define AWT_ALT_DOWN_MASK (1 << 9) -#define AWT_BUTTON1_DOWN_MASK (1 << 10) -#define AWT_BUTTON2_DOWN_MASK (1 << 11) -#define AWT_BUTTON3_DOWN_MASK (1 << 12) - #define AWT_BUTTON1_MASK (1 << 4) #define AWT_BUTTON2_MASK (1 << 3) #define AWT_BUTTON3_MASK (1 << 2) -#define MULTI_CLICK_TIME 250 -/* as opposed to a MULTI_PASS_TIME :) */ - -#define AWT_MOUSE_CLICKED 500 -#define AWT_MOUSE_PRESSED 501 -#define AWT_MOUSE_RELEASED 502 -#define AWT_MOUSE_MOVED 503 -#define AWT_MOUSE_ENTERED 504 -#define AWT_MOUSE_EXITED 505 -#define AWT_MOUSE_DRAGGED 506 - -#define AWT_ADJUSTMENT_UNIT_INCREMENT 1 -#define AWT_ADJUSTMENT_UNIT_DECREMENT 2 -#define AWT_ADJUSTMENT_BLOCK_DECREMENT 3 -#define AWT_ADJUSTMENT_BLOCK_INCREMENT 4 -#define AWT_ADJUSTMENT_TRACK 5 - -#define AWT_SCROLLPANE_SCROLLBARS_AS_NEEDED 0 -#define AWT_SCROLLPANE_SCROLLBARS_ALWAYS 1 -#define AWT_SCROLLPANE_SCROLLBARS_NEVER 2 - -#define AWT_LABEL_LEFT 0 -#define AWT_LABEL_CENTER 1 -#define AWT_LABEL_RIGHT 2 - -#define AWT_TEXTAREA_SCROLLBARS_BOTH 0 -#define AWT_TEXTAREA_SCROLLBARS_VERTICAL_ONLY 1 -#define AWT_TEXTAREA_SCROLLBARS_HORIZONTAL_ONLY 2 - #define AWT_ITEM_SELECTED 1 #define AWT_ITEM_DESELECTED 2 @@ -187,82 +113,17 @@ struct graphics #define AWT_KEY_PRESSED 401 #define AWT_KEY_RELEASED 402 -#define AWT_KEY_CHAR_UNDEFINED 0 - #define AWT_KEY_LOCATION_UNKNOWN 0 #define AWT_KEY_LOCATION_STANDARD 1 #define AWT_KEY_LOCATION_LEFT 2 #define AWT_KEY_LOCATION_RIGHT 3 #define AWT_KEY_LOCATION_NUMPAD 4 -/* Virtual Keys */ -/* This list should be kept in the same order as the VK_ field - declarations in KeyEvent.java. */ -#define VK_ENTER '\n' -#define VK_BACK_SPACE '\b' -#define VK_TAB '\t' -#define VK_CANCEL 3 -#define VK_CLEAR 12 -#define VK_SHIFT 16 -#define VK_CONTROL 17 -#define VK_ALT 18 -#define VK_PAUSE 19 -#define VK_CAPS_LOCK 20 -#define VK_ESCAPE 27 -#define VK_SPACE ' ' -#define VK_PAGE_UP 33 -#define VK_PAGE_DOWN 34 -#define VK_END 35 -#define VK_HOME 36 -#define VK_LEFT 37 -#define VK_UP 38 -#define VK_RIGHT 39 -#define VK_DOWN 40 -#define VK_COMMA ',' -#define VK_MINUS '-' -#define VK_PERIOD '.' -#define VK_SLASH '/' -#define VK_0 '0' -#define VK_1 '1' -#define VK_2 '2' -#define VK_3 '3' -#define VK_4 '4' -#define VK_5 '5' -#define VK_6 '6' -#define VK_7 '7' -#define VK_8 '8' -#define VK_9 '9' -#define VK_SEMICOLON ';' -#define VK_EQUALS '=' -#define VK_A 'A' -#define VK_B 'B' -#define VK_C 'C' -#define VK_D 'D' -#define VK_E 'E' -#define VK_F 'F' -#define VK_G 'G' -#define VK_H 'H' -#define VK_I 'I' -#define VK_J 'J' -#define VK_K 'K' -#define VK_L 'L' -#define VK_M 'M' -#define VK_N 'N' -#define VK_O 'O' -#define VK_P 'P' -#define VK_Q 'Q' -#define VK_R 'R' -#define VK_S 'S' -#define VK_T 'T' -#define VK_U 'U' -#define VK_V 'V' -#define VK_W 'W' -#define VK_X 'X' -#define VK_Y 'Y' -#define VK_Z 'Z' -#define VK_OPEN_BRACKET '[' -#define VK_BACK_SLASH '\\' -#define VK_CLOSE_BRACKET ']' +#define AWT_STYLE_PLAIN 0 +#define AWT_STYLE_BOLD 1 +#define AWT_STYLE_ITALIC 2 + +/* Used in GtkComponentPeer and GtkWindowPeer */ #define VK_NUMPAD0 96 #define VK_NUMPAD1 97 #define VK_NUMPAD2 98 @@ -273,229 +134,13 @@ struct graphics #define VK_NUMPAD7 103 #define VK_NUMPAD8 104 #define VK_NUMPAD9 105 -#define VK_MULTIPLY 106 -#define VK_ADD 107 -#define VK_SEPARATER 108 -#define VK_SEPARATOR 108 -#define VK_SUBTRACT 109 #define VK_DECIMAL 110 -#define VK_DIVIDE 111 -#define VK_DELETE 127 -#define VK_NUM_LOCK 144 -#define VK_SCROLL_LOCK 145 -#define VK_F1 112 -#define VK_F2 113 -#define VK_F3 114 -#define VK_F4 115 -#define VK_F5 116 -#define VK_F6 117 -#define VK_F7 118 -#define VK_F8 119 -#define VK_F9 120 -#define VK_F10 121 -#define VK_F11 122 -#define VK_F12 123 -#define VK_F13 61440 -#define VK_F14 61441 -#define VK_F15 61442 -#define VK_F16 61443 -#define VK_F17 61444 -#define VK_F18 61445 -#define VK_F19 61446 -#define VK_F20 61447 -#define VK_F21 61448 -#define VK_F22 61449 -#define VK_F23 61450 -#define VK_F24 61451 -#define VK_PRINTSCREEN 154 -#define VK_INSERT 155 -#define VK_HELP 156 -#define VK_META 157 -#define VK_BACK_QUOTE 192 -#define VK_QUOTE 222 -#define VK_KP_UP 224 -#define VK_KP_DOWN 225 -#define VK_KP_LEFT 226 -#define VK_KP_RIGHT 227 -#define VK_DEAD_GRAVE 128 -#define VK_DEAD_ACUTE 129 -#define VK_DEAD_CIRCUMFLEX 130 -#define VK_DEAD_TILDE 131 -#define VK_DEAD_MACRON 132 -#define VK_DEAD_BREVE 133 -#define VK_DEAD_ABOVEDOT 134 -#define VK_DEAD_DIAERESIS 135 -#define VK_DEAD_ABOVERING 136 -#define VK_DEAD_DOUBLEACUTE 137 -#define VK_DEAD_CARON 138 -#define VK_DEAD_CEDILLA 139 -#define VK_DEAD_OGONEK 140 -#define VK_DEAD_IOTA 141 -#define VK_DEAD_VOICED_SOUND 142 -#define VK_DEAD_SEMIVOICED_SOUND 143 -#define VK_AMPERSAND 150 -#define VK_ASTERISK 151 -#define VK_QUOTEDBL 152 -#define VK_LESS 153 -#define VK_GREATER 160 -#define VK_BRACELEFT 161 -#define VK_BRACERIGHT 162 -#define VK_AT 512 -#define VK_COLON 513 -#define VK_CIRCUMFLEX 514 -#define VK_DOLLAR 515 -#define VK_EURO_SIGN 516 -#define VK_EXCLAMATION_MARK 517 -#define VK_INVERTED_EXCLAMATION_MARK 518 -#define VK_LEFT_PARENTHESIS 519 -#define VK_NUMBER_SIGN 520 -#define VK_PLUS 521 -#define VK_RIGHT_PARENTHESIS 522 -#define VK_UNDERSCORE 523 -#define VK_FINAL 24 -#define VK_CONVERT 28 -#define VK_NONCONVERT 29 -#define VK_ACCEPT 30 -#define VK_MODECHANGE 31 -#define VK_KANA 21 -#define VK_KANJI 25 -#define VK_ALPHANUMERIC 240 -#define VK_KATAKANA 241 -#define VK_HIRAGANA 242 -#define VK_FULL_WIDTH 243 -#define VK_HALF_WIDTH 244 -#define VK_ROMAN_CHARACTERS 245 -#define VK_ALL_CANDIDATES 256 -#define VK_PREVIOUS_CANDIDATE 257 -#define VK_CODE_INPUT 258 -#define VK_JAPANESE_KATAKANA 259 -#define VK_JAPANESE_HIRAGANA 260 -#define VK_JAPANESE_ROMAN 261 -#define VK_KANA_LOCK 262 -#define VK_INPUT_METHOD_ON_OFF 263 -#define VK_CUT 65489 -#define VK_COPY 65485 -#define VK_PASTE 65487 -#define VK_UNDO 65483 -#define VK_AGAIN 65481 -#define VK_FIND 65488 -#define VK_PROPS 65482 -#define VK_STOP 65480 -#define VK_COMPOSE 65312 -#define VK_ALT_GRAPH 65406 -#define VK_UNDEFINED 0 - -#define AWT_FOCUS_GAINED 1004 -#define AWT_FOCUS_LOST 1005 - -#define AWT_WINDOW_OPENED 200 -#define AWT_WINDOW_CLOSING 201 -#define AWT_WINDOW_CLOSED 202 -#define AWT_WINDOW_ICONIFIED 203 -#define AWT_WINDOW_DEICONIFIED 204 -#define AWT_WINDOW_ACTIVATED 205 -#define AWT_WINDOW_DEACTIVATED 206 -#define AWT_WINDOW_GAINED_FOCUS 207 -#define AWT_WINDOW_LOST_FOCUS 208 -#define AWT_WINDOW_STATE_CHANGED 209 - -#define AWT_FRAME_STATE_NORMAL 0 -#define AWT_FRAME_STATE_ICONIFIED 1 -#define AWT_FRAME_STATE_MAXIMIZED_HORIZ 2 -#define AWT_FRAME_STATE_MAXIMIZED_VERT 4 -#define AWT_FRAME_STATE_MAXIMIZED_BOTH 6 -#define AWT_STYLE_PLAIN 0 -#define AWT_STYLE_BOLD 1 -#define AWT_STYLE_ITALIC 2 +JNIEnv *cp_gtk_gdk_env(void); -/* From java.awt.SystemColor */ -#define AWT_DESKTOP 0 -#define AWT_ACTIVE_CAPTION 1 -#define AWT_ACTIVE_CAPTION_TEXT 2 -#define AWT_ACTIVE_CAPTION_BORDER 3 -#define AWT_INACTIVE_CAPTION 4 -#define AWT_INACTIVE_CAPTION_TEXT 5 -#define AWT_INACTIVE_CAPTION_BORDER 6 -#define AWT_WINDOW 7 -#define AWT_WINDOW_BORDER 8 -#define AWT_WINDOW_TEXT 9 -#define AWT_MENU 10 -#define AWT_MENU_TEXT 11 -#define AWT_TEXT 12 -#define AWT_TEXT_TEXT 13 -#define AWT_TEXT_HIGHLIGHT 14 -#define AWT_TEXT_HIGHLIGHT_TEXT 15 -#define AWT_TEXT_INACTIVE_TEXT 16 -#define AWT_CONTROL 17 -#define AWT_CONTROL_TEXT 18 -#define AWT_CONTROL_HIGHLIGHT 19 -#define AWT_CONTROL_LT_HIGHLIGHT 20 -#define AWT_CONTROL_SHADOW 21 -#define AWT_CONTROL_DK_SHADOW 22 -#define AWT_SCROLLBAR 23 -#define AWT_INFO 24 -#define AWT_INFO_TEXT 25 -#define AWT_NUM_COLORS 26 - -extern jmethodID setBoundsCallbackID; - -extern jmethodID postActionEventID; -extern jmethodID postMenuActionEventID; -extern jmethodID postMouseEventID; -extern jmethodID postConfigureEventID; -extern jmethodID postExposeEventID; -extern jmethodID postKeyEventID; -extern jmethodID postFocusEventID; -extern jmethodID postAdjustmentEventID; -extern jmethodID choicePostItemEventID; -extern jmethodID postItemEventID; -extern jmethodID postListItemEventID; -extern jmethodID postTextEventID; -extern jmethodID postWindowEventID; - -extern jmethodID beginNativeRepaintID; -extern jmethodID endNativeRepaintID; - -extern jmethodID initComponentGraphicsID; -extern jmethodID initComponentGraphics2DID; -extern jmethodID setCursorID; - -extern jmethodID syncAttrsID; -extern jclass gdkColor; -extern jmethodID gdkColorID; - -extern jmethodID postInsetsChangedEventID; -extern jmethodID windowGetWidthID; -extern jmethodID windowGetHeightID; - -JNIEnv *gdk_env(void); - -extern double dpi_conversion_factor; - -extern GtkWindowGroup *global_gtk_window_group; - -void awt_event_handler (GdkEvent *event); - -gboolean pre_event_handler (GtkWidget *widget, - GdkEvent *event, - jobject peer); - -void connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...); -void connect_awt_hook_cb (GtkWidget *widget, jobject peer); - -void set_visible (GtkWidget *widget, jboolean visible); -void set_parent (GtkWidget *widget, GtkContainer *parent); - -jint keyevent_state_to_awt_mods (GdkEvent *event); - -guint awt_keycode_to_keysym (jint keyCode, jint keyLocation); - -struct item_event_hook_info -{ - jobject peer_obj; - const char *label; -}; +/* Global variables */ +extern double cp_gtk_dpi_conversion_factor; +extern GtkWindowGroup *cp_gtk_global_window_group; /* Union used for type punning. */ union widget_union @@ -504,31 +149,57 @@ union widget_union GtkWidget **widget; }; +/* Keycode helpers */ +guint cp_gtk_awt_keycode_to_keysym (jint keyCode, jint keyLocation); + +/* Image helpers */ +GdkPixbuf *cp_gtk_image_get_pixbuf (JNIEnv *env, jobject obj); +GdkPixmap *cp_gtk_image_get_pixmap (JNIEnv *env, jobject obj); +jboolean cp_gtk_image_is_offscreen (JNIEnv *env, jobject obj); + /* JNI initialization functions */ -void classpath_gtk_textcomponent_init_jni (void); +#if GTK_CAIRO +void cp_gtk_graphics2d_init_jni (void); +#endif +void cp_gtk_graphics_init_jni (void); +void cp_gtk_button_init_jni (void); +void cp_gtk_checkbox_init_jni (void); +void cp_gtk_choice_init_jni (void); +void cp_gtk_component_init_jni (void); +void cp_gtk_list_init_jni (void); +void cp_gtk_menuitem_init_jni (void); +void cp_gtk_scrollbar_init_jni (void); +void cp_gtk_textcomponent_init_jni (void); +void cp_gtk_window_init_jni (void); /* Signal connection convience functions */ -void classpath_gtk_component_connect_signals (GObject *ptr, jobject *gref); -void classpath_gtk_component_connect_nonfocus_signals (GObject *ptr, jobject *gref); -void classpath_gtk_textcomponent_connect_signals (GObject *ptr, jobject *gref); +void cp_gtk_component_connect_expose_signals (GObject *ptr, jobject *gref); +void cp_gtk_component_connect_focus_signals (GObject *ptr, jobject *gref); +void cp_gtk_component_connect_mouse_signals (GObject *ptr, jobject *gref); +void cp_gtk_component_connect_signals (GObject *ptr, jobject *gref); +void cp_gtk_textcomponent_connect_signals (GObject *ptr, jobject *gref); -/* GtkImage functions used by other gtk peer native routines */ -GdkPixbuf *gnu_java_awt_peer_gtk_GtkImage_getPixbuf(JNIEnv *env, jobject obj); -GdkPixmap *gnu_java_awt_peer_gtk_GtkImage_getPixmap(JNIEnv *env, jobject obj); -jboolean gnu_java_awt_peer_gtk_GtkImage_isOffScreen(JNIEnv *env, jobject obj); +/* Debugging */ +void cp_gtk_print_current_thread (void); #define DEBUG_LOCKING 0 #if DEBUG_LOCKING -#define gdk_threads_enter() \ -{ \ - g_print ("lock: %s, %d\n", __FILE__, __LINE__); \ - gdk_threads_enter (); \ +#define gdk_threads_enter() \ +{ \ + g_print ("locking: %s, %d\n", __FILE__, __LINE__); \ + cp_gtk_print_current_thread (); \ + gdk_threads_enter (); \ + g_print ("locked: %s, %d\n", __FILE__, __LINE__); \ + cp_gtk_print_current_thread (); \ } -#define gdk_threads_leave() \ -{ \ - g_print ("unlock: %s, %d\n", __FILE__, __LINE__); \ - gdk_threads_leave (); \ +#define gdk_threads_leave() \ +{ \ + g_print ("unlocking: %s, %d\n", __FILE__, __LINE__); \ + cp_gtk_print_current_thread (); \ + gdk_threads_leave (); \ + g_print ("unlocked: %s, %d\n", __FILE__, __LINE__); \ + cp_gtk_print_current_thread (); \ } #endif |