🐛 修复开始 webgl 终端显示错误.

This commit is contained in:
lijiahangmax
2024-08-29 00:23:11 +08:00
parent ee9f51ce7d
commit cd05f71173
4 changed files with 18 additions and 9 deletions

View File

@@ -32,7 +32,6 @@ export interface ExecLogQueryResponse extends TableData, ExecLogQueryExtraRespon
startTime: number; startTime: number;
finishTime: number; finishTime: number;
hostIdList: Array<number>; hostIdList: Array<number>;
hosts: Array<ExecHostLogQueryResponse>;
} }
/** /**

View File

@@ -13,7 +13,7 @@ import { Terminal } from '@xterm/xterm';
import { FitAddon } from '@xterm/addon-fit'; import { FitAddon } from '@xterm/addon-fit';
import { SearchAddon } from '@xterm/addon-search'; import { SearchAddon } from '@xterm/addon-search';
import { WebLinksAddon } from '@xterm/addon-web-links'; import { WebLinksAddon } from '@xterm/addon-web-links';
import { WebglAddon } from '@xterm/addon-webgl'; import { CanvasAddon } from '@xterm/addon-canvas';
import { Unicode11Addon } from '@xterm/addon-unicode11'; import { Unicode11Addon } from '@xterm/addon-unicode11';
// 执行日志 appender 实现 // 执行日志 appender 实现
@@ -129,20 +129,20 @@ export default class LogAppender implements ILogAppender {
// 初始化插件 // 初始化插件
initAddons(terminal: Terminal): XtermAddons { initAddons(terminal: Terminal): XtermAddons {
const fit = new FitAddon(); const fit = new FitAddon();
const canvas = new CanvasAddon();
const search = new SearchAddon(); const search = new SearchAddon();
const webgl = new WebglAddon();
const weblink = new WebLinksAddon(); const weblink = new WebLinksAddon();
const unicode = new Unicode11Addon(); const unicode = new Unicode11Addon();
terminal.loadAddon(fit); terminal.loadAddon(fit);
terminal.loadAddon(canvas);
terminal.loadAddon(search); terminal.loadAddon(search);
terminal.loadAddon(webgl);
terminal.loadAddon(weblink); terminal.loadAddon(weblink);
terminal.loadAddon(unicode); terminal.loadAddon(unicode);
terminal.unicode.activeVersion = '11'; terminal.unicode.activeVersion = '11';
return { return {
fit, fit,
canvas,
search, search,
webgl,
weblink, weblink,
unicode unicode
} as XtermAddons; } as XtermAddons;
@@ -177,7 +177,7 @@ export default class LogAppender implements ILogAppender {
if (this.client?.readyState === WebSocket.OPEN) { if (this.client?.readyState === WebSocket.OPEN) {
this.client?.send('p'); this.client?.send('p');
} }
}, 15000); }, 15000) as unknown as number;
} }
// 设置当前元素 // 设置当前元素

View File

@@ -33,10 +33,14 @@ export default class SshSession extends BaseSession implements ISshSession {
private readonly addons: XtermAddons; private readonly addons: XtermAddons;
private readonly canUseWebgl: boolean;
constructor(tab: TerminalPanelTabItem, constructor(tab: TerminalPanelTabItem,
channel: ITerminalChannel) { channel: ITerminalChannel,
canUseWebgl: boolean) {
super(PanelSessionType.SSH.type, tab); super(PanelSessionType.SSH.type, tab);
this.channel = channel; this.channel = channel;
this.canUseWebgl = canUseWebgl;
this.status = TerminalStatus.CONNECTING; this.status = TerminalStatus.CONNECTING;
this.inst = undefined as unknown as Terminal; this.inst = undefined as unknown as Terminal;
this.handler = undefined as unknown as ISshSessionHandler; this.handler = undefined as unknown as ISshSessionHandler;
@@ -173,7 +177,7 @@ export default class SshSession extends BaseSession implements ISshSession {
if (preference.pluginsSetting.enableWeblinkPlugin) { if (preference.pluginsSetting.enableWeblinkPlugin) {
this.addons.weblink = new WebLinksAddon(); this.addons.weblink = new WebLinksAddon();
} }
if (preference.pluginsSetting.enableWebglPlugin) { if (preference.pluginsSetting.enableWebglPlugin && this.canUseWebgl) {
// WebGL 渲染插件 // WebGL 渲染插件
this.addons.webgl = new WebglAddon(true); this.addons.webgl = new WebglAddon(true);
} else { } else {

View File

@@ -37,8 +37,14 @@ export default class TerminalSessionManager implements ITerminalSessionManager {
async openSsh(tab: TerminalPanelTabItem, domRef: XtermDomRef) { async openSsh(tab: TerminalPanelTabItem, domRef: XtermDomRef) {
// 初始化客户端 // 初始化客户端
await this.initChannel(); await this.initChannel();
// 获取会话数量
const sshSessionLen = Object.values(this.sessions)
.filter(s => s?.type === PanelSessionType.SSH.type)
.length;
// 检查 webgl 数量
const canUseWebgl = (sshSessionLen || 0) <= (navigator.hardwareConcurrency || 0) / 2;
// 新建会话 // 新建会话
const session = new SshSession(tab, this.channel); const session = new SshSession(tab, this.channel, canUseWebgl);
// 初始化 // 初始化
session.init(domRef); session.init(domRef);
// 等待前端渲染完成 // 等待前端渲染完成