Files
xterm.js/src/renderer/RenderCoordinator.ts
T

64 lines
2.0 KiB
TypeScript

/**
* Copyright (c) 2019 The xterm.js authors. All rights reserved.
* @license MIT
*/
import { IRenderer } from './Types';
import { RenderDebouncer } from '../ui/RenderDebouncer';
import { EventEmitter2, IEvent } from '../common/EventEmitter2';
export class RenderCoordinator {
private _renderDebouncer: RenderDebouncer;
private _onCanvasResize = new EventEmitter2<{ width: number, height: number }>();
public get onCanvasResize(): IEvent<{ width: number, height: number }> { return this._onCanvasResize.event; }
private _onRender = new EventEmitter2<{ start: number, end: number }>();
public get onRender(): IEvent<{ start: number, end: number }> { return this._onRender.event; }
private _canvasWidth: number = 0;
private _canvasHeight: number = 0;
constructor(
private _renderer: IRenderer,
private _rowCount: number
) {
this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end));
}
public refreshRows(start: number, end: number): void {
this._renderDebouncer.refresh(start, end, this._rowCount);
}
private _renderRows(start: number, end: number): void {
this._renderer.renderRows(start, end);
this._onRender.fire({ start, end });
}
public resize(cols: number, rows: number): void {
this._rowCount = rows;
this._fireOnCanvasResize();
}
public changeOptions(): void {
this._renderer.onOptionsChanged();
this._fireOnCanvasResize();
}
private _fireOnCanvasResize(): void {
// Don't fire the event if the dimensions haven't changed
if (this._renderer.dimensions.canvasWidth === this._canvasWidth && this._renderer.dimensions.canvasHeight === this._canvasHeight) {
return;
}
this._canvasWidth = this._renderer.dimensions.canvasWidth;
this._canvasHeight = this._renderer.dimensions.canvasHeight;
this._onCanvasResize.fire({
width: this._canvasWidth,
height: this._canvasHeight
});
}
public setRenderer(renderer: IRenderer): void {
this._renderer = renderer;
}
}