< prev index next >

src/java.desktop/unix/native/libawt_xawt/awt/awt_Robot.c

Print this page

        

@@ -35,10 +35,11 @@
 #include <X11/Xmd.h>
 #include <X11/extensions/xtestext1.h>
 #include <X11/extensions/XTest.h>
 #include <X11/extensions/XInput.h>
 #include <X11/extensions/XI.h>
+#include <X11/extensions/Xcomposite.h>
 #include <jni.h>
 #include <sizecalc.h>
 #include "robot_common.h"
 #include "canvas.h"
 #include "wsutils.h"

@@ -87,10 +88,36 @@
     }
 
     return isXTestAvailable;
 }
 
+static Bool hasXCompositeOverlayExtension(Display *display) {
+    int xoverlay = False;
+    int eventBase, errorBase;
+    if (XCompositeQueryExtension(display, &eventBase, &errorBase)) {
+        int major = 0;
+        int minor = 0;
+    
+        XCompositeQueryVersion(display, &major, &minor);
+        if (major > 0 || minor >= 3) {
+            xoverlay = True;
+        }
+    }
+    
+    return xoverlay;
+}
+  
+static jboolean isXCompositeDisplay(Display *display, int screenNumber) {
+  
+    char NET_WM_CM_Sn[25];
+    snprintf(NET_WM_CM_Sn, sizeof(NET_WM_CM_Sn), "_NET_WM_CM_S%d\0", screenNumber);
+ 
+    Atom managerSelection = XInternAtom(display, NET_WM_CM_Sn, 0);
+    Window owner = XGetSelectionOwner(display, managerSelection);
+    
+    return owner != 0;
+}
 
 static XImage *getWindowImage(Display * display, Window window,
                               int32_t x, int32_t y,
                               int32_t w, int32_t h) {
     XImage         *image;

@@ -236,10 +263,18 @@
     jint swidth = jwidth * scale;
     jint sheight = jheight * scale;
 
     rootWindow = XRootWindow(awt_display, adata->awt_visInfo.screen);
 
+    if (!isGtkSupported) {
+        if (isXCompositeDisplay(awt_display, adata->awt_visInfo.screen) &&
+            hasXCompositeOverlayExtension(awt_display))
+        {
+            rootWindow = XCompositeGetOverlayWindow(awt_display, rootWindow);
+        }
+    }
+    
     if (!XGetWindowAttributes(awt_display, rootWindow, &attr)
             || sx + swidth <= attr.x
             || attr.x + attr.width <= sx
             || sy + sheight <= attr.y
             || attr.y + attr.height <= sy) {
< prev index next >