diff --git a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java index 2f5f3979885d..5f9fe3d0ede2 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java @@ -39,7 +39,10 @@ import com.intellij.openapi.util.ExpirableRunnable; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.wm.IdeFocusManager; +import com.intellij.openapi.wm.IdeFrame; +import com.intellij.openapi.wm.WindowManager; import com.intellij.openapi.wm.ex.WindowManagerEx; +import com.intellij.openapi.wm.impl.FocusManagerImpl; import com.intellij.util.Alarm; import com.intellij.util.ReflectionUtil; import com.intellij.util.containers.ContainerUtil; @@ -804,10 +807,11 @@ public class IdeEventQueue extends EventQueue { // Only Dialogs and Frames get window activated events. // Let's handle Windows this way. + final Window eventWindow = we.getWindow(); if (we.getID() == WindowEvent.WINDOW_ACTIVATED || we.getID() == WindowEvent.WINDOW_GAINED_FOCUS) { appImpl.myCancelDeactivation = true; if (!appImpl.isActive()) { - appImpl.tryToApplyActivationState(true, we.getWindow()); + appImpl.tryToApplyActivationState(true, eventWindow); } } else if (we.getID() == WindowEvent.WINDOW_DEACTIVATED) { @@ -821,7 +825,7 @@ public class IdeEventQueue extends EventQueue { Timer timer = new Timer(Registry.intValue("app.deactivation.timeout"), new ActionListener() { public void actionPerformed(ActionEvent evt) { if (appImpl.isActive() && !appImpl.isDeactivationCanceled()) { - appImpl.tryToApplyActivationState(false, we.getWindow()); + appImpl.tryToApplyActivationState(false, eventWindow); } } }); @@ -829,6 +833,24 @@ public class IdeEventQueue extends EventQueue { timer.setRepeats(false); timer.start(); } + + if (we.getID() == WindowEvent.WINDOW_DEACTIVATED || we.getID() == WindowEvent.WINDOW_LOST_FOCUS) { + Component frame = UIUtil.findUltimateParent(eventWindow); + Component focusOwnerInDeactivatedWindow = eventWindow.getMostRecentFocusOwner(); + IdeFrame[] allProjectFrames = WindowManager.getInstance().getAllProjectFrames(); + + if (focusOwnerInDeactivatedWindow != null) { + for (IdeFrame ideFrame : allProjectFrames) { + JFrame aFrame = WindowManager.getInstance().getFrame(ideFrame.getProject()); + if (aFrame.equals(frame)) { + IdeFocusManager focusManager = IdeFocusManager.getGlobalInstance(); + if (focusManager instanceof FocusManagerImpl) { + ((FocusManagerImpl)focusManager).setLastFocusedAtDeactivation(ideFrame, focusOwnerInDeactivatedWindow); + } + } + } + } + } } return false; diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index 0b9a48d45da8..72a576aee7b3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -1191,10 +1191,6 @@ public class ApplicationImpl extends PlatformComponentManagerImpl implements App } else { publisher.applicationDeactivated(ideFrame); - IdeFocusManager focusManager = IdeFocusManager.getGlobalInstance(); - if (focusManager instanceof FocusManagerImpl) { - ((FocusManagerImpl)focusManager).setLastFocusedAtDeactivation(ideFrame, focusManager.getLastFocusedFor(ideFrame)); - } } return true; }