1 /*
2 * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
259
260 AWT_LOCK();
261 xtestAvailable = isXTestAvailable();
262 DTRACE_PRINTLN1("RobotPeer: XTest available = %d", xtestAvailable);
263 if (!xtestAvailable) {
264 JNU_ThrowByName(env, "java/awt/AWTException", "java.awt.Robot requires your X server support the XTEST extension version 2.2");
265 }
266
267 AWT_UNLOCK();
268 }
269
270
271 JNIEXPORT void JNICALL
272 Java_sun_awt_X11_XRobotPeer_getRGBPixelsImpl( JNIEnv *env,
273 jclass cls,
274 jobject xgc,
275 jint jx,
276 jint jy,
277 jint jwidth,
278 jint jheight,
279 jint scale,
280 jintArray pixelArray,
281 jboolean useGtk) {
282 XImage *image;
283 jint *ary; /* Array of jints for sending pixel values back
284 * to parent process.
285 */
286 Window rootWindow;
287 XWindowAttributes attr;
288 AwtGraphicsConfigDataPtr adata;
289
290 DTRACE_PRINTLN6("RobotPeer: getRGBPixelsImpl(%lx, %d, %d, %d, %d, %x)", xgc, jx, jy, jwidth, jheight, pixelArray);
291
292 if (jwidth <= 0 || jheight <= 0) {
293 return;
294 }
295
296 adata = (AwtGraphicsConfigDataPtr) JNU_GetLongFieldAsPtr(env, xgc, x11GraphicsConfigIDs.aData);
297 DASSERT(adata != NULL);
298
299 AWT_LOCK();
300
301 jint sx = jx * scale;
302 jint sy = jy * scale;
303 jint swidth = jwidth * scale;
304 jint sheight = jheight * scale;
305
306 rootWindow = XRootWindow(awt_display, adata->awt_visInfo.screen);
307
308 if (!useGtk) {
309 if (hasXCompositeOverlayExtension(awt_display) &&
310 isXCompositeDisplay(awt_display, adata->awt_visInfo.screen))
311 {
312 rootWindow = compositeGetOverlayWindow(awt_display, rootWindow);
313 }
314 }
315
316 if (!XGetWindowAttributes(awt_display, rootWindow, &attr)
317 || sx + swidth <= attr.x
318 || attr.x + attr.width <= sx
319 || sy + sheight <= attr.y
320 || attr.y + attr.height <= sy) {
321
322 AWT_UNLOCK();
323 return; // Does not intersect with root window
324 }
325
326 gboolean gtk_failed = TRUE;
327 jint _x, _y;
328
329 jint x = MAX(sx, attr.x);
330 jint y = MAX(sy, attr.y);
331 jint width = MIN(sx + swidth, attr.x + attr.width) - x;
332 jint height = MIN(sy + sheight, attr.y + attr.height) - y;
333
334
335 int dx = attr.x > sx ? attr.x - sx : 0;
336 int dy = attr.y > sy ? attr.y - sy : 0;
337
338 int index;
339
340 if (useGtk) {
341 gtk->gdk_threads_enter();
342 gtk_failed = gtk->get_drawable_data(env, pixelArray, x, y, width,
343 height, jwidth, dx, dy, scale);
344 gtk->gdk_threads_leave();
345 }
346
347 if (gtk_failed) {
348 image = getWindowImage(awt_display, rootWindow, sx, sy, swidth, sheight);
349
350 ary = (*env)->GetPrimitiveArrayCritical(env, pixelArray, NULL);
351
352 if (!ary) {
353 XDestroyImage(image);
354 AWT_UNLOCK();
355 return;
356 }
357
358 dx /= scale;
359 dy /= scale;
360 width /= scale;
361 height /= scale;
362
363 /* convert to Java ARGB pixels */
364 for (_y = 0; _y < height; _y++) {
365 for (_x = 0; _x < width; _x++) {
366 jint pixel = (jint) XGetPixel(image, _x * scale, _y * scale);
367 /* Note ignore upper
368 * 32-bits on 64-bit
369 * OSes.
370 */
371 pixel |= 0xff000000; /* alpha - full opacity */
372
373 index = (_y + dy) * jwidth + (_x + dx);
374 ary[index] = pixel;
375 }
376 }
377
378 XDestroyImage(image);
379 (*env)->ReleasePrimitiveArrayCritical(env, pixelArray, ary, 0);
380 }
381 AWT_UNLOCK();
382 }
383
384 JNIEXPORT void JNICALL
385 Java_sun_awt_X11_XRobotPeer_keyPressImpl (JNIEnv *env,
386 jclass cls,
|
1 /*
2 * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
259
260 AWT_LOCK();
261 xtestAvailable = isXTestAvailable();
262 DTRACE_PRINTLN1("RobotPeer: XTest available = %d", xtestAvailable);
263 if (!xtestAvailable) {
264 JNU_ThrowByName(env, "java/awt/AWTException", "java.awt.Robot requires your X server support the XTEST extension version 2.2");
265 }
266
267 AWT_UNLOCK();
268 }
269
270
271 JNIEXPORT void JNICALL
272 Java_sun_awt_X11_XRobotPeer_getRGBPixelsImpl( JNIEnv *env,
273 jclass cls,
274 jobject xgc,
275 jint jx,
276 jint jy,
277 jint jwidth,
278 jint jheight,
279 jintArray pixelArray,
280 jboolean useGtk) {
281 XImage *image;
282 jint *ary; /* Array of jints for sending pixel values back
283 * to parent process.
284 */
285 Window rootWindow;
286 XWindowAttributes attr;
287 AwtGraphicsConfigDataPtr adata;
288
289 DTRACE_PRINTLN6("RobotPeer: getRGBPixelsImpl(%lx, %d, %d, %d, %d, %x)", xgc, jx, jy, jwidth, jheight, pixelArray);
290
291 if (jwidth <= 0 || jheight <= 0) {
292 return;
293 }
294
295 adata = (AwtGraphicsConfigDataPtr) JNU_GetLongFieldAsPtr(env, xgc, x11GraphicsConfigIDs.aData);
296 DASSERT(adata != NULL);
297
298 AWT_LOCK();
299
300 rootWindow = XRootWindow(awt_display, adata->awt_visInfo.screen);
301
302 if (!useGtk) {
303 if (hasXCompositeOverlayExtension(awt_display) &&
304 isXCompositeDisplay(awt_display, adata->awt_visInfo.screen))
305 {
306 rootWindow = compositeGetOverlayWindow(awt_display, rootWindow);
307 }
308 }
309
310 if (!XGetWindowAttributes(awt_display, rootWindow, &attr)
311 || jx + jwidth <= attr.x
312 || attr.x + attr.width <= jx
313 || jy + jheight <= attr.y
314 || attr.y + attr.height <= jy) {
315
316 AWT_UNLOCK();
317 return; // Does not intersect with root window
318 }
319
320 gboolean gtk_failed = TRUE;
321 jint _x, _y;
322
323 jint x = MAX(jx, attr.x);
324 jint y = MAX(jy, attr.y);
325 jint width = MIN(jx + jwidth, attr.x + attr.width) - x;
326 jint height = MIN(jy + jheight, attr.y + attr.height) - y;
327
328 int dx = attr.x > jx ? attr.x - jx : 0;
329 int dy = attr.y > jy ? attr.y - jy : 0;
330
331 int index;
332
333 if (useGtk) {
334 gtk->gdk_threads_enter();
335 gtk_failed = gtk->get_drawable_data(env, pixelArray, x, y, width,
336 height, jwidth, dx, dy, 1);
337 gtk->gdk_threads_leave();
338 }
339
340 if (gtk_failed) {
341 image = getWindowImage(awt_display, rootWindow, x, y, width, height);
342
343 ary = (*env)->GetPrimitiveArrayCritical(env, pixelArray, NULL);
344
345 if (!ary) {
346 XDestroyImage(image);
347 AWT_UNLOCK();
348 return;
349 }
350
351 /* convert to Java ARGB pixels */
352 for (_y = 0; _y < height; _y++) {
353 for (_x = 0; _x < width; _x++) {
354 jint pixel = (jint) XGetPixel(image, _x, _y);
355 /* Note ignore upper
356 * 32-bits on 64-bit
357 * OSes.
358 */
359 pixel |= 0xff000000; /* alpha - full opacity */
360
361 index = (_y + dy) * jwidth + (_x + dx);
362 ary[index] = pixel;
363 }
364 }
365
366 XDestroyImage(image);
367 (*env)->ReleasePrimitiveArrayCritical(env, pixelArray, ary, 0);
368 }
369 AWT_UNLOCK();
370 }
371
372 JNIEXPORT void JNICALL
373 Java_sun_awt_X11_XRobotPeer_keyPressImpl (JNIEnv *env,
374 jclass cls,
|