Mercurial > hg > release > icedtea6-1.10
changeset 2513:711c59eac969
Let AWT know about Mutter as a window manager.
author | Denis Lila <dlila@redhat.com> |
---|---|
date | Wed, 18 May 2011 09:06:00 -0400 |
parents | 3cf29ba320c1 |
children | d7b761a77f0d |
files | ChangeLog Makefile.am NEWS patches/openjdk/mutter.patch |
diffstat | 4 files changed, 321 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Thu May 12 13:36:41 2011 -0400 +++ b/ChangeLog Wed May 18 09:06:00 2011 -0400 @@ -1,3 +1,10 @@ +2011-05-17 Denis Lila <dlila@redhat.com> + + * Makefile.am: Apply patch. + * NEWS: Update with backport. + * patches/openjdk/mutter.patch: Add Mutter as a window manager, + so that a WM specific workaround keeps working. + 2011-05-12 Denis Lila <dlila@redhat.com> * Makefile.am: Apply patch.
--- a/Makefile.am Thu May 12 13:36:41 2011 -0400 +++ b/Makefile.am Wed May 18 09:06:00 2011 -0400 @@ -331,7 +331,8 @@ patches/hotspot/$(HSBUILD)/7032388-work_without_cmov_instruction.patch \ patches/openjdk/7031385-gcc-register-allocation-fix.patch \ patches/shark-llvm-2.9.patch \ - patches/openjdk/pgram-pipe-regression.patch + patches/openjdk/pgram-pipe-regression.patch \ + patches/openjdk/mutter.patch if WITH_ALT_HSBUILD ICEDTEA_PATCHES += \
--- a/NEWS Thu May 12 13:36:41 2011 -0400 +++ b/NEWS Wed May 18 09:06:00 2011 -0400 @@ -15,6 +15,7 @@ - PR689: Shark fails to find LLVM 2.9 System headers during build. * Backports - S7043054: REGRESSION - wrong userBounds in Paint.createContext() + - S7043963, RH698295: Window manager workaround in AWT was not applied to mutter. Now it is. New in release 1.10.1 (2011-04-04):
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/openjdk/mutter.patch Wed May 18 09:06:00 2011 -0400 @@ -0,0 +1,311 @@ +# HG changeset patch +# User Denis Lila <dlila@redhat.com> +# Date 1305642927 14400 +# Node ID 49098163596b4e2972ddad36550e0b9801d3170b +# Parent cf7c64f276c60d1bab5b26b87a4e337dadbb4888 +Add mutter as a window manager. + +diff -r cf7c64f276c6 -r 49098163596b src/solaris/classes/sun/awt/X11/XDecoratedPeer.java +--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java Wed May 11 11:08:03 2011 -0400 ++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java Tue May 17 10:35:27 2011 -0400 +@@ -721,7 +721,7 @@ + // Location, Client size + insets + newLocation = new Point(xe.get_x() - currentInsets.left, xe.get_y() - currentInsets.top); + } else { +- // CDE/MWM/Metacity/Sawfish bug: if shell is resized using ++ // CDE/MWM/Metacity/Sawfish/Mutter bug: if shell is resized using + // top or left border, we don't receive synthetic + // ConfigureNotify, only the one from X with zero + // coordinates. This is the workaround to get real +@@ -731,6 +731,7 @@ + case XWM.MOTIF_WM: + case XWM.METACITY_WM: + case XWM.SAWFISH_WM: ++ case XWM.MUTTER_WM: + { + Point xlocation = queryXLocation(); + if (log.isLoggable(PlatformLogger.FINE)) log.fine("New X location: {0}", xlocation); +diff -r cf7c64f276c6 -r 49098163596b src/solaris/classes/sun/awt/X11/XWM.java +--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XWM.java Wed May 11 11:08:03 2011 -0400 ++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XWM.java Tue May 17 10:35:27 2011 -0400 +@@ -101,7 +101,8 @@ + ICE_WM = 10, + METACITY_WM = 11, + COMPIZ_WM = 12, +- LG3D_WM = 13; ++ LG3D_WM = 13, ++ MUTTER_WM = 14; + public String toString() { + switch (WMID) { + case NO_WM: +@@ -128,6 +129,8 @@ + return "Compiz"; + case LG3D_WM: + return "LookingGlass"; ++ case MUTTER_WM: ++ return "Mutter"; + case UNDETERMINED_WM: + default: + return "Undetermined WM"; +@@ -566,6 +569,12 @@ + // getIntProperty(XToolkit.getDefaultRootWindow(), XAtom.XA_CARDINAL)) == 0); + } + ++ static boolean isMutter() { ++ return isNetWMName("Mutter"); ++ } ++ ++ // TODO: according to wikipedia, compiz is now reparenting. This should ++ // probably be updated. + static boolean isNonReparentingWM() { + return (XWM.getWMID() == XWM.COMPIZ_WM || XWM.getWMID() == XWM.LG3D_WM); + } +@@ -735,10 +744,12 @@ + awt_wmgr = XWM.ENLIGHTEN_WM; + } else if (isMetacity()) { + awt_wmgr = XWM.METACITY_WM; ++ } else if (isMutter()) { ++ awt_wmgr = XWM.MUTTER_WM; + } else if (isSawfish()) { + awt_wmgr = XWM.SAWFISH_WM; + } else if (isKDE2()) { +- awt_wmgr =XWM.KDE2_WM; ++ awt_wmgr = XWM.KDE2_WM; + } else if (isCompiz()) { + awt_wmgr = XWM.COMPIZ_WM; + } else if (isLookingGlass()) { +@@ -1036,6 +1047,8 @@ + + boolean supportsDynamicLayout() { + int wm = getWMID(); ++ // TODO: does mutter support this? It's a fancy new WM, so it probably ++ // does. Confirm and fix this. + switch (wm) { + case XWM.ENLIGHTEN_WM: + case XWM.KDE2_WM: +@@ -1360,6 +1373,7 @@ + return insets; + } + } ++ // TODO: figure out if Mutter implements the insets property. + switch(getWMID()) { + case XWM.KDE2_WM: + return getInsetsFromProp(window, XA_KDE_NET_WM_FRAME_STRUT); +@@ -1554,6 +1568,9 @@ + correctWM.bottom = correctWM.left; + break; + } ++ case XWM.MUTTER_WM: ++ // TODO: Figure out if Mutter is double reparenting. ++ // For now the fallback code is good enough. + case XWM.OTHER_WM: + default: { /* this is very similar to the E! case above */ + insLog.finest("Getting correct insets for OTHER_WM/default, parent: {0}", parent); +diff -r cf7c64f276c6 -r 49098163596b test/java/awt/WMSpecificTests/Mutter/MutterMaximizeTest.java +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ openjdk/jdk/test/java/awt/WMSpecificTests/Mutter/MutterMaximizeTest.java Tue May 17 10:35:27 2011 -0400 +@@ -0,0 +1,161 @@ ++/* ++ * Copyright 2011 Red Hat, Inc. All Rights Reserved. ++ * Copyright (c) 2011, 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. ++ */ ++ ++ ++/* ++ @test ++ @bug 7043963 ++ @summary Tests that the screen location of windows is ++ updated properly after a maximize. ++ @author Denis Lila ++ @library ../../regtesthelpers ++ @build Util ++ @run main MutterMaximizeTest ++*/ ++ ++import java.awt.AWTException; ++import java.awt.Dimension; ++import java.awt.Frame; ++import java.awt.Point; ++import java.awt.Robot; ++import java.awt.Window; ++import java.awt.event.InputEvent; ++import java.awt.event.WindowAdapter; ++import java.awt.event.WindowEvent; ++ ++import test.java.awt.regtesthelpers.Util; ++ ++@SuppressWarnings("serial") ++public class MutterMaximizeTest extends Frame { ++ ++ public static void main(String[] args) throws InterruptedException { ++ if (Util.getWMID() != Util.MUTTER_WM) { ++ System.out.println("This test is only useful on Mutter"); ++ return; ++ } ++ MutterMaximizeTest frame = new MutterMaximizeTest(); ++ frame.addWindowListener(Util.getClosingWindowAdapter()); ++ ++ //Display the window. ++ frame.pack(); ++ frame.setSize(500, 500); ++ Util.showWindowWait(frame); ++ runRobotTest(frame); ++ } ++ ++ private static void runRobotTest(Frame frame) { ++ try { ++ Thread robotThread = startRegTest(frame); ++ robotThread.start(); ++ waitForThread(robotThread); ++ } finally { ++ frame.dispose(); ++ } ++ } ++ ++ private static void waitForThread(Thread t) { ++ while (t.isAlive()) { ++ try { ++ t.join(); ++ } catch (InterruptedException e) { ++ } ++ } ++ } ++ ++ private static void sleepFor(long millis) { ++ long dT = 0; ++ long start = System.nanoTime(); ++ while (dT < millis) { ++ try { ++ long toSleep = millis - dT/1000000; ++ if (toSleep > 0) { ++ Thread.sleep(toSleep); ++ } ++ // if this ends without an interrupted exception, ++ // that's good enough. ++ break; ++ } catch (InterruptedException e) { ++ long now = System.nanoTime(); ++ dT = now - start; ++ } ++ } ++ } ++ ++ private static void rmove(Robot robot, Point p) { ++ robot.mouseMove(p.x, p.y); ++ } ++ private static void rdown(Robot robot) { ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ robot.delay(50); ++ } ++ private static void rup(Robot robot) { ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ robot.delay(50); ++ } ++ ++ public static void click(Robot robot) { ++ rdown(robot); ++ rup(robot); ++ } ++ ++ public static void doubleClick(Robot robot) { ++ click(robot); ++ click(robot); ++ } ++ ++ private static void dragWindow(Window w, int dx, int dy, Robot robot) { ++ Point p = Util.getTitlePoint(w); ++ rmove(robot, p); ++ rdown(robot); ++ p.translate(dx, dy); ++ rmove(robot, p); ++ rup(robot); ++ } ++ ++ // f must be visible ++ private static Thread startRegTest(final Frame f) { ++ Thread robot = new Thread(new Runnable() { ++ public void run() { ++ Robot r = Util.createRobot(); ++ dragWindow(f, 100, 100, r); ++ // wait for the location to be set. ++ sleepFor(2000); ++ ++ final Point l2 = f.getLocationOnScreen(); ++ ++ // double click should maximize the frame ++ doubleClick(r); ++ ++ // wait for location again. ++ sleepFor(2000); ++ final Point l3 = f.getLocationOnScreen(); ++ if (l3.equals(l2)) { ++ throw new RuntimeException("Bad location after maximize. Window location has not moved"); ++ } ++ } ++ }); ++ return robot; ++ } ++} ++ +diff -r cf7c64f276c6 -r 49098163596b test/java/awt/regtesthelpers/Util.java +--- openjdk.orig/jdk/test/java/awt/regtesthelpers/Util.java Wed May 11 11:08:03 2011 -0400 ++++ openjdk/jdk/test/java/awt/regtesthelpers/Util.java Tue May 17 10:35:27 2011 -0400 +@@ -140,6 +140,13 @@ + robot.mouseMove(bounds.x + bounds.width / 2, bounds.y + bounds.height / 2); + } + ++ public static Point getTitlePoint(Window decoratedWindow) { ++ Point p = decoratedWindow.getLocationOnScreen(); ++ Dimension d = decoratedWindow.getSize(); ++ return new Point(p.x + (int)(d.getWidth()/2), ++ p.y + (int)decoratedWindow.getInsets().top/2); ++ } ++ + /** + * Moves mouse pointer in the center of a given {@code comp} component + * and performs a left mouse button click using the {@code robot} parameter +@@ -167,11 +174,9 @@ + * WARNING: it may fail on some platforms when the window is not wide enough. + */ + public static void clickOnTitle(final Window decoratedWindow, final Robot robot) { +- Point p = decoratedWindow.getLocationOnScreen(); +- Dimension d = decoratedWindow.getSize(); +- + if (decoratedWindow instanceof Frame || decoratedWindow instanceof Dialog) { +- robot.mouseMove(p.x + (int)(d.getWidth()/2), p.y + (int)decoratedWindow.getInsets().top/2); ++ Point p = getTitlePoint(decoratedWindow); ++ robot.mouseMove(p.x, p.y); + robot.delay(50); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.delay(50); +@@ -409,7 +414,8 @@ + ICE_WM = 10, + METACITY_WM = 11, + COMPIZ_WM = 12, +- LG3D_WM = 13; ++ LG3D_WM = 13, ++ MUTTER_WM = 14; + + /* + * Returns -1 in case of not X Window or any problems. +exporting patch: +<fdopen>