mirror of
https://github.com/wavetermdev/xterm.js.git
synced 2026-08-05 13:43:48 -07:00
Introduce Disposable abstract class
This commit is contained in:
+3
-5
@@ -6,7 +6,7 @@
|
|||||||
import { CircularList } from './utils/CircularList';
|
import { CircularList } from './utils/CircularList';
|
||||||
import { LineData, CharData, ITerminal, IBuffer } from './Types';
|
import { LineData, CharData, ITerminal, IBuffer } from './Types';
|
||||||
import { EventEmitter } from './EventEmitter';
|
import { EventEmitter } from './EventEmitter';
|
||||||
import { IDisposable, IMarker } from 'xterm';
|
import { IMarker } from 'xterm';
|
||||||
|
|
||||||
export const DEFAULT_ATTR = (0 << 18) | (257 << 9) | (256 << 0);
|
export const DEFAULT_ATTR = (0 << 18) | (257 << 9) | (256 << 0);
|
||||||
export const CHAR_DATA_ATTR_INDEX = 0;
|
export const CHAR_DATA_ATTR_INDEX = 0;
|
||||||
@@ -320,7 +320,7 @@ export class Buffer implements IBuffer {
|
|||||||
public addMarker(y: number): Marker {
|
public addMarker(y: number): Marker {
|
||||||
const marker = new Marker(y);
|
const marker = new Marker(y);
|
||||||
this.markers.push(marker);
|
this.markers.push(marker);
|
||||||
marker.disposables.push(this.lines.addDisposableListener('trim', amount => {
|
marker.register(this.lines.addDisposableListener('trim', amount => {
|
||||||
marker.line -= amount;
|
marker.line -= amount;
|
||||||
// The marker should be disposed when the line is trimmed from the buffer
|
// The marker should be disposed when the line is trimmed from the buffer
|
||||||
if (marker.line < 0) {
|
if (marker.line < 0) {
|
||||||
@@ -342,7 +342,6 @@ export class Marker extends EventEmitter implements IMarker {
|
|||||||
|
|
||||||
private _id: number = Marker._nextId++;
|
private _id: number = Marker._nextId++;
|
||||||
public isDisposed: boolean = false;
|
public isDisposed: boolean = false;
|
||||||
public disposables: IDisposable[] = [];
|
|
||||||
|
|
||||||
public get id(): number { return this._id; }
|
public get id(): number { return this._id; }
|
||||||
|
|
||||||
@@ -357,8 +356,7 @@ export class Marker extends EventEmitter implements IMarker {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.isDisposed = true;
|
this.isDisposed = true;
|
||||||
this.disposables.forEach(d => d.dispose());
|
super.dispose();
|
||||||
this.disposables.length = 0;
|
|
||||||
this.emit('dispose');
|
this.emit('dispose');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -5,11 +5,13 @@
|
|||||||
|
|
||||||
import { XtermListener } from './Types';
|
import { XtermListener } from './Types';
|
||||||
import { IEventEmitter, IDisposable } from 'xterm';
|
import { IEventEmitter, IDisposable } from 'xterm';
|
||||||
|
import { Disposable } from './common/Lifecycle';
|
||||||
|
|
||||||
export class EventEmitter implements IEventEmitter, IDisposable {
|
export class EventEmitter extends Disposable implements IEventEmitter, IDisposable {
|
||||||
private _events: {[type: string]: XtermListener[]};
|
private _events: {[type: string]: XtermListener[]};
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
|
super();
|
||||||
// Restore the previous events if available, this will happen if the
|
// Restore the previous events if available, this will happen if the
|
||||||
// constructor is called multiple times on the same object (terminal reset).
|
// constructor is called multiple times on the same object (terminal reset).
|
||||||
this._events = this._events || {};
|
this._events = this._events || {};
|
||||||
@@ -26,6 +28,7 @@ export class EventEmitter implements IEventEmitter, IDisposable {
|
|||||||
* @param handler The handler for the listener.
|
* @param handler The handler for the listener.
|
||||||
*/
|
*/
|
||||||
public addDisposableListener(type: string, handler: XtermListener): IDisposable {
|
public addDisposableListener(type: string, handler: XtermListener): IDisposable {
|
||||||
|
// TODO: Rename addDisposableEventListener to more easily disambiguate from Dom listener
|
||||||
this.on(type, handler);
|
this.on(type, handler);
|
||||||
return {
|
return {
|
||||||
dispose: () => {
|
dispose: () => {
|
||||||
|
|||||||
+1
-5
@@ -113,8 +113,6 @@ export class Terminal extends EventEmitter implements ITerminal, IDisposable, II
|
|||||||
public element: HTMLElement;
|
public element: HTMLElement;
|
||||||
public screenElement: HTMLElement;
|
public screenElement: HTMLElement;
|
||||||
|
|
||||||
private _disposables: IDisposable[];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The HTMLElement that the terminal is created in, set by Terminal.open.
|
* The HTMLElement that the terminal is created in, set by Terminal.open.
|
||||||
*/
|
*/
|
||||||
@@ -252,8 +250,6 @@ export class Terminal extends EventEmitter implements ITerminal, IDisposable, II
|
|||||||
}
|
}
|
||||||
|
|
||||||
private _setup(): void {
|
private _setup(): void {
|
||||||
this._disposables = [];
|
|
||||||
|
|
||||||
Object.keys(DEFAULT_OPTIONS).forEach((key) => {
|
Object.keys(DEFAULT_OPTIONS).forEach((key) => {
|
||||||
if (this.options[key] == null) {
|
if (this.options[key] == null) {
|
||||||
this.options[key] = DEFAULT_OPTIONS[key];
|
this.options[key] = DEFAULT_OPTIONS[key];
|
||||||
@@ -688,7 +684,7 @@ export class Terminal extends EventEmitter implements ITerminal, IDisposable, II
|
|||||||
this.on('dprchange', () => this.renderer.onWindowResize(window.devicePixelRatio));
|
this.on('dprchange', () => this.renderer.onWindowResize(window.devicePixelRatio));
|
||||||
// dprchange should handle this case, we need this as well for browsers that don't support the
|
// dprchange should handle this case, we need this as well for browsers that don't support the
|
||||||
// matchMedia query.
|
// matchMedia query.
|
||||||
this._disposables.push(Dom.addDisposableDomListener(window, 'resize', () => this.renderer.onWindowResize(window.devicePixelRatio)));
|
this.register(Dom.addDisposableDomListener(window, 'resize', () => this.renderer.onWindowResize(window.devicePixelRatio)));
|
||||||
this.charMeasure.on('charsizechanged', () => this.renderer.onCharSizeChanged());
|
this.charMeasure.on('charsizechanged', () => this.renderer.onCharSizeChanged());
|
||||||
this.renderer.on('resize', (dimensions) => this.viewport.syncScrollArea());
|
this.renderer.on('resize', (dimensions) => this.viewport.syncScrollArea());
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2018 The xterm.js authors. All rights reserved.
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { IDisposable } from 'xterm';
|
||||||
|
|
||||||
|
export abstract class Disposable implements IDisposable {
|
||||||
|
protected _disposables: IDisposable[] = [];
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public dispose(): void {
|
||||||
|
this._disposables.forEach(d => d.dispose());
|
||||||
|
this._disposables.length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public register<T extends IDisposable>(t: T): void {
|
||||||
|
this._disposables.push(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user