Merge branch 'master' into reuse_bufferlines

This commit is contained in:
Jörg Breitbart
2018-10-30 14:18:28 +01:00
5 changed files with 28 additions and 21 deletions
+1
View File
@@ -477,6 +477,7 @@ export class Terminal extends EventEmitter implements ITerminal, IDisposable, II
if (this._theme) { if (this._theme) {
this.renderer.setTheme(this._theme); this.renderer.setTheme(this._theme);
} }
this.mouseHelper.setRenderer(this.renderer);
break; break;
case 'scrollback': case 'scrollback':
this.buffers.resize(this.cols, this.rows); this.buffers.resize(this.cols, this.rows);
+16 -13
View File
@@ -94,22 +94,23 @@ export class DomRenderer extends EventEmitter implements IRenderer {
} }
private _updateDimensions(): void { private _updateDimensions(): void {
this.dimensions.scaledCharWidth = this._terminal.charMeasure.width * window.devicePixelRatio; this.dimensions.scaledCharWidth = Math.floor(this._terminal.charMeasure.width * window.devicePixelRatio);
this.dimensions.scaledCharHeight = this._terminal.charMeasure.height * window.devicePixelRatio; this.dimensions.scaledCharHeight = Math.ceil(this._terminal.charMeasure.height * window.devicePixelRatio);
this.dimensions.scaledCellWidth = this.dimensions.scaledCharWidth; this.dimensions.scaledCellWidth = this.dimensions.scaledCharWidth + Math.round(this._terminal.options.letterSpacing);
this.dimensions.scaledCellHeight = this.dimensions.scaledCharHeight; this.dimensions.scaledCellHeight = Math.floor(this.dimensions.scaledCharHeight * this._terminal.options.lineHeight);
this.dimensions.scaledCharLeft = 0; this.dimensions.scaledCharLeft = 0;
this.dimensions.scaledCharTop = 0; this.dimensions.scaledCharTop = 0;
this.dimensions.scaledCanvasWidth = this.dimensions.scaledCellWidth * this._terminal.cols; this.dimensions.scaledCanvasWidth = this.dimensions.scaledCellWidth * this._terminal.cols;
this.dimensions.scaledCanvasHeight = this.dimensions.scaledCellHeight * this._terminal.rows; this.dimensions.scaledCanvasHeight = this.dimensions.scaledCellHeight * this._terminal.rows;
this.dimensions.canvasWidth = this._terminal.charMeasure.width * this._terminal.cols; this.dimensions.canvasWidth = Math.round(this.dimensions.scaledCanvasWidth / window.devicePixelRatio);
this.dimensions.canvasHeight = this._terminal.charMeasure.height * this._terminal.rows; this.dimensions.canvasHeight = Math.round(this.dimensions.scaledCanvasHeight / window.devicePixelRatio);
this.dimensions.actualCellWidth = this._terminal.charMeasure.width; this.dimensions.actualCellWidth = this.dimensions.canvasWidth / this._terminal.cols;
this.dimensions.actualCellHeight = this._terminal.charMeasure.height; this.dimensions.actualCellHeight = this.dimensions.canvasHeight / this._terminal.rows;
this._rowElements.forEach(element => { this._rowElements.forEach(element => {
element.style.width = `${this.dimensions.canvasWidth}px`; element.style.width = `${this.dimensions.canvasWidth}px`;
element.style.height = `${this._terminal.charMeasure.height}px`; element.style.height = `${this.dimensions.actualCellHeight}px`;
element.style.lineHeight = `${this.dimensions.actualCellHeight}px`;
}); });
if (!this._dimensionsStyleElement) { if (!this._dimensionsStyleElement) {
@@ -130,6 +131,8 @@ export class DomRenderer extends EventEmitter implements IRenderer {
this._selectionContainer.style.height = (<any>this._terminal)._viewportElement.style.height; this._selectionContainer.style.height = (<any>this._terminal)._viewportElement.style.height;
this._rowContainer.style.width = `${this.dimensions.canvasWidth}px`; this._rowContainer.style.width = `${this.dimensions.canvasWidth}px`;
this._rowContainer.style.height = `${this.dimensions.canvasHeight}px`; this._rowContainer.style.height = `${this.dimensions.canvasHeight}px`;
this._terminal.screenElement.style.width = '';
this._terminal.screenElement.style.height = '';
} }
public setTheme(theme: ITheme | undefined): IColorSet { public setTheme(theme: ITheme | undefined): IColorSet {
@@ -290,10 +293,10 @@ export class DomRenderer extends EventEmitter implements IRenderer {
*/ */
private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement { private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {
const element = document.createElement('div'); const element = document.createElement('div');
element.style.height = `${rowCount * this._terminal.charMeasure.height}px`; element.style.height = `${rowCount * this.dimensions.actualCellHeight}px`;
element.style.top = `${row * this._terminal.charMeasure.height}px`; element.style.top = `${row * this.dimensions.actualCellHeight}px`;
element.style.left = `${colStart * this._terminal.charMeasure.width}px`; element.style.left = `${colStart * this.dimensions.actualCellWidth}px`;
element.style.width = `${this._terminal.charMeasure.width * (colEnd - colStart)}px`; element.style.width = `${this.dimensions.actualCellWidth * (colEnd - colStart)}px`;
return element; return element;
} }
+4
View File
@@ -9,6 +9,10 @@ import { IRenderer } from '../renderer/Types';
export class MouseHelper { export class MouseHelper {
constructor(private _renderer: IRenderer) {} constructor(private _renderer: IRenderer) {}
public setRenderer(renderer: IRenderer): void {
this._renderer = renderer;
}
public static getCoordsRelativeToElement(event: {pageX: number, pageY: number}, element: HTMLElement): [number, number] { public static getCoordsRelativeToElement(event: {pageX: number, pageY: number}, element: HTMLElement): [number, number] {
// Ignore browsers that don't support MouseEvent.pageX // Ignore browsers that don't support MouseEvent.pageX
if (event.pageX === null || event.pageX === undefined) { if (event.pageX === null || event.pageX === undefined) {
+1 -1
View File
@@ -121,7 +121,7 @@ export class MockTerminal implements ITerminal {
handler(data: string): void { handler(data: string): void {
throw new Error('Method not implemented.'); throw new Error('Method not implemented.');
} }
on(event: string, callback: () => void): void { on(event: string, callback: (...args: any[]) => void): void {
throw new Error('Method not implemented.'); throw new Error('Method not implemented.');
} }
off(type: string, listener: XtermListener): void { off(type: string, listener: XtermListener): void {
+6 -7
View File
@@ -163,7 +163,6 @@ declare module 'xterm' {
* when canvas is too slow for the environment. The following features do * when canvas is too slow for the environment. The following features do
* not work when the DOM renderer is used: * not work when the DOM renderer is used:
* *
* - Line height
* - Letter spacing * - Letter spacing
* - Cursor blink * - Cursor blink
*/ */
@@ -390,37 +389,37 @@ declare module 'xterm' {
* @param type The type of the event. * @param type The type of the event.
* @param listener The listener. * @param listener The listener.
*/ */
on(type: 'key', listener: (key?: string, event?: KeyboardEvent) => void): void; on(type: 'key', listener: (key: string, event: KeyboardEvent) => void): void;
/** /**
* Registers an event listener. * Registers an event listener.
* @param type The type of the event. * @param type The type of the event.
* @param listener The listener. * @param listener The listener.
*/ */
on(type: 'keypress' | 'keydown', listener: (event?: KeyboardEvent) => void): void; on(type: 'keypress' | 'keydown', listener: (event: KeyboardEvent) => void): void;
/** /**
* Registers an event listener. * Registers an event listener.
* @param type The type of the event. * @param type The type of the event.
* @param listener The listener. * @param listener The listener.
*/ */
on(type: 'refresh', listener: (data?: {start: number, end: number}) => void): void; on(type: 'refresh', listener: (data: {start: number, end: number}) => void): void;
/** /**
* Registers an event listener. * Registers an event listener.
* @param type The type of the event. * @param type The type of the event.
* @param listener The listener. * @param listener The listener.
*/ */
on(type: 'resize', listener: (data?: {cols: number, rows: number}) => void): void; on(type: 'resize', listener: (data: {cols: number, rows: number}) => void): void;
/** /**
* Registers an event listener. * Registers an event listener.
* @param type The type of the event. * @param type The type of the event.
* @param listener The listener. * @param listener The listener.
*/ */
on(type: 'scroll', listener: (ydisp?: number) => void): void; on(type: 'scroll', listener: (ydisp: number) => void): void;
/** /**
* Registers an event listener. * Registers an event listener.
* @param type The type of the event. * @param type The type of the event.
* @param listener The listener. * @param listener The listener.
*/ */
on(type: 'title', listener: (title?: string) => void): void; on(type: 'title', listener: (title: string) => void): void;
/** /**
* Registers an event listener. * Registers an event listener.
* @param type The type of the event. * @param type The type of the event.