Add timeout for showing windows
diff --git a/src/solaris/classes/sun/awt/X11/WindowStateMachine.java b/src/solaris/classes/sun/awt/X11/WindowStateMachine.java
index ab80fc2..6720e41 100644
--- a/src/solaris/classes/sun/awt/X11/WindowStateMachine.java
+++ b/src/solaris/classes/sun/awt/X11/WindowStateMachine.java
@@ -3,7 +3,9 @@
import sun.util.logging.PlatformLogger;
import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
public class WindowStateMachine {
@@ -20,19 +22,47 @@
MAPPED_AND_WAITING_FOR_MAP_NOTIFY,
}
- private Map<Long, State> waitingWindows = new LinkedHashMap<>();
+ private Map<WindowInfo, State> waitingWindows = new LinkedHashMap<>();
+
+ class WindowInfo {
+ public WindowInfo(long id, long time) {
+ this.id = id;
+ this.time = time;
+ }
+
+ private long id;
+ private long time;
+ }
public void waitForNotifyAfterRaise (Long windowId) {
focusLog.finer("Window: " + Long.toHexString(windowId), new Throwable());
- waitingWindows.put(windowId, State.RAISED_AND_WAITING_FOR_MAP_NOTIFY);
+ waitingWindows.put(new WindowInfo(windowId, System.nanoTime()), State.RAISED_AND_WAITING_FOR_MAP_NOTIFY);
}
public void waitForNotifyAfterMap (Long windowId) {
- waitingWindows.put(windowId, State.MAPPED_AND_WAITING_FOR_MAP_NOTIFY);
+ waitingWindows.put(new WindowInfo(windowId, System.nanoTime()), State.MAPPED_AND_WAITING_FOR_MAP_NOTIFY);
}
public void notify(Long windowId) {
- waitingWindows.remove(windowId);
+ List<WindowInfo> windows = waitingWindows.entrySet().stream().
+ filter(windowInfoStateEntry -> windowInfoStateEntry.getKey().id == windowId).
+ map(Map.Entry::getKey).
+ collect(Collectors.toList());
+ focusLog.finer("Remove " + windows.size() + "windows");
+ windows.forEach(wId -> waitingWindows.remove(wId));
+
+ double timeout = 3 * 1E9;
+
+ List<WindowInfo> windows2 = waitingWindows.entrySet().stream().
+ filter(windowInfoStateEntry -> {
+ long timeKept = System.nanoTime() - windowInfoStateEntry.getKey().time;
+ focusLog.finer("Window has been kept " + timeKept);
+ return timeKept > timeout;
+ }).
+ map(Map.Entry::getKey).
+ collect(Collectors.toList());
+ focusLog.finer("Remove " + windows2.size() + "windows by timout");
+ windows2.forEach(wId -> waitingWindows.remove(wId));
}
public boolean isWaitingForWindowShow () {
@@ -46,6 +76,6 @@
@Override
public String toString() {
return "Window state machine: " + waitingWindows.entrySet().stream().
- collect(StringBuilder::new, (sb, e) -> sb.append(Long.toHexString(e.getKey())).append(" : ").append(e.getValue()).append("; "), StringBuilder::append);
+ collect(StringBuilder::new, (sb, e) -> sb.append(Long.toHexString(e.getKey().id)).append(" : ").append(e.getValue()).append("; "), StringBuilder::append);
}
}
diff --git a/src/solaris/classes/sun/awt/X11/XBaseWindow.java b/src/solaris/classes/sun/awt/X11/XBaseWindow.java
index 8493a32..052af80 100644
--- a/src/solaris/classes/sun/awt/X11/XBaseWindow.java
+++ b/src/solaris/classes/sun/awt/X11/XBaseWindow.java
@@ -930,9 +930,6 @@
}
public void handlePropertyNotify(XEvent xev) {
XPropertyEvent msg = xev.get_xproperty();
- if (msg.get_atom() == XAtom.XA_WM_HINTS) {
- WindowStateMachine.get().notify(msg.get_window());
- }
if (XPropertyCache.isCachingSupported()) {
XPropertyCache.clearCache(window, XAtom.get(msg.get_atom()));
}