From 9bce4aced78d31542c4d573f36f547efb18001aa Mon Sep 17 00:00:00 2001 From: root Date: Thu, 16 Apr 2026 03:27:48 +0000 Subject: [PATCH] fix: allow ime input in terminal --- ServerDeck/src/App.tsx | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/ServerDeck/src/App.tsx b/ServerDeck/src/App.tsx index 3c0ed5b..aa9c02f 100644 --- a/ServerDeck/src/App.tsx +++ b/ServerDeck/src/App.tsx @@ -2082,7 +2082,13 @@ export default function App() { clearDocumentSelection(); terminal.focus(); }); + let isTerminalComposing = false; + terminal.attachCustomKeyEventHandler((event) => { + if (event.isComposing || event.keyCode === 229) { + return true; + } + const sequence = getTerminalControlSequence(event); if (!sequence) { return true; @@ -2107,18 +2113,19 @@ export default function App() { } const terminalTextarea = terminal.textarea; - const handleTerminalBlur = () => { - window.requestAnimationFrame(() => { - terminal.clearSelection(); - clearDocumentSelection(); - }); + const handleCompositionStart = () => { + isTerminalComposing = true; + }; + const handleCompositionEnd = () => { + isTerminalComposing = false; }; - terminalTextarea?.addEventListener("blur", handleTerminalBlur); + terminalTextarea?.addEventListener("compositionstart", handleCompositionStart); + terminalTextarea?.addEventListener("compositionend", handleCompositionEnd); const disposable = terminal.onData((data) => { sendActiveTerminalInput(data); - if (data === "\r") { + if (data === "\r" && !isTerminalComposing) { window.requestAnimationFrame(() => { terminal.focus(); terminal.clearSelection(); @@ -2159,7 +2166,8 @@ export default function App() { } window.cancelAnimationFrame(clearSelectionFrame); disposable.dispose(); - terminalTextarea?.removeEventListener("blur", handleTerminalBlur); + terminalTextarea?.removeEventListener("compositionstart", handleCompositionStart); + terminalTextarea?.removeEventListener("compositionend", handleCompositionEnd); terminal.dispose(); terminalRef.current = null; fitAddonRef.current = null;