diff --git a/plugins/terminal/backend/src/com/intellij/terminal/backend/TerminalSessionStart.kt b/plugins/terminal/backend/src/com/intellij/terminal/backend/TerminalSessionStart.kt index 35b4420da4d2..71e00ef9163f 100644 --- a/plugins/terminal/backend/src/com/intellij/terminal/backend/TerminalSessionStart.kt +++ b/plugins/terminal/backend/src/com/intellij/terminal/backend/TerminalSessionStart.kt @@ -15,6 +15,7 @@ import com.jediterm.core.typeahead.TerminalTypeAheadManager import com.jediterm.core.util.TermSize import com.jediterm.terminal.TerminalExecutorServiceManager import com.jediterm.terminal.TerminalStarter +import com.jediterm.terminal.TtyBasedArrayDataStream import com.jediterm.terminal.TtyConnector import com.jediterm.terminal.model.JediTermTypeAheadModel import com.jediterm.terminal.model.StyleState @@ -23,7 +24,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch -import org.jetbrains.plugins.terminal.FusAwareTtyBasedDataStream import org.jetbrains.plugins.terminal.LocalBlockTerminalRunner import org.jetbrains.plugins.terminal.ShellStartupOptions import org.jetbrains.plugins.terminal.fus.BackendOutputActivity @@ -115,7 +115,7 @@ private fun createJediTermServices( val terminalStarter = StopAwareTerminalStarter( controller, connector, - FusAwareTtyBasedDataStream(connector, fusActivity), + enableFus(TtyBasedArrayDataStream(connector), fusActivity), typeAheadManager, executorService, fusActivity diff --git a/plugins/terminal/backend/src/com/intellij/terminal/backend/fus/BackendLatencyServiceImpl.kt b/plugins/terminal/backend/src/com/intellij/terminal/backend/fus/BackendLatencyServiceImpl.kt index 05c3258a6a16..d7075f689582 100644 --- a/plugins/terminal/backend/src/com/intellij/terminal/backend/fus/BackendLatencyServiceImpl.kt +++ b/plugins/terminal/backend/src/com/intellij/terminal/backend/fus/BackendLatencyServiceImpl.kt @@ -5,6 +5,8 @@ import com.intellij.platform.rpc.UID import com.intellij.terminal.session.TerminalContentUpdatedEvent import com.intellij.terminal.session.TerminalWriteBytesEvent import com.jediterm.core.util.TermSize +import com.jediterm.terminal.TerminalDataStream +import com.jediterm.terminal.TtyBasedArrayDataStream import com.jediterm.terminal.TtyConnector import fleet.multiplatform.shims.ConcurrentHashMap import org.jetbrains.plugins.terminal.fus.BackendLatencyService @@ -38,6 +40,9 @@ internal class BackendLatencyServiceImpl : BackendLatencyService { internal fun enableFus(ttyConnector: TtyConnector, fusActivity: BackendOutputActivity): TtyConnector = FusAwareTtyConnector(ttyConnector, fusActivity) +internal fun enableFus(stream: TerminalDataStream, fusActivity: BackendOutputActivity): TerminalDataStream = + FusAwareTtyBasedDataStream(stream, fusActivity) + private val backendTypingActivityByByteArray = ConcurrentHashMap() private class BackendTypingActivityImpl(override val id: Int, private val bytes: ByteArray) : BackendTypingActivity { @@ -334,6 +339,36 @@ private class IdentityWrapper(private val instance: T) { override fun hashCode(): Int = System.identityHashCode(instance) } +private class FusAwareTtyBasedDataStream( + private val original: TerminalDataStream, + private val fusActivity: BackendOutputActivity, +) : TerminalDataStream { + override fun getChar(): Char { + @Suppress("UsePropertyAccessSyntax") + val result = original.getChar() + fusActivity.charsProcessed(1) + return result + } + + override fun pushChar(c: Char) { + fusActivity.charsProcessed(-1) + original.pushChar(c) + } + + override fun readNonControlCharacters(maxChars: Int): String? { + val result = original.readNonControlCharacters(maxChars) + fusActivity.charsProcessed(result.length) + return result + } + + override fun pushBackBuffer(bytes: CharArray, length: Int) { + fusActivity.charsProcessed(-length) + original.pushBackBuffer(bytes, length) + } + + override fun isEmpty(): Boolean = original.isEmpty +} + private fun T.toIdentity(): IdentityWrapper = IdentityWrapper(this) private val LOG = logger() diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/FusAwareTtyBasedDataStream.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/FusAwareTtyBasedDataStream.kt deleted file mode 100644 index 495f3df86904..000000000000 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/FusAwareTtyBasedDataStream.kt +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package org.jetbrains.plugins.terminal - -import com.jediterm.terminal.TtyBasedArrayDataStream -import com.jediterm.terminal.TtyConnector -import org.jetbrains.annotations.ApiStatus -import org.jetbrains.plugins.terminal.fus.BackendOutputActivity - -@ApiStatus.Internal -class FusAwareTtyBasedDataStream( - connector: TtyConnector, - private val fusActivity: BackendOutputActivity, -) : TtyBasedArrayDataStream(connector) { - - override fun getChar(): Char { - val result = super.getChar() - fusActivity.charsProcessed(1) - return result - } - - override fun readNonControlCharacters(maxChars: Int): String { - val result = super.readNonControlCharacters(maxChars) - fusActivity.charsProcessed(result.length) - return result - } - - override fun pushChar(c: Char) { - fusActivity.charsProcessed(-1) - super.pushChar(c) - } - - override fun pushBackBuffer(bytes: CharArray, length: Int) { - fusActivity.charsProcessed(-length) - super.pushBackBuffer(bytes, length) - } -}