diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CRobot.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CRobot.java index 4c39d2bed56..c764ae2162b 100644 --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CRobot.java +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CRobot.java @@ -27,7 +27,6 @@ import java.awt.Point; import java.awt.Rectangle; -import java.awt.Robot; import java.awt.peer.RobotPeer; import sun.awt.CGraphicsDevice; @@ -49,7 +48,7 @@ final class CRobot implements RobotPeer { * Uses the given GraphicsDevice as the coordinate system for subsequent * coordinate calls. */ - public CRobot(Robot r, CGraphicsDevice d) { + CRobot(CGraphicsDevice d) { fDevice = d; initRobot(); } diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java index c0af4562616..3446f0db2b4 100644 --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ package sun.lwawt.macosx; import java.awt.AWTError; +import java.awt.AWTException; import java.awt.CheckboxMenuItem; import java.awt.Color; import java.awt.Component; @@ -49,7 +50,6 @@ import java.awt.Point; import java.awt.PopupMenu; import java.awt.RenderingHints; -import java.awt.Robot; import java.awt.SystemTray; import java.awt.Taskbar; import java.awt.Toolkit; @@ -499,8 +499,11 @@ public void sync() { } @Override - public RobotPeer createRobot(Robot target, GraphicsDevice screen) { - return new CRobot(target, (CGraphicsDevice)screen); + public RobotPeer createRobot(GraphicsDevice screen) throws AWTException { + if (screen instanceof CGraphicsDevice) { + return new CRobot((CGraphicsDevice) screen); + } + return super.createRobot(screen); } private native boolean isCapsLockOn(); diff --git a/src/java.desktop/share/classes/java/awt/Robot.java b/src/java.desktop/share/classes/java/awt/Robot.java index 7f4b8608a5c..e801639358c 100644 --- a/src/java.desktop/share/classes/java/awt/Robot.java +++ b/src/java.desktop/share/classes/java/awt/Robot.java @@ -136,7 +136,7 @@ private void init(GraphicsDevice screen) throws AWTException { checkRobotAllowed(); Toolkit toolkit = Toolkit.getDefaultToolkit(); if (toolkit instanceof ComponentFactory) { - peer = ((ComponentFactory)toolkit).createRobot(this, screen); + peer = ((ComponentFactory)toolkit).createRobot(screen); } initLegalButtonMask(); } diff --git a/src/java.desktop/share/classes/sun/awt/ComponentFactory.java b/src/java.desktop/share/classes/sun/awt/ComponentFactory.java index b2e8af875ec..12664d88f97 100644 --- a/src/java.desktop/share/classes/sun/awt/ComponentFactory.java +++ b/src/java.desktop/share/classes/sun/awt/ComponentFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,60 @@ package sun.awt; -import java.awt.peer.TaskbarPeer; -import java.awt.*; +import java.awt.AWTException; +import java.awt.Button; +import java.awt.Canvas; +import java.awt.Checkbox; +import java.awt.CheckboxMenuItem; +import java.awt.Choice; +import java.awt.Component; +import java.awt.Desktop; +import java.awt.Dialog; +import java.awt.FileDialog; +import java.awt.Frame; +import java.awt.GraphicsDevice; +import java.awt.HeadlessException; +import java.awt.Label; +import java.awt.Menu; +import java.awt.MenuBar; +import java.awt.MenuItem; +import java.awt.Panel; +import java.awt.PopupMenu; +import java.awt.ScrollPane; +import java.awt.Scrollbar; +import java.awt.Taskbar; +import java.awt.TextArea; +import java.awt.TextField; +import java.awt.Window; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.InvalidDnDOperationException; import java.awt.dnd.peer.DragSourceContextPeer; -import java.awt.peer.*; +import java.awt.peer.ButtonPeer; +import java.awt.peer.CanvasPeer; +import java.awt.peer.CheckboxMenuItemPeer; +import java.awt.peer.CheckboxPeer; +import java.awt.peer.ChoicePeer; +import java.awt.peer.DesktopPeer; +import java.awt.peer.DialogPeer; +import java.awt.peer.FileDialogPeer; +import java.awt.peer.FontPeer; +import java.awt.peer.FramePeer; +import java.awt.peer.LabelPeer; +import java.awt.peer.LightweightPeer; +import java.awt.peer.ListPeer; +import java.awt.peer.MenuBarPeer; +import java.awt.peer.MenuItemPeer; +import java.awt.peer.MenuPeer; +import java.awt.peer.MouseInfoPeer; +import java.awt.peer.PanelPeer; +import java.awt.peer.PopupMenuPeer; +import java.awt.peer.RobotPeer; +import java.awt.peer.ScrollPanePeer; +import java.awt.peer.ScrollbarPeer; +import java.awt.peer.TaskbarPeer; +import java.awt.peer.TextAreaPeer; +import java.awt.peer.TextFieldPeer; +import java.awt.peer.WindowPeer; import sun.awt.datatransfer.DataTransferer; @@ -437,9 +485,17 @@ default FontPeer getFontPeer(String name, int style) { return null; } - default RobotPeer createRobot(Robot target, GraphicsDevice screen) - throws AWTException { - throw new HeadlessException(); + /** + * Creates the peer for a Robot. + * + * @param screen the GraphicsDevice indicating the coordinate system the + * Robot will operate in + * @return the peer created + * @throws AWTException if the platform configuration does not allow + * low-level input control + */ + default RobotPeer createRobot(GraphicsDevice screen) throws AWTException { + throw new AWTException(String.format("Unsupported device: %s", screen)); } default DataTransferer getDataTransferer() { diff --git a/src/java.desktop/unix/classes/sun/awt/X11/XRobotPeer.java b/src/java.desktop/unix/classes/sun/awt/X11/XRobotPeer.java index ef9589aa0b4..4834fb3bc43 100644 --- a/src/java.desktop/unix/classes/sun/awt/X11/XRobotPeer.java +++ b/src/java.desktop/unix/classes/sun/awt/X11/XRobotPeer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package sun.awt.X11; -import java.awt.GraphicsConfiguration; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.peer.RobotPeer; @@ -35,11 +34,12 @@ import sun.awt.SunToolkit; import sun.awt.UNIXToolkit; import sun.awt.X11GraphicsConfig; +import sun.awt.X11GraphicsDevice; import sun.security.action.GetPropertyAction; final class XRobotPeer implements RobotPeer { - static final boolean tryGtk; + private static final boolean tryGtk; static { loadNativeLibraries(); tryGtk = Boolean.parseBoolean( @@ -48,16 +48,10 @@ final class XRobotPeer implements RobotPeer { )); } private static volatile boolean useGtk; - private X11GraphicsConfig xgc = null; + private final X11GraphicsConfig xgc; - /* - * native implementation uses some static shared data (pipes, processes) - * so use a class lock to synchronize native method calls - */ - static Object robotLock = new Object(); - - XRobotPeer(GraphicsConfiguration gc) { - this.xgc = (X11GraphicsConfig)gc; + XRobotPeer(X11GraphicsDevice gd) { + xgc = (X11GraphicsConfig) gd.getDefaultConfiguration(); SunToolkit tk = (SunToolkit)Toolkit.getDefaultToolkit(); setup(tk.getNumberOfButtons(), AWTAccessor.getInputEventAccessor().getButtonDownMasks()); diff --git a/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java b/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java index eafabd47130..330827c939d 100644 --- a/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java +++ b/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,6 @@ import java.awt.PopupMenu; import java.awt.PrintJob; import java.awt.Rectangle; -import java.awt.Robot; import java.awt.ScrollPane; import java.awt.Scrollbar; import java.awt.SystemColor; @@ -1069,11 +1068,13 @@ protected static void targetDisposedPeer(Object target, Object peer) { } @Override - public RobotPeer createRobot(Robot target, GraphicsDevice screen) { - return new XRobotPeer(screen.getDefaultConfiguration()); + public RobotPeer createRobot(GraphicsDevice screen) throws AWTException { + if (screen instanceof X11GraphicsDevice) { + return new XRobotPeer((X11GraphicsDevice) screen); + } + return super.createRobot(screen); } - /* * On X, support for dynamic layout on resizing is governed by the * window manager. If the window manager supports it, it happens diff --git a/src/java.desktop/windows/classes/sun/awt/windows/WRobotPeer.java b/src/java.desktop/windows/classes/sun/awt/windows/WRobotPeer.java index 1f4cedf6775..c30b4ee3a08 100644 --- a/src/java.desktop/windows/classes/sun/awt/windows/WRobotPeer.java +++ b/src/java.desktop/windows/classes/sun/awt/windows/WRobotPeer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package sun.awt.windows; -import java.awt.GraphicsDevice; import java.awt.Point; import java.awt.Rectangle; import java.awt.peer.RobotPeer; @@ -34,9 +33,6 @@ final class WRobotPeer implements RobotPeer { - WRobotPeer(GraphicsDevice screen) { - } - public native void mouseMoveImpl(int x, int y); @Override public void mouseMove(int x, int y) { diff --git a/src/java.desktop/windows/classes/sun/awt/windows/WToolkit.java b/src/java.desktop/windows/classes/sun/awt/windows/WToolkit.java index e4686f0b577..f1de1f00186 100644 --- a/src/java.desktop/windows/classes/sun/awt/windows/WToolkit.java +++ b/src/java.desktop/windows/classes/sun/awt/windows/WToolkit.java @@ -25,60 +25,124 @@ package sun.awt.windows; -import java.awt.peer.TaskbarPeer; -import java.awt.*; -import java.awt.im.InputMethodHighlight; -import java.awt.im.spi.InputMethodDescriptor; -import java.awt.image.*; -import java.awt.peer.*; +import java.awt.AWTEvent; +import java.awt.AWTException; +import java.awt.Button; +import java.awt.Canvas; +import java.awt.Checkbox; +import java.awt.CheckboxMenuItem; +import java.awt.Choice; +import java.awt.Component; +import java.awt.Cursor; +import java.awt.Desktop; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.FileDialog; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Frame; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.HeadlessException; +import java.awt.Image; +import java.awt.Insets; +import java.awt.JobAttributes; +import java.awt.Label; +import java.awt.List; +import java.awt.Menu; +import java.awt.MenuBar; +import java.awt.MenuItem; +import java.awt.PageAttributes; +import java.awt.Panel; +import java.awt.Point; +import java.awt.PopupMenu; +import java.awt.PrintJob; +import java.awt.RenderingHints; +import java.awt.ScrollPane; +import java.awt.Scrollbar; +import java.awt.SystemTray; +import java.awt.Taskbar; +import java.awt.TextArea; +import java.awt.TextComponent; +import java.awt.TextField; +import java.awt.Toolkit; +import java.awt.TrayIcon; +import java.awt.Window; +import java.awt.datatransfer.Clipboard; +import java.awt.dnd.DragGestureEvent; +import java.awt.dnd.DragGestureListener; +import java.awt.dnd.DragGestureRecognizer; +import java.awt.dnd.DragSource; +import java.awt.dnd.InvalidDnDOperationException; +import java.awt.dnd.MouseDragGestureRecognizer; +import java.awt.dnd.peer.DragSourceContextPeer; import java.awt.event.FocusEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; -import java.awt.datatransfer.Clipboard; -import java.awt.TextComponent; -import java.awt.TrayIcon; +import java.awt.im.InputMethodHighlight; +import java.awt.im.spi.InputMethodDescriptor; +import java.awt.image.ColorModel; +import java.awt.peer.ButtonPeer; +import java.awt.peer.CanvasPeer; +import java.awt.peer.CheckboxMenuItemPeer; +import java.awt.peer.CheckboxPeer; +import java.awt.peer.ChoicePeer; +import java.awt.peer.DesktopPeer; +import java.awt.peer.DialogPeer; +import java.awt.peer.FileDialogPeer; +import java.awt.peer.FontPeer; +import java.awt.peer.FramePeer; +import java.awt.peer.KeyboardFocusManagerPeer; +import java.awt.peer.LabelPeer; +import java.awt.peer.ListPeer; +import java.awt.peer.MenuBarPeer; +import java.awt.peer.MenuItemPeer; +import java.awt.peer.MenuPeer; +import java.awt.peer.MouseInfoPeer; +import java.awt.peer.PanelPeer; +import java.awt.peer.PopupMenuPeer; +import java.awt.peer.RobotPeer; +import java.awt.peer.ScrollPanePeer; +import java.awt.peer.ScrollbarPeer; +import java.awt.peer.SystemTrayPeer; +import java.awt.peer.TaskbarPeer; +import java.awt.peer.TextAreaPeer; +import java.awt.peer.TextFieldPeer; +import java.awt.peer.TrayIconPeer; +import java.awt.peer.WindowPeer; import java.beans.PropertyChangeListener; import java.lang.ref.WeakReference; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.Hashtable; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + import javax.swing.text.JTextComponent; import sun.awt.AWTAccessor; -import sun.awt.AppContext; import sun.awt.AWTAutoShutdown; import sun.awt.AWTPermissions; import sun.awt.AppContext; import sun.awt.DisplayChangedListener; import sun.awt.LightweightFrame; import sun.awt.SunToolkit; -import sun.awt.util.ThreadGroupUtils; import sun.awt.Win32GraphicsDevice; import sun.awt.Win32GraphicsEnvironment; import sun.awt.datatransfer.DataTransferer; -import sun.java2d.d3d.D3DRenderQueue; -import sun.java2d.opengl.OGLRenderQueue; - -import sun.print.PrintJob2D; - -import java.awt.dnd.DragSource; -import java.awt.dnd.DragGestureListener; -import java.awt.dnd.DragGestureEvent; -import java.awt.dnd.DragGestureRecognizer; -import java.awt.dnd.MouseDragGestureRecognizer; -import java.awt.dnd.InvalidDnDOperationException; -import java.awt.dnd.peer.DragSourceContextPeer; - -import java.util.Hashtable; -import java.util.Locale; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - import sun.awt.util.PerformanceLogger; +import sun.awt.util.ThreadGroupUtils; import sun.font.FontManager; import sun.font.FontManagerFactory; import sun.font.SunFontManager; +import sun.java2d.d3d.D3DRenderQueue; +import sun.java2d.opengl.OGLRenderQueue; +import sun.print.PrintJob2D; import sun.util.logging.PlatformLogger; public final class WToolkit extends SunToolkit implements Runnable { @@ -496,11 +560,11 @@ public CheckboxMenuItemPeer createCheckboxMenuItem(CheckboxMenuItem target) { } @Override - public RobotPeer createRobot(Robot target, GraphicsDevice screen) { - // (target is unused for now) - // Robot's don't need to go in the peer map since - // they're not Component's - return new WRobotPeer(screen); + public RobotPeer createRobot(GraphicsDevice screen) throws AWTException { + if (screen instanceof Win32GraphicsDevice) { + return new WRobotPeer(); + } + return super.createRobot(screen); } public WEmbeddedFramePeer createEmbeddedFrame(WEmbeddedFrame target) { diff --git a/test/jdk/java/awt/Robot/CreateRobotCustomGC/CreateRobotCustomGC.java b/test/jdk/java/awt/Robot/CreateRobotCustomGC/CreateRobotCustomGC.java new file mode 100644 index 00000000000..47a4e4946a5 --- /dev/null +++ b/test/jdk/java/awt/Robot/CreateRobotCustomGC/CreateRobotCustomGC.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.AWTException; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.Robot; + +/** + * @test + * @key headful + * @bug 8238936 + * @summary Check that Robot(GraphicsDevice) constructor throw AWTException if + * device is unsupported + */ +public final class CreateRobotCustomGC { + + public static void main(String[] args) { + try { + new Robot(new GraphicsDevice() { + @Override + public int getType() { + return TYPE_RASTER_SCREEN; + } + + @Override + public String getIDstring() { + return "Custom screen device"; + } + + @Override + public GraphicsConfiguration[] getConfigurations() { + return new GraphicsConfiguration[0]; + } + + @Override + public GraphicsConfiguration getDefaultConfiguration() { + return null; + } + }); + throw new RuntimeException("Expected AWTException did not occur"); + } catch (AWTException ignored) { + // expected AWTException + } + } +} \ No newline at end of file