NoResizeEventOnDMChangeTest.java revision 14851:980da45565c8
1/*
2 * Copyright (c) 2007, 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.
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 * @test
25 * @key headful
26 * @bug 6646411
27 * @summary Tests that full screen window and its children receive resize
28            event when display mode changes
29 * @author Dmitri.Trembovetski@sun.com: area=Graphics
30 * @run main/othervm NoResizeEventOnDMChangeTest
31 * @run main/othervm -Dsun.java2d.d3d=false NoResizeEventOnDMChangeTest
32 */
33
34import java.awt.Canvas;
35import java.awt.Color;
36import java.awt.Component;
37import java.awt.DisplayMode;
38import java.awt.EventQueue;
39import java.awt.Frame;
40import java.awt.Graphics;
41import java.awt.GraphicsDevice;
42import java.awt.GraphicsEnvironment;
43import java.awt.Window;
44import java.awt.event.ComponentAdapter;
45import java.awt.event.ComponentEvent;
46import java.awt.event.WindowAdapter;
47import java.awt.event.WindowEvent;
48
49public class NoResizeEventOnDMChangeTest {
50    public static void main(String[] args) {
51        final GraphicsDevice gd = GraphicsEnvironment.
52            getLocalGraphicsEnvironment().getDefaultScreenDevice();
53
54        if (!gd.isFullScreenSupported()) {
55            System.out.println("Full screen not supported, test passed");
56            return;
57        }
58
59        DisplayMode dm = gd.getDisplayMode();
60        final DisplayMode dms[] = new DisplayMode[2];
61        for (DisplayMode dm1 : gd.getDisplayModes()) {
62            if (dm1.getWidth()  != dm.getWidth() ||
63                dm1.getHeight() != dm.getHeight())
64            {
65                dms[0] = dm1;
66                break;
67            }
68        }
69        if (dms[0] == null) {
70            System.out.println("Test Passed: all DMs have same dimensions");
71            return;
72        }
73        dms[1] = dm;
74
75        Frame f = new Frame() {
76            @Override
77            public void paint(Graphics g) {
78                g.setColor(Color.red);
79                g.fillRect(0, 0, getWidth(), getHeight());
80                g.setColor(Color.green);
81                g.drawRect(0, 0, getWidth()-1, getHeight()-1);
82            }
83        };
84        f.setUndecorated(true);
85        testFSWindow(gd, dms, f);
86
87        Window w = new Window(f) {
88            @Override
89            public void paint(Graphics g) {
90                g.setColor(Color.magenta);
91                g.fillRect(0, 0, getWidth(), getHeight());
92                g.setColor(Color.cyan);
93                g.drawRect(0, 0, getWidth()-1, getHeight()-1);
94            }
95        };
96        testFSWindow(gd, dms, w);
97        System.out.println("Test Passed.");
98    }
99
100    private static void testFSWindow(final GraphicsDevice gd,
101                                     final DisplayMode dms[],
102                                     final Window fsWin)
103    {
104        System.out.println("Testing FS window: "+fsWin);
105        Component c = new Canvas() {
106            @Override
107            public void paint(Graphics g) {
108                g.setColor(Color.blue);
109                g.fillRect(0, 0, getWidth(), getHeight());
110                g.setColor(Color.magenta);
111                g.drawRect(0, 0, getWidth()-1, getHeight()-1);
112                g.setColor(Color.red);
113                g.drawString("FS Window   : " + fsWin, 50, 50);
114                DisplayMode dm =
115                    getGraphicsConfiguration().getDevice().getDisplayMode();
116                g.drawString("Display Mode: " +
117                             dm.getWidth() + "x" + dm.getHeight(), 50, 75);
118            }
119        };
120        fsWin.add("Center", c);
121        fsWin.addWindowListener(new WindowAdapter() {
122            @Override
123            public void windowClosing(WindowEvent e) {
124                fsWin.dispose();
125                if (fsWin.getOwner() != null) {
126                    fsWin.getOwner().dispose();
127                }
128            }
129        });
130
131        try {
132            EventQueue.invokeAndWait(new Runnable() {
133                public void run() {
134                    gd.setFullScreenWindow(fsWin);
135                }
136            });
137        } catch (Exception ex) {}
138
139        sleep(1000);
140
141        final ResizeEventChecker r1 = new ResizeEventChecker();
142        final ResizeEventChecker r2 = new ResizeEventChecker();
143
144        if (gd.isDisplayChangeSupported()) {
145            fsWin.addComponentListener(r1);
146            c.addComponentListener(r2);
147            for (final DisplayMode dm1 : dms) {
148                try {
149                    EventQueue.invokeAndWait(new Runnable() {
150                        public void run() {
151                            System.err.printf("----------- Setting DM %dx%d:\n",
152                                              dm1.getWidth(), dm1.getHeight());
153                            try {
154                                gd.setDisplayMode(dm1);
155                                r1.incDmChanges();
156                                r2.incDmChanges();
157                            } catch (IllegalArgumentException iae) {}
158                        }
159                    });
160                } catch (Exception ex) {}
161                for (int i = 0; i < 3; i++) {
162                    fsWin.repaint();
163                    sleep(1000);
164                }
165            }
166            fsWin.removeComponentListener(r1);
167            c.removeComponentListener(r2);
168        }
169        try {
170           EventQueue.invokeAndWait(new Runnable() {
171               public void run() {
172                   gd.setFullScreenWindow(null);
173                    fsWin.dispose();
174                    if (fsWin.getOwner() != null) {
175                        fsWin.getOwner().dispose();
176                    }
177                }
178            });
179        } catch (Exception ex) {}
180
181        System.out.printf("FS Window: resizes=%d, dm changes=%d\n",
182                           r1.getResizes(), r1.getDmChanges());
183        System.out.printf("Component: resizes=%d, dm changes=%d\n",
184                          r2.getResizes(), r2.getDmChanges());
185        if (r1.getResizes() < r1.getDmChanges()) {
186            throw new RuntimeException("FS Window didn't receive all resizes!");
187        }
188        if (r2.getResizes() < r2.getDmChanges()) {
189            throw new RuntimeException("Component didn't receive all resizes!");
190        }
191    }
192
193    static void sleep(long ms) {
194        try {
195            Thread.sleep(ms);
196        } catch (InterruptedException ex) {}
197    }
198    static class ResizeEventChecker extends ComponentAdapter {
199        int dmChanges;
200        int resizes;
201
202        @Override
203        public synchronized void componentResized(ComponentEvent e) {
204            System.out.println("Received resize event for "+e.getSource());
205            resizes++;
206        }
207        public synchronized int getResizes() {
208            return resizes;
209        }
210        public synchronized void incDmChanges() {
211            dmChanges++;
212        }
213        public synchronized int getDmChanges() {
214            return dmChanges;
215        }
216    }
217}
218