void (@NotNull final XSuspendContext suspendContext, boolean attract) { setBreakpointsDisabledTemporarily(false); mySuspendContext = suspendContext; myCurrentExecutionStack = suspendContext.getActiveExecutionStack(); myCurrentStackFrame = myCurrentExecutionStack != null ? myCurrentExecutionStack.getTopFrame() : null; myIsTopFrame = true; myTopStackFrame = myCurrentStackFrame; XSourcePosition topFramePosition = getTopFramePosition(); myPaused.set(true); boolean isAlternative = myAlternativeSourceHandler != null && myAlternativeSourceHandler.isAlternativeSourceKindPreferred(suspendContext); updateExecutionPosition(isAlternative ? XSourceKind.ALTERNATIVE : XSourceKind.MAIN); logPositionReached(topFramePosition); final boolean showOnSuspend = myShowTabOnSuspend.compareAndSet(true, false); if (showOnSuspend || attract) { AppUIUtil.invokeLaterIfProjectAlive(myProject, () -> { if (showOnSuspend) { initSessionTab(null); showSessionTab(); } // user attractions should only be made if event happens independently (e.g. program paused/suspended) // and should not be made when user steps in the code if (attract) { if (mySessionTab == null) { LOG.debug("Cannot request focus because Session Tab is not initialized yet"); return; } if (XDebuggerSettingManagerImpl.getInstanceImpl().getGeneralSettings().isShowDebuggerOnBreakpoint()) { mySessionTab.toFront(true, this::updateExecutionPosition); } if (topFramePosition == null) { // if there is no source position available, we should somehow tell the user that session is stopped. // the best way is to show the stack frames. XDebugSessionTab.showFramesView(this); } mySessionTab.getUi().attractBy(XDebuggerUIConstants.LAYOUT_VIEW_BREAKPOINT_CONDITION); } }); } myDispatcher.getMulticaster().sessionPaused(); }