microsoft / vscode

Visual Studio Code
https://code.visualstudio.com
MIT License
161.92k stars 28.46k forks source link

Tabs: clicking between active tabs results in 4 `redrawTabSelectedActiveAndDirty` #213160

Open bpasero opened 3 months ago

bpasero commented 3 months ago

When I log a stack trace in redrawTabSelectedActiveAndDirty, I see 3 calls when I click on the active tab, even when the tab is already active:

multiEditorTabsControl.js:1263 redrawTabSelectedActiveAndDirty Error
    at MultiEditorTabsControl.redrawTabSelectedActiveAndDirty (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/multiEditorTabsControl.js:1263:60)
    at vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/multiEditorTabsControl.js:480:22
    at MultiEditorTabsControl.doWithTab (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/multiEditorTabsControl.js:563:17)
    at vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/multiEditorTabsControl.js:550:22
    at Array.forEach (<anonymous>)
    at MultiEditorTabsControl.forEachTab (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/multiEditorTabsControl.js:543:72)
    at MultiEditorTabsControl.updateEditorSelections (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/multiEditorTabsControl.js:479:18)
    at MultiRowEditorControl.updateEditorSelections (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/multiRowEditorTabsControl.js:132:44)
    at EditorTitleControl.updateEditorSelections (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/editorTitleControl.js:118:36)
    at EditorGroupView.onDidChangeEditorSelection (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/editorGroupView.js:648:31)
    at EditorGroupView.onDidGroupModelChange (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/editorGroupView.js:432:26)
    at UniqueContainer.value (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/editorGroupView.js:415:66)
    at Emitter._deliver (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/base/common/event.js:926:26)
    at Emitter._deliverQueue (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/base/common/event.js:937:22)
    at Emitter.fire (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/base/common/event.js:960:22)
    at EditorGroupModel.doSetSelection (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/common/editor/editorGroupModel.js:488:36)
    at EditorGroupModel.setSelection (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/common/editor/editorGroupModel.js:474:18)
    at EditorGroupModel.openEditor (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/common/editor/editorGroupModel.js:227:22)
    at EditorGroupView.doOpenEditor (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/editorGroupView.js:941:64)
    at EditorGroupView.openEditor (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/editorGroupView.js:866:25)
    at handleClickOrTouch (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/multiEditorTabsControl.js:660:46)
    at HTMLDivElement.<anonymous> (vscode-file://vscode-app/Users/bpasero/Development/Microsoft/vscode/out/vs/workbench/browser/parts/editor/multiEditorTabsControl.js:672:100)

For some reason a onDidChangeEditorSelection selection event is fired always?

bpasero commented 3 months ago

This is fixed, but jumping between 2 active tabs still results in 4 updates.

benibenj commented 1 month ago

This is happening because we are redrawing when

We only need to redraw from updateEditorSelections if a selection got removed. Otherwise it gets handled by the open editor call. To fully optimize, this requires supporting selectedEditors on the filtered model.