1 /*
2 * Copyright (c) 2013, 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.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /*
25 * @test
26 * @bug 8012586
27 * @summary verify that modal dialog will appeared above fullscreen window under Metacity WM.
28 * @run main FullscreenDialogModality
29 * @run main/othervm FullscreenDialogModality
30 * @author vkravets
31 */
32
33 import test.java.awt.regtesthelpers.Util;
34
35 import java.awt.*;
36 import java.lang.reflect.InvocationTargetException;
37
38 public class FullscreenDialogModality extends Frame {
39
40 static Robot robot = null;
41
42 public void enterFS() {
43 GraphicsDevice gd = getGraphicsConfiguration().getDevice();
44 final boolean fs = gd.isFullScreenSupported();
45 System.out.println("FullscreenSupported: " + (fs ? "yes" : "no"));
46 gd.setFullScreenWindow(this);
47 try {
48 // Give the system time to set the FS window and display it
49 // properly
50 Thread.sleep(2000);
51 } catch (Exception e) {}
52 }
53
54 public void exitFS() {
55 GraphicsDevice gd = getGraphicsConfiguration().getDevice();
56 // reset window
57 gd.setFullScreenWindow(null);
58 try {
59 // Give the system time to set the FS window and display it
60 // properly
61 Thread.sleep(2000);
62 } catch (Exception e) {}
63 }
64
65 public void checkDialogModality() throws InvocationTargetException, InterruptedException {
66 // Dialog
67 final Dialog d = new Dialog(FullscreenDialogModality.this, "Modal dialog", Dialog.ModalityType.APPLICATION_MODAL);
68 d.setBounds(500, 500, 160, 160);
69 d.setModal(true);
70 d.setBackground(Color.red);
71 EventQueue.invokeLater(new Runnable()
72 {
73 public void run()
74 {
75 d.setVisible(true);
76 }
77 });
78 // Wait until the dialog is shown
79 EventQueue.invokeLater(new Runnable() {
80 public void run() {
81 // Empty
82 }
83 });
84
85 Util.waitForIdle(robot);
86 try {
87 //Check color
88 Point checkPoint = new Point(d.getX() + d.getWidth() / 2, d.getY() + d.getHeight() / 2);
89 Color actual = robot.getPixelColor(checkPoint.x, checkPoint.y);
90 System.out.println("Color = " + actual);
91 if (actual.getRGB() == Color.GREEN.getRGB()) {
92 throw new RuntimeException("Test FAILED: Modal dialog shown below fullscreen window");
93 } else if (actual.getRGB() == Color.RED.getRGB()) {
94 System.out.println("Test PASSED: Modal dialog shown above fullscreen window");
95 } else {
96 System.out.println("pixelColor " +
97 Integer.toHexString(actual.getRGB()) +
98 " at coordinates (" + checkPoint.x + ", " + checkPoint.y + ")");
99 throw new RuntimeException("Test FAILED: Unexpected behavior");
100 }
101
102 robot.delay(2000);
103 Util.waitForIdle(robot);
104 } finally {
105 d.dispose();
106 }
107 }
108
109 public static void main(String args[]) throws InvocationTargetException, InterruptedException {
110 if (Util.getWMID() != Util.METACITY_WM) {
111 System.out.println("This test is only useful on Metacity");
112 return;
113 }
114 robot = Util.createRobot();
115 Util.waitForIdle(robot);
116 final FullscreenDialogModality frame = new FullscreenDialogModality();
117 frame.setUndecorated(true);
118 frame.setBackground(Color.green);
119 frame.setSize(500, 500);
120 frame.setVisible(true);
121 try {
122 robot.delay(100);
123 Util.waitForIdle(robot);
124
125 EventQueue.invokeAndWait(new Runnable() {
126 public void run() {
127 frame.enterFS();
128 }
129 });
130 robot.delay(200);
131 Util.waitForIdle(robot);
132
133 frame.checkDialogModality();
134
135 EventQueue.invokeAndWait(new Runnable() {
136 public void run() {
137 frame.exitFS();
138 }
139 });
140 } finally {
141 frame.dispose();
142 }
143 }
144 }