classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] [patch] refactor GTK event handling


From: Thomas Fitzsimmons
Subject: [cp-patches] [patch] refactor GTK event handling
Date: Thu, 14 Jul 2005 18:17:34 -0400

Hi,

This large patch does several things.  It splits the event handling code
from gnu_java_awt_peer_gtk_GtkEvents.c and into widget-specific files.
For example, mouse button callbacks now reside in
gnu_java_awt_peer_gtk_GtkComponentPeer.c.  This refactoring simplifies
the code and makes it much clearer which signals are connected to which
widgets.

The patch makes internal all symbols that can be internal, and prefixes
external symbols with the cp_gtk_ prefix.  Here is the output from nm:

$ nm --extern-only --defined-only libgtkpeer.so
0002bcb4 A __bss_start
00021554 T cp_gtk_awt_keycode_to_keysym
00015450 T cp_gtk_button_init_jni
00015fbc T cp_gtk_checkbox_init_jni
00016520 T cp_gtk_choice_init_jni
000181b4 T cp_gtk_component_connect_expose_signals
000181fc T cp_gtk_component_connect_focus_signals
00018270 T cp_gtk_component_connect_mouse_signals
00018364 T cp_gtk_component_connect_signals
00016e88 T cp_gtk_component_init_jni
0002be30 B cp_gtk_dpi_conversion_factor
0001e5cc T cp_gtk_gdk_env
00025ef0 T cp_gtk_get_state
00025d38 T cp_gtk_get_state_oid
0002be24 B cp_gtk_global_window_group
0000e2e4 T cp_gtk_graphics2d_init_jni
00012aa8 T cp_gtk_graphics_init_jni
00019fc8 T cp_gtk_image_get_pixbuf
0001a6c0 T cp_gtk_image_get_pixmap
0001a6ec T cp_gtk_image_is_offscreen
00025c48 T cp_gtk_init_state_table
00025bb4 T cp_gtk_init_state_table_with_size
0001ab04 T cp_gtk_list_init_jni
0001baf4 T cp_gtk_menuitem_init_jni
0002be14 B cp_gtk_native_font_state_table
0002be20 B cp_gtk_native_global_ref_table
0002be28 B cp_gtk_native_state_table
0002be18 B cp_gtk_native_text_layout_state_table
0002bc60 D cp_gtk_portable_native_sync_jni_functions
0001e624 T cp_gtk_print_current_thread
00025dd0 T cp_gtk_remove_state_oid
00025f50 T cp_gtk_remove_state_slot
0001c624 T cp_gtk_scrollbar_init_jni
00025e84 T cp_gtk_set_state
00025c70 T cp_gtk_set_state_oid
0001e4b8 T cp_gtk_textcomponent_connect_signals
0001dc48 T cp_gtk_textcomponent_init_jni
0002be38 B cp_gtk_the_vm
0001f050 T cp_gtk_window_init_jni
0002a014 A _DYNAMIC
0002bcb4 A _edata
0002be3c A _end
00026354 T _fini
0000c430 T _init
00011ed0 T Java_gnu_java_awt_peer_gtk_GdkFontPeer_dispose

...

other JNI methods

...

00020a40 T Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toFront
0002629c T JCL_FindClass
00026138 T JCL_free
000261dc T JCL_free_cstring
00026164 T JCL_jstring_to_cstring
0002609c T JCL_malloc
000261fc T JCL_MonitorEnter
0002624c T JCL_MonitorExit
000260e8 T JCL_realloc
00025fb0 T JCL_ThrowException

We should try to keep libgtkpeer.so namespace-clean from now on.

The patch also moves initialization of JNI method IDs out of
gnu_java_awt_peer_gtk_GtkToolkit.c and into the widget-specific files
that use the IDs.  This allows us to hide the method ID symbols that
were previously external.

Tom

2005-07-14  Thomas Fitzsimmons  <address@hidden>

        * 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.

Index: gnu/java/awt/peer/gtk/GtkChoicePeer.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkChoicePeer.java,v
retrieving revision 1.22
diff -u -r1.22 GtkChoicePeer.java
--- gnu/java/awt/peer/gtk/GtkChoicePeer.java    11 Jul 2005 23:27:43 -0000      
1.22
+++ gnu/java/awt/peer/gtk/GtkChoicePeer.java    14 Jul 2005 21:58:40 -0000
@@ -120,7 +120,7 @@
     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)
Index: gnu/java/awt/peer/gtk/GtkComponentPeer.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkComponentPeer.java,v
retrieving revision 1.87
diff -u -r1.87 GtkComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkComponentPeer.java 4 Jul 2005 23:56:36 -0000       
1.87
+++ gnu/java/awt/peer/gtk/GtkComponentPeer.java 14 Jul 2005 21:58:40 -0000
@@ -105,6 +105,13 @@
 
   native boolean isRealized ();
 
+  void realize ()
+  {
+    // Default implementation does nothing
+  }
+
+  native void setNativeEventMask ();
+
   void create ()
   {
     throw new RuntimeException ();
@@ -137,6 +144,10 @@
     if (awtComponent instanceof Window
         || (parent != null && ! parent.isShowing ()))
       setParentAndBounds ();
+
+    setNativeEventMask ();
+
+    realize ();
   }
 
   void setParentAndBounds ()
Index: gnu/java/awt/peer/gtk/GtkGenericPeer.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkGenericPeer.java,v
retrieving revision 1.16
diff -u -r1.16 GtkGenericPeer.java
--- gnu/java/awt/peer/gtk/GtkGenericPeer.java   2 Jul 2005 20:32:12 -0000       
1.16
+++ gnu/java/awt/peer/gtk/GtkGenericPeer.java   14 Jul 2005 21:58:40 -0000
@@ -90,4 +90,9 @@
   }
 
   native void gtkWidgetModifyFont (String name, int style, int size);
+
+  static void printCurrentThread ()
+  {
+    System.out.println ("gtkgenericpeer, thread: " + Thread.currentThread ());
+  }
 }
Index: gnu/java/awt/peer/gtk/GtkWindowPeer.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkWindowPeer.java,v
retrieving revision 1.35
diff -u -r1.35 GtkWindowPeer.java
--- gnu/java/awt/peer/gtk/GtkWindowPeer.java    2 Jul 2005 20:32:12 -0000       
1.35
+++ gnu/java/awt/peer/gtk/GtkWindowPeer.java    14 Jul 2005 21:58:40 -0000
@@ -63,6 +63,8 @@
   native void gtkWindowSetResizable (boolean resizable);
   native void gtkWindowSetModal (boolean modal);
 
+  native void realize ();
+
   int getWidth ()
   {
     return awtComponent.getWidth();
Index: include/gnu_java_awt_peer_gtk_GtkComponentPeer.h
===================================================================
RCS file: 
/cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkComponentPeer.h,v
retrieving revision 1.17
diff -u -r1.17 gnu_java_awt_peer_gtk_GtkComponentPeer.h
--- include/gnu_java_awt_peer_gtk_GtkComponentPeer.h    29 Oct 2004 08:54:35 
-0000      1.17
+++ include/gnu_java_awt_peer_gtk_GtkComponentPeer.h    14 Jul 2005 21:58:41 
-0000
@@ -25,6 +25,7 @@
 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);
Index: include/gnu_java_awt_peer_gtk_GtkWindowPeer.h
===================================================================
RCS file: 
/cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkWindowPeer.h,v
retrieving revision 1.14
diff -u -r1.14 gnu_java_awt_peer_gtk_GtkWindowPeer.h
--- include/gnu_java_awt_peer_gtk_GtkWindowPeer.h       22 Feb 2005 07:40:43 
-0000      1.14
+++ include/gnu_java_awt_peer_gtk_GtkWindowPeer.h       14 Jul 2005 21:58:41 
-0000
@@ -13,6 +13,7 @@
 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);
Index: native/jni/classpath/native_state.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/classpath/native_state.c,v
retrieving revision 1.10
diff -u -r1.10 native_state.c
--- native/jni/classpath/native_state.c 2 Jul 2005 20:32:52 -0000       1.10
+++ native/jni/classpath/native_state.c 14 Jul 2005 21:58:43 -0000
@@ -42,7 +42,7 @@
 #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 @@
 }
 
 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 @@
 }
 
 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 @@
 }
 
 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 @@
 }
 
 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 @@
 }
 
 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 @@
   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 @@
   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 @@
   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);
 }
Index: native/jni/classpath/native_state.h
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/classpath/native_state.h,v
retrieving revision 1.6
diff -u -r1.6 native_state.h
--- native/jni/classpath/native_state.h 2 Jul 2005 20:32:52 -0000       1.6
+++ native/jni/classpath/native_state.h 14 Jul 2005 21:58:43 -0000
@@ -55,17 +55,17 @@
   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
Index: native/jni/gtk-peer/Makefile.am
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/Makefile.am,v
retrieving revision 1.26
diff -u -r1.26 Makefile.am
--- native/jni/gtk-peer/Makefile.am     4 Jul 2005 23:56:36 -0000       1.26
+++ native/jni/gtk-peer/Makefile.am     14 Jul 2005 21:58:43 -0000
@@ -25,7 +25,6 @@
                        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 \
Index: native/jni/gtk-peer/gdkfont.h
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gdkfont.h,v
retrieving revision 1.8
diff -u -r1.8 gdkfont.h
--- native/jni/gtk-peer/gdkfont.h       2 Jul 2005 20:32:52 -0000       1.8
+++ native/jni/gtk-peer/gdkfont.h       14 Jul 2005 21:58:43 -0000
@@ -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
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c,v
retrieving revision 1.7
diff -u -r1.7 gnu_java_awt_peer_gtk_GdkFontPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c     11 Jul 2005 
23:27:43 -0000      1.7
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c     14 Jul 2005 
21:58:43 -0000
@@ -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 @@
   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 @@
 
   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 @@
          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 @@
   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();
     }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c,v
retrieving revision 1.25
diff -u -r1.25 gnu_java_awt_peer_gtk_GdkGraphics.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c     11 Jul 2005 
23:27:43 -0000      1.25
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c     14 Jul 2005 
21:58:43 -0000
@@ -41,11 +41,26 @@
 #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 @@
 
   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 @@
   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 @@
 {
   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 ();
 }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c,v
retrieving revision 1.30
diff -u -r1.30 gnu_java_awt_peer_gtk_GdkGraphics2D.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c   11 Jul 2005 
23:55:27 -0000      1.30
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c   14 Jul 2005 
21:58:43 -0000
@@ -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 @@
 {
   gdk_threads_leave ();
 
-  (*gdk_env())->CallVoidMethod (gdk_env(), peer, initComponentGraphics2DID);
+  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, 
initComponentGraphics2DID);
 
   gdk_threads_enter ();
 }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c,v
retrieving revision 1.17
diff -u -r1.17 gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c        11 Jul 
2005 23:27:43 -0000      1.17
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c        14 Jul 
2005 21:58:43 -0000
@@ -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 @@
 
   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, 
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c,v
retrieving revision 1.4
diff -u -r1.4 gnu_java_awt_peer_gtk_GdkRobotPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c    11 Jul 2005 
23:27:43 -0000      1.4
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c    14 Jul 2005 
21:58:43 -0000
@@ -205,7 +205,8 @@
   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 @@
   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 @@
   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,
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c,v
retrieving revision 1.7
diff -u -r1.7 gnu_java_awt_peer_gtk_GdkTextLayout.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c   11 Jul 2005 
23:27:43 -0000      1.7
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c   14 Jul 2005 
21:58:43 -0000
@@ -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 
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c,v
retrieving revision 1.25
diff -u -r1.25 gnu_java_awt_peer_gtk_GtkButtonPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c   11 Jul 2005 
23:27:43 -0000      1.25
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c   14 Jul 2005 
21:58:43 -0000
@@ -39,12 +39,24 @@
 #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 @@
 
   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 @@
   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 @@
   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 @@
 
   gdk_threads_leave ();
 
-  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
+  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                               endNativeRepaintID);
 
   gdk_threads_enter ();
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c,v
retrieving revision 1.18
diff -u -r1.18 gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 11 Jul 2005 
23:27:43 -0000      1.18
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 14 Jul 2005 
21:58:43 -0000
@@ -40,6 +40,21 @@
 #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 @@
   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 @@
   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 @@
 {
   gdk_threads_leave ();
 
-  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
+  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                 postItemEventID,
                                 peer,
                                 item->active ?
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c,v
retrieving revision 1.16
diff -u -r1.16 gnu_java_awt_peer_gtk_GtkChoicePeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c   11 Jul 2005 
23:27:43 -0000      1.16
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c   14 Jul 2005 
21:58:43 -0000
@@ -39,6 +39,21 @@
 #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 @@
   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 @@
       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 ();
     }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c,v
retrieving revision 1.11
diff -u -r1.11 gnu_java_awt_peer_gtk_GtkClipboard.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c    11 Jul 2005 
23:27:43 -0000      1.11
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c    14 Jul 2005 
21:58:43 -0000
@@ -39,16 +39,18 @@
 #include "gtkpeer.h"
 #include "gnu_java_awt_peer_gtk_GtkClipboard.h"
 
-jmethodID stringSelectionReceivedID;
-jmethodID stringSelectionHandlerID;
-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 jmethodID stringSelectionReceivedID;
+static jmethodID stringSelectionHandlerID;
+static jmethodID selectionClearID;
+
+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 @@
   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 @@
   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 @@
     {
       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 @@
       
       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 @@
   return;
 }
 
-void
+static void
 selection_get_cb (GtkWidget *widget __attribute__((unused)), 
                   GtkSelectionData *selection_data,
                   guint      info __attribute__((unused)),
@@ -148,7 +150,7 @@
 
   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 @@
       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 @@
   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 ();
 
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v
retrieving revision 1.47
diff -u -r1.47 gnu_java_awt_peer_gtk_GtkComponentPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c        11 Jul 
2005 23:27:43 -0000      1.47
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c        14 Jul 
2005 21:58:43 -0000
@@ -40,370 +40,145 @@
 #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);
-
-  /* GDK_0 through GDK_9 */
-  if (keyCode >= VK_0 && keyCode <= VK_9)
-    return keyCode;
+static jmethodID postMouseEventID;
+static jmethodID setCursorID;
+static jmethodID postExposeEventID;
+static jmethodID postFocusEventID;
+
+void
+cp_gtk_component_init_jni (void)
+ {
+  jclass gtkcomponentpeer;
+
+  gtkcomponentpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(),
+                                     "gnu/java/awt/peer/gtk/GtkComponentPeer");
+
+  postMouseEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), 
gtkcomponentpeer,
+                                               "postMouseEvent", "(IJIIIIZ)V");
 
-  switch (keyCode)
+  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 @@
   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 @@
 
   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 @@
 
   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 @@
 {
   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 ();
+
+  ptr = NSA_GET_PTR (env, obj);
 
-  g_signal_connect_after (G_OBJECT (ptr), "realize",
-                          G_CALLBACK (connect_awt_hook_cb), *gref);
+  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 @@
   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 @@
   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;
 }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
===================================================================
RCS file: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
diff -N native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c       2 Jul 2005 
20:32:54 -0000       1.35
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -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 ();
-}
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c,v
retrieving revision 1.21
diff -u -r1.21 gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c       11 Jul 
2005 23:27:43 -0000      1.21
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c       14 Jul 
2005 21:58:43 -0000
@@ -79,7 +79,7 @@
 
   /* 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 @@
   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 @@
   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 @@
       && 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 @@
 
   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 ();
 }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c,v
retrieving revision 1.7
diff -u -r1.7 gnu_java_awt_peer_gtk_GtkFramePeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c    11 Jul 2005 
23:27:43 -0000      1.7
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c    14 Jul 2005 
21:58:43 -0000
@@ -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 @@
 
   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 @@
 
   /* 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 ();
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c,v
retrieving revision 1.7
diff -u -r1.7 gnu_java_awt_peer_gtk_GtkGenericPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c  11 Jul 2005 
23:27:43 -0000      1.7
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c  14 Jul 2005 
21:58:43 -0000
@@ -82,7 +82,8 @@
   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);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c,v
retrieving revision 1.6
diff -u -r1.6 gnu_java_awt_peer_gtk_GtkImage.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c        11 Jul 2005 
23:27:43 -0000      1.6
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c        14 Jul 2005 
21:58:43 -0000
@@ -71,7 +71,10 @@
   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 @@
 
   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 @@
   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 @@
 /**
  * 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 @@
 /**
  * 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);
 }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c,v
retrieving revision 1.15
diff -u -r1.15 gnu_java_awt_peer_gtk_GtkLabelPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c    11 Jul 2005 
23:27:43 -0000      1.15
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c    14 Jul 2005 
21:58:43 -0000
@@ -84,10 +84,14 @@
   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);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c,v
retrieving revision 1.19
diff -u -r1.19 gnu_java_awt_peer_gtk_GtkListPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c     11 Jul 2005 
23:27:43 -0000      1.19
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c     14 Jul 2005 
21:58:43 -0000
@@ -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 @@
   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 @@
   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 @@
     {
       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 @@
       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 ();
         }
     }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c,v
retrieving revision 1.15
diff -u -r1.15 gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c 11 Jul 2005 
23:27:43 -0000      1.15
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c 14 Jul 2005 
21:58:43 -0000
@@ -40,6 +40,22 @@
 #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 @@
   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 @@
 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 ();
 }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c,v
retrieving revision 1.18
diff -u -r1.18 gnu_java_awt_peer_gtk_GtkMenuPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c     11 Jul 2005 
23:27:43 -0000      1.18
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c     14 Jul 2005 
21:58:43 -0000
@@ -95,7 +95,7 @@
   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));
     }
 
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c,v
retrieving revision 1.15
diff -u -r1.15 gnu_java_awt_peer_gtk_GtkPanelPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c    11 Jul 2005 
23:27:43 -0000      1.15
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c    14 Jul 2005 
21:58:43 -0000
@@ -88,7 +88,9 @@
   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 @@
 {
   return TRUE;
 }
-
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c,v
retrieving revision 1.10
diff -u -r1.10 gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c       11 Jul 
2005 23:27:43 -0000      1.10
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c       14 Jul 
2005 21:58:43 -0000
@@ -39,6 +39,10 @@
 #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)
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c,v
retrieving revision 1.1
diff -u -r1.1 gnu_java_awt_peer_gtk_GtkScrollbarPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c        4 Jul 
2005 23:20:35 -0000       1.1
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c        14 Jul 
2005 21:58:43 -0000
@@ -41,14 +41,36 @@
 #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 @@
 
   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 @@
   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 @@
 }
 #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
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c,v
retrieving revision 1.22
diff -u -r1.22 gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c 4 Jul 2005 
23:56:36 -0000       1.22
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c 14 Jul 2005 
21:58:43 -0000
@@ -39,6 +39,10 @@
 #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 @@
   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 @@
 
   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);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c,v
retrieving revision 1.21
diff -u -r1.21 gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c        4 Jul 
2005 23:56:37 -0000       1.21
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c        14 Jul 
2005 21:58:43 -0000
@@ -45,15 +45,17 @@
 #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 @@
   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 @@
 
   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 @@
 }
 
 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 @@
                          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 ();
 }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c,v
retrieving revision 1.18
diff -u -r1.18 gnu_java_awt_peer_gtk_GtkToolkit.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c      11 Jul 2005 
23:27:43 -0000      1.18
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c      14 Jul 2005 
21:58:43 -0000
@@ -43,40 +43,43 @@
 
 #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;
+#define RC_FILE ".classpath-gtkrc"
 
-JavaVM *java_vm;
+/* 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 @@
 };
 
 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 @@
 }
 
 
-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 @@
   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 @@
      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 @@
   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");
-#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");
+#if GTK_CAIRO
+  cp_gtk_graphics2d_init_jni ();
 #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 @@
 #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 @@
   /*   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 @@
       /* 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 @@
   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 @@
                   | 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);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,v
retrieving revision 1.50
diff -u -r1.50 gnu_java_awt_peer_gtk_GtkWindowPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c   11 Jul 2005 
23:27:43 -0000      1.50
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c   14 Jul 2005 
21:58:43 -0000
@@ -41,6 +41,971 @@
 #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 @@
                                            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 @@
 
   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 @@
   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 @@
   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 @@
 {
   /* 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 @@
 {
   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 @@
 {
   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 @@
 {
   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 @@
   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 @@
   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 @@
 {
   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 @@
 {
   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 @@
          /* 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 @@
          /* 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 @@
 
   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 @@
     {
       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 @@
   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);
 
@@ -769,4 +1823,359 @@
   gtk_window_resize (GTK_WINDOW (widget),
                     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;
+    }
 }
Index: native/jni/gtk-peer/gthread-jni.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gthread-jni.c,v
retrieving revision 1.19
diff -u -r1.19 gthread-jni.c
--- native/jni/gtk-peer/gthread-jni.c   2 Jul 2005 20:32:54 -0000       1.19
+++ native/jni/gtk-peer/gthread-jni.c   14 Jul 2005 21:58:43 -0000
@@ -245,7 +245,7 @@
 
 /*  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 @@
 
 /* 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 @@
     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 @@
 
   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 @@
   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 @@
     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 @@
   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 @@
     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 @@
     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 @@
     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 @@
             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 @@
 
 
   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 @@
   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 @@
     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 @@
     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 @@
             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 @@
     }
 
   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 @@
     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 @@
     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 @@
     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 @@
             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 @@
     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 @@
             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 @@
 /************************************************************************/
 
 /* 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 */
Index: native/jni/gtk-peer/gthread-jni.h
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gthread-jni.h,v
retrieving revision 1.7
diff -u -r1.7 gthread-jni.h
--- native/jni/gtk-peer/gthread-jni.h   2 Jul 2005 20:32:54 -0000       1.7
+++ native/jni/gtk-peer/gthread-jni.h   14 Jul 2005 21:58:43 -0000
@@ -42,7 +42,7 @@
 #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__ */
Index: native/jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.34
diff -u -r1.34 gtkpeer.h
--- native/jni/gtk-peer/gtkpeer.h       4 Jul 2005 23:56:37 -0000       1.34
+++ native/jni/gtk-peer/gtkpeer.h       14 Jul 2005 21:58:43 -0000
@@ -45,12 +45,6 @@
 
 #include <jni.h>
 
-#define RC_FILE      ".classpath-gtkrc"
-#define JVM_SUN
-/*
-  #define JVM_JAPHAR
-*/
-
 #ifndef __GTKPEER_H__
 #define __GTKPEER_H__
 
@@ -58,55 +52,37 @@
 #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 @@
   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 @@
 #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 @@
 #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
-
-/* 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);
+JNIEnv *cp_gtk_gdk_env(void);
 
-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 @@
   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);
-
-/* 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);
+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);
+
+/* 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
 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]