diff --git a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDecoratedPeer.java b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDecoratedPeer.java index 74ee97f4f89..f4595b0eb8b 100644 --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDecoratedPeer.java +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDecoratedPeer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2016, 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 @@ -1010,7 +1010,22 @@ abstract class XDecoratedPeer extends XWindowPeer { if (focusLog.isLoggable(PlatformLogger.Level.FINE)) { focusLog.fine("WM_TAKE_FOCUS on {0}", this); } - requestWindowFocus(cl.get_data(1), true); + + if (XWM.getWMID() == XWM.UNITY_COMPIZ_WM) { + // JDK-8159460 + Window focusedWindow = XKeyboardFocusManagerPeer.getInstance() + .getCurrentFocusedWindow(); + Window activeWindow = XWindowPeer.getDecoratedOwner(focusedWindow); + if (activeWindow != target) { + requestWindowFocus(cl.get_data(1), true); + } else { + WindowEvent we = new WindowEvent(focusedWindow, + WindowEvent.WINDOW_GAINED_FOCUS); + sendEvent(we); + } + } else { + requestWindowFocus(cl.get_data(1), true); + } } /** diff --git a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XWM.java b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XWM.java index 5ece4e86e59..b227b5395cb 100644 --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XWM.java +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XWM.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, 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 @@ -104,7 +104,8 @@ final class XWM COMPIZ_WM = 12, LG3D_WM = 13, CWM_WM = 14, - MUTTER_WM = 15; + MUTTER_WM = 15, + UNITY_COMPIZ_WM = 16; public String toString() { switch (WMID) { case NO_WM: @@ -129,6 +130,8 @@ final class XWM return "Metacity"; case COMPIZ_WM: return "Compiz"; + case UNITY_COMPIZ_WM: + return "Unity Compiz"; case LG3D_WM: return "LookingGlass"; case CWM_WM: @@ -572,6 +575,10 @@ final class XWM return isNetWMName("compiz"); } + static boolean isUnityCompiz() { + return isNetWMName("Compiz"); + } + static boolean isLookingGlass() { return isNetWMName("LG3D"); } @@ -790,6 +797,8 @@ final class XWM awt_wmgr = CWM_WM; } else if (doIsIceWM && isIceWM()) { awt_wmgr = XWM.ICE_WM; + } else if (isUnityCompiz()) { + awt_wmgr = XWM.UNITY_COMPIZ_WM; } /* * We don't check for legacy WM when we already know that WM diff --git a/jdk/test/java/awt/Window/FindOwner/FindOwnerTest.html b/jdk/test/java/awt/Window/FindOwner/FindOwnerTest.html index f022dc470d1..38846d9285f 100644 --- a/jdk/test/java/awt/Window/FindOwner/FindOwnerTest.html +++ b/jdk/test/java/awt/Window/FindOwner/FindOwnerTest.html @@ -1,5 +1,5 @@