diff options
| author | Adam <[email protected]> | 2026-02-11 08:19:42 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-02-11 08:47:26 -0600 |
| commit | 7222fc0ba0e46b3ee787be608c71738aa14fe480 (patch) | |
| tree | 235ac36d586ec8a15ad7a5ad85742792debbbf7d /packages/app/src/components/terminal.tsx | |
| parent | 17bdb5d56a671972d7d5fad53c3a16df45f9cd20 (diff) | |
| download | opencode-7222fc0ba0e46b3ee787be608c71738aa14fe480.tar.gz opencode-7222fc0ba0e46b3ee787be608c71738aa14fe480.zip | |
fix(app): terminal resize
Diffstat (limited to 'packages/app/src/components/terminal.tsx')
| -rw-r--r-- | packages/app/src/components/terminal.tsx | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/packages/app/src/components/terminal.tsx b/packages/app/src/components/terminal.tsx index 2527c74ec..09c04db40 100644 --- a/packages/app/src/components/terminal.tsx +++ b/packages/app/src/components/terminal.tsx @@ -91,7 +91,7 @@ export const Terminal = (props: TerminalProps) => { } const getTerminalColors = (): TerminalColors => { - const mode = theme.mode() + const mode = theme.mode() === "dark" ? "dark" : "light" const fallback = DEFAULT_TERMINAL_COLORS[mode] const currentTheme = theme.themes()[theme.themeId()] if (!currentTheme) return fallback @@ -186,9 +186,23 @@ export const Terminal = (props: TerminalProps) => { } ws = socket + const restore = typeof local.pty.buffer === "string" ? local.pty.buffer : "" + const restoreSize = + restore && + typeof local.pty.cols === "number" && + Number.isSafeInteger(local.pty.cols) && + local.pty.cols > 0 && + typeof local.pty.rows === "number" && + Number.isSafeInteger(local.pty.rows) && + local.pty.rows > 0 + ? { cols: local.pty.cols, rows: local.pty.rows } + : undefined + const t = new mod.Terminal({ cursorBlink: true, cursorStyle: "bar", + cols: restoreSize?.cols, + rows: restoreSize?.rows, fontSize: 14, fontFamily: monoFontFamily(settings.appearance.font()), allowTransparency: false, @@ -277,19 +291,29 @@ export const Terminal = (props: TerminalProps) => { focusTerminal() - fit.fit() + const startResize = () => { + fit.observeResize() + handleResize = () => fit.fit() + window.addEventListener("resize", handleResize) + cleanups.push(() => window.removeEventListener("resize", handleResize)) + } - if (local.pty.buffer) { - t.write(local.pty.buffer, () => { - if (local.pty.scrollY) t.scrollToLine(local.pty.scrollY) + if (restore && restoreSize) { + t.write(restore, () => { + fit.fit() + if (typeof local.pty.scrollY === "number") t.scrollToLine(local.pty.scrollY) + startResize() }) + } else { + fit.fit() + if (restore) { + t.write(restore, () => { + if (typeof local.pty.scrollY === "number") t.scrollToLine(local.pty.scrollY) + }) + } + startResize() } - fit.observeResize() - handleResize = () => fit.fit() - window.addEventListener("resize", handleResize) - cleanups.push(() => window.removeEventListener("resize", handleResize)) - const onResize = t.onResize(async (size) => { if (socket.readyState === WebSocket.OPEN) { await sdk.client.pty |
