diff --git a/plugins/terminal/frontend/src/com/intellij/terminal/frontend/session/TerminalTabsManager.kt b/plugins/terminal/frontend/src/com/intellij/terminal/frontend/session/TerminalTabsManager.kt index 17263de40ce1..66f194ff629e 100644 --- a/plugins/terminal/frontend/src/com/intellij/terminal/frontend/session/TerminalTabsManager.kt +++ b/plugins/terminal/frontend/src/com/intellij/terminal/frontend/session/TerminalTabsManager.kt @@ -37,7 +37,6 @@ internal class TerminalTabsManager(private val project: Project, private val cor private val tabsMap: MutableMap = LinkedHashMap() private val tabsLock = Mutex() private val tabIdCounter = AtomicInteger(0) - private val detachedTabs: MutableSet = HashSet() init { val storedTabs = TerminalTabsStorage.getInstance(project).getStoredTabs() @@ -55,7 +54,7 @@ internal class TerminalTabsManager(private val project: Project, private val cor /** Caller must hold [tabsLock] */ private fun getTerminalTabsNoLock(): List { - return tabsMap.values.filter { it.id !in detachedTabs } + return tabsMap.values.toList() } suspend fun createNewTerminalTab(): TerminalSessionTab { @@ -108,7 +107,6 @@ internal class TerminalTabsManager(private val project: Project, private val cor scope.awaitCancellationAndInvoke { updateTabsAndStore { tabs -> tabs.remove(tabId) - detachedTabs -= tabId } } @@ -140,7 +138,6 @@ internal class TerminalTabsManager(private val project: Project, private val cor else { // The session was not started - just remove the tab. tabs.remove(tabId) - detachedTabs -= tabId } } } @@ -241,12 +238,6 @@ internal class TerminalTabsManager(private val project: Project, private val cor ) } - suspend fun detachTerminalTab(tabId: Int) { - updateTabsAndStore { - detachedTabs += tabId - } - } - companion object { @JvmStatic fun getInstance(project: Project): TerminalTabsManager { diff --git a/plugins/terminal/frontend/src/com/intellij/terminal/frontend/toolwindow/impl/DetachedTabs.kt b/plugins/terminal/frontend/src/com/intellij/terminal/frontend/toolwindow/impl/DetachedTabs.kt deleted file mode 100644 index f03f8518af3a..000000000000 --- a/plugins/terminal/frontend/src/com/intellij/terminal/frontend/toolwindow/impl/DetachedTabs.kt +++ /dev/null @@ -1,74 +0,0 @@ -package com.intellij.terminal.frontend.toolwindow.impl - -import com.intellij.openapi.project.Project -import com.intellij.terminal.frontend.session.TerminalTabsManager -import com.intellij.terminal.frontend.toolwindow.TerminalTabsManagerListener -import com.intellij.terminal.frontend.toolwindow.TerminalToolWindowTab -import com.intellij.terminal.frontend.view.TerminalView -import com.intellij.util.AwaitCancellationAndInvoke -import com.intellij.util.awaitCancellationAndInvoke -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch -import java.util.Collections -import java.util.IdentityHashMap - -/** - * Notifies [TerminalTabsManager] when a terminal tab is detached, - * so it isn't restored on the next IDE start. - */ -internal class DetachedTabs( - private val project: Project, - private val coroutineScope: CoroutineScope, -) { - - private val lock = Any() - private val detachedViews: MutableSet = Collections.newSetFromMap(IdentityHashMap()) - private val viewsWithIds: MutableMap = IdentityHashMap() - - init { - project.messageBus.connect(coroutineScope).subscribe(TerminalTabsManagerListener.TOPIC, object : TerminalTabsManagerListener { - override fun tabDetached(tab: TerminalToolWindowTab) { - onTabDetached(tab.view) - } - }) - } - - private fun onTabDetached(detachedView: TerminalView) { - synchronized(lock) { - detachedViews.add(detachedView) - } - tryMatchAndDetach(detachedView) - } - - /** May be called before or after [onTabDetached]. */ - @OptIn(AwaitCancellationAndInvoke::class) - fun onTabCreated(terminalView: TerminalView, tabId: Int) { - synchronized(lock) { - viewsWithIds[terminalView] = tabId - } - tryMatchAndDetach(terminalView) - terminalView.coroutineScope.awaitCancellationAndInvoke { - synchronized(lock) { - viewsWithIds.remove(terminalView) - detachedViews.remove(terminalView) - } - } - } - - private fun tryMatchAndDetach(view: TerminalView) { - val tabId = synchronized(lock) { - if (view in detachedViews && view in viewsWithIds) { - detachedViews.remove(view) - viewsWithIds.remove(view) - } - else { - null - } - } - if (tabId != null) { - coroutineScope.launch { - TerminalTabsManager.getInstance(project).detachTerminalTab(tabId) - } - } - } -} diff --git a/plugins/terminal/frontend/src/com/intellij/terminal/frontend/toolwindow/impl/TerminalToolWindowTabsManagerImpl.kt b/plugins/terminal/frontend/src/com/intellij/terminal/frontend/toolwindow/impl/TerminalToolWindowTabsManagerImpl.kt index 45cc629dd4ad..ba72ac8fa1ce 100644 --- a/plugins/terminal/frontend/src/com/intellij/terminal/frontend/toolwindow/impl/TerminalToolWindowTabsManagerImpl.kt +++ b/plugins/terminal/frontend/src/com/intellij/terminal/frontend/toolwindow/impl/TerminalToolWindowTabsManagerImpl.kt @@ -79,8 +79,6 @@ internal class TerminalToolWindowTabsManagerImpl( private var tabsRestoredDeferred: Deferred = CompletableDeferred(Unit) - private val detachedTabs = DetachedTabs(project, coroutineScope) - init { project.messageBus.connect(coroutineScope).subscribe(ToolWindowManagerListener.TOPIC, object : ToolWindowManagerListener { override fun toolWindowShown(toolWindow: ToolWindow) { @@ -292,8 +290,6 @@ internal class TerminalToolWindowTabsManagerImpl( ) = terminal.coroutineScope.launch { val backendTabId = existingBackendTabId ?: TerminalTabsManager.getInstance(project).createNewTerminalTab().id - detachedTabs.onTabCreated(terminal, backendTabId) - terminal.coroutineScope.awaitCancellationAndInvoke(Dispatchers.EDT) { // Backend terminal session tab lifecycle is not directly bound to the terminal frontend lifecycle. // We need to close the backend session when the terminal is closed explicitly.