Skip to content

Commit f050eaa

Browse files
committed
Coordinate writing to the textarea, do it after rendering the lines text
1 parent a07b7d4 commit f050eaa

3 files changed

Lines changed: 24 additions & 4 deletions

File tree

src/vs/editor/browser/controller/keyboardHandler.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,8 +312,9 @@ export class KeyboardHandler extends ViewEventHandler implements IDisposable {
312312
return false;
313313
}
314314

315+
private _lastCursorSelectionChanged:editorCommon.IViewCursorSelectionChangedEvent = null;
315316
public onCursorSelectionChanged(e:editorCommon.IViewCursorSelectionChangedEvent): boolean {
316-
this.textAreaHandler.setCursorSelections(e.selection, e.secondarySelections);
317+
this._lastCursorSelectionChanged = e;
317318
return false;
318319
}
319320

@@ -328,4 +329,12 @@ export class KeyboardHandler extends ViewEventHandler implements IDisposable {
328329
return false;
329330
}
330331

332+
public writeToTextArea(): void {
333+
if (this._lastCursorSelectionChanged) {
334+
let e = this._lastCursorSelectionChanged;
335+
this._lastCursorSelectionChanged = null;
336+
this.textAreaHandler.setCursorSelections(e.selection, e.secondarySelections);
337+
}
338+
}
339+
331340
}

src/vs/editor/browser/view/viewImpl.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -889,18 +889,23 @@ export class View extends ViewEventHandler implements editorBrowser.IView, IDisp
889889

890890
if (!this.viewLines.shouldRender() && viewPartsToRender.length === 0) {
891891
// Nothing to render
892+
this.keyboardHandler.writeToTextArea();
892893
t.stop();
893894
return;
894895
}
895896

896897
let linesViewportData = this.layoutProvider.getLinesViewportData();
897898

898899
if (this.viewLines.shouldRender()) {
899-
this.viewLines.renderText(linesViewportData);
900+
this.viewLines.renderText(linesViewportData, () => {
901+
this.keyboardHandler.writeToTextArea();
902+
});
900903
this.viewLines.onDidRender();
901904

902905
// Rendering of viewLines might cause scroll events to occur, so collect view parts to render again
903906
viewPartsToRender = this._getViewPartsToRender();
907+
} else {
908+
this.keyboardHandler.writeToTextArea();
904909
}
905910

906911
let renderingContext = this.createRenderingContext(linesViewportData);

src/vs/editor/browser/viewParts/lines/viewLines.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ export class ViewLines extends ViewLayer {
375375
throw new Error('Not supported');
376376
}
377377

378-
public renderText(linesViewportData:editorCommon.ViewLinesViewportData): void {
378+
public renderText(linesViewportData:editorCommon.ViewLinesViewportData, onAfterLinesRendered:()=>void): void {
379379
if (!this.shouldRender()) {
380380
throw new Error('I did not ask to render!');
381381
}
@@ -387,7 +387,10 @@ export class ViewLines extends ViewLayer {
387387
this.domNode.setWidth(this._layoutProvider.getScrollWidth());
388388
this.domNode.setHeight(Math.min(this._layoutProvider.getTotalHeight(), 1000000));
389389

390-
// (2) compute horizontal scroll position:
390+
// (2) execute DOM writing that forces sync layout (e.g. textArea manipulation)
391+
onAfterLinesRendered();
392+
393+
// (3) compute horizontal scroll position:
391394
// - this must happen after the lines are in the DOM since it might need a line that rendered just now
392395
// - it might change `scrollWidth` and `scrollLeft`
393396
if (this._lastCursorRevealRangeHorizontallyEvent) {
@@ -410,6 +413,7 @@ export class ViewLines extends ViewLayer {
410413
this._layoutProvider.setScrollLeft(newScrollLeft.scrollLeft);
411414
}
412415

416+
// (4) handle scrolling
413417
let somethingChanged = false;
414418
if (browser.canUseTranslate3d) {
415419
var transform = 'translate3d(' + -this._layoutProvider.getScrollLeft() + 'px, ' + linesViewportData.visibleRangesDeltaTop + 'px, 0px)';
@@ -418,6 +422,8 @@ export class ViewLines extends ViewLayer {
418422
somethingChanged = StyleMutator.setTop(<HTMLElement>this.domNode.domNode.parentNode, linesViewportData.visibleRangesDeltaTop) || somethingChanged; // TODO@Alex
419423
somethingChanged = StyleMutator.setLeft(<HTMLElement>this.domNode.domNode.parentNode, -this._layoutProvider.getScrollLeft()) || somethingChanged; // TODO@Alex
420424
}
425+
426+
// (5) reset cached client rect left if scrolling changed something
421427
if (somethingChanged) {
422428
this._lastRenderedData.resetDomNodeClientRectLeft();
423429
}

0 commit comments

Comments
 (0)