diff options
author | Denis Fokin <Denis.Fokin@jetbrain.com> | 2019-04-09 16:24:05 +0300 |
---|---|---|
committer | Denis Fokin <Denis.Fokin@jetbrain.com> | 2019-04-09 16:24:05 +0300 |
commit | 3c9c599a2d03e3044a18d0bb688bc92586515044 (patch) | |
tree | 6f2a98884a4dd5c3b753ae10c84894c84aac6e60 /src/java.desktop/unix/classes/sun/awt/X11/XWindowPeer.java | |
parent | 06d35de06951adacc04cba6c35bf7d568ff11f79 (diff) | |
download | JetBrainsRuntime-3c9c599a2d03e3044a18d0bb688bc92586515044.tar.gz |
JBR-1362 Multiple child windows opened and closed in sequence result in a focus lossjb11_0_2-b221jb11_0_2-b215.6jb11_0_2-b159.40
Diffstat (limited to 'src/java.desktop/unix/classes/sun/awt/X11/XWindowPeer.java')
-rw-r--r-- | src/java.desktop/unix/classes/sun/awt/X11/XWindowPeer.java | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/src/java.desktop/unix/classes/sun/awt/X11/XWindowPeer.java b/src/java.desktop/unix/classes/sun/awt/X11/XWindowPeer.java index e59d990b34c..e1244ee4c00 100644 --- a/src/java.desktop/unix/classes/sun/awt/X11/XWindowPeer.java +++ b/src/java.desktop/unix/classes/sun/awt/X11/XWindowPeer.java @@ -44,18 +44,20 @@ import java.awt.SystemColor; import java.awt.Window; import java.awt.event.ComponentEvent; import java.awt.event.FocusEvent; +import java.awt.event.InvocationEvent; import java.awt.event.WindowEvent; import java.awt.peer.ComponentPeer; import java.awt.peer.WindowPeer; import java.io.UnsupportedEncodingException; import java.security.AccessController; import java.security.PrivilegedAction; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -import java.util.Vector; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.BooleanSupplier; +import java.util.function.Consumer; import sun.awt.AWTAccessor; import sun.awt.AWTAccessor.ComponentAccessor; @@ -624,11 +626,10 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, target.dispatchEvent(we); } } - - public void handleWindowFocusInSync(long serial) { + public void handleWindowFocusInSync(long serial, Runnable lightweigtRequest) { WindowEvent we = new WindowEvent((Window)target, WindowEvent.WINDOW_GAINED_FOCUS); XKeyboardFocusManagerPeer.getInstance().setCurrentFocusedWindow((Window) target); - sendEvent(we); + sendEvent(we, lightweigtRequest); } // NOTE: This method may be called by privileged threads. // DO NOT INVOKE CLIENT CODE ON THIS THREAD! @@ -849,7 +850,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, if (focusLog.isLoggable(PlatformLogger.Level.FINE)) { focusLog.fine("Requesting window focus"); } - requestWindowFocus(time, timeProvided); + requestWindowFocus(time, timeProvided, () -> {}, () -> {}); } public final boolean focusAllowedFor() { @@ -1302,7 +1303,8 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, if (isSimpleWindow()) { if (target == XKeyboardFocusManagerPeer.getInstance().getCurrentFocusedWindow()) { Window owner = getDecoratedOwner((Window)target); - ((XWindowPeer)AWTAccessor.getComponentAccessor().getPeer(owner)).requestWindowFocus(); + ((XWindowPeer)AWTAccessor.getComponentAccessor().getPeer(owner)). + requestWindowFocus(() -> {}, () -> {}); } } } @@ -1937,16 +1939,25 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, return window; } - public boolean requestWindowFocus(XWindowPeer actualFocusedWindow) { + public boolean requestWindowFocus(XWindowPeer actualFocusedWindow, Runnable lightweigtRequest, Runnable rejectFocusRequest) { setActualFocusedWindow(actualFocusedWindow); - return requestWindowFocus(); + return requestWindowFocus(lightweigtRequest, rejectFocusRequest); } public boolean requestWindowFocus() { - return requestWindowFocus(0, false); + return requestWindowFocus(() -> {}, () -> {}); + } + + public boolean requestWindowFocus(Runnable lightweigtRequest, Runnable rejectFocusRequest) { + return requestWindowFocus(0, false, lightweigtRequest, rejectFocusRequest); } public boolean requestWindowFocus(long time, boolean timeProvided) { + return requestWindowFocus(time, timeProvided, () -> {}, () -> {}); + } + + public boolean requestWindowFocus(long time, boolean timeProvided, + Runnable lightweigtRequest, Runnable rejectFocusRequest) { focusLog.fine("Request for window focus"); // If this is Frame or Dialog we can't assure focus request success - but we still can try // If this is Window and its owner Frame is active we can be sure request succedded. @@ -1956,11 +1967,12 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, if (isWMStateNetHidden()) { focusLog.fine("The window is unmapped, so rejecting the request"); + rejectFocusRequest.run(); return false; } if (activeWindow == ownerWindow) { focusLog.fine("Parent window is active - generating focus for this window"); - handleWindowFocusInSync(-1); + handleWindowFocusInSync(-1, lightweigtRequest); return true; } focusLog.fine("Parent window is not active"); @@ -1968,9 +1980,11 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, XDecoratedPeer wpeer = AWTAccessor.getComponentAccessor().getPeer(ownerWindow); if (wpeer != null && wpeer.requestWindowFocus(this, time, timeProvided)) { focusLog.fine("Parent window accepted focus request - generating focus for this window"); + handleWindowFocusInSync(-1, lightweigtRequest); return true; } focusLog.fine("Denied - parent window is not active and didn't accept focus request"); + rejectFocusRequest.run(); return false; } |