From d2298d84a0b2846d146dcf232d791bd1632d20ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Breitbart?= Date: Wed, 7 Dec 2022 23:56:43 +0100 Subject: [PATCH] move safari check to WebglAddon ctor --- addons/xterm-addon-webgl/src/WebglAddon.ts | 8 ++--- demo/client.ts | 34 +++++++++++++--------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/addons/xterm-addon-webgl/src/WebglAddon.ts b/addons/xterm-addon-webgl/src/WebglAddon.ts index 6dbbeca9..97e2ce0c 100644 --- a/addons/xterm-addon-webgl/src/WebglAddon.ts +++ b/addons/xterm-addon-webgl/src/WebglAddon.ts @@ -9,7 +9,6 @@ import { EventEmitter, forwardEvent } from 'common/EventEmitter'; import { Disposable, toDisposable } from 'common/Lifecycle'; import { getSafariVersion, isSafari } from 'common/Platform'; import { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; -import { ICoreTerminal } from 'common/Types'; import { ITerminalAddon, Terminal } from 'xterm'; import { WebglRenderer } from './WebglRenderer'; @@ -29,14 +28,13 @@ export class WebglAddon extends Disposable implements ITerminalAddon { constructor( private _preserveDrawingBuffer?: boolean ) { + if (isSafari && getSafariVersion() < 16) { + throw new Error('Webgl2 is only supported on Safari 16 and above'); + } super(); } public activate(terminal: Terminal): void { - if (isSafari && getSafariVersion() < 16) { - throw new Error('Webgl2 is only supported on Safari 16 and above'); - } - const core = (terminal as any)._core as ITerminal; if (!terminal.element) { this.register(core.onWillOpen(() => this.activate(terminal))); diff --git a/demo/client.ts b/demo/client.ts index 280b5e56..7c04bb2a 100644 --- a/demo/client.ts +++ b/demo/client.ts @@ -250,7 +250,11 @@ function createTerminal(): void { addons.serialize.instance = new SerializeAddon(); addons.fit.instance = new FitAddon(); addons.unicode11.instance = new Unicode11Addon(); - addons.webgl.instance = new WebglAddon(); + try { // try to start with webgl renderer (might throw on older safari/webkit) + addons.webgl.instance = new WebglAddon(); + } catch (e) { + console.warn(e); + } addons['web-links'].instance = new WebLinksAddon(); typedTerm.loadAddon(addons.fit.instance); typedTerm.loadAddon(addons.search.instance); @@ -274,18 +278,22 @@ function createTerminal(): void { addons.fit.instance!.fit(); - // try to start with webgl renderer (might throw on older safari/webkit) - try { - typedTerm.loadAddon(addons.webgl.instance); - term.open(terminalContainer); - setTextureAtlas(addons.webgl.instance.textureAtlas); - addons.webgl.instance.onChangeTextureAtlas(e => setTextureAtlas(e)); - addons.webgl.instance.onAddTextureAtlasCanvas(e => appendTextureAtlas(e)); - addons.webgl.instance.onRemoveTextureAtlasCanvas(e => removeTextureAtlas(e)); - } catch (e) { - console.log(e); - addons.webgl.instance.dispose(); - addons.webgl.instance = undefined; + if (addons.webgl.instance) { + try { + typedTerm.loadAddon(addons.webgl.instance); + term.open(terminalContainer); + setTextureAtlas(addons.webgl.instance.textureAtlas); + addons.webgl.instance.onChangeTextureAtlas(e => setTextureAtlas(e)); + addons.webgl.instance.onAddTextureAtlasCanvas(e => appendTextureAtlas(e)); + addons.webgl.instance.onRemoveTextureAtlasCanvas(e => removeTextureAtlas(e)); + } catch (e) { + console.warn('error during loading webgl addon:', e); + addons.webgl.instance.dispose(); + addons.webgl.instance = undefined; + } + } + if (!typedTerm.element) { + // webgl loading failed for some reason, attach with DOM renderer term.open(terminalContainer); }