classpath-patches
[Top][All Lists]
Advanced

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

[cp-patches] fix GTK peer locking


From: Thomas Fitzsimmons
Subject: [cp-patches] fix GTK peer locking
Date: Wed, 17 Aug 2005 21:49:32 -0400

Hi,

It turns out that it is never safe to release the GDK lock within GTK
callbacks but we were doing this throughout the peer code.  Doing so
caused strange race conditions, like the 1x1 window:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21600

This patch eliminates all releases of the GDK lock within callbacks.
Since the GDK lock is not re-entrant I had to make other changes so that
callbacks don't cause self-deadlock.  A callback cannot call any method
that attempts to obtain the GDK lock.  There is still the possibility
that this will occur, since in some callbacks we call user-overridable
methods in java.awt.  We should probably insulate these calls from the
GDK lock, perhaps in the same way that GtkClipboardNotifier works, but
that is a separate patch.  This patch at least improves the locking
situation, fixing 21600.

Tom

2005-08-17  Thomas Fitzsimmons  <address@hidden>

        * gnu/java/awt/peer/gtk/GtkFramePeer.java,
        gnu_java_awt_peer_gtk_GtkFramePeer.c (postConfigureEvent): Prevent
        callback calling back into peers.
        (setBounds): Likewise.
        (setMenuBarWidthUnlocked): New method.
        * native/jni/gtk-peer/gtkpeer.h (cp_gtk_filedialog_init_jni):
        Declare function.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c
        (gtkInit): Call cp_gtk_filedialog_init_jni.
        (loadSystemColors): Work around deadlock.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
        (textcomponent_changed_cb): Don't release GDK lock.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
        (item_activate_cb): Don't release GDK lock.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
        (item_highlighted_cb): Don't release GDK lock.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
        (component_button_press_cb): Don't release GDK lock.
        (component_button_release_cb): Likewise.
        (component_motion_notify_cb): Likewise.
        (component_enter_notify_cb): Likewise.
        (component_leave_notify_cb): Likewise.
        (component_expose_cb): Likewise.
        (component_focus_in_cb): Likewise.
        (component_focus_out_cb): Likewise.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
        (block_expose_event_cb): Remove callback.
        * gnu/java/awt/peer/gtk/GtkWindowPeer.java,
        gnu_java_awt_peer_gtk_GtkWindowPeer.c (postConfigureEvent):
        Prevent callback calling back into peers.
        (setBounds): Likewise.
        (nativeSetBoundsUnlocked): New method.
        (setBoundsUnlocked): Likewise.
        (nativeSetVisibleUnlocked): Likewise.
        (setVisibleUnlocked): Likewise.
        (window_delete_cb): Don't release GDK lock.
        (window_destroy_cb): Likewise.
        (window_show_cb): Likewise.
        (window_active_state_change_cb): Likewise.
        (window_focus_state_change_cb): Likewise.
        (window_focus_in_cb): Likewise.
        (window_focus_out_cb): Likewise.
        (window_window_state_cb): Likewise.
        (window_property_changed_cb): Likewise.
        (realize_cb): Likewise.
        * gnu/java/awt/peer/gtk/GtkToolkit.java (mainThread): New
        variable.
        * gnu/java/awt/peer/gtk/GtkFileDialogPeer.java,
        gnu_java_awt_peer_gtk_GtkFileDialogPeer.c (setVisible): Prevent
        callback calling back into peers.
        (filename_filter_cb): Don't release GDK lock.
        (handle_response_cb): Likewise.
        (cp_gtk_filedialog_init_jni): New function.
        * gnu/java/awt/peer/gtk/GtkCheckboxPeer.java (setState): Prevent
        callback from calling back into peers.
        (item_toggled_cb): Don't release GDK lock.
        * gnu/java/awt/peer/gtk/GdkPixbufDecoder.java,
        gnu_java_awt_peer_gtk_GdkPixbufDecoder.c (area_prepared_cb): Don't
        release GDK lock.
        (area_updated_cb): Likewise.
        * gnu/java/awt/peer/gtk/GdkGraphics2D.java,
        gnu_java_awt_peer_gtk_GdkGraphics2D.c (initStateUnlocked): New
        method.
        (cairoSurfaceSetFilterUnlocked): Likewise.
        (initComponentGraphics2DUnlocked): Likewise.
        (setTexturePixelsUnlocked): Likewise.
        (setGradientUnlocked): Likewise.
        (cairoSetMatrixUnlocked): Likewise.
        (cairoSetRGBAColorUnlocked): Likewise.
        (cairoSetLineWidthUnlocked): Likewise.
        (cairoSetLineCapUnlocked): Likewise.
        (cairoSetLineJoinUnlocked): Likewise.
        (cairoSetDashUnlocked): Likewise.
        (cairoSetMiterLimitUnlocked): Likewise.
        (setPaintUnlocked): Likewise.
        (setTransformUnlocked): Likewise.
        (setStrokeUnlocked): Likewise.
        (setColorUnlocked): Likewise.
        (setBackgroundUnlocked): Likewise.
        (setRenderingHintsUnlocked): Likewise.
        (setFontUnlocked): Likewise.
        (realize_cb): Don't release GDK lock.  Call
        initComponentGraphics2DUnlocked.
        * gnu/java/awt/peer/gtk/GdkGraphics.java,
        gnu_java_awt_peer_gtk_GdkGraphics.c (initStateUnlocked): New
        method.
        (initComponentGraphicsUnlocked): New method.
        (realize_cb): Don't release GDK lock.  Call
        initComponentGraphicsUnlocked.
        * include/gnu_java_awt_peer_gtk_GdkGraphics.h: Regenerate.
        * include/gnu_java_awt_peer_gtk_GdkGraphics2D.h: Likewise.
        * include/gnu_java_awt_peer_gtk_GtkFramePeer.h: Likewise.
        * include/gnu_java_awt_peer_gtk_GtkWindowPeer.h: Likewise.

Index: gnu/java/awt/peer/gtk/GdkGraphics.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GdkGraphics.java,v
retrieving revision 1.43
diff -u -r1.43 GdkGraphics.java
--- gnu/java/awt/peer/gtk/GdkGraphics.java      26 Jul 2005 20:25:13 -0000      
1.43
+++ gnu/java/awt/peer/gtk/GdkGraphics.java      18 Aug 2005 01:14:39 -0000
@@ -78,6 +78,7 @@
   static final int GDK_COPY = 0, GDK_XOR = 2;
 
   native void initState (GtkComponentPeer component);
+  native void initStateUnlocked (GtkComponentPeer component);
   native void initState (int width, int height);
   native void initFromImage (GtkImage image);
   native void copyState (GdkGraphics g);
@@ -126,6 +127,15 @@
   void initComponentGraphics ()
   {
     initState (component);
+    color = component.awtComponent.getForeground ();
+    Dimension d = component.awtComponent.getSize ();
+    clip = new Rectangle (0, 0, d.width, d.height);
+  }
+
+  // called back by native side: realize_cb
+  void initComponentGraphicsUnlocked ()
+  {
+    initStateUnlocked (component);
     color = component.awtComponent.getForeground ();
     Dimension d = component.awtComponent.getSize ();
     clip = new Rectangle (0, 0, d.width, d.height);
Index: gnu/java/awt/peer/gtk/GdkGraphics2D.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GdkGraphics2D.java,v
retrieving revision 1.39
diff -u -r1.39 GdkGraphics2D.java
--- gnu/java/awt/peer/gtk/GdkGraphics2D.java    2 Jul 2005 20:32:11 -0000       
1.39
+++ gnu/java/awt/peer/gtk/GdkGraphics2D.java    18 Aug 2005 01:14:39 -0000
@@ -132,12 +132,14 @@
   Composite comp;
   private Stack stateStack;
 
+  private native void initStateUnlocked(GtkComponentPeer component);
   private native void initState(GtkComponentPeer component);
   private native void initState(int width, int height);
   private native void initState(int[] pixes, int width, int height);
   private native void copyState(GdkGraphics2D g);
   public native void dispose();
   private native void cairoSurfaceSetFilter(int filter);
+  private native void cairoSurfaceSetFilterUnlocked(int filter);
   native void connectSignals(GtkComponentPeer component);
 
   public void finalize()
@@ -236,6 +238,21 @@
     stateStack = new Stack();
   }
 
+  void initComponentGraphics2DUnlocked()
+  {
+    initStateUnlocked(component);
+
+    setColorUnlocked(component.awtComponent.getForeground());
+    setBackgroundUnlocked(component.awtComponent.getBackground());
+    setPaintUnlocked(getColorUnlocked());
+    setTransformUnlocked(new AffineTransform());
+    setStrokeUnlocked(new BasicStroke());
+    setRenderingHintsUnlocked(getDefaultHints());
+    setFontUnlocked(new Font("SansSerif", Font.PLAIN, 12));
+
+    stateStack = new Stack();
+  }
+
   GdkGraphics2D(BufferedImage bimage)
   {
     this.bimage = bimage;
@@ -280,25 +297,37 @@
   // drawing utility methods
   private native void drawPixels(int[] pixels, int w, int h, int stride,
                                  double[] i2u);
+  private native void setTexturePixelsUnlocked(int[] pixels, int w, int h, int 
stride);
   private native void setTexturePixels(int[] pixels, int w, int h, int stride);
   private native void setGradient(double x1, double y1, double x2, double y2,
                                   int r1, int g1, int b1, int a1, int r2,
                                   int g2, int b2, int a2, boolean cyclic);
+  private native void setGradientUnlocked(double x1, double y1, double x2, 
double y2,
+                                  int r1, int g1, int b1, int a1, int r2,
+                                  int g2, int b2, int a2, boolean cyclic);
 
   // simple passthroughs to cairo
   private native void cairoSave();
   private native void cairoRestore();
   private native void cairoSetMatrix(double[] m);
+  private native void cairoSetMatrixUnlocked(double[] m);
   private native void cairoSetOperator(int cairoOperator);
   private native void cairoSetRGBAColor(double red, double green,
                                         double blue, double alpha);
+  private native void cairoSetRGBAColorUnlocked(double red, double green,
+                                        double blue, double alpha);
   private native void cairoSetFillRule(int cairoFillRule);
   private native void cairoSetLineWidth(double width);
+  private native void cairoSetLineWidthUnlocked(double width);
   private native void cairoSetLineCap(int cairoLineCap);
+  private native void cairoSetLineCapUnlocked(int cairoLineCap);
   private native void cairoSetLineJoin(int cairoLineJoin);
+  private native void cairoSetLineJoinUnlocked(int cairoLineJoin);
   private native void cairoSetDash(double[] dashes, int ndash, double offset);
+  private native void cairoSetDashUnlocked(double[] dashes, int ndash, double 
offset);
 
   private native void cairoSetMiterLimit(double limit);
+  private native void cairoSetMiterLimitUnlocked(double limit);
   private native void cairoNewPath();
   private native void cairoMoveTo(double x, double y);
   private native void cairoLineTo(double x, double y);
@@ -689,6 +718,49 @@
       throw new java.lang.UnsupportedOperationException();
   }
 
+  public void setPaintUnlocked(Paint p)
+  {
+    if (paint == null)
+      return;
+
+    paint = p;
+    if (paint instanceof Color)
+      {
+        setColorUnlocked((Color) paint);
+      }
+    else if (paint instanceof TexturePaint)
+      {
+       TexturePaint tp = (TexturePaint) paint;
+       BufferedImage img = tp.getImage();
+
+       // map the image to the anchor rectangle  
+       int width = (int) tp.getAnchorRect().getWidth();
+       int height = (int) tp.getAnchorRect().getHeight();
+
+       double scaleX = width / (double) img.getWidth();
+       double scaleY = width / (double) img.getHeight();
+
+       AffineTransform at = new AffineTransform(scaleX, 0, 0, scaleY, 0, 0);
+       AffineTransformOp op = new AffineTransformOp(at, getRenderingHints());
+       BufferedImage texture = op.filter(img, null);
+       int[] pixels = texture.getRGB(0, 0, width, height, null, 0, width);
+       setTexturePixelsUnlocked(pixels, width, height, width);
+      }
+    else if (paint instanceof GradientPaint)
+      {
+       GradientPaint gp = (GradientPaint) paint;
+       Point2D p1 = gp.getPoint1();
+       Point2D p2 = gp.getPoint2();
+       Color c1 = gp.getColor1();
+       Color c2 = gp.getColor2();
+       setGradientUnlocked(p1.getX(), p1.getY(), p2.getX(), p2.getY(), 
c1.getRed(),
+                   c1.getGreen(), c1.getBlue(), c1.getAlpha(), c2.getRed(),
+                   c2.getGreen(), c2.getBlue(), c2.getAlpha(), gp.isCyclic());
+      }
+    else
+      throw new java.lang.UnsupportedOperationException();
+  }
+
   public void setTransform(AffineTransform tx)
   {
     transform = tx;
@@ -700,6 +772,17 @@
       }
   }
 
+  public void setTransformUnlocked(AffineTransform tx)
+  {
+    transform = tx;
+    if (transform != null)
+      {
+       double[] m = new double[6];
+       transform.getMatrix(m);
+       cairoSetMatrixUnlocked(m);
+      }
+  }
+
   public void transform(AffineTransform tx)
   {
     if (transform == null)
@@ -787,6 +870,28 @@
       }
   }
 
+  public void setStrokeUnlocked(Stroke st)
+  {
+    stroke = st;
+    if (stroke instanceof BasicStroke)
+      {
+       BasicStroke bs = (BasicStroke) stroke;
+       cairoSetLineCapUnlocked(bs.getEndCap());
+       cairoSetLineWidthUnlocked(bs.getLineWidth());
+       cairoSetLineJoinUnlocked(bs.getLineJoin());
+       cairoSetMiterLimitUnlocked(bs.getMiterLimit());
+       float[] dashes = bs.getDashArray();
+       if (dashes != null)
+         {
+           double[] double_dashes = new double[dashes.length];
+           for (int i = 0; i < dashes.length; i++)
+             double_dashes[i] = dashes[i];
+           cairoSetDashUnlocked(double_dashes, double_dashes.length,
+                                 (double) bs.getDashPhase());
+         }
+      }
+  }
+
   ////////////////////////////////////////////////
   ////// Implementation of Graphics Methods //////
   ////////////////////////////////////////////////
@@ -812,11 +917,27 @@
                       fg.getBlue() / 255.0, fg.getAlpha() / 255.0);
   }
 
+  public void setColorUnlocked(Color c)
+  {
+    if (c == null)
+      c = Color.BLACK;
+
+    fg = c;
+    paint = c;
+    cairoSetRGBAColorUnlocked(fg.getRed() / 255.0, fg.getGreen() / 255.0,
+                      fg.getBlue() / 255.0, fg.getAlpha() / 255.0);
+  }
+
   public Color getColor()
   {
     return fg;
   }
 
+  public Color getColorUnlocked()
+  {
+    return getColor();
+  }
+
   public void clipRect(int x, int y, int width, int height)
   {
     clip(new Rectangle(x, y, width, height));
@@ -929,6 +1050,11 @@
     bg = c;
   }
 
+  public void setBackgroundUnlocked(Color c)
+  {
+    setBackground(c);
+  }
+
   public Color getBackground()
   {
     return bg;
@@ -1180,6 +1306,36 @@
                      || 
hints.containsValue(RenderingHints.VALUE_STROKE_DEFAULT);
   }
 
+  public void setRenderingHintsUnlocked(Map hints)
+  {
+    this.hints = new RenderingHints(getDefaultHints());
+    this.hints.add(new RenderingHints(hints));
+
+    if (hints.containsKey(RenderingHints.KEY_INTERPOLATION))
+      {
+       if 
(hints.containsValue(RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR))
+         cairoSurfaceSetFilterUnlocked(0);
+
+       else if 
(hints.containsValue(RenderingHints.VALUE_INTERPOLATION_BILINEAR))
+         cairoSurfaceSetFilterUnlocked(1);
+      }
+
+    if (hints.containsKey(RenderingHints.KEY_ALPHA_INTERPOLATION))
+      {
+       if (hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED))
+         cairoSurfaceSetFilterUnlocked(2);
+
+       else if 
(hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY))
+         cairoSurfaceSetFilterUnlocked(3);
+
+       else if 
(hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT))
+         cairoSurfaceSetFilterUnlocked(4);
+      }
+
+    shiftDrawCalls = hints.containsValue(RenderingHints.VALUE_STROKE_NORMALIZE)
+                     || 
hints.containsValue(RenderingHints.VALUE_STROKE_DEFAULT);
+  }
+
   public void addRenderingHints(Map hints)
   {
     this.hints.add(new RenderingHints(hints));
@@ -1441,6 +1597,11 @@
       font = 
         ((ClasspathToolkit)(Toolkit.getDefaultToolkit()))
         .getFont(f.getName(), f.getAttributes());    
+  }
+
+  public void setFontUnlocked(Font f)
+  {
+    setFont (f);
   }
 
   public String toString()
Index: gnu/java/awt/peer/gtk/GdkPixbufDecoder.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java,v
retrieving revision 1.15
diff -u -r1.15 GdkPixbufDecoder.java
--- gnu/java/awt/peer/gtk/GdkPixbufDecoder.java 4 Jul 2005 18:07:44 -0000       
1.15
+++ gnu/java/awt/peer/gtk/GdkPixbufDecoder.java 18 Aug 2005 01:14:39 -0000
@@ -122,7 +122,7 @@
     super (imagedata, imageoffset, imagelength);
   }
 
-  // called back by native side
+  // called back by native side: area_prepared_cb
   void areaPrepared (int width, int height)
   {
 
@@ -138,7 +138,7 @@
       }
   }
   
-  // called back by native side
+  // called back by native side: area_updated_cb
   void areaUpdated (int x, int y, int width, int height, 
                     int pixels[], int scansize)
   {
Index: gnu/java/awt/peer/gtk/GtkCheckboxPeer.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java,v
retrieving revision 1.21
diff -u -r1.21 GtkCheckboxPeer.java
--- gnu/java/awt/peer/gtk/GtkCheckboxPeer.java  2 Jul 2005 20:32:12 -0000       
1.21
+++ gnu/java/awt/peer/gtk/GtkCheckboxPeer.java  18 Aug 2005 01:14:39 -0000
@@ -49,6 +49,7 @@
   public GtkCheckboxGroupPeer old_group;
   // The current state of the GTK checkbox.
   private boolean currentState;  
+  private boolean changing = false;
 
   public native void create (GtkCheckboxGroupPeer group);
   public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group);
@@ -76,6 +77,15 @@
 
   public void setState (boolean state)
   {
+    // prevent item_toggled_cb -> postItemEvent ->
+    // awtComponent.setState -> this.setState ->
+    // gtkToggleButtonSetActive self-deadlock on the GDK lock.
+    if (changing && Thread.currentThread() == GtkToolkit.mainThread)
+      {
+        changing = false;
+        return;
+      }
+
     if (currentState != state)
       gtkToggleButtonSetActive (state);
   }
@@ -100,6 +110,7 @@
 
   // Override the superclass postItemEvent so that the peer doesn't
   // need information that we have.
+  // called back by native side: item_toggled_cb
   public void postItemEvent (Object item, int stateChange)
   {
     Checkbox currentCheckBox = ((Checkbox)awtComponent);
@@ -113,6 +124,7 @@
     {
       super.postItemEvent (awtComponent, stateChange);
       currentState = !currentCheckBox.getState();
+      changing = true;
       currentCheckBox.setState(currentState);
     }
   }
Index: gnu/java/awt/peer/gtk/GtkFileDialogPeer.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java,v
retrieving revision 1.25
diff -u -r1.25 GtkFileDialogPeer.java
--- gnu/java/awt/peer/gtk/GtkFileDialogPeer.java        17 Aug 2005 04:35:44 
-0000      1.25
+++ gnu/java/awt/peer/gtk/GtkFileDialogPeer.java        18 Aug 2005 01:14:39 
-0000
@@ -62,6 +62,8 @@
   public native void nativeSetDirectory(String directory);
   native void nativeSetFilenameFilter (FilenameFilter filter);
 
+  private boolean hiding = false;
+
   public void create()
   {
     create((GtkContainerPeer) awtComponent.getParent().getPeer());
@@ -156,6 +158,7 @@
      GtkFileFilterInfo object and send it to this method, which will
      in turn call the filter's accept() method and give back the return
      value. */
+  // called back by native side: filename_filter_cb
   boolean filenameFilterCallback (String fullname) {
     String filename = fullname.substring(fullname.lastIndexOf(FS) + 1);
     String dirname = fullname.substring(0, fullname.lastIndexOf(FS));
@@ -169,19 +172,37 @@
     return null;
   }
   
+  public void setVisible (boolean b)
+  {
+    // prevent handle_response_cb -> postItemEvent -> awtComponent.setState -> 
this.setState
+    // -> gtkToggleButtonSetActive self-deadlock on the GDK lock.
+    if (hiding && Thread.currentThread() == GtkToolkit.mainThread)
+      {
+        setVisibleUnlocked (b);
+        hiding = false;
+      }
+    else
+      super.setVisible (b);
+  }
+
+  // called back by native side: handle_response_cb
   void gtkHideFileDialog () 
   {
+    // hide calls back the peer's setVisible method, so locking is a
+    // problem.
+    hiding = true;
     ((Dialog) awtComponent).hide();
   }
   
+  // called back by native side: handle_response_cb
   void gtkDisposeFileDialog () 
   {
     ((Dialog) awtComponent).dispose();
   }
 
-  /* Callback to set the file and directory values when the user is finished
-   * with the dialog.
-   */
+  // Callback to set the file and directory values when the user is finished
+  // with the dialog.
+  // called back by native side: handle_response_cb
   void gtkSetFilename (String fileName)
   {
     FileDialog fd = (FileDialog) awtWidget;
Index: gnu/java/awt/peer/gtk/GtkFramePeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkFramePeer.java,v
retrieving revision 1.38
diff -u -r1.38 GtkFramePeer.java
--- gnu/java/awt/peer/gtk/GtkFramePeer.java     17 Aug 2005 04:24:38 -0000      
1.38
+++ gnu/java/awt/peer/gtk/GtkFramePeer.java     18 Aug 2005 01:14:39 -0000
@@ -56,11 +56,14 @@
   private int menuBarHeight;
   private MenuBarPeer menuBar;
   native int getMenuBarHeight (MenuBarPeer bar);
+  native void setMenuBarWidthUnlocked (MenuBarPeer bar, int width);
   native void setMenuBarWidth (MenuBarPeer bar, int width);
   native void setMenuBarPeer (MenuBarPeer bar);
   native void removeMenuBarPeer ();
   native void gtkFixedSetVisible (boolean visible);
 
+  private boolean resizing = false;
+
   int getMenuBarHeight ()
   {
     return menuBar == null ? 0 : getMenuBarHeight (menuBar);
@@ -118,6 +121,18 @@
 
   public void setBounds (int x, int y, int width, int height)
   {
+    // prevent window_configure_cb -> awtComponent.setSize ->
+    // peer.setBounds -> nativeSetBounds self-deadlock on GDK lock.
+    if (resizing && Thread.currentThread() == GtkToolkit.mainThread)
+      {
+        int menuBarWidth = width - insets.left - insets.right;
+        if (menuBar != null && menuBarWidth > 0)
+          setMenuBarWidthUnlocked (menuBar, menuBarWidth);
+
+        resizing = false;
+        return;
+      }
+
     int menuBarWidth = width - insets.left - insets.right;
     if (menuBar != null && menuBarWidth > 0)
       setMenuBarWidth (menuBar, menuBarWidth);
@@ -200,7 +215,10 @@
 
     if (frame_width != awtComponent.getWidth()
         || frame_height != awtComponent.getHeight())
-      awtComponent.setSize(frame_width, frame_height);
+      {
+        resizing = true;
+        awtComponent.setSize(frame_width, frame_height);
+      }
 
     int frame_x = x - insets.left;
     // Likewise, since insets.top includes the MenuBar height, we need
Index: gnu/java/awt/peer/gtk/GtkToolkit.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkToolkit.java,v
retrieving revision 1.74
diff -u -r1.74 GtkToolkit.java
--- gnu/java/awt/peer/gtk/GtkToolkit.java       16 Aug 2005 18:16:26 -0000      
1.74
+++ gnu/java/awt/peer/gtk/GtkToolkit.java       18 Aug 2005 01:14:39 -0000
@@ -90,6 +90,7 @@
   static EventQueue q;
   static boolean useGraphics2dSet;
   static boolean useGraphics2d;
+  static Thread mainThread;
 
   public static boolean useGraphics2D()
   {
@@ -124,13 +125,14 @@
     // Register ImageIO SPIs
     GdkPixbufDecoder.registerSpis( IIORegistry.getDefaultInstance() );
 
-    new Thread ("GTK main thread")
-    {
-      public void run ()
+    mainThread = new Thread ("GTK main thread")
       {
-       gtkMain ();
-      }
-    }.start ();
+        public void run ()
+        {
+          gtkMain ();
+        }
+      };
+    mainThread.start ();
   }
 
   public GtkToolkit ()
Index: gnu/java/awt/peer/gtk/GtkWindowPeer.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkWindowPeer.java,v
retrieving revision 1.37
diff -u -r1.37 GtkWindowPeer.java
--- gnu/java/awt/peer/gtk/GtkWindowPeer.java    17 Aug 2005 04:24:38 -0000      
1.37
+++ gnu/java/awt/peer/gtk/GtkWindowPeer.java    18 Aug 2005 01:14:39 -0000
@@ -60,6 +60,8 @@
   private boolean hasBeenShown = false;
   private int oldState = Frame.NORMAL;
 
+  private boolean resizing = false;
+
   native void gtkWindowSetTitle (String title);
   native void gtkWindowSetResizable (boolean resizable);
   native void gtkWindowSetModal (boolean modal);
@@ -116,14 +118,29 @@
   public native void toFront();
 
   native void nativeSetBounds (int x, int y, int width, int height);
+  native void nativeSetBoundsUnlocked (int x, int y, int width, int height);
 
   public void setBounds (int x, int y, int width, int height)
   {
+    // prevent window_configure_cb -> awtComponent.setSize ->
+    // peer.setBounds -> nativeSetBounds self-deadlock on GDK lock.
+    if (resizing && Thread.currentThread() == GtkToolkit.mainThread)
+      {
+        resizing = false;
+        return;
+      }
     nativeSetBounds (x, y,
                     width - insets.left - insets.right,
                     height - insets.top - insets.bottom);
   }
 
+  public void setBoundsUnlocked (int x, int y, int width, int height)
+  {
+    nativeSetBoundsUnlocked (x, y,
+                             width - insets.left - insets.right,
+                             height - insets.top - insets.bottom);
+  }
+
   public void setTitle (String title)
   {
     gtkWindowSetTitle (title);
@@ -157,7 +174,10 @@
 
     if (frame_width != awtComponent.getWidth()
        || frame_height != awtComponent.getHeight())
-      awtComponent.setSize(frame_width, frame_height);
+      {
+        resizing = true;
+        awtComponent.setSize(frame_width, frame_height);
+      }
 
     int frame_x = x - insets.left;
     int frame_y = y - insets.top;
@@ -180,6 +200,19 @@
                 awtComponent.getWidth(),
                 awtComponent.getHeight());
     nativeSetVisible (b);
+  }
+
+  native void nativeSetVisibleUnlocked (boolean b);
+  public void setVisibleUnlocked (boolean b)
+  {
+    // Prevent the window manager from automatically placing this
+    // window when it is shown.
+    if (b)
+      setBoundsUnlocked (awtComponent.getX(),
+                         awtComponent.getY(),
+                         awtComponent.getWidth(),
+                         awtComponent.getHeight());
+    nativeSetVisibleUnlocked (b);
   }
 
   void postWindowEvent (int id, Window opposite, int newState)
Index: include/gnu_java_awt_peer_gtk_GdkGraphics.h
===================================================================
RCS file: 
/cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GdkGraphics.h,v
retrieving revision 1.13
diff -u -r1.13 gnu_java_awt_peer_gtk_GdkGraphics.h
--- include/gnu_java_awt_peer_gtk_GdkGraphics.h 26 Jul 2005 20:25:13 -0000      
1.13
+++ include/gnu_java_awt_peer_gtk_GdkGraphics.h 18 Aug 2005 01:14:39 -0000
@@ -12,6 +12,7 @@
 
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initStaticState 
(JNIEnv *env, jclass);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2
 (JNIEnv *env, jobject, jobject);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics_initStateUnlocked (JNIEnv *env, jobject, 
jobject);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__II 
(JNIEnv *env, jobject, jint, jint);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initFromImage 
(JNIEnv *env, jobject, jobject);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_copyState 
(JNIEnv *env, jobject, jobject);
Index: include/gnu_java_awt_peer_gtk_GdkGraphics2D.h
===================================================================
RCS file: 
/cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GdkGraphics2D.h,v
retrieving revision 1.8
diff -u -r1.8 gnu_java_awt_peer_gtk_GdkGraphics2D.h
--- include/gnu_java_awt_peer_gtk_GdkGraphics2D.h       8 Jun 2005 21:19:25 
-0000       1.8
+++ include/gnu_java_awt_peer_gtk_GdkGraphics2D.h       18 Aug 2005 01:14:42 
-0000
@@ -11,28 +11,39 @@
 #endif
 
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initStaticState (JNIEnv *env, jclass);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initStateUnlocked (JNIEnv *env, 
jobject, jobject);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2
 (JNIEnv *env, jobject, jobject);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__II 
(JNIEnv *env, jobject, jint, jint);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState___3III (JNIEnv *env, 
jobject, jintArray, jint, jint);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState 
(JNIEnv *env, jobject, jobject);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose 
(JNIEnv *env, jobject);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilter (JNIEnv *env, 
jobject, jint);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilterUnlocked (JNIEnv 
*env, jobject, jint);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_connectSignals 
(JNIEnv *env, jobject, jobject);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable (JNIEnv *env, jobject, 
jobject, jint, jint);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels 
(JNIEnv *env, jobject, jintArray, jint, jint, jint, jdoubleArray);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixelsUnlocked (JNIEnv *env, 
jobject, jintArray, jint, jint, jint);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels (JNIEnv *env, 
jobject, jintArray, jint, jint, jint);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradient 
(JNIEnv *env, jobject, jdouble, jdouble, jdouble, jdouble, jint, jint, jint, 
jint, jint, jint, jint, jint, jboolean);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradientUnlocked (JNIEnv *env, 
jobject, jdouble, jdouble, jdouble, jdouble, jint, jint, jint, jint, jint, 
jint, jint, jint, jboolean);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSave 
(JNIEnv *env, jobject);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRestore 
(JNIEnv *env, jobject);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix 
(JNIEnv *env, jobject, jdoubleArray);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrixUnlocked (JNIEnv *env, 
jobject, jdoubleArray);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator (JNIEnv *env, 
jobject, jint);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBAColor (JNIEnv *env, 
jobject, jdouble, jdouble, jdouble, jdouble);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBAColorUnlocked (JNIEnv 
*env, jobject, jdouble, jdouble, jdouble, jdouble);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFillRule (JNIEnv *env, 
jobject, jint);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidth (JNIEnv *env, 
jobject, jdouble);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidthUnlocked (JNIEnv 
*env, jobject, jdouble);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap (JNIEnv *env, jobject, 
jint);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCapUnlocked (JNIEnv *env, 
jobject, jint);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin (JNIEnv *env, 
jobject, jint);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoinUnlocked (JNIEnv *env, 
jobject, jint);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash 
(JNIEnv *env, jobject, jdoubleArray, jint, jdouble);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDashUnlocked (JNIEnv *env, 
jobject, jdoubleArray, jint, jdouble);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimit (JNIEnv *env, 
jobject, jdouble);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimitUnlocked (JNIEnv 
*env, jobject, jdouble);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoNewPath 
(JNIEnv *env, jobject);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoMoveTo 
(JNIEnv *env, jobject, jdouble, jdouble);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoLineTo 
(JNIEnv *env, jobject, jdouble, jdouble);
Index: include/gnu_java_awt_peer_gtk_GtkFramePeer.h
===================================================================
RCS file: 
/cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkFramePeer.h,v
retrieving revision 1.10
diff -u -r1.10 gnu_java_awt_peer_gtk_GtkFramePeer.h
--- include/gnu_java_awt_peer_gtk_GtkFramePeer.h        2 Jun 2005 13:18:10 
-0000       1.10
+++ include/gnu_java_awt_peer_gtk_GtkFramePeer.h        18 Aug 2005 01:14:42 
-0000
@@ -11,6 +11,7 @@
 #endif
 
 JNIEXPORT jint JNICALL 
Java_gnu_java_awt_peer_gtk_GtkFramePeer_getMenuBarHeight (JNIEnv *env, jobject, 
jobject);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarWidthUnlocked (JNIEnv *env, 
jobject, jobject, jint);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarWidth 
(JNIEnv *env, jobject, jobject, jint);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarPeer 
(JNIEnv *env, jobject, jobject);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GtkFramePeer_removeMenuBarPeer (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.16
diff -u -r1.16 gnu_java_awt_peer_gtk_GtkWindowPeer.h
--- include/gnu_java_awt_peer_gtk_GtkWindowPeer.h       17 Aug 2005 04:24:38 
-0000      1.16
+++ include/gnu_java_awt_peer_gtk_GtkWindowPeer.h       18 Aug 2005 01:14:42 
-0000
@@ -19,8 +19,10 @@
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toBack (JNIEnv 
*env, jobject);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toFront 
(JNIEnv *env, jobject);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBounds (JNIEnv *env, jobject, 
jint, jint, jint, jint);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBoundsUnlocked (JNIEnv *env, 
jobject, jint, jint, jint, jint);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setSize 
(JNIEnv *env, jobject, jint, jint);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible (JNIEnv *env, 
jobject, jboolean);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisibleUnlocked (JNIEnv *env, 
jobject, jboolean);
 #undef gnu_java_awt_peer_gtk_GtkWindowPeer_GDK_WINDOW_TYPE_HINT_NORMAL
 #define gnu_java_awt_peer_gtk_GtkWindowPeer_GDK_WINDOW_TYPE_HINT_NORMAL 0L
 #undef gnu_java_awt_peer_gtk_GtkWindowPeer_GDK_WINDOW_TYPE_HINT_DIALOG
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.27
diff -u -r1.27 gnu_java_awt_peer_gtk_GdkGraphics.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c     26 Jul 2005 
20:25:13 -0000      1.27
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c     18 Aug 2005 
01:14:42 -0000
@@ -41,7 +41,7 @@
 #include <gdk/gdkprivate.h>
 #include <gdk/gdkx.h>
 
-static jmethodID initComponentGraphicsID;
+static jmethodID initComponentGraphicsUnlockedID;
 
 void
 cp_gtk_graphics_init_jni (void)
@@ -51,9 +51,10 @@
   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");
+  initComponentGraphicsUnlockedID =
+    (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gdkgraphics,
+                                      "initComponentGraphicsUnlocked",
+                                      "()V");
 }
 
 struct state_table *cp_gtk_native_graphics_state_table;
@@ -175,10 +176,8 @@
   gdk_threads_leave ();
 }
 
-/* copy the native state of the peer (GtkWidget *) to the native state
-   of the graphics object */
 JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2
+Java_gnu_java_awt_peer_gtk_GdkGraphics_initStateUnlocked
   (JNIEnv *env, jobject obj, jobject peer)
 {
   struct graphics *g = NULL;
@@ -186,8 +185,6 @@
   GtkWidget *widget = NULL;
   GdkColor color;
 
-  gdk_threads_enter ();
-
   g = (struct graphics *) g_malloc (sizeof (struct graphics));
   ptr = NSA_GET_PTR (env, peer);
   g->x_offset = 0;
@@ -204,7 +201,17 @@
   color = widget->style->fg[GTK_STATE_NORMAL];
 
   NSA_SET_G_PTR (env, obj, g);
+}
 
+/* copy the native state of the peer (GtkWidget *) to the native state
+   of the graphics object */
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2
+  (JNIEnv *env, jobject obj, jobject peer)
+{
+  gdk_threads_enter ();
+  Java_gnu_java_awt_peer_gtk_GdkGraphics_initStateUnlocked
+    (env, obj, peer);
   gdk_threads_leave ();
 }
 
@@ -666,11 +673,9 @@
 static void
 realize_cb (GtkWidget *widget __attribute__ ((unused)), jobject jgraphics)
 {
-  gdk_threads_leave ();
-
-  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), jgraphics, 
initComponentGraphicsID);
+  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(),
+                                       jgraphics,
+                                       initComponentGraphicsUnlockedID);
 
   NSA_DEL_GLOBAL_G_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.31
diff -u -r1.31 gnu_java_awt_peer_gtk_GdkGraphics2D.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c   14 Jul 2005 
22:07:02 -0000      1.31
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c   18 Aug 2005 
01:14:42 -0000
@@ -52,7 +52,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-static jmethodID initComponentGraphics2DID;
+static jmethodID initComponentGraphics2DUnlockedID;
 
 void
 cp_gtk_graphics2d_init_jni (void)
@@ -62,8 +62,8 @@
   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",
+  initComponentGraphics2DUnlockedID = (*cp_gtk_gdk_env())->GetMethodID 
(cp_gtk_gdk_env(), gdkgraphics2d,
+                                                         
"initComponentGraphics2DUnlocked",
                                                          "()V");
 }
 
@@ -369,11 +369,9 @@
 static void
 realize_cb (GtkWidget *widget __attribute__ ((unused)), jobject peer)
 {
-  gdk_threads_leave ();
-
-  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, 
initComponentGraphics2DID);
-
-  gdk_threads_enter ();
+  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(),
+                                       peer,
+                                       initComponentGraphics2DUnlockedID);
 }
 
 JNIEXPORT void JNICALL
@@ -593,6 +591,43 @@
 }
 
 JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initStateUnlocked
+  (JNIEnv *env, jobject obj, jobject peer)
+{
+  struct graphics2d *gr = NULL;
+  GtkWidget *widget = NULL;
+  void *ptr = NULL;
+
+  if (peer_is_disposed(env, obj))
+    return;
+
+  ptr = NSA_GET_PTR (env, peer);
+  g_assert (ptr != NULL);
+
+  gr = (struct graphics2d *) g_malloc (sizeof (struct graphics2d));
+  g_assert (gr != NULL);
+  memset (gr, 0, sizeof(struct graphics2d));
+
+  check_for_debug (gr);
+
+  widget = GTK_WIDGET (ptr);
+  g_assert (widget != NULL);
+
+  grab_current_drawable (widget, &(gr->drawable), &(gr->win));
+  g_assert (gr->drawable != NULL);
+
+  gr->width = widget->allocation.width;
+  gr->height = widget->allocation.height;
+
+  if (x_server_has_render_extension ())
+    init_graphics2d_as_renderable (gr);
+  else
+    init_graphics2d_as_pixbuf (gr);
+
+  NSA_SET_G2D_PTR (env, obj, gr);
+}
+
+JNIEXPORT void JNICALL
 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2
   (JNIEnv *env, jobject obj, jobject peer)
 {
@@ -711,21 +746,36 @@
    jint r2, jint g2, jint b2, jint a2,
    jboolean cyclic)
 {
+  gdk_threads_enter();
+  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradientUnlocked
+    (env, obj,
+     x1, y1, x2, y2,
+     r1, g1, b1, a1,
+     r2, g2, b2, a2,
+     cyclic);
+
+  gdk_threads_leave();
+}
+  
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradientUnlocked
+  (JNIEnv *env, jobject obj, 
+   jdouble x1, jdouble y1, 
+   jdouble x2, jdouble y2,
+   jint r1, jint g1, jint b1, jint a1,
+   jint r2, jint g2, jint b2, jint a2,
+   jboolean cyclic)
+{
   struct graphics2d *gr = NULL;
   cairo_surface_t *surf = NULL;
   cairo_t *cr2 = NULL;
   cairo_matrix_t mat;
 
-  gdk_threads_enter();
-
   gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
   g_assert (gr != NULL);
 
   if (peer_is_disposed(env, obj))
-    {
-      gdk_threads_leave ();
-      return;
-    }
+    return;
 
   if (gr->debug) printf ("setGradient (%f,%f) -> (%f,%f); (%d,%d,%d,%d) -> 
(%d,%d,%d,%d)\n",
                         x1, y1, 
@@ -826,24 +876,29 @@
   gr->pattern = cairo_pattern_create_for_surface(surf);
 
   cairo_set_source (gr->cr, gr->pattern);
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels 
+  (JNIEnv *env, jobject obj, jintArray jarr, jint w, jint h, jint stride)
+{
+  gdk_threads_enter();
+
+  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixelsUnlocked
+    (env, obj, jarr, w, h, stride);
 
   gdk_threads_leave();
 }
 
 JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels 
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixelsUnlocked
   (JNIEnv *env, jobject obj, jintArray jarr, jint w, jint h, jint stride)
 {
   struct graphics2d *gr = NULL;
   jint *jpixels = NULL;
 
-  gdk_threads_enter();
-
   if (peer_is_disposed(env, obj))
-    {
-      gdk_threads_leave ();
-      return;
-    }
+    return;
 
   gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
   g_assert (gr != NULL);
@@ -880,8 +935,6 @@
   gr->pattern = cairo_pattern_create_for_surface (gr->pattern_surface);
   g_assert (gr->pattern != NULL);
   cairo_set_source (gr->cr, gr->pattern);
-
-  gdk_threads_leave();
 }
 
 JNIEXPORT void JNICALL
@@ -996,26 +1049,30 @@
 Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix 
    (JNIEnv *env, jobject obj, jdoubleArray java_matrix)
 {
+  gdk_threads_enter();
+
+  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrixUnlocked
+    (env, obj, java_matrix);
+
+  gdk_threads_leave();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrixUnlocked
+   (JNIEnv *env, jobject obj, jdoubleArray java_matrix)
+{
   struct graphics2d *gr = NULL;
   jdouble *native_matrix = NULL;
 
-  gdk_threads_enter();
-
   if (peer_is_disposed(env, obj))
-    {
-      gdk_threads_leave ();
-      return;
-    }
+    return;
 
   gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
 
   /* cairoSetMatrix was called before this graphics object's component
      was realized. */
   if (gr == NULL)
-    {
-      gdk_threads_leave ();
-      return;
-    }
+    return;
 
   native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);  
   g_assert (native_matrix != NULL);
@@ -1039,8 +1096,6 @@
 
   (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
   update_pattern_transform (gr);
-
-  gdk_threads_leave();
 }
 
 static void
@@ -1357,15 +1412,22 @@
 Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBAColor 
    (JNIEnv *env, jobject obj, jdouble r, jdouble g, jdouble b, jdouble a)
 {
-  struct graphics2d *gr = NULL;
-
   gdk_threads_enter();
 
+  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBAColorUnlocked
+    (env, obj, r, g, b, a);
+
+  gdk_threads_leave();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBAColorUnlocked
+   (JNIEnv *env, jobject obj, jdouble r, jdouble g, jdouble b, jdouble a)
+{
+  struct graphics2d *gr = NULL;
+
   if (peer_is_disposed(env, obj))
-    {
-      gdk_threads_leave ();
-      return;
-    }
+    return;
 
   gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
   g_assert (gr != NULL);
@@ -1381,8 +1443,6 @@
     cairo_set_source_rgba (gr->cr, b, g, r, a);
   else
     cairo_set_source_rgba (gr->cr, r, g, b, a);
-
-  gdk_threads_leave();
 }
 
 JNIEXPORT void JNICALL
@@ -1419,10 +1479,20 @@
 Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidth 
    (JNIEnv *env, jobject obj, jdouble width)
 {
-  struct graphics2d *gr = NULL;
-
   gdk_threads_enter();
 
+  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidthUnlocked
+    (env, obj, width);
+
+  gdk_threads_leave();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidthUnlocked
+   (JNIEnv *env, jobject obj, jdouble width)
+{
+  struct graphics2d *gr = NULL;
+
   if (peer_is_disposed(env, obj))
     return;
 
@@ -1430,23 +1500,28 @@
   g_assert (gr != NULL);
   if (gr->debug) printf ("cairo_set_line_width %f\n", width);
   cairo_set_line_width (gr->cr, width);
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap 
+   (JNIEnv *env, jobject obj, jint cap)
+{
+  gdk_threads_enter();
+
+  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCapUnlocked
+    (env, obj, cap);
 
   gdk_threads_leave();
 }
 
 JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap 
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCapUnlocked
    (JNIEnv *env, jobject obj, jint cap)
 {
   struct graphics2d *gr = NULL;
 
-  gdk_threads_enter();
-
   if (peer_is_disposed(env, obj))
-    {
-      gdk_threads_leave ();
-      return;
-    }
+    return;
 
   gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
   g_assert (gr != NULL);
@@ -1465,23 +1540,28 @@
       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_SQUARE);
       break;
     }
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin
+   (JNIEnv *env, jobject obj, jint join)
+{
+  gdk_threads_enter();
+
+  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoinUnlocked
+    (env, obj, join);
 
   gdk_threads_leave();
 }
 
 JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoinUnlocked
    (JNIEnv *env, jobject obj, jint join)
 {
   struct graphics2d *gr = NULL;
 
-  gdk_threads_enter();
-
   if (peer_is_disposed(env, obj))
-    {
-      gdk_threads_leave ();
-      return;
-    }
+    return;
 
   gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
   g_assert (gr != NULL);
@@ -1500,24 +1580,29 @@
       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_BEVEL);
       break;
     }
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash
+   (JNIEnv *env, jobject obj, jdoubleArray dashes, jint ndash, jdouble offset)
+{
+  gdk_threads_enter();
+
+  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDashUnlocked
+    (env, obj, dashes, ndash, offset);
 
   gdk_threads_leave();
 }
 
 JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash 
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDashUnlocked
    (JNIEnv *env, jobject obj, jdoubleArray dashes, jint ndash, jdouble offset)
 {
   struct graphics2d *gr = NULL;
   jdouble *dasharr = NULL;
 
-  gdk_threads_enter();
-
   if (peer_is_disposed(env, obj))
-    {
-      gdk_threads_leave ();
-      return;
-    }
+    return;
 
   gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
   g_assert (gr != NULL);
@@ -1526,30 +1611,33 @@
   g_assert (dasharr != NULL);
   cairo_set_dash (gr->cr, dasharr, ndash, offset);
   (*env)->ReleaseDoubleArrayElements (env, dashes, dasharr, 0);
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimit 
+   (JNIEnv *env, jobject obj, jdouble miter)
+{
+  gdk_threads_enter();
+
+  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimitUnlocked
+    (env, obj, miter);
 
   gdk_threads_leave();
 }
 
 JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimit 
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimitUnlocked
    (JNIEnv *env, jobject obj, jdouble miter)
 {
   struct graphics2d *gr = NULL;
 
-  gdk_threads_enter();
-
   if (peer_is_disposed(env, obj))
-    {
-      gdk_threads_leave ();
-      return;
-    }
+    return;
 
   gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
   g_assert (gr != NULL);
   if (gr->debug) printf ("cairo_set_miter_limit %f\n", miter);
   cairo_set_miter_limit (gr->cr, miter);
-
-  gdk_threads_leave();
 }
 
 JNIEXPORT void JNICALL
@@ -1845,15 +1933,22 @@
 Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilter
    (JNIEnv *env, jobject obj, jint filter)
 {
-  struct graphics2d *gr = NULL;   
-
   gdk_threads_enter();
 
+  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilterUnlocked
+    (env, obj, filter);
+
+  gdk_threads_leave();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilterUnlocked
+   (JNIEnv *env, jobject obj, jint filter)
+{
+  struct graphics2d *gr = NULL;   
+
   if (peer_is_disposed(env, obj))
-    {
-      gdk_threads_leave ();
-      return;
-    }
+    return;
 
   gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
   g_assert (gr != NULL);
@@ -1876,6 +1971,4 @@
       cairo_pattern_set_filter (gr->pattern, CAIRO_FILTER_BEST);
       break;
     }
-
-   gdk_threads_leave();
 }
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.18
diff -u -r1.18 gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c        14 Jul 
2005 22:07:02 -0000      1.18
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c        18 Aug 
2005 01:14:42 -0000
@@ -97,14 +97,10 @@
   e.jni_env = &env;
   (*vm)->GetEnv (vm, e.void_env, JNI_VERSION_1_1);
 
-  gdk_threads_leave ();
-
   (*env)->CallVoidMethod (env,
                          *decoder,
                          areaPreparedID,
                          width, height);
-  
-  gdk_threads_enter ();
 }
 
 static void
@@ -143,12 +139,8 @@
   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, 
@@ -165,8 +157,6 @@
 
   g_object_unref (pixbuf);
 
-  gdk_threads_leave ();
-
   (*env)->ReleaseIntArrayElements (env, jpixels, java_pixels, 0);
 
   (*env)->CallVoidMethod (env, 
@@ -178,8 +168,6 @@
                          stride_pixels);
 
   (*env)->DeleteLocalRef(env, jpixels);
-
-  gdk_threads_enter ();
 }
 
 static void
@@ -190,12 +178,8 @@
   e.jni_env = &env;
   (*vm)->GetEnv (vm, e.void_env, JNI_VERSION_1_1);
 
-  gdk_threads_leave ();
-
   (*env)->DeleteGlobalRef (env, *decoder); 
   g_free (decoder);
-
-  gdk_threads_enter ();
 }
 
 
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.28
diff -u -r1.28 gnu_java_awt_peer_gtk_GtkButtonPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c   15 Aug 2005 
04:14:29 -0000      1.28
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c   18 Aug 2005 
01:14:42 -0000
@@ -63,9 +63,6 @@
                                                   "postActionEvent", "(I)V");
 }
 
-static void block_expose_event_cb (GtkWidget *widget,
-                                   jobject peer);
-
 static void clicked_cb (GtkButton *button,
                        jobject peer);
 
@@ -160,12 +157,6 @@
   button = gtk_bin_get_child (GTK_BIN (ptr));
 
   /* 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);
-
   g_signal_connect (G_OBJECT (button), "clicked",
                    G_CALLBACK (clicked_cb), *gref);
 
@@ -376,26 +367,6 @@
     }
 
   gdk_threads_leave ();
-}
-
-static void
-block_expose_event_cb (GtkWidget *widget, jobject peer)
-{
-  gdk_threads_leave ();
-
-  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
-                                beginNativeRepaintID);
-
-  gdk_threads_enter ();
-
-  gdk_window_process_updates (widget->window, TRUE);
-
-  gdk_threads_leave ();
-
-  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
-                              endNativeRepaintID);
-
-  gdk_threads_enter ();
 }
 
 static void
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.19
diff -u -r1.19 gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 14 Jul 2005 
22:07:02 -0000      1.19
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 18 Aug 2005 
01:14:42 -0000
@@ -227,14 +227,10 @@
 static void
 item_toggled_cb (GtkToggleButton *item, jobject peer)
 {
-  gdk_threads_leave ();
-
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                 postItemEventID,
                                 peer,
                                 item->active ?
                                 (jint) AWT_ITEM_SELECTED :
                                 (jint) AWT_ITEM_DESELECTED);
-
-  gdk_threads_enter ();
 }
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.17
diff -u -r1.17 gnu_java_awt_peer_gtk_GtkChoicePeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c   14 Jul 2005 
22:07:02 -0000      1.17
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c   18 Aug 2005 
01:14:42 -0000
@@ -219,7 +219,8 @@
   return index;
 }
 
-static void selection_changed_cb (GtkComboBox *combobox, jobject peer)
+static void
+selection_changed_cb (GtkComboBox *combobox, jobject peer)
 {
   jstring label;
   GtkTreeModel *model;
@@ -236,13 +237,9 @@
       gtk_tree_model_get (model, &iter, 0, &selected, -1);
       label = (*cp_gtk_gdk_env())->NewStringUTF (cp_gtk_gdk_env(), selected);
 
-      gdk_threads_leave ();
-
       (*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.13
diff -u -r1.13 gnu_java_awt_peer_gtk_GtkClipboard.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c    16 Aug 2005 
18:16:27 -0000      1.13
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c    18 Aug 2005 
01:14:42 -0000
@@ -68,9 +68,9 @@
 static jstring filesTarget;
 
 static void
-cp_gtk_clipboard_owner_change (GtkClipboard *clipboard __attribute__((unused)),
-                              GdkEvent *event __attribute__((unused)),
-                              gpointer user_data __attribute__((unused)))
+cp_gtk_clipboard_owner_change_cb (GtkClipboard *clipboard 
__attribute__((unused)),
+                                  GdkEvent *event __attribute__((unused)),
+                                  gpointer user_data __attribute__((unused)))
 {
   /* These are only interesting when we are not the owner. Otherwise
      we will have the set and clear functions doing the updating. */
@@ -108,7 +108,7 @@
   if (gdk_display_supports_selection_notification (display))
     {
       g_signal_connect (clipboard, "owner-change",
-                       G_CALLBACK (cp_gtk_clipboard_owner_change), NULL);
+                       G_CALLBACK (cp_gtk_clipboard_owner_change_cb), NULL);
       gdk_display_request_selection_notification (display,
                                                  GDK_SELECTION_CLIPBOARD);
       can_cache = JNI_TRUE;
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.49
diff -u -r1.49 gnu_java_awt_peer_gtk_GtkComponentPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c        15 Aug 
2005 04:14:29 -0000      1.49
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c        18 Aug 
2005 01:14:42 -0000
@@ -940,8 +940,6 @@
   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, 
@@ -954,8 +952,6 @@
                                 (event->button == 3) ? JNI_TRUE :
                                 JNI_FALSE);
 
-  gdk_threads_enter ();
-
   hasBeenDragged = FALSE;
 
   return FALSE;
@@ -968,8 +964,6 @@
 {
   int width, height;
 
-  gdk_threads_leave ();
-
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                 postMouseEventID,
                                 AWT_MOUSE_RELEASED, 
@@ -981,8 +975,6 @@
                                 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. */
@@ -993,8 +985,6 @@
       && event->x <= width 
       && event->y <= height)
     {
-      gdk_threads_leave ();
-
       (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                     postMouseEventID,
                                     AWT_MOUSE_CLICKED, 
@@ -1005,8 +995,6 @@
                                     (jint)event->y, 
                                     click_count,
                                     JNI_FALSE);
-
-      gdk_threads_enter ();
     }
   return FALSE;
 }
@@ -1022,8 +1010,6 @@
                       | GDK_BUTTON4_MASK
                       | GDK_BUTTON5_MASK))
     {
-      gdk_threads_leave ();
-
       (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                     postMouseEventID,
                                     AWT_MOUSE_DRAGGED,
@@ -1034,14 +1020,10 @@
                                     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,
@@ -1050,8 +1032,6 @@
                                     (jint)event->y,
                                     0,
                                     JNI_FALSE);
-
-      gdk_threads_enter ();
     }
   return FALSE;
 }
@@ -1065,8 +1045,6 @@
      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,
@@ -1075,8 +1053,6 @@
                                     (jint)event->y, 
                                     0,
                                     JNI_FALSE);
-
-      gdk_threads_enter ();
     }
   return FALSE;
 }
@@ -1090,8 +1066,6 @@
      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, 
@@ -1101,8 +1075,6 @@
                                     (jint)event->y, 
                                     0,
                                     JNI_FALSE);
-
-      gdk_threads_enter ();
     }
   return FALSE;
 }
@@ -1112,8 +1084,6 @@
                      GdkEventExpose *event,
                      jobject peer)
 {
-  gdk_threads_leave ();
-
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                 postExposeEventID,
                                 (jint)event->area.x,
@@ -1121,8 +1091,6 @@
                                 (jint)event->area.width,
                                 (jint)event->area.height);
 
-  gdk_threads_enter ();
-
   return FALSE;
 }
 
@@ -1131,15 +1099,11 @@
                        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;
 }
 
@@ -1148,14 +1112,10 @@
                         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_GtkFileDialogPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c,v
retrieving revision 1.22
diff -u -r1.22 gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c       14 Jul 
2005 22:07:02 -0000      1.22
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c       18 Aug 
2005 01:14:42 -0000
@@ -44,6 +44,43 @@
                                 gint responseId,
                                 jobject peer_obj);
 
+static jmethodID gtkSetFilenameID;
+static jmethodID gtkHideFileDialogID;
+static jmethodID gtkDisposeFileDialogID;
+static jmethodID filenameFilterCallbackID;
+
+void
+cp_gtk_filedialog_init_jni (void)
+{
+  jclass gtkfiledialogpeer;
+
+  gtkfiledialogpeer =
+    (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(),
+                                    "gnu/java/awt/peer/gtk/GtkFileDialogPeer");
+
+  gtkDisposeFileDialogID =
+    (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(),
+                                      gtkfiledialogpeer,
+                                      "gtkDisposeFileDialog", "()V");
+
+  gtkHideFileDialogID =
+    (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(),
+                                      gtkfiledialogpeer,
+                                      "gtkHideFileDialog", "()V");
+
+  gtkSetFilenameID =
+    (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(),
+                                      gtkfiledialogpeer,
+                                      "gtkSetFilename",
+                                      "(Ljava/lang/String;)V");
+
+  filenameFilterCallbackID =
+    (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(),
+                                      gtkfiledialogpeer,
+                                      "filenameFilterCallback",
+                                      "(Ljava/lang/String;)Z");
+}
+
 /*
  * Make a new file selection dialog
  */
@@ -132,25 +169,17 @@
    This function extracts the filename from the GtkFileFilterInfo object,
    and passes it to the Java method.  The Java method will call the filter's
    accept() method and will give back the return value. */
-static gboolean filenameFilterCallback (const GtkFileFilterInfo *filter_info,
+static gboolean filename_filter_cb (const GtkFileFilterInfo *filter_info,
                                        gpointer obj)
 {
-  jclass cx;
-  jmethodID id;
   jstring *filename;
   gboolean accepted;
 
-  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 = (*cp_gtk_gdk_env())->NewStringUTF(cp_gtk_gdk_env(), 
filter_info->filename);
 
-  gdk_threads_leave();
-
-  accepted = (*cp_gtk_gdk_env())->CallBooleanMethod(cp_gtk_gdk_env(), obj, id, 
filename);
-
-  gdk_threads_enter();
+  accepted = (*cp_gtk_gdk_env())->CallBooleanMethod(cp_gtk_gdk_env(), obj,
+                                                    filenameFilterCallbackID,
+                                                    filename);
 
   return accepted;
 }
@@ -168,7 +197,7 @@
 
   filter = gtk_file_filter_new();
   gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME,
-                            filenameFilterCallback, obj, NULL);
+                            filename_filter_cb, obj, NULL);
 
   gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(ptr), filter);
 
@@ -220,11 +249,6 @@
                     gint responseId,
                     jobject peer_obj)
 {
-  static int isDisposeIDSet = 0;
-  static int isIDSet = 0;
-  static jmethodID gtkSetFilenameID;
-  static jmethodID hideID;
-  static jmethodID disposeID;
   void *ptr;
   G_CONST_RETURN gchar *fileName;
   jstring str_fileName = NULL;
@@ -240,42 +264,24 @@
 
   if (responseId == GTK_RESPONSE_DELETE_EVENT)
   {
-    if (!isDisposeIDSet)
-      {
-        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 ();
-    (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj, 
disposeID);
-    gdk_threads_enter ();
+    (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj,
+                                         gtkDisposeFileDialogID);
 
     return;
   }
 
-  if (responseId == GTK_RESPONSE_ACCEPT) {
-    fileName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (GTK_WIDGET 
(ptr)));
-    str_fileName = (*cp_gtk_gdk_env())->NewStringUTF (cp_gtk_gdk_env(), 
fileName);
-  }
-
-  if (!isIDSet)
+  if (responseId == GTK_RESPONSE_ACCEPT)
     {
-      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;
+      fileName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (GTK_WIDGET 
(ptr)));
+      str_fileName = (*cp_gtk_gdk_env())->NewStringUTF (cp_gtk_gdk_env(), 
fileName);
     }
 
   /* Set the Java object field 'file' with this value. */
-  gdk_threads_leave ();
-  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_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) */
-  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj, hideID);
-
-  gdk_threads_enter ();
+  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj,
+                                       gtkHideFileDialogID);
 }
-
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.9
diff -u -r1.9 gnu_java_awt_peer_gtk_GtkFramePeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c    17 Aug 2005 
04:24:38 -0000      1.9
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c    18 Aug 2005 
01:14:42 -0000
@@ -118,13 +118,23 @@
 
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarWidth
+  (JNIEnv *env, jobject obj, jobject menubar, jint width)
+{
+  gdk_threads_enter ();
+
+  Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarWidthUnlocked
+    (env, obj, menubar, width);
+
+  gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarWidthUnlocked
   (JNIEnv *env, jobject obj __attribute__((unused)), jobject menubar, jint 
width)
 {
   GtkWidget *ptr;
   GtkRequisition natural_req;
 
-  gdk_threads_enter ();
-
   if (menubar)
     {
       ptr = NSA_GET_PTR (env, menubar);
@@ -137,8 +147,6 @@
       gtk_widget_set_size_request (GTK_WIDGET (ptr),
                                    width, natural_req.height);
     }
-
-  gdk_threads_leave ();
 }
 
 JNIEXPORT void JNICALL
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.20
diff -u -r1.20 gnu_java_awt_peer_gtk_GtkListPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c     14 Jul 2005 
22:07:02 -0000      1.20
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c     18 Aug 2005 
01:14:42 -0000
@@ -513,25 +513,17 @@
 
       if (!path_currently_selected)
         {
-          gdk_threads_leave ();
-
           (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                         postListItemEventID,
                                         row,
                                         (jint) AWT_ITEM_SELECTED);
-
-          gdk_threads_enter ();
         }
       else
         {
-          gdk_threads_leave ();
-
           (*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.16
diff -u -r1.16 gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c 14 Jul 2005 
22:07:02 -0000      1.16
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c 18 Aug 2005 
01:14:42 -0000
@@ -186,8 +186,6 @@
 static void
 item_activate_cb (GtkMenuItem *item __attribute__((unused)), jobject peer_obj)
 {
-  gdk_threads_leave ();
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj,
-                                postMenuActionEventID);
-  gdk_threads_enter ();
+                                       postMenuActionEventID);
 }
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.22
diff -u -r1.22 gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c        14 Jul 
2005 22:07:02 -0000      1.22
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c        18 Aug 
2005 01:14:42 -0000
@@ -417,7 +417,5 @@
 textcomponent_changed_cb (GtkEditable *editable __attribute__((unused)),
                          jobject peer)
 {
-  gdk_threads_leave ();
   (*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.21
diff -u -r1.21 gnu_java_awt_peer_gtk_GtkToolkit.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c      16 Aug 2005 
09:21:40 -0000      1.21
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c      18 Aug 2005 
01:14:42 -0000
@@ -188,6 +188,7 @@
   cp_gtk_checkbox_init_jni ();
   cp_gtk_choice_init_jni ();
   cp_gtk_component_init_jni ();
+  cp_gtk_filedialog_init_jni ();
   cp_gtk_list_init_jni ();
   cp_gtk_menuitem_init_jni ();
   cp_gtk_scrollbar_init_jni ();
@@ -396,7 +397,11 @@
   jint *colors;
   GtkStyle *style;
 
+  /* FIXME: this was deadlocking so assume it is thread-safe for now;
+     we need to replace this call with a .properties file anyway. */
+#if 0
   gdk_threads_enter ();
+#endif
 
   colors = (*env)->GetIntArrayElements (env, jcolors, 0);
 
@@ -431,7 +436,9 @@
 
   (*env)->ReleaseIntArrayElements(env, jcolors, colors, 0);
 
+#if 0
   gdk_threads_leave ();
+#endif
 }
 
 #undef CONVERT
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.52
diff -u -r1.52 gnu_java_awt_peer_gtk_GtkWindowPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c   17 Aug 2005 
04:24:38 -0000      1.52
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c   18 Aug 2005 
01:14:42 -0000
@@ -1044,8 +1044,6 @@
                      GdkEventConfigure *event,
                      jobject peer)
 {
-  gdk_threads_leave ();
-
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                 postConfigureEventID,
                                 (jint) event->x,
@@ -1053,8 +1051,6 @@
                                 (jint) event->width,
                                 (jint) event->height);
 
-  gdk_threads_enter ();
-
   return FALSE;
 }
 
@@ -1063,8 +1059,6 @@
               GdkEventKey *event,
               jobject peer)
 {
-  gdk_threads_leave ();
-
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                 postKeyEventID,
                                 (jint) AWT_KEY_PRESSED,
@@ -1074,8 +1068,6 @@
                                 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
@@ -1090,8 +1082,6 @@
                 GdkEventKey *event,
                 jobject peer)
 {
-  gdk_threads_leave ();
-
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                 postKeyEventID,
                                 (jint) AWT_KEY_RELEASED,
@@ -1101,8 +1091,6 @@
                                 keyevent_to_awt_keychar (event),
                                 keysym_to_awt_keylocation (event));
 
-  gdk_threads_enter ();
-
   return TRUE;
 }
 
@@ -1213,10 +1201,20 @@
 Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible
   (JNIEnv *env, jobject obj, jboolean visible)
 {
-  void *ptr;
-
   gdk_threads_enter ();
 
+  Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisibleUnlocked
+    (env, obj, visible);
+
+  gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisibleUnlocked
+  (JNIEnv *env, jobject obj, jboolean visible)
+{
+  void *ptr;
+
   ptr = NSA_GET_PTR (env, obj);
 
   if (visible)
@@ -1225,8 +1223,6 @@
     gtk_widget_hide (GTK_WIDGET (ptr));
 
   XFlush (GDK_DISPLAY ());
-
-  gdk_threads_leave ();
 }
 
 JNIEXPORT void JNICALL
@@ -1363,10 +1359,20 @@
 Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBounds
   (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height)
 {
-  void *ptr;
-
   gdk_threads_enter ();
 
+  Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBoundsUnlocked
+    (env, obj, x, y, width, height);
+
+  gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBoundsUnlocked
+  (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height)
+{
+  void *ptr;
+
   ptr = NSA_GET_PTR (env, obj);
 
   /* Avoid GTK runtime assertion failures. */
@@ -1395,8 +1401,6 @@
      by the program and the window's "resizable" property is true then
      the size request will not be honoured. */
   gtk_window_resize (GTK_WINDOW (ptr), width, height);
-
-  gdk_threads_leave ();
 }
 
 static void
@@ -1512,15 +1516,11 @@
                  GdkEvent *event __attribute__((unused)),
                  jobject peer)
 {
-  gdk_threads_leave ();
-
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                              postWindowEventID,
                              (jint) AWT_WINDOW_CLOSING,
                              (jobject) NULL, (jint) 0);
 
-  gdk_threads_enter ();
-
   /* Prevents that the Window dissappears ("destroy"
      not being signalled). This is necessary because it
      should be up to a WindowListener implementation
@@ -1533,28 +1533,20 @@
                   GdkEvent *event __attribute__((unused)),
                   jobject peer)
 {
-  gdk_threads_leave ();
-
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                              postWindowEventID,
                              (jint) AWT_WINDOW_CLOSED,
                              (jobject) NULL, (jint) 0);
-
-  gdk_threads_enter ();
 }
 
 static void
 window_show_cb (GtkWidget *widget __attribute__((unused)),
                jobject peer)
 {
-  gdk_threads_leave ();
-
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                              postWindowEventID,
                              (jint) AWT_WINDOW_OPENED,
                              (jobject) NULL, (jint) 0);
-
-  gdk_threads_enter ();
 }
 
 static void
@@ -1587,8 +1579,6 @@
                              GParamSpec *pspec __attribute__((unused)),
                              jobject peer)
 {
-  gdk_threads_leave ();
-
   if (GTK_WINDOW (widget)->has_toplevel_focus)
     (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                 postWindowEventID,
@@ -1599,8 +1589,6 @@
                                 postWindowEventID,
                                 (jint) AWT_WINDOW_DEACTIVATED,
                                 (jobject) NULL, (jint) 0);
-
-  gdk_threads_enter ();
 }
 
 static gboolean
@@ -1608,15 +1596,11 @@
                    GdkEventFocus *event  __attribute__((unused)),
                    jobject peer)
 {
-  gdk_threads_leave ();
-
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                               postWindowEventID,
                               (jint) AWT_WINDOW_GAINED_FOCUS,
                               (jobject) NULL, (jint) 0);
 
-  gdk_threads_enter ();
-
   return FALSE;
 }
 
@@ -1625,15 +1609,11 @@
                     GdkEventFocus *event __attribute__((unused)),
                     jobject peer)
 {
-  gdk_threads_leave ();
-
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                               postWindowEventID,
                               (jint) AWT_WINDOW_LOST_FOCUS,
                               (jobject) NULL, (jint) 0);
 
-  gdk_threads_enter ();
-
   return FALSE;
 }
 
@@ -1651,26 +1631,18 @@
       if (event->window_state.new_window_state & GDK_WINDOW_STATE_ICONIFIED)
        {
          /* We've been iconified. */
-         gdk_threads_leave ();
-
          (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                      postWindowEventID,
                                      (jint) AWT_WINDOW_ICONIFIED,
                                      (jobject) NULL, (jint) 0);
-
-         gdk_threads_enter ();
        }
       else
        {
          /* We've been deiconified. */
-         gdk_threads_leave ();
-
          (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                      postWindowEventID,
                                      (jint) AWT_WINDOW_DEICONIFIED,
                                      (jobject) NULL, (jint) 0);
-
-         gdk_threads_enter ();
        }
     }
 
@@ -1683,15 +1655,11 @@
 
   new_state |= window_get_new_state (widget);
 
-  gdk_threads_leave ();
-
   (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                              postWindowEventID,
                              (jint) AWT_WINDOW_STATE_CHANGED,
                              (jobject) NULL, new_state);
 
-  gdk_threads_enter ();
-
   return TRUE;
 }
 
@@ -1757,16 +1725,12 @@
                            NULL,
                            gu_ex.gu_extents))
     {
-      gdk_threads_leave ();
-
       (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
                                    postInsetsChangedEventID,
                                    (jint) extents[2],  /* top */
                                    (jint) extents[0],  /* left */
                                    (jint) extents[3],  /* bottom */
                                    (jint) extents[1]); /* right */
-
-      gdk_threads_enter ();
     }
   
 
Index: native/jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.37
diff -u -r1.37 gtkpeer.h
--- native/jni/gtk-peer/gtkpeer.h       15 Aug 2005 04:14:29 -0000      1.37
+++ native/jni/gtk-peer/gtkpeer.h       18 Aug 2005 01:14:42 -0000
@@ -181,6 +181,7 @@
 void cp_gtk_checkbox_init_jni (void);
 void cp_gtk_choice_init_jni (void);
 void cp_gtk_component_init_jni (void);
+void cp_gtk_filedialog_init_jni (void);
 void cp_gtk_list_init_jni (void);
 void cp_gtk_menuitem_init_jni (void);
 void cp_gtk_scrollbar_init_jni (void);

reply via email to

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