Merge branch 'master' into 2452_website_update

This commit is contained in:
Daniel Imms
2019-10-17 12:00:13 -07:00
committed by GitHub
5 changed files with 38 additions and 22 deletions
+1 -1
View File
@@ -107,7 +107,7 @@ jobs:
- Windows - Windows
- Linux_IntegrationTests - Linux_IntegrationTests
- macOS_IntegrationTests - macOS_IntegrationTests
condition: and(succeeded(), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/release/*'))) condition: and(succeeded(), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['FORCE_RELEASE'], 'true')))
pool: pool:
vmImage: 'ubuntu-16.04' vmImage: 'ubuntu-16.04'
steps: steps:
+4
View File
@@ -1469,6 +1469,10 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp
this._charSizeService.measure(); this._charSizeService.measure();
} }
// Sync the scroll area to make sure scroll events don't fire and scroll the viewport to an
// invalid location
this.viewport.syncScrollArea(true);
this.refresh(0, this.rows - 1); this.refresh(0, this.rows - 1);
this._onResize.fire({ cols: x, rows: y }); this._onResize.fire({ cols: x, rows: y });
} }
+1 -1
View File
@@ -35,7 +35,7 @@ export interface IPartialColorSet {
export interface IViewport extends IDisposable { export interface IViewport extends IDisposable {
scrollBarWidth: number; scrollBarWidth: number;
syncScrollArea(): void; syncScrollArea(immediate?: boolean): void;
getLinesScrolled(ev: WheelEvent): number; getLinesScrolled(ev: WheelEvent): number;
onWheel(ev: WheelEvent): boolean; onWheel(ev: WheelEvent): boolean;
onTouchStart(ev: TouchEvent): void; onTouchStart(ev: TouchEvent): void;
+14 -8
View File
@@ -61,7 +61,14 @@ export class Viewport extends Disposable implements IViewport {
* Refreshes row height, setting line-height, viewport height and scroll area height if * Refreshes row height, setting line-height, viewport height and scroll area height if
* necessary. * necessary.
*/ */
private _refresh(): void { private _refresh(immediate: boolean): void {
if (immediate) {
this._innerRefresh();
if (this._refreshAnimationFrame !== null) {
cancelAnimationFrame(this._refreshAnimationFrame);
}
return;
}
if (this._refreshAnimationFrame === null) { if (this._refreshAnimationFrame === null) {
this._refreshAnimationFrame = requestAnimationFrame(() => this._innerRefresh()); this._refreshAnimationFrame = requestAnimationFrame(() => this._innerRefresh());
} }
@@ -89,40 +96,39 @@ export class Viewport extends Disposable implements IViewport {
this._refreshAnimationFrame = null; this._refreshAnimationFrame = null;
} }
/** /**
* Updates dimensions and synchronizes the scroll area if necessary. * Updates dimensions and synchronizes the scroll area if necessary.
*/ */
public syncScrollArea(): void { public syncScrollArea(immediate: boolean = false): void {
// If buffer height changed // If buffer height changed
if (this._lastRecordedBufferLength !== this._bufferService.buffer.lines.length) { if (this._lastRecordedBufferLength !== this._bufferService.buffer.lines.length) {
this._lastRecordedBufferLength = this._bufferService.buffer.lines.length; this._lastRecordedBufferLength = this._bufferService.buffer.lines.length;
this._refresh(); this._refresh(immediate);
return; return;
} }
// If viewport height changed // If viewport height changed
if (this._lastRecordedViewportHeight !== this._renderService.dimensions.canvasHeight) { if (this._lastRecordedViewportHeight !== this._renderService.dimensions.canvasHeight) {
this._refresh(); this._refresh(immediate);
return; return;
} }
// If the buffer position doesn't match last scroll top // If the buffer position doesn't match last scroll top
const newScrollTop = this._bufferService.buffer.ydisp * this._currentRowHeight; const newScrollTop = this._bufferService.buffer.ydisp * this._currentRowHeight;
if (this._lastScrollTop !== newScrollTop) { if (this._lastScrollTop !== newScrollTop) {
this._refresh(); this._refresh(immediate);
return; return;
} }
// If element's scroll top changed, this can happen when hiding the element // If element's scroll top changed, this can happen when hiding the element
if (this._lastScrollTop !== this._viewportElement.scrollTop) { if (this._lastScrollTop !== this._viewportElement.scrollTop) {
this._refresh(); this._refresh(immediate);
return; return;
} }
// If row height changed // If row height changed
if (this._renderService.dimensions.scaledCellHeight / window.devicePixelRatio !== this._currentRowHeight) { if (this._renderService.dimensions.scaledCellHeight / window.devicePixelRatio !== this._currentRowHeight) {
this._refresh(); this._refresh(immediate);
return; return;
} }
} }
+18 -12
View File
@@ -167,19 +167,25 @@ export class Buffer implements IBuffer {
if (this._rows < newRows) { if (this._rows < newRows) {
for (let y = this._rows; y < newRows; y++) { for (let y = this._rows; y < newRows; y++) {
if (this.lines.length < newRows + this.ybase) { if (this.lines.length < newRows + this.ybase) {
if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) { if (this._optionsService.options.windowsMode) {
// There is room above the buffer and there are no empty elements below the line, // Just add the new missing rows on Windows as conpty reprints the screen with it's
// scroll up // view of the world. Once a line enters scrollback for conpty it remains there
this.ybase--;
addToY++;
if (this.ydisp > 0) {
// Viewport is at the top of the buffer, must increase downwards
this.ydisp--;
}
} else {
// Add a blank line if there is no buffer left at the top to scroll to, or if there
// are blank lines after the cursor
this.lines.push(new BufferLine(newCols, nullCell)); this.lines.push(new BufferLine(newCols, nullCell));
} else {
if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {
// There is room above the buffer and there are no empty elements below the line,
// scroll up
this.ybase--;
addToY++;
if (this.ydisp > 0) {
// Viewport is at the top of the buffer, must increase downwards
this.ydisp--;
}
} else {
// Add a blank line if there is no buffer left at the top to scroll to, or if there
// are blank lines after the cursor
this.lines.push(new BufferLine(newCols, nullCell));
}
} }
} }
} }