Merge pull request #2870 from Tyriar/selection
Make sure selection gets redrawn when switching renderers
This commit is contained in:
@@ -173,7 +173,7 @@ export class WebglRenderer extends Disposable implements IRenderer {
|
|||||||
this._renderLayers.forEach(l => l.onFocus(this._terminal));
|
this._renderLayers.forEach(l => l.onFocus(this._terminal));
|
||||||
}
|
}
|
||||||
|
|
||||||
public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void {
|
public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {
|
||||||
this._renderLayers.forEach(l => l.onSelectionChanged(this._terminal, start, end, columnSelectMode));
|
this._renderLayers.forEach(l => l.onSelectionChanged(this._terminal, start, end, columnSelectMode));
|
||||||
|
|
||||||
this._updateSelectionModel(start, end, columnSelectMode);
|
this._updateSelectionModel(start, end, columnSelectMode);
|
||||||
@@ -295,7 +295,7 @@ export class WebglRenderer extends Disposable implements IRenderer {
|
|||||||
this._rectangleRenderer.updateBackgrounds(this._model);
|
this._rectangleRenderer.updateBackgrounds(this._model);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _updateSelectionModel(start: [number, number], end: [number, number], columnSelectMode: boolean): void {
|
private _updateSelectionModel(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {
|
||||||
const terminal = this._terminal;
|
const terminal = this._terminal;
|
||||||
|
|
||||||
// Selection does not exist
|
// Selection does not exist
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ export abstract class BaseRenderLayer implements IRenderLayer {
|
|||||||
public onFocus(terminal: Terminal): void {}
|
public onFocus(terminal: Terminal): void {}
|
||||||
public onCursorMove(terminal: Terminal): void {}
|
public onCursorMove(terminal: Terminal): void {}
|
||||||
public onGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}
|
public onGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}
|
||||||
public onSelectionChanged(terminal: Terminal, start: [number, number], end: [number, number], columnSelectMode: boolean = false): void {}
|
public onSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}
|
||||||
|
|
||||||
public setColors(terminal: Terminal, colorSet: IColorSet): void {
|
public setColors(terminal: Terminal, colorSet: IColorSet): void {
|
||||||
this._refreshCharAtlas(terminal, colorSet);
|
this._refreshCharAtlas(terminal, colorSet);
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export interface IRenderLayer extends IDisposable {
|
|||||||
/**
|
/**
|
||||||
* Calls when the selection changes.
|
* Calls when the selection changes.
|
||||||
*/
|
*/
|
||||||
onSelectionChanged(terminal: Terminal, start: [number, number], end: [number, number], columnSelectMode: boolean): void;
|
onSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers a handler to join characters to render as a group
|
* Registers a handler to join characters to render as a group
|
||||||
|
|||||||
@@ -49,15 +49,15 @@ export class RenderDebouncer implements IDisposable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Clamp values
|
// Clamp values
|
||||||
this._rowStart = Math.max(this._rowStart, 0);
|
const start = Math.max(this._rowStart, 0);
|
||||||
this._rowEnd = Math.min(this._rowEnd, this._rowCount - 1);
|
const end = Math.min(this._rowEnd, this._rowCount - 1);
|
||||||
|
|
||||||
// Run render callback
|
// Reset debouncer (this happens before render callback as the render could trigger it again)
|
||||||
this._renderCallback(this._rowStart, this._rowEnd);
|
|
||||||
|
|
||||||
// Reset debouncer
|
|
||||||
this._rowStart = undefined;
|
this._rowStart = undefined;
|
||||||
this._rowEnd = undefined;
|
this._rowEnd = undefined;
|
||||||
this._animationFrame = undefined;
|
this._animationFrame = undefined;
|
||||||
|
|
||||||
|
// Run render callback
|
||||||
|
this._renderCallback(start, end);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ export abstract class BaseRenderLayer implements IRenderLayer {
|
|||||||
public onFocus(): void {}
|
public onFocus(): void {}
|
||||||
public onCursorMove(): void {}
|
public onCursorMove(): void {}
|
||||||
public onGridChanged(startRow: number, endRow: number): void {}
|
public onGridChanged(startRow: number, endRow: number): void {}
|
||||||
public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean = false): void {}
|
public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}
|
||||||
|
|
||||||
public setColors(colorSet: IColorSet): void {
|
public setColors(colorSet: IColorSet): void {
|
||||||
this._refreshCharAtlas(colorSet);
|
this._refreshCharAtlas(colorSet);
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ export class Renderer extends Disposable implements IRenderer {
|
|||||||
this._runOperation(l => l.onFocus());
|
this._runOperation(l => l.onFocus());
|
||||||
}
|
}
|
||||||
|
|
||||||
public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean = false): void {
|
public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {
|
||||||
this._runOperation(l => l.onSelectionChanged(start, end, columnSelectMode));
|
this._runOperation(l => l.onSelectionChanged(start, end, columnSelectMode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ export class SelectionRenderLayer extends BaseRenderLayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void {
|
public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {
|
||||||
// Selection has not changed
|
// Selection has not changed
|
||||||
if (!this._didStateChange(start, end, columnSelectMode, this._bufferService.buffer.ydisp)) {
|
if (!this._didStateChange(start, end, columnSelectMode, this._bufferService.buffer.ydisp)) {
|
||||||
return;
|
return;
|
||||||
@@ -110,7 +110,7 @@ export class SelectionRenderLayer extends BaseRenderLayer {
|
|||||||
this._state.ydisp = this._bufferService.buffer.ydisp;
|
this._state.ydisp = this._bufferService.buffer.ydisp;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _didStateChange(start: [number, number], end: [number, number], columnSelectMode: boolean, ydisp: number): boolean {
|
private _didStateChange(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean, ydisp: number): boolean {
|
||||||
return !this._areCoordinatesEqual(start, this._state.start) ||
|
return !this._areCoordinatesEqual(start, this._state.start) ||
|
||||||
!this._areCoordinatesEqual(end, this._state.end) ||
|
!this._areCoordinatesEqual(end, this._state.end) ||
|
||||||
columnSelectMode !== this._state.columnSelectMode ||
|
columnSelectMode !== this._state.columnSelectMode ||
|
||||||
|
|||||||
Vendored
+2
-2
@@ -49,7 +49,7 @@ export interface IRenderer extends IDisposable {
|
|||||||
onCharSizeChanged(): void;
|
onCharSizeChanged(): void;
|
||||||
onBlur(): void;
|
onBlur(): void;
|
||||||
onFocus(): void;
|
onFocus(): void;
|
||||||
onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void;
|
onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;
|
||||||
onCursorMove(): void;
|
onCursorMove(): void;
|
||||||
onOptionsChanged(): void;
|
onOptionsChanged(): void;
|
||||||
clear(): void;
|
clear(): void;
|
||||||
@@ -104,7 +104,7 @@ export interface IRenderLayer extends IDisposable {
|
|||||||
/**
|
/**
|
||||||
* Calls when the selection changes.
|
* Calls when the selection changes.
|
||||||
*/
|
*/
|
||||||
onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void;
|
onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers a handler to join characters to render as a group
|
* Registers a handler to join characters to render as a group
|
||||||
|
|||||||
@@ -273,7 +273,7 @@ export class DomRenderer extends Disposable implements IRenderer {
|
|||||||
this._rowContainer.classList.add(FOCUS_CLASS);
|
this._rowContainer.classList.add(FOCUS_CLASS);
|
||||||
}
|
}
|
||||||
|
|
||||||
public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void {
|
public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {
|
||||||
// Remove all selections
|
// Remove all selections
|
||||||
while (this._selectionContainer.children.length) {
|
while (this._selectionContainer.children.length) {
|
||||||
this._selectionContainer.removeChild(this._selectionContainer.children[0]);
|
this._selectionContainer.removeChild(this._selectionContainer.children[0]);
|
||||||
|
|||||||
@@ -13,6 +13,12 @@ import { IColorSet } from 'browser/Types';
|
|||||||
import { IOptionsService } from 'common/services/Services';
|
import { IOptionsService } from 'common/services/Services';
|
||||||
import { ICharSizeService, IRenderService } from 'browser/services/Services';
|
import { ICharSizeService, IRenderService } from 'browser/services/Services';
|
||||||
|
|
||||||
|
interface ISelectionState {
|
||||||
|
start: [number, number] | undefined;
|
||||||
|
end: [number, number] | undefined;
|
||||||
|
columnSelectMode: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
export class RenderService extends Disposable implements IRenderService {
|
export class RenderService extends Disposable implements IRenderService {
|
||||||
public serviceBrand: any;
|
public serviceBrand: any;
|
||||||
|
|
||||||
@@ -22,8 +28,14 @@ export class RenderService extends Disposable implements IRenderService {
|
|||||||
private _isPaused: boolean = false;
|
private _isPaused: boolean = false;
|
||||||
private _needsFullRefresh: boolean = false;
|
private _needsFullRefresh: boolean = false;
|
||||||
private _isNextRenderRedrawOnly: boolean = true;
|
private _isNextRenderRedrawOnly: boolean = true;
|
||||||
|
private _needsSelectionRefresh: boolean = false;
|
||||||
private _canvasWidth: number = 0;
|
private _canvasWidth: number = 0;
|
||||||
private _canvasHeight: number = 0;
|
private _canvasHeight: number = 0;
|
||||||
|
private _selectionState: ISelectionState = {
|
||||||
|
start: undefined,
|
||||||
|
end: undefined,
|
||||||
|
columnSelectMode: false
|
||||||
|
};
|
||||||
|
|
||||||
private _onDimensionsChange = new EventEmitter<IRenderDimensions>();
|
private _onDimensionsChange = new EventEmitter<IRenderDimensions>();
|
||||||
public get onDimensionsChange(): IEvent<IRenderDimensions> { return this._onDimensionsChange.event; }
|
public get onDimensionsChange(): IEvent<IRenderDimensions> { return this._onDimensionsChange.event; }
|
||||||
@@ -89,6 +101,14 @@ export class RenderService extends Disposable implements IRenderService {
|
|||||||
|
|
||||||
private _renderRows(start: number, end: number): void {
|
private _renderRows(start: number, end: number): void {
|
||||||
this._renderer.renderRows(start, end);
|
this._renderer.renderRows(start, end);
|
||||||
|
|
||||||
|
// Update selection if needed
|
||||||
|
if (this._needsSelectionRefresh) {
|
||||||
|
this._renderer.onSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);
|
||||||
|
this._needsSelectionRefresh = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fire render event only if it was not a redraw
|
||||||
if (!this._isNextRenderRedrawOnly) {
|
if (!this._isNextRenderRedrawOnly) {
|
||||||
this._onRender.fire({ start, end });
|
this._onRender.fire({ start, end });
|
||||||
}
|
}
|
||||||
@@ -124,7 +144,10 @@ export class RenderService extends Disposable implements IRenderService {
|
|||||||
this._renderer.dispose();
|
this._renderer.dispose();
|
||||||
this._renderer = renderer;
|
this._renderer = renderer;
|
||||||
this._renderer.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));
|
this._renderer.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));
|
||||||
this.refreshRows(0, this._rowCount - 1);
|
|
||||||
|
// Force a refresh
|
||||||
|
this._needsSelectionRefresh = true;
|
||||||
|
this._fullRefresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
private _fullRefresh(): void {
|
private _fullRefresh(): void {
|
||||||
@@ -163,7 +186,10 @@ export class RenderService extends Disposable implements IRenderService {
|
|||||||
this._renderer.onFocus();
|
this._renderer.onFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void {
|
public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {
|
||||||
|
this._selectionState.start = start;
|
||||||
|
this._selectionState.end = end;
|
||||||
|
this._selectionState.columnSelectMode = columnSelectMode;
|
||||||
this._renderer.onSelectionChanged(start, end, columnSelectMode);
|
this._renderer.onSelectionChanged(start, end, columnSelectMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ export interface IRenderService extends IDisposable {
|
|||||||
onCharSizeChanged(): void;
|
onCharSizeChanged(): void;
|
||||||
onBlur(): void;
|
onBlur(): void;
|
||||||
onFocus(): void;
|
onFocus(): void;
|
||||||
onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void;
|
onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;
|
||||||
onCursorMove(): void;
|
onCursorMove(): void;
|
||||||
clear(): void;
|
clear(): void;
|
||||||
registerCharacterJoiner(handler: CharacterJoinerHandler): number;
|
registerCharacterJoiner(handler: CharacterJoinerHandler): number;
|
||||||
|
|||||||
Reference in New Issue
Block a user