From 64c2cfccd90a80859fbe64f9b07afe36992570f0 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Thu, 28 Mar 2024 15:39:47 +0100 Subject: [PATCH] Fix synchronization of scrolling event flooding (#209021) fixes #209020 --- .../contrib/scrollLocking/browser/scrollLocking.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/scrollLocking/browser/scrollLocking.ts b/src/vs/workbench/contrib/scrollLocking/browser/scrollLocking.ts index 739709ba1f2..418197bc66c 100644 --- a/src/vs/workbench/contrib/scrollLocking/browser/scrollLocking.ts +++ b/src/vs/workbench/contrib/scrollLocking/browser/scrollLocking.ts @@ -12,6 +12,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { SideBySideEditor } from 'vs/workbench/browser/parts/editor/sideBySideEditor'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IEditorPane, IEditorPaneScrollPosition, isEditorPaneWithScrolling } from 'vs/workbench/common/editor'; +import { ReentrancyBarrier } from 'vs/workbench/contrib/mergeEditor/browser/utils'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IStatusbarEntryAccessor, IStatusbarService, StatusbarAlignment } from 'vs/workbench/services/statusbar/browser/statusbar'; @@ -59,6 +60,9 @@ export class SyncScroll extends Disposable implements IWorkbenchContribution { this.toggleStatusbarItem(this.isActive); } + // makes sure that the onDidEditorPaneScroll is not called multiple times for the same event + private _reentrancyBarrier = new ReentrancyBarrier(); + private trackVisiblePanes(): void { this.paneDisposables.clear(); this.paneInitialScrollTop.clear(); @@ -70,7 +74,11 @@ export class SyncScroll extends Disposable implements IWorkbenchContribution { } this.paneInitialScrollTop.set(pane, pane.getScrollPosition()); - this.paneDisposables.add(pane.onDidChangeScroll(() => this.onDidEditorPaneScroll(pane))); + this.paneDisposables.add(pane.onDidChangeScroll(() => + this._reentrancyBarrier.runExclusively(() => { + this.onDidEditorPaneScroll(pane); + }) + )); } }