summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/components/terminal.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-11 08:19:42 -0600
committerAdam <[email protected]>2026-02-11 08:47:26 -0600
commit7222fc0ba0e46b3ee787be608c71738aa14fe480 (patch)
tree235ac36d586ec8a15ad7a5ad85742792debbbf7d /packages/app/src/components/terminal.tsx
parent17bdb5d56a671972d7d5fad53c3a16df45f9cd20 (diff)
downloadopencode-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.tsx44
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