From 6297ccba254fadd2b9a95174f17d391f5580895c Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Thu, 11 Nov 2010 13:45:33 +0300 Subject: [PATCH] attempt to fix key events reordeing --- .../src/com/intellij/ide/IdeEventQueue.java | 10 +---- .../openapi/wm/impl/FocusManagerImpl.java | 37 +++++++++++-------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java index 65e04b9340a6..7e6b443de6d3 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java @@ -545,21 +545,17 @@ public class IdeEventQueue extends EventQueue { } } - public boolean fixStickyFocusedComponents(@Nullable AWTEvent e) { - boolean attemptedToFix = false; - - if (e != null && !(e instanceof InputEvent)) return attemptedToFix; + public void fixStickyFocusedComponents(@Nullable AWTEvent e) { + if (e != null && !(e instanceof InputEvent)) return; final KeyboardFocusManager mgr = KeyboardFocusManager.getCurrentKeyboardFocusManager(); if (Registry.is("actionSystem.fixStickyFocusedWindows")) { - attemptedToFix = true; fixStickyWindow(mgr, mgr.getActiveWindow(), "setGlobalActiveWindow"); fixStickyWindow(mgr, mgr.getFocusedWindow(), "setGlobalFocusedWindow"); } if (Registry.is("actionSystem.fixNullFocusedComponent")) { - attemptedToFix = true; final Component focusOwner = mgr.getFocusOwner(); if (focusOwner == null) { @@ -615,8 +611,6 @@ public class IdeEventQueue extends EventQueue { } } } - - return attemptedToFix; } private void enterSuspendModeIfNeeded(AWTEvent e) { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/FocusManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/FocusManagerImpl.java index 2bdc854b830e..3d15040d4cf4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/FocusManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/FocusManagerImpl.java @@ -31,7 +31,6 @@ import com.intellij.openapi.wm.*; import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy; import com.intellij.ui.FocusTrackback; import com.intellij.util.Alarm; -import com.intellij.util.containers.HashSet; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -70,7 +69,7 @@ public class FocusManagerImpl extends IdeFocusManager implements Disposable { private final EdtAlarm myForcedFocusRequestsAlarm; private final EdtAlarm myIdleAlarm; - private final Set myIdleRequests = new HashSet(); + private final Set myIdleRequests = new LinkedHashSet(); private final EdtRunnable myIdleRunnable = new EdtRunnable() { public void runEdt() { if (canFlushIdleRequests()) { @@ -81,6 +80,7 @@ public class FocusManagerImpl extends IdeFocusManager implements Disposable { } } }; + private boolean myFlushWasDelayedToFixFocus; private boolean canFlushIdleRequests() { return isFocusTransferReady() && !isIdleQueueEmpty(); @@ -350,6 +350,7 @@ public class FocusManagerImpl extends IdeFocusManager implements Disposable { public void run() { if (isFlushingIdleRequests()) { SwingUtilities.invokeLater(this); + return; } if (myRunContext != null) { @@ -360,7 +361,7 @@ public class FocusManagerImpl extends IdeFocusManager implements Disposable { final boolean needsRestart = isIdleQueueEmpty(); myIdleRequests.add(runnable); - if (isFocusTransferReady()) { + if (canFlushIdleRequests()) { flushIdleRequests(); } else { if (needsRestart) { @@ -420,19 +421,15 @@ public class FocusManagerImpl extends IdeFocusManager implements Disposable { if (isPendingKeyEventsRedispatched()) { - boolean focusOk = getFocusOwner() != null; - boolean attemptedToFixFocus = IdeEventQueue.getInstance().fixStickyFocusedComponents(null); + boolean focusOk = getFocusOwner() != null || myFlushWasDelayedToFixFocus; + if (!focusOk) { + IdeEventQueue.getInstance().fixStickyFocusedComponents(null); + myFlushWasDelayedToFixFocus = true; + } - if (canFlushIdleRequests() && myFlushingIdleRequestsEntryCount <= 1) { - if (focusOk || !attemptedToFixFocus) { - final Runnable[] all = myIdleRequests.toArray(new Runnable[myIdleRequests.size()]); - myIdleRequests.clear(); - for (Runnable each : all) { - if (each != null) { - each.run(); - } - } - } + if (canFlushIdleRequests() && myFlushingIdleRequestsEntryCount <= 1 && (focusOk || !myFlushWasDelayedToFixFocus)) { + myFlushWasDelayedToFixFocus = false; + flushNow(); } } } @@ -444,6 +441,16 @@ public class FocusManagerImpl extends IdeFocusManager implements Disposable { } } + private void flushNow() { + final Runnable[] all = myIdleRequests.toArray(new Runnable[myIdleRequests.size()]); + myIdleRequests.clear(); + for (Runnable each : all) { + if (each != null) { + each.run(); + } + } + } + public boolean isFocusTransferReady() { if (myRunContext != null) return true;