--- old/src/java.desktop/unix/classes/sun/awt/X11/XRobotPeer.java 2016-06-16 18:30:06.239533987 +0200 +++ new/src/java.desktop/unix/classes/sun/awt/X11/XRobotPeer.java 2016-06-16 18:30:06.110536150 +0200 @@ -35,8 +35,15 @@ class XRobotPeer implements RobotPeer { - private static volatile boolean isGtkSupported; + static final boolean tryGtk; + static { + loadNativeLibraries(); + tryGtk = Boolean.getBoolean("awt.robot.gtk"); + } + + private static volatile boolean useGtk; private X11GraphicsConfig xgc = null; + /* * native implementation uses some static shared data (pipes, processes) * so use a class lock to synchronize native method calls @@ -49,13 +56,14 @@ setup(tk.getNumberOfButtons(), AWTAccessor.getInputEventAccessor().getButtonDownMasks()); - Toolkit toolkit = Toolkit.getDefaultToolkit(); - if (!isGtkSupported) { - if (toolkit instanceof UNIXToolkit - && ((UNIXToolkit) toolkit).loadGTK()) { + boolean isGtkSupported = false; + if (tryGtk && !isGtkSupported) { + if (tk instanceof UNIXToolkit && ((UNIXToolkit) tk).loadGTK()) { isGtkSupported = true; } } + + useGtk = (tryGtk && isGtkSupported); } @Override @@ -104,7 +112,7 @@ public int getRGBPixel(int x, int y) { int pixelArray[] = new int[1]; getRGBPixelsImpl(xgc, x, y, 1, 1, xgc.getScale(), pixelArray, - isGtkSupported); + useGtk); return pixelArray[0]; } @@ -112,11 +120,12 @@ public int [] getRGBPixels(Rectangle bounds) { int pixelArray[] = new int[bounds.width*bounds.height]; getRGBPixelsImpl(xgc, bounds.x, bounds.y, bounds.width, bounds.height, - xgc.getScale(), pixelArray, isGtkSupported); + xgc.getScale(), pixelArray, useGtk); return pixelArray; } private static synchronized native void setup(int numberOfButtons, int[] buttonDownMasks); + private static native void loadNativeLibraries(); private static synchronized native void mouseMoveImpl(X11GraphicsConfig xgc, int x, int y); private static synchronized native void mousePressImpl(int buttons);