diff --git a/frontend/app/view/term/term-model.ts b/frontend/app/view/term/term-model.ts index a256929e7d..3b7a5dc8b7 100644 --- a/frontend/app/view/term/term-model.ts +++ b/frontend/app/view/term/term-model.ts @@ -697,6 +697,10 @@ export class TermViewModel implements ViewModel { } handleTerminalKeydown(event: KeyboardEvent): boolean { + if (this.shouldDeferImeSpaceToComposition(event)) { + return false; + } + const waveEvent = keyutil.adaptFromReactOrNativeKeyEvent(event); if (waveEvent.type != "keydown") { return true; @@ -779,6 +783,14 @@ export class TermViewModel implements ViewModel { return true; } + shouldDeferImeSpaceToComposition(event: KeyboardEvent): boolean { + // On Windows Korean IME, xterm's keydown path can finalize composition before + // Chromium commits the last syllable, causing space to be sent before it. + return ( + isWindows() && event.isComposing && event.key === " " && !event.ctrlKey && !event.altKey && !event.metaKey + ); + } + setTerminalTheme(themeName: string) { RpcApi.SetMetaCommand(TabRpcClient, { oref: WOS.makeORef("block", this.blockId),