From 5f746760c8e269a33769870cfa3306b5678bacf1 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Mon, 18 Jul 2022 06:53:15 -0700 Subject: [PATCH] Fix terminal fit errors (#5811) --- src/common/utils/disposer.ts | 44 ++++++++++++------- .../components/dock/terminal/terminal.ts | 19 ++------ 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/common/utils/disposer.ts b/src/common/utils/disposer.ts index db71148404..05a349ab4d 100644 --- a/src/common/utils/disposer.ts +++ b/src/common/utils/disposer.ts @@ -3,23 +3,35 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -export type Disposer = () => void; -interface Extendable { - push(...vals: T[]): void; + +export interface Disposer { + (): void; } -export type ExtendableDisposer = Disposer & Extendable; - -export function disposer(...args: (Disposer | undefined | null)[]): ExtendableDisposer { - const res = () => { - args.forEach(dispose => dispose?.()); - args.length = 0; - }; - - res.push = (...vals: Disposer[]) => { - args.push(...vals); - }; - - return res; +export interface Disposable { + dispose(): void; +} + +export interface ExtendableDisposer extends Disposer { + push(...vals: (Disposer | ExtendableDisposer | Disposable)[]): void; +} + +export function disposer(...items: (Disposer | Disposable | undefined | null)[]): ExtendableDisposer { + return Object.assign(() => { + for (const item of items) { + if (!item) { + continue; + } + + if (typeof item === "function") { + item(); + } else { + item.dispose(); + } + } + items.length = 0; + }, { + push: (...newItems) => items.push(...newItems), + } as Pick); } diff --git a/src/renderer/components/dock/terminal/terminal.ts b/src/renderer/components/dock/terminal/terminal.ts index 7ea9518437..1415a643dd 100644 --- a/src/renderer/components/dock/terminal/terminal.ts +++ b/src/renderer/components/dock/terminal/terminal.ts @@ -119,6 +119,9 @@ export class Terminal { () => this.api.removeAllListeners(), () => window.removeEventListener("resize", this.onResize), () => this.elem.removeEventListener("contextmenu", this.onContextMenu), + this.xterm.onResize(({ cols, rows }) => { + this.api.sendTerminalSize(cols, rows); + }), ); } @@ -127,21 +130,7 @@ export class Terminal { this.xterm.dispose(); } - fit = () => { - try { - const { cols, rows } = this.fitAddon.proposeDimensions(); - - // attempt to resize/fit terminal when it's not visible in DOM will crash with exception - // see: https://github.com/xtermjs/xterm.js/issues/3118 - if (isNaN(cols) || isNaN(rows)) return; - - this.fitAddon.fit(); - this.api.sendTerminalSize(cols, rows); - } catch (error) { - // see https://github.com/lensapp/lens/issues/1891 - logger.error(`[TERMINAL]: failed to resize terminal to fit`, error); - } - }; + fit = () => this.fitAddon.fit(); fitLazy = debounce(this.fit, 250);