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()));
         }