diff --git a/tabby-terminal/src/api/baseTerminalTab.component.ts b/tabby-terminal/src/api/baseTerminalTab.component.ts index 04438017..301b43b9 100644 --- a/tabby-terminal/src/api/baseTerminalTab.component.ts +++ b/tabby-terminal/src/api/baseTerminalTab.component.ts @@ -9,7 +9,6 @@ import { BaseSession } from '../session' import { Frontend } from '../frontends/frontend' import { XTermFrontend, XTermWebGLFrontend } from '../frontends/xtermFrontend' -import { syncTerminalVisibility } from '../frontends/visibility' import { ResizeEvent, BaseTerminalProfile } from './interfaces' import { TerminalDecorator } from './decorator' import { SearchPanelComponent } from '../components/searchPanel.component' @@ -446,8 +445,8 @@ export class BaseTerminalTabComponent
extends Bas
this.visibility$
.pipe(debounce(visibility => interval(visibility ? 0 : INACTIVE_TAB_UNLOAD_DELAY)))
.subscribe(visibility => {
- if (this.frontend instanceof XTermFrontend) {
- syncTerminalVisibility(this.frontend, visibility)
+ if (visibility && this.frontend instanceof XTermFrontend) {
+ this.frontend.reactivate()
}
})
}
diff --git a/tabby-terminal/src/frontends/visibility.test.js b/tabby-terminal/src/frontends/visibility.test.js
deleted file mode 100644
index de564117..00000000
--- a/tabby-terminal/src/frontends/visibility.test.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import assert from 'node:assert/strict'
-import test from 'node:test'
-
-import { syncTerminalVisibility } from './visibility.ts'
-
-test('syncTerminalVisibility reactivates the frontend when the tab becomes visible', () => {
- let reactivated = 0
- let deactivated = 0
-
- syncTerminalVisibility({
- reactivateAfterVisibilityChange: () => {
- reactivated++
- },
- deactivateAfterVisibilityChange: () => {
- deactivated++
- },
- }, true)
-
- assert.equal(reactivated, 1)
- assert.equal(deactivated, 0)
-})
-
-test('syncTerminalVisibility releases hidden-tab resources when the tab becomes invisible', () => {
- let reactivated = 0
- let deactivated = 0
-
- syncTerminalVisibility({
- reactivateAfterVisibilityChange: () => {
- reactivated++
- },
- deactivateAfterVisibilityChange: () => {
- deactivated++
- },
- }, false)
-
- assert.equal(reactivated, 0)
- assert.equal(deactivated, 1)
-})
diff --git a/tabby-terminal/src/frontends/visibility.ts b/tabby-terminal/src/frontends/visibility.ts
deleted file mode 100644
index 7302e765..00000000
--- a/tabby-terminal/src/frontends/visibility.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-export interface VisibilityManagedTerminalFrontend {
- reactivateAfterVisibilityChange: () => void
- deactivateAfterVisibilityChange: () => void
-}
-
-export function syncTerminalVisibility (frontend: VisibilityManagedTerminalFrontend, visible: boolean): void {
- if (visible) {
- frontend.reactivateAfterVisibilityChange()
- } else {
- frontend.deactivateAfterVisibilityChange()
- }
-}
diff --git a/tabby-terminal/src/frontends/xtermFrontend.ts b/tabby-terminal/src/frontends/xtermFrontend.ts
index 0eb100ad..2c90fc10 100644
--- a/tabby-terminal/src/frontends/xtermFrontend.ts
+++ b/tabby-terminal/src/frontends/xtermFrontend.ts
@@ -1,5 +1,5 @@
import deepEqual from 'deep-equal'
-import { BehaviorSubject, filter, firstValueFrom, takeUntil } from 'rxjs'
+import { BehaviorSubject, filter, firstValueFrom, fromEvent, takeUntil } from 'rxjs'
import { Injector } from '@angular/core'
import { ConfigService, getCSSFontFamily, getWindows10Build, HostAppService, HotkeysService, Platform, PlatformService, TerminalColorScheme, ThemesService } from 'tabby-core'
import { Frontend, SearchOptions, SearchState } from './frontend'
@@ -22,6 +22,10 @@ const COLOR_NAMES = [
'brightBlack', 'brightRed', 'brightGreen', 'brightYellow', 'brightBlue', 'brightMagenta', 'brightCyan', 'brightWhite',
]
+// How many times to recreate the WebGL renderer after a lost GPU context
+// before giving up and letting xterm fall back to its DOM renderer.
+const MAX_WEBGL_RECOVERY_ATTEMPTS = 3
+
class FlowControl {
private blocked = false
private blocked$ = new BehaviorSubject