diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d510a68..8abdfd3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [Unreleased] New: +- Support synchronized terminal update for rendering. - Changed: diff --git a/mosaic-runtime/src/commonMain/kotlin/com/jakewharton/mosaic/mosaic.kt b/mosaic-runtime/src/commonMain/kotlin/com/jakewharton/mosaic/mosaic.kt index eb72a7de..6502b89f 100644 --- a/mosaic-runtime/src/commonMain/kotlin/com/jakewharton/mosaic/mosaic.kt +++ b/mosaic-runtime/src/commonMain/kotlin/com/jakewharton/mosaic/mosaic.kt @@ -21,6 +21,9 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.yield +private const val TerminalBeginSynchronizedUpdateControlSequence = "\u001B[?2026h" +private const val TerminalEndSynchronizedUpdateControlSequence = "\u001B[?2026l" + /** * True for a debug-like output that renders each "frame" on its own with a timestamp delta. * False when using ANSI control sequences to overwrite output. @@ -74,7 +77,7 @@ public suspend fun runMosaic(body: suspend MosaicScope.() -> Unit): Unit = corou var displaySignal: CompletableDeferred? = null val applier = MosaicNodeApplier(rootNode) { val render = rendering.render(rootNode) - platformDisplay(render) + platformDisplay("$TerminalBeginSynchronizedUpdateControlSequence$render$TerminalEndSynchronizedUpdateControlSequence") displaySignal?.complete(Unit) hasFrameWaiters = false