aboutsummaryrefslogtreecommitdiff
path: root/src/java.desktop/unix/classes/sun/awt/X11/XWindowPeer.java
diff options
context:
space:
mode:
authorDenis Fokin <Denis.Fokin@jetbrain.com>2019-04-09 16:24:05 +0300
committerDenis Fokin <Denis.Fokin@jetbrain.com>2019-04-09 16:24:05 +0300
commit3c9c599a2d03e3044a18d0bb688bc92586515044 (patch)
tree6f2a98884a4dd5c3b753ae10c84894c84aac6e60 /src/java.desktop/unix/classes/sun/awt/X11/XWindowPeer.java
parent06d35de06951adacc04cba6c35bf7d568ff11f79 (diff)
downloadJetBrainsRuntime-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.java42
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;
}