diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 7da809b8bf420c2382e5ba14a0e6c02c536de75f..31b06d9db9832471f0f5964b097af891b9670913 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,10 @@
+2007-12-05  Thomas Fitzsimmons  <fitzsim@redhat.com>
+
+	* gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.h: Regenerate.
+	* gnu/java/awt/peer/gtk/GtkWindowPeer.h: Likewise.
+	* java/awt/Component.h: Likewise.
+	* java/awt/Container.h: Likewise.
+
 2007-11-05  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* configure.ac: Don't run config-ml.in directly.
diff --git a/libjava/classpath/ChangeLog b/libjava/classpath/ChangeLog
index c24ad7b80841fef01b64f1a5bc9dcbea22701bfa..4086a236ceaca43e5becee549fa548d3ef2026a1 100644
--- a/libjava/classpath/ChangeLog
+++ b/libjava/classpath/ChangeLog
@@ -1,3 +1,47 @@
+2007-12-05  Thomas Fitzsimmons  <fitzsim@redhat.com>
+
+	* gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java,
+	native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c
+	(isWindowUnderMouse): New method.
+	* include/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.h:
+	Regenerate.
+	* gnu/java/awt/peer/gtk/GtkComponentPeer.java
+	(getLocationOnScreen): Move WindowPeer section to...
+	* gnu/java/awt/peer/gtk/GtkWindowPeer.java (getLocationOnScreen):
+	New method.
+	* gnu/java/awt/peer/gtk/GtkMouseInfoPeer.java
+	(isWindowUnderMouse): Implement.
+	* java/awt/Component.java (getMousePosition): New method.
+	(getMousePositionHelper): Likewise.
+	(mouseOverComponent): Likewise.
+	* java/awt/Container.java (getMousePosition): New method.
+	(mouseOverComponent): Likewise.
+	* classpath/lib/java/awt/Component.class,
+	classpath/lib/java/awt/Component$BltBufferStrategy.class,
+	classpath/lib/java/awt/Container$GfxPaintAllVisitor.class,
+	classpath/lib/java/awt/Component$AccessibleAWTComponent
+	$AccessibleAWTFocusHandler.class,
+	classpath/lib/java/awt/Component$FlipBufferStrategy.class,
+	classpath/lib/java/awt/Container$GfxVisitor.class,
+	classpath/lib/java/awt/Component$AccessibleAWTComponent
+	$AccessibleAWTComponentHandler.class,
+	classpath/lib/java/awt/Container$AccessibleAWTContainer
+	$AccessibleContainerHandler.class,
+	classpath/lib/java/awt/Container.class,
+	classpath/lib/java/awt/Container$AccessibleAWTContainer.class,
+	classpath/lib/java/awt/Container$GfxPrintAllVisitor.class,
+	classpath/lib/java/awt/Component$AccessibleAWTComponent.class,
+	classpath/lib/java/awt/Container$GfxPaintVisitor.class,
+	classpath/lib/java/awt/Container$GfxPrintVisitor.class,
+	classpath/lib/java/awt/Component$HeavyweightInLightweightListener.class,
+	classpath/lib/gnu/java/awt/peer/gtk/GtkComponentPeer.class,
+	classpath/lib/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.class,
+	classpath/lib/gnu/java/awt/peer/gtk/GtkMouseInfoPeer.class,
+	classpath/lib/gnu/java/awt/peer/gtk/GtkWindowPeer.class,
+	classpath/lib/gnu/java/awt/peer/gtk/GtkComponentPeer
+	$RepaintTimerTask.class:
+	Regenerate.
+
 2007-10-01  Alexandre Oliva  <aoliva@redhat.com>
 
 	* scripts/check_jni_methods.sh: Don't depend on diff -b ignoring
diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java b/libjava/classpath/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java
index 67040b82a0f56f402b5204dbda0cee8b361f26b2..d06af84433f3d69e0c5620700d09a7e4aa6b1454 100644
--- a/libjava/classpath/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java
+++ b/libjava/classpath/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java
@@ -155,6 +155,7 @@ public class GdkGraphicsEnvironment extends ClasspathGraphicsEnvironment
    * Used by GtkMouseInfoPeer.
    */ 
   native int[] getMouseCoordinates();
+  native boolean isWindowUnderMouse(GtkWindowPeer windowPeer);
   
   public WritableRaster createRaster(ColorModel cm, SampleModel sm)
   {
diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkComponentPeer.java
index 16c20ee253f939e926da49ccc226022cf8ce1d66..f658c17afbb7d3987a9ed6ca09358ffb3f2d416e 100644
--- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkComponentPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/gtk/GtkComponentPeer.java
@@ -76,7 +76,6 @@ import java.awt.image.VolatileImage;
 import java.awt.peer.ComponentPeer;
 import java.awt.peer.ContainerPeer;
 import java.awt.peer.LightweightPeer;
-import java.awt.peer.WindowPeer;
 import java.util.Timer;
 import java.util.TimerTask;
 
@@ -251,10 +250,7 @@ public class GtkComponentPeer extends GtkGenericPeer
   public Point getLocationOnScreen () 
   { 
     int point[] = new int[2];
-    if( this instanceof WindowPeer )
-      gtkWindowGetLocationOnScreen (point);
-    else
-      gtkWidgetGetLocationOnScreen (point);
+    gtkWidgetGetLocationOnScreen (point);
     return new Point (point[0], point[1]);
   }
 
diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkMouseInfoPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkMouseInfoPeer.java
index 7aea50991dfaf814a7851759dd130035c30e5e4a..7407744af9e8cee750f4d88ae6e3e172e5e36a69 100644
--- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkMouseInfoPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/gtk/GtkMouseInfoPeer.java
@@ -60,17 +60,7 @@ public class GtkMouseInfoPeer implements MouseInfoPeer
   
   public boolean isWindowUnderMouse(Window w)
   {
-    int[] coords = gde.getMouseCoordinates();
-    GraphicsDevice[] gds = gde.getScreenDevices();
-
-    // Check if the screen  of the Window and the cursor match
-    if( gds[ coords[0] ] != w.getGraphicsConfiguration().getDevice() )
-      return false;
-
-    // Return the bounds-check.
-    Point p = w.getLocationOnScreen();
-    return (coords[1] >= p.x && coords[1] < p.x + w.getWidth() &&
-	    coords[2] >= p.y && coords[2] < p.y + w.getHeight() );
-    }
+    return gde.isWindowUnderMouse((GtkWindowPeer) w.getPeer());
+  }
 }
 
diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkWindowPeer.java
index d8054150dea551219c3fa0a2dc0a77bf2be267c5..5dc4b2e5b377008044ac4779345c3a03ac0a309e 100644
--- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkWindowPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/gtk/GtkWindowPeer.java
@@ -45,6 +45,7 @@ import java.awt.Font;
 import java.awt.Frame;
 import java.awt.Graphics;
 import java.awt.KeyboardFocusManager;
+import java.awt.Point;
 import java.awt.Rectangle;
 import java.awt.Window;
 import java.awt.event.ComponentEvent;
@@ -392,6 +393,13 @@ public class GtkWindowPeer extends GtkContainerPeer
                           clickCount, popupTrigger);
   }
 
+  public Point getLocationOnScreen()
+  {
+    int point[] = new int[2];
+    gtkWindowGetLocationOnScreen(point);
+    return new Point(point[0], point[1]);
+  }
+
   // We override this to keep it in sync with our internal
   // representation.
   public Rectangle getBounds()
diff --git a/libjava/classpath/include/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.h b/libjava/classpath/include/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.h
index aa0bd0156899a2a53be31425214695f1000eca0c..de83f57a5979a8f3e88df7af92825083781f60b1 100644
--- a/libjava/classpath/include/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.h
+++ b/libjava/classpath/include/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.h
@@ -1,10 +1,10 @@
 /* DO NOT EDIT THIS FILE - it is machine generated */
 
+#include <jni.h>
+
 #ifndef __gnu_java_awt_peer_gtk_GdkGraphicsEnvironment__
 #define __gnu_java_awt_peer_gtk_GdkGraphicsEnvironment__
 
-#include <jni.h>
-
 #ifdef __cplusplus
 extern "C"
 {
@@ -17,6 +17,7 @@ JNIEXPORT jobject JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_nati
 JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_nativeGetNumFontFamilies (JNIEnv *env, jobject);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_nativeGetFontFamilies (JNIEnv *env, jobject, jobjectArray);
 JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_getMouseCoordinates (JNIEnv *env, jobject);
+JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_isWindowUnderMouse (JNIEnv *env, jobject, jobject);
 
 #ifdef __cplusplus
 }
diff --git a/libjava/classpath/java/awt/Component.java b/libjava/classpath/java/awt/Component.java
index f8bed17618ea01ebbfd1b0fcd5cc78d00999b1f2..fe4fb9b8b0da5de0ffc6a113b594c1f7accee3a3 100644
--- a/libjava/classpath/java/awt/Component.java
+++ b/libjava/classpath/java/awt/Component.java
@@ -5833,6 +5833,62 @@ p   * <li>the set of backward traversal keys
     return visible;
   }
 
+  /**
+   * Returns the mouse pointer position relative to this Component's
+   * top-left corner.
+   *
+   * @return relative mouse pointer position
+   *
+   * @throws HeadlessException if in a headless environment
+   */
+  public Point getMousePosition() throws HeadlessException
+  {
+    return getMousePositionHelper(true);
+  }
+
+  Point getMousePositionHelper(boolean allowChildren) throws HeadlessException
+  {
+    if (GraphicsEnvironment.isHeadless())
+      throw new HeadlessException("can't get mouse position"
+                                  + " in headless environment");
+    if (!isShowing())
+      return null;
+
+    Component parent = this;
+    int windowRelativeXOffset = 0;
+    int windowRelativeYOffset = 0;
+    while (parent != null && !(parent instanceof Window))
+      {
+        windowRelativeXOffset += parent.getX();
+        windowRelativeYOffset += parent.getY();
+        parent = parent.getParent();
+      }
+    if (parent == null)
+      return null;
+
+    Window window = (Window) parent;
+    if (!Toolkit.getDefaultToolkit()
+        .getMouseInfoPeer().isWindowUnderMouse(window))
+      return null;
+
+    PointerInfo info = MouseInfo.getPointerInfo();
+    Point mouseLocation = info.getLocation();
+    Point windowLocation = window.getLocationOnScreen();
+
+    int x = mouseLocation.x - windowLocation.x;
+    int y = mouseLocation.y - windowLocation.y;
+
+    if (!mouseOverComponent(window.getComponentAt(x, y), allowChildren))
+      return null;
+
+    return new Point(x - windowRelativeXOffset, y - windowRelativeYOffset);
+  }
+
+  boolean mouseOverComponent(Component component, boolean allowChildren)
+  {
+    return component == this;
+  }
+
   /**
    * This method is used to implement transferFocus(). CHILD is the child
    * making the request. This is overridden by Container; when called for an
diff --git a/libjava/classpath/java/awt/Container.java b/libjava/classpath/java/awt/Container.java
index 83d9f7b78c5b0d86934f97f740b9c2d4cc4c9132..e7622f2e839675d02ff931e16dc9494ee7518c60 100644
--- a/libjava/classpath/java/awt/Container.java
+++ b/libjava/classpath/java/awt/Container.java
@@ -1097,6 +1097,33 @@ public class Container extends Component
     return locate (x, y);
   }
 
+  /**
+   * Returns the mouse pointer position relative to this Container's
+   * top-left corner.  If allowChildren is false, the mouse pointer
+   * must be directly over this container.  If allowChildren is true,
+   * the mouse pointer may be over this container or any of its
+   * descendents.
+   *
+   * @param allowChildren true to allow descendents, false if pointer
+   * must be directly over Container.
+   *
+   * @return relative mouse pointer position
+   *
+   * @throws HeadlessException if in a headless environment
+   */
+  public Point getMousePosition(boolean allowChildren) throws HeadlessException
+  {
+    return super.getMousePositionHelper(allowChildren);
+  }
+
+  boolean mouseOverComponent(Component component, boolean allowChildren)
+  {
+    if (allowChildren)
+      return isAncestorOf(component);
+    else
+      return component == this;
+  }
+
   /**
    * Returns the component located at the specified point.  This is done
    * by checking whether or not a child component claims to contain this
diff --git a/libjava/classpath/lib/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.class b/libjava/classpath/lib/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.class
index dfb28e4bf3ece359dd067cd75655587ef1450c28..6e3a11a3cf1c30a780846a4a025ad41b7afd06ff 100644
Binary files a/libjava/classpath/lib/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.class and b/libjava/classpath/lib/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.class differ
diff --git a/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkComponentPeer$RepaintTimerTask.class b/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkComponentPeer$RepaintTimerTask.class
index 097713c014afc4df54b9ce0c14ba1f082809f87c..abf76c0d9ee15a930e5b17492d91a488995a12d5 100644
Binary files a/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkComponentPeer$RepaintTimerTask.class and b/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkComponentPeer$RepaintTimerTask.class differ
diff --git a/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkComponentPeer.class b/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkComponentPeer.class
index 9627e77665a99cadcab4a46d83cab59b5d19e4a8..45f9c47f8c6e8199373199de090d6e0cd1fbe1ed 100644
Binary files a/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkComponentPeer.class and b/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkComponentPeer.class differ
diff --git a/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkMouseInfoPeer.class b/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkMouseInfoPeer.class
index 35c5677f5b867b069d0e57e595bea78c4b3a725b..fc028c27fbbb5e0101ee076f6d2ca3d69b406035 100644
Binary files a/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkMouseInfoPeer.class and b/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkMouseInfoPeer.class differ
diff --git a/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkWindowPeer.class b/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkWindowPeer.class
index 53b831decaf8782bd7c1a72b4759b4d75a3e9a1a..a348cf02d4ab66380c7d6d3adfc3dd7bfde58533 100644
Binary files a/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkWindowPeer.class and b/libjava/classpath/lib/gnu/java/awt/peer/gtk/GtkWindowPeer.class differ
diff --git a/libjava/classpath/lib/java/awt/Component$AccessibleAWTComponent$AccessibleAWTComponentHandler.class b/libjava/classpath/lib/java/awt/Component$AccessibleAWTComponent$AccessibleAWTComponentHandler.class
index f48c922ff792d49fb88ea272c16cca4c14a50970..6c5bdeb7565acf653b2fb2ea1b17693ac629f441 100644
Binary files a/libjava/classpath/lib/java/awt/Component$AccessibleAWTComponent$AccessibleAWTComponentHandler.class and b/libjava/classpath/lib/java/awt/Component$AccessibleAWTComponent$AccessibleAWTComponentHandler.class differ
diff --git a/libjava/classpath/lib/java/awt/Component$AccessibleAWTComponent$AccessibleAWTFocusHandler.class b/libjava/classpath/lib/java/awt/Component$AccessibleAWTComponent$AccessibleAWTFocusHandler.class
index 029692cc4f01be7ea4ba5ae559cf8b6743549703..e2e3e879254f03f02233e762137559a317e310bf 100644
Binary files a/libjava/classpath/lib/java/awt/Component$AccessibleAWTComponent$AccessibleAWTFocusHandler.class and b/libjava/classpath/lib/java/awt/Component$AccessibleAWTComponent$AccessibleAWTFocusHandler.class differ
diff --git a/libjava/classpath/lib/java/awt/Component$AccessibleAWTComponent.class b/libjava/classpath/lib/java/awt/Component$AccessibleAWTComponent.class
index 010706e95d8ce4e43ba39ead8a846c71c0fd78ee..22532323a23c48aae7cb9cc9c5672b73a6fd9def 100644
Binary files a/libjava/classpath/lib/java/awt/Component$AccessibleAWTComponent.class and b/libjava/classpath/lib/java/awt/Component$AccessibleAWTComponent.class differ
diff --git a/libjava/classpath/lib/java/awt/Component$BltBufferStrategy.class b/libjava/classpath/lib/java/awt/Component$BltBufferStrategy.class
index 74be60b2956ddd6a065d45be923a6773c063aa7b..e796a03a7f4bd12840c034d0e2138d5811afce4d 100644
Binary files a/libjava/classpath/lib/java/awt/Component$BltBufferStrategy.class and b/libjava/classpath/lib/java/awt/Component$BltBufferStrategy.class differ
diff --git a/libjava/classpath/lib/java/awt/Component$FlipBufferStrategy.class b/libjava/classpath/lib/java/awt/Component$FlipBufferStrategy.class
index 16b024509d292e6caa70d07f2d90b2ccb71f5452..f0857dc8ea3d2d6400478221e574e9de954fef6b 100644
Binary files a/libjava/classpath/lib/java/awt/Component$FlipBufferStrategy.class and b/libjava/classpath/lib/java/awt/Component$FlipBufferStrategy.class differ
diff --git a/libjava/classpath/lib/java/awt/Component$HeavyweightInLightweightListener.class b/libjava/classpath/lib/java/awt/Component$HeavyweightInLightweightListener.class
index 5ab9670bde14b26b2b4c862a31be8ab95889d585..60503e61e1d2382e703b079b07461454858baf96 100644
Binary files a/libjava/classpath/lib/java/awt/Component$HeavyweightInLightweightListener.class and b/libjava/classpath/lib/java/awt/Component$HeavyweightInLightweightListener.class differ
diff --git a/libjava/classpath/lib/java/awt/Component.class b/libjava/classpath/lib/java/awt/Component.class
index 6adbf61ac0abe38207e239d9a19164c27ce94556..90b546ccd3a8bc5e208f638e00b5432ae4358a8f 100644
Binary files a/libjava/classpath/lib/java/awt/Component.class and b/libjava/classpath/lib/java/awt/Component.class differ
diff --git a/libjava/classpath/lib/java/awt/Container$AccessibleAWTContainer$AccessibleContainerHandler.class b/libjava/classpath/lib/java/awt/Container$AccessibleAWTContainer$AccessibleContainerHandler.class
index a07e427861d9fe6efe6a64a2fc299b6342ce2393..5f045ab2123f369c9115b8849d05154b22ffa81f 100644
Binary files a/libjava/classpath/lib/java/awt/Container$AccessibleAWTContainer$AccessibleContainerHandler.class and b/libjava/classpath/lib/java/awt/Container$AccessibleAWTContainer$AccessibleContainerHandler.class differ
diff --git a/libjava/classpath/lib/java/awt/Container$AccessibleAWTContainer.class b/libjava/classpath/lib/java/awt/Container$AccessibleAWTContainer.class
index 18f79012eb308bc4028c96f1a4492ebb82bbfa18..167660a70ba3aad921bf1f9b24a9c1ec302b01d5 100644
Binary files a/libjava/classpath/lib/java/awt/Container$AccessibleAWTContainer.class and b/libjava/classpath/lib/java/awt/Container$AccessibleAWTContainer.class differ
diff --git a/libjava/classpath/lib/java/awt/Container$GfxPaintAllVisitor.class b/libjava/classpath/lib/java/awt/Container$GfxPaintAllVisitor.class
index fea586bd9fdd6e2ff76fe5c78de1563e926b8035..cd7fd4c64930d3a08cf132bc29c5d8951751eb8a 100644
Binary files a/libjava/classpath/lib/java/awt/Container$GfxPaintAllVisitor.class and b/libjava/classpath/lib/java/awt/Container$GfxPaintAllVisitor.class differ
diff --git a/libjava/classpath/lib/java/awt/Container$GfxPaintVisitor.class b/libjava/classpath/lib/java/awt/Container$GfxPaintVisitor.class
index e5a54f8ffdcd4daeaacaa7526c0056e5eb50ca58..791d8579f0ff3cb816670735951113a24851de7d 100644
Binary files a/libjava/classpath/lib/java/awt/Container$GfxPaintVisitor.class and b/libjava/classpath/lib/java/awt/Container$GfxPaintVisitor.class differ
diff --git a/libjava/classpath/lib/java/awt/Container$GfxPrintAllVisitor.class b/libjava/classpath/lib/java/awt/Container$GfxPrintAllVisitor.class
index 3c741e9842639cb4b6c5961655b37de47ecb2287..087631893fb153a2de73bbae80511d0bbcba9092 100644
Binary files a/libjava/classpath/lib/java/awt/Container$GfxPrintAllVisitor.class and b/libjava/classpath/lib/java/awt/Container$GfxPrintAllVisitor.class differ
diff --git a/libjava/classpath/lib/java/awt/Container$GfxPrintVisitor.class b/libjava/classpath/lib/java/awt/Container$GfxPrintVisitor.class
index fe7b3267f6e8096714b07d3a456415747465c279..c8557e99c45554e42dc3cc2c2333c03576935b34 100644
Binary files a/libjava/classpath/lib/java/awt/Container$GfxPrintVisitor.class and b/libjava/classpath/lib/java/awt/Container$GfxPrintVisitor.class differ
diff --git a/libjava/classpath/lib/java/awt/Container$GfxVisitor.class b/libjava/classpath/lib/java/awt/Container$GfxVisitor.class
index f9f85ae5215725a0eef598f52c2705b1c6225465..9fd2811aad91576777515d178c0f0e871e924694 100644
Binary files a/libjava/classpath/lib/java/awt/Container$GfxVisitor.class and b/libjava/classpath/lib/java/awt/Container$GfxVisitor.class differ
diff --git a/libjava/classpath/lib/java/awt/Container.class b/libjava/classpath/lib/java/awt/Container.class
index 1154af9697a1a404674013f11285144c05956757..f6b029ec2587659e06a999c4b4358fd6f8186798 100644
Binary files a/libjava/classpath/lib/java/awt/Container.class and b/libjava/classpath/lib/java/awt/Container.class differ
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c
index 1c88d1b510e4cf09b9c4f47756c438ad919b99be..6066a6bb271264c4a1de5c7e7de3933dfd298ace 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c
@@ -263,3 +263,37 @@ Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_getMouseCoordinates
 
   return retArray;
 }
+
+JNIEXPORT jboolean JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_isWindowUnderMouse
+(JNIEnv *env, jobject obj, jobject windowPeer)
+{
+  GdkDisplay *display = NULL;
+  gint x = 0;
+  gint y = 0;
+  GtkWidget *windowToTest = NULL;
+  GdkWindow *windowAtPointer = NULL;
+  jboolean retVal = JNI_FALSE;
+
+  display = (GdkDisplay *) gtkpeer_get_display (env, obj);
+  g_assert (display != NULL);
+
+  windowToTest = (GtkWidget *) gtkpeer_get_widget (env, windowPeer);
+
+  gdk_threads_enter ();
+
+  windowAtPointer = gdk_display_get_window_at_pointer (display, &x, &y);
+
+  while (windowAtPointer
+         && windowAtPointer != windowToTest->window)
+    windowAtPointer = gdk_window_get_parent (windowAtPointer);
+
+  gdk_threads_leave ();
+
+  if (windowAtPointer)
+    retVal = JNI_TRUE;
+  else
+    retVal = JNI_FALSE;
+
+  return retVal;
+}
diff --git a/libjava/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.h b/libjava/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.h
index 78d947c6ef4c4d711a05f32c4cfa5db4b6664d0a..978c2ec506b4c39b164682c496cb79a2d72aa7ac 100644
--- a/libjava/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.h
+++ b/libjava/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.h
@@ -27,6 +27,7 @@ extern "Java"
           {
               class GdkGraphicsEnvironment;
               class GdkScreenGraphicsDevice;
+              class GtkWindowPeer;
           }
         }
       }
@@ -77,6 +78,7 @@ public:
   virtual JArray< ::java::lang::String * > * getAvailableFontFamilyNames(::java::util::Locale *);
 public: // actually package-private
   virtual JArray< jint > * getMouseCoordinates();
+  virtual jboolean isWindowUnderMouse(::gnu::java::awt::peer::gtk::GtkWindowPeer *);
 public:
   virtual ::java::awt::image::WritableRaster * createRaster(::java::awt::image::ColorModel *, ::java::awt::image::SampleModel *);
 private:
diff --git a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.h b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.h
index 3eb4c142aaf739b9c4c2cc53e3348f9df4e84e8c..a40f4168d2bc9c2c3421140e1c70ce39c22ca4f9 100644
--- a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.h
+++ b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.h
@@ -32,6 +32,7 @@ extern "Java"
         class Component;
         class Dialog;
         class Graphics;
+        class Point;
         class Rectangle;
         class Window;
     }
@@ -101,6 +102,7 @@ public:
 public: // actually protected
   virtual void postMouseEvent(jint, jlong, jint, jint, jint, jint, jboolean);
 public:
+  virtual ::java::awt::Point * getLocationOnScreen();
   virtual ::java::awt::Rectangle * getBounds();
   virtual void updateIconImages();
   virtual void updateMinimumSize();
diff --git a/libjava/java/awt/Component.h b/libjava/java/awt/Component.h
index f5889d2bc0d3dc1cd682d2deaa6bf71565ad70ed..23edfa77e98bcde19987d6854419227b168c1acb 100644
--- a/libjava/java/awt/Component.h
+++ b/libjava/java/awt/Component.h
@@ -354,6 +354,11 @@ public: // actually package-private
   virtual void dispatchEventImpl(::java::awt::AWTEvent *);
   virtual jboolean eventTypeEnabled(jint);
   virtual jboolean isHierarchyVisible();
+public:
+  virtual ::java::awt::Point * getMousePosition();
+public: // actually package-private
+  virtual ::java::awt::Point * getMousePositionHelper(jboolean);
+  virtual jboolean mouseOverComponent(::java::awt::Component *, jboolean);
   virtual ::java::awt::Component * findNextFocusComponent(::java::awt::Component *);
 private:
   void readObject(::java::io::ObjectInputStream *);
diff --git a/libjava/java/awt/Container.h b/libjava/java/awt/Container.h
index 4a44759532af0340386ff38f1244b0833c2d5585..3ea162aaede6430dd8463d46c72c96a84b7bf84d 100644
--- a/libjava/java/awt/Container.h
+++ b/libjava/java/awt/Container.h
@@ -97,6 +97,10 @@ public: // actually protected
 public:
   virtual void deliverEvent(::java::awt::Event *);
   virtual ::java::awt::Component * getComponentAt(jint, jint);
+  virtual ::java::awt::Point * getMousePosition(jboolean);
+public: // actually package-private
+  virtual jboolean mouseOverComponent(::java::awt::Component *, jboolean);
+public:
   virtual ::java::awt::Component * locate(jint, jint);
   virtual ::java::awt::Component * getComponentAt(::java::awt::Point *);
   virtual ::java::awt::Component * findComponentAt(jint, jint);