[terminal] IJPL-175766 migrate TerminalOutputEditorInputMethodSupport to CoroutineScope

(cherry picked from commit 69c290b0ad193829ce518b887b971591c7400c33)

IJ-MR-163479


(cherry picked from commit 92906e849110cba414ff3e59cd5592addfe99f18)

IJ-CR-163730

GitOrigin-RevId: 1ebb24c7e504e28597677215f6471606f33e2914
This commit is contained in:
Sergey Simonchik
2025-05-20 11:58:05 +02:00
committed by intellij-monorepo-bot
parent 476ea78c03
commit ae7da7ba3d
5 changed files with 34 additions and 16 deletions

View File

@@ -323,7 +323,7 @@ internal class ReworkedTerminalView(
val offset = model.cursorOffsetState.value
editor.offsetToLogicalPosition(offset)
}
).install(parentDisposable)
).install(coroutineScope)
CopyOnSelectionHandler.install(editor, settings)

View File

@@ -52,11 +52,7 @@ class SimpleTerminalController(
val eventsHandler = SimpleTerminalEventsHandler(session, settings, outputModel)
setupKeyEventDispatcher(editor, eventsHandler, disposable = this)
setupMouseListener(editor, settings, terminalModel, eventsHandler, disposable = this)
TerminalOutputEditorInputMethodSupport(
editor,
sendInputString = { text -> session.terminalOutputStream.sendString(text, true) },
getCaretPosition = { caretModel.getCaretPosition() }
).install(this)
setupInputMethodSupport(editor, session, caretModel, this)
terminalModel.withContentLock {
updateEditorContent()
}

View File

@@ -16,13 +16,17 @@ import com.intellij.openapi.editor.ex.FocusChangeListener
import com.intellij.openapi.observable.util.addKeyListener
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.util.registry.Registry
import com.intellij.platform.util.coroutines.childScope
import com.intellij.terminal.JBTerminalSystemSettingsProviderBase
import com.intellij.util.application
import com.intellij.util.concurrency.ThreadingAssertions
import com.jediterm.terminal.emulator.mouse.MouseMode
import kotlinx.coroutines.cancel
import org.intellij.lang.annotations.Language
import org.jetbrains.annotations.NonNls
import org.jetbrains.plugins.terminal.block.session.BlockTerminalSession
import org.jetbrains.plugins.terminal.block.session.TerminalModel
import org.jetbrains.plugins.terminal.util.terminalApplicationScope
import java.awt.AWTEvent
import java.awt.event.*
import javax.swing.KeyStroke
@@ -266,3 +270,20 @@ internal fun setupMouseListener(editor: EditorEx,
editor.scrollPane.removeMouseWheelListener(mouseWheelListener)
})
}
internal fun setupInputMethodSupport(
editor: EditorEx,
session: BlockTerminalSession,
caretModel: TerminalCaretModel,
parentDisposable: Disposable
) {
val coroutineScope = terminalApplicationScope().childScope(TerminalOutputEditorInputMethodSupport::class.java.simpleName)
Disposer.register(parentDisposable) {
coroutineScope.cancel("Terminal is disposed (Experimental 2024)")
}
TerminalOutputEditorInputMethodSupport(
editor,
sendInputString = { text -> session.terminalOutputStream.sendString(text, true) },
getCaretPosition = { caretModel.getCaretPosition() }
).install(coroutineScope)
}

View File

@@ -393,11 +393,7 @@ class TerminalOutputController(
val eventsHandler = BlockTerminalEventsHandler(session, settings, this@TerminalOutputController)
setupKeyEventDispatcher(editor, eventsHandler, disposable)
setupMouseListener(editor, settings, session.model, eventsHandler, disposable)
TerminalOutputEditorInputMethodSupport(
editor,
sendInputString = { text -> session.terminalOutputStream.sendString(text, true) },
getCaretPosition = { caretModel.getCaretPosition() }
).install(disposable)
setupInputMethodSupport(editor, session, caretModel, disposable)
contentUpdatesScheduler = setupContentUpdating()
}

View File

@@ -1,7 +1,8 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.terminal.block.output
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.application.runInEdt
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.Inlay
import com.intellij.openapi.editor.LogicalPosition
@@ -10,6 +11,8 @@ import com.intellij.openapi.editor.impl.EditorImpl
import com.intellij.openapi.editor.impl.EditorInputMethodSupport
import com.intellij.openapi.editor.impl.InputMethodInlayRenderer
import com.intellij.openapi.util.Disposer
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.job
import org.jetbrains.annotations.ApiStatus
import java.awt.Component
import java.awt.Dimension
@@ -37,7 +40,7 @@ class TerminalOutputEditorInputMethodSupport(
private var inlay: Inlay<*>? = null
fun install(parentDisposable: Disposable) {
fun install(coroutineScope: CoroutineScope) {
check(editor.isViewer)
val mouseListener = object : MouseAdapter() {
@@ -64,9 +67,11 @@ class TerminalOutputEditorInputMethodSupport(
(editor as EditorImpl).setInputMethodSupport(EditorInputMethodSupport(inputMethodRequests, inputMethodListener))
Disposer.register(parentDisposable) {
editor.contentComponent.removeMouseListener(mouseListener)
editor.setInputMethodSupport(null)
coroutineScope.coroutineContext.job.invokeOnCompletion {
runInEdt(ModalityState.any()) {
editor.contentComponent.removeMouseListener(mouseListener)
editor.setInputMethodSupport(null)
}
}
}