< prev index next >

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

Print this page

        

*** 36,53 **** #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 <jni.h> #include <sizecalc.h> #include "robot_common.h" #include "canvas.h" #include "wsutils.h" #include "list.h" #include "multiVis.h" - #include "gtk2_interface.h" #if defined(__linux__) || defined(MACOSX) #include <sys/socket.h> #endif --- 36,53 ---- #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" #include "list.h" #include "multiVis.h" #if defined(__linux__) || defined(MACOSX) #include <sys/socket.h> #endif
*** 88,97 **** --- 88,123 ---- } 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;
*** 209,220 **** jint jx, jint jy, jint jwidth, jint jheight, jint scale, ! jintArray pixelArray, ! jboolean isGtkSupported) { XImage *image; jint *ary; /* Array of jints for sending pixel values back * to parent process. */ Window rootWindow; --- 235,245 ---- jint jx, jint jy, jint jwidth, jint jheight, jint scale, ! jintArray pixelArray) { XImage *image; jint *ary; /* Array of jints for sending pixel values back * to parent process. */ Window rootWindow;
*** 236,245 **** --- 261,275 ---- jint sy = jy * scale; jint swidth = jwidth * scale; jint sheight = jheight * scale; rootWindow = XRootWindow(awt_display, adata->awt_visInfo.screen); + 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
*** 247,257 **** AWT_UNLOCK(); return; // Does not intersect with root window } - gboolean gtk_failed = TRUE; jint _x, _y; jint x = MAX(sx, attr.x); jint y = MAX(sy, attr.y); jint width = MIN(sx + swidth, attr.x + attr.width) - x; --- 277,286 ----
*** 261,338 **** int dx = attr.x > sx ? attr.x - sx : 0; int dy = attr.y > sy ? attr.y - sy : 0; int index; - if (isGtkSupported) { - GdkPixbuf *pixbuf; - (*fp_gdk_threads_enter)(); - GdkWindow *root = (*fp_gdk_get_default_root_window)(); - - pixbuf = (*fp_gdk_pixbuf_get_from_drawable)(NULL, root, NULL, - x, y, 0, 0, width, height); - if (pixbuf && scale != 1) { - GdkPixbuf *scaledPixbuf; - x /= scale; - y /= scale; - width /= scale; - height /= scale; - dx /= scale; - dy /= scale; - scaledPixbuf = (*fp_gdk_pixbuf_scale_simple)(pixbuf, width, height, - GDK_INTERP_BILINEAR); - (*fp_g_object_unref)(pixbuf); - pixbuf = scaledPixbuf; - } - - if (pixbuf) { - int nchan = (*fp_gdk_pixbuf_get_n_channels)(pixbuf); - int stride = (*fp_gdk_pixbuf_get_rowstride)(pixbuf); - - if ((*fp_gdk_pixbuf_get_width)(pixbuf) == width - && (*fp_gdk_pixbuf_get_height)(pixbuf) == height - && (*fp_gdk_pixbuf_get_bits_per_sample)(pixbuf) == 8 - && (*fp_gdk_pixbuf_get_colorspace)(pixbuf) == GDK_COLORSPACE_RGB - && nchan >= 3 - ) { - guchar *p, *pix = (*fp_gdk_pixbuf_get_pixels)(pixbuf); - - ary = (*env)->GetPrimitiveArrayCritical(env, pixelArray, NULL); - if (!ary) { - (*fp_g_object_unref)(pixbuf); - (*fp_gdk_threads_leave)(); - AWT_UNLOCK(); - return; - } - - for (_y = 0; _y < height; _y++) { - for (_x = 0; _x < width; _x++) { - p = pix + _y * stride + _x * nchan; - - index = (_y + dy) * jwidth + (_x + dx); - ary[index] = 0xff000000 - | (p[0] << 16) - | (p[1] << 8) - | (p[2]); - - } - } - (*env)->ReleasePrimitiveArrayCritical(env, pixelArray, ary, 0); - if ((*env)->ExceptionCheck(env)) { - (*fp_g_object_unref)(pixbuf); - (*fp_gdk_threads_leave)(); - AWT_UNLOCK(); - return; - } - gtk_failed = FALSE; - } - (*fp_g_object_unref)(pixbuf); - } - (*fp_gdk_threads_leave)(); - } - - if (gtk_failed) { image = getWindowImage(awt_display, rootWindow, sx, sy, swidth, sheight); ary = (*env)->GetPrimitiveArrayCritical(env, pixelArray, NULL); if (!ary) { --- 290,299 ----
*** 361,371 **** } } XDestroyImage(image); (*env)->ReleasePrimitiveArrayCritical(env, pixelArray, ary, 0); ! } AWT_UNLOCK(); } JNIEXPORT void JNICALL Java_sun_awt_X11_XRobotPeer_keyPressImpl (JNIEnv *env, --- 322,332 ---- } } XDestroyImage(image); (*env)->ReleasePrimitiveArrayCritical(env, pixelArray, ary, 0); ! AWT_UNLOCK(); } JNIEXPORT void JNICALL Java_sun_awt_X11_XRobotPeer_keyPressImpl (JNIEnv *env,
< prev index next >