From c11dedb56d7aef5afffca81cb3f709992fc6abfa Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Fri, 15 May 2026 17:04:35 -0700 Subject: [PATCH 1/4] fix(desktop): recover terminal renderer on attach --- .../renderer/lib/terminal/terminal-runtime.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts b/apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts index fd85b46761d..bdef6a6622b 100644 --- a/apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts +++ b/apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts @@ -148,6 +148,19 @@ function measureAndResize(runtime: TerminalRuntime): boolean { return terminal.cols !== prevCols || terminal.rows !== prevRows; } +function recoverTerminalRenderer( + runtime: TerminalRuntime, + onResize?: () => void, +) { + if (!hostIsVisible(runtime.container)) return; + try { + runtime.terminal.clearTextureAtlas(); + } catch {} + const changed = measureAndResize(runtime); + if (changed) onResize?.(); + runtime.terminal.refresh(0, Math.max(0, runtime.terminal.rows - 1)); +} + function createResizeScheduler( runtime: TerminalRuntime, onResize?: () => void, @@ -258,7 +271,7 @@ export function attachToContainer( runtime.container = container; container.appendChild(runtime.wrapper); - if (measureAndResize(runtime)) onResize?.(); + recoverTerminalRenderer(runtime, onResize); runtime._disposeResizeObserver?.(); runtime._disposeResizeObserver = null; @@ -300,7 +313,7 @@ export function updateRuntimeAppearance( terminal.options.fontFamily = appearance.fontFamily; terminal.options.fontSize = appearance.fontSize; if (hostIsVisible(runtime.container)) { - measureAndResize(runtime); + recoverTerminalRenderer(runtime); } } } From e6707f8f67f6edc92bcd08a7964ce0f11f664145 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Fri, 15 May 2026 17:06:17 -0700 Subject: [PATCH 2/4] Revert "fix(desktop): recover terminal renderer on attach" This reverts commit c11dedb56d7aef5afffca81cb3f709992fc6abfa. --- .../renderer/lib/terminal/terminal-runtime.ts | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts b/apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts index bdef6a6622b..fd85b46761d 100644 --- a/apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts +++ b/apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts @@ -148,19 +148,6 @@ function measureAndResize(runtime: TerminalRuntime): boolean { return terminal.cols !== prevCols || terminal.rows !== prevRows; } -function recoverTerminalRenderer( - runtime: TerminalRuntime, - onResize?: () => void, -) { - if (!hostIsVisible(runtime.container)) return; - try { - runtime.terminal.clearTextureAtlas(); - } catch {} - const changed = measureAndResize(runtime); - if (changed) onResize?.(); - runtime.terminal.refresh(0, Math.max(0, runtime.terminal.rows - 1)); -} - function createResizeScheduler( runtime: TerminalRuntime, onResize?: () => void, @@ -271,7 +258,7 @@ export function attachToContainer( runtime.container = container; container.appendChild(runtime.wrapper); - recoverTerminalRenderer(runtime, onResize); + if (measureAndResize(runtime)) onResize?.(); runtime._disposeResizeObserver?.(); runtime._disposeResizeObserver = null; @@ -313,7 +300,7 @@ export function updateRuntimeAppearance( terminal.options.fontFamily = appearance.fontFamily; terminal.options.fontSize = appearance.fontSize; if (hostIsVisible(runtime.container)) { - recoverTerminalRenderer(runtime); + measureAndResize(runtime); } } } From 8136f8dcf41b9f62e2b3553d70cfc0798dd0af6d Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Fri, 15 May 2026 17:16:55 -0700 Subject: [PATCH 3/4] fix(desktop): fall back from terminal WebGL on context loss --- apps/desktop/src/renderer/lib/terminal/terminal-addons.ts | 1 + .../WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/desktop/src/renderer/lib/terminal/terminal-addons.ts b/apps/desktop/src/renderer/lib/terminal/terminal-addons.ts index 85faa897cdb..28d8dc61d02 100644 --- a/apps/desktop/src/renderer/lib/terminal/terminal-addons.ts +++ b/apps/desktop/src/renderer/lib/terminal/terminal-addons.ts @@ -49,6 +49,7 @@ export function loadAddons(terminal: XTerm): LoadAddonsResult { try { webglAddon = new WebglAddon(); webglAddon.onContextLoss(() => { + suggestedRendererType = "dom"; webglAddon?.dispose(); webglAddon = null; terminal.refresh(0, terminal.rows - 1); diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts index c6f2d1c3571..a62310ef3b4 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts @@ -131,6 +131,7 @@ export function createTerminalInWrapper(options: CreateTerminalOptions = {}): { try { webglAddon = new WebglAddon(); webglAddon.onContextLoss(() => { + suggestedRendererType = "dom"; webglAddon?.dispose(); webglAddon = null; xterm.refresh(0, xterm.rows - 1); From 52b833da221d7fd3ff593e69dec7daba1b96dd19 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Fri, 15 May 2026 18:04:55 -0700 Subject: [PATCH 4/4] revert terminal WebGL context-loss fallback --- apps/desktop/src/renderer/lib/terminal/terminal-addons.ts | 1 - .../WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/apps/desktop/src/renderer/lib/terminal/terminal-addons.ts b/apps/desktop/src/renderer/lib/terminal/terminal-addons.ts index 28d8dc61d02..85faa897cdb 100644 --- a/apps/desktop/src/renderer/lib/terminal/terminal-addons.ts +++ b/apps/desktop/src/renderer/lib/terminal/terminal-addons.ts @@ -49,7 +49,6 @@ export function loadAddons(terminal: XTerm): LoadAddonsResult { try { webglAddon = new WebglAddon(); webglAddon.onContextLoss(() => { - suggestedRendererType = "dom"; webglAddon?.dispose(); webglAddon = null; terminal.refresh(0, terminal.rows - 1); diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts index a62310ef3b4..c6f2d1c3571 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts @@ -131,7 +131,6 @@ export function createTerminalInWrapper(options: CreateTerminalOptions = {}): { try { webglAddon = new WebglAddon(); webglAddon.onContextLoss(() => { - suggestedRendererType = "dom"; webglAddon?.dispose(); webglAddon = null; xterm.refresh(0, xterm.rows - 1);