Skip to content

Commit 2cab9c9

Browse files
authored
fix tab moves focus (#174704)
1 parent 59e68e1 commit 2cab9c9

File tree

8 files changed

+40
-41
lines changed

8 files changed

+40
-41
lines changed

src/vs/editor/browser/config/editorConfiguration.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import * as platform from 'vs/base/common/platform';
1212
import { ElementSizeObserver } from 'vs/editor/browser/config/elementSizeObserver';
1313
import { FontMeasurements } from 'vs/editor/browser/config/fontMeasurements';
1414
import { migrateOptions } from 'vs/editor/browser/config/migrateOptions';
15-
import { TabFocus } from 'vs/editor/browser/config/tabFocus';
15+
import { TabFocus, TabFocusContext } from 'vs/editor/browser/config/tabFocus';
1616
import { ComputeOptionsMemory, ConfigurationChangedEvent, EditorOption, editorOptionsRegistry, FindComputedEditorOptionValueById, IComputedEditorOptions, IEditorOptions, IEnvironmentalOptions } from 'vs/editor/common/config/editorOptions';
1717
import { EditorZoom } from 'vs/editor/common/config/editorZoom';
1818
import { BareFontInfo, FontInfo, IValidatedEditorOptions } from 'vs/editor/common/config/fontInfo';
@@ -86,7 +86,6 @@ export class EditorConfiguration extends Disposable implements IEditorConfigurat
8686
this._register(FontMeasurements.onDidChange(() => this._recomputeOptions()));
8787
this._register(browser.PixelRatio.onDidChange(() => this._recomputeOptions()));
8888
this._register(this._accessibilityService.onDidChangeScreenReaderOptimized(() => this._recomputeOptions()));
89-
TabFocus.setTabFocusMode(this.options.get(EditorOption.tabFocusMode));
9089
}
9190

9291
private _recomputeOptions(): void {
@@ -117,7 +116,7 @@ export class EditorConfiguration extends Disposable implements IEditorConfigurat
117116
lineNumbersDigitCount: this._lineNumbersDigitCount,
118117
emptySelectionClipboard: partialEnv.emptySelectionClipboard,
119118
pixelRatio: partialEnv.pixelRatio,
120-
tabFocusMode: TabFocus.getTabFocusMode(),
119+
tabFocusMode: TabFocus.getTabFocusMode(TabFocusContext.Editor),
121120
accessibilitySupport: partialEnv.accessibilitySupport
122121
};
123122
return EditorOptionsUtil.computeOptions(this._validatedOptions, env);

src/vs/editor/browser/config/tabFocus.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,32 @@
55

66
import { Emitter, Event } from 'vs/base/common/event';
77

8+
export const enum TabFocusContext {
9+
Terminal = 'terminalFocus',
10+
Editor = 'editorFocus'
11+
}
12+
813
class TabFocusImpl {
9-
private _tabFocus: boolean = false;
14+
private _tabFocusTerminal: boolean = false;
15+
private _tabFocusEditor: boolean = false;
1016

1117
private readonly _onDidChangeTabFocus = new Emitter<boolean>();
1218
public readonly onDidChangeTabFocus: Event<boolean> = this._onDidChangeTabFocus.event;
1319

14-
public getTabFocusMode(): boolean {
15-
return this._tabFocus;
20+
public getTabFocusMode(context: TabFocusContext): boolean {
21+
return context === TabFocusContext.Terminal ? this._tabFocusTerminal : this._tabFocusEditor;
1622
}
1723

18-
public setTabFocusMode(tabFocusMode: boolean): void {
19-
if (this._tabFocus === tabFocusMode) {
24+
public setTabFocusMode(tabFocusMode: boolean, context: TabFocusContext): void {
25+
if ((context === TabFocusContext.Terminal && this._tabFocusTerminal === tabFocusMode) || (context === TabFocusContext.Editor && this._tabFocusEditor === tabFocusMode)) {
2026
return;
2127
}
22-
23-
this._tabFocus = tabFocusMode;
24-
this._onDidChangeTabFocus.fire(this._tabFocus);
28+
if (context === TabFocusContext.Terminal) {
29+
this._tabFocusTerminal = tabFocusMode;
30+
} else {
31+
this._tabFocusEditor = tabFocusMode;
32+
}
33+
this._onDidChangeTabFocus.fire(this._tabFocusTerminal);
2534
}
2635
}
2736

src/vs/editor/browser/widget/codeEditorWidget.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguratio
6060
import { IDimension } from 'vs/editor/common/core/dimension';
6161
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
6262
import { CodeEditorContributions } from 'vs/editor/browser/widget/codeEditorContributions';
63+
import { TabFocus, TabFocusContext } from 'vs/editor/browser/config/tabFocus';
6364

6465
let EDITOR_ID = 0;
6566

@@ -1963,6 +1964,7 @@ class EditorContextKeysManager extends Disposable {
19631964
this._register(this._editor.onDidBlurEditorText(() => this._updateFromFocus()));
19641965
this._register(this._editor.onDidChangeModel(() => this._updateFromModel()));
19651966
this._register(this._editor.onDidChangeConfiguration(() => this._updateFromModel()));
1967+
this._register(TabFocus.onDidChangeTabFocus(() => this._editorTabMovesFocus.set(TabFocus.getTabFocusMode(TabFocusContext.Editor))));
19661968

19671969
this._updateFromConfig();
19681970
this._updateFromSelection();

src/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55

66
import { alert } from 'vs/base/browser/ui/aria/aria';
77
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
8-
import { TabFocus } from 'vs/editor/browser/config/tabFocus';
8+
import { TabFocus, TabFocusContext } from 'vs/editor/browser/config/tabFocus';
99
import { ServicesAccessor } from 'vs/editor/browser/editorExtensions';
1010
import * as nls from 'vs/nls';
1111
import { Action2, registerAction2 } from 'vs/platform/actions/common/actions';
12+
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
1213
import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
1314

1415
export class ToggleTabFocusModeAction extends Action2 {
@@ -30,9 +31,10 @@ export class ToggleTabFocusModeAction extends Action2 {
3031
}
3132

3233
public run(accessor: ServicesAccessor): void {
33-
const oldValue = TabFocus.getTabFocusMode();
34+
const context = accessor.get(IContextKeyService).getContextKeyValue('focusedView') === 'terminal' ? TabFocusContext.Terminal : TabFocusContext.Editor;
35+
const oldValue = TabFocus.getTabFocusMode(context);
3436
const newValue = !oldValue;
35-
TabFocus.setTabFocusMode(newValue);
37+
TabFocus.setTabFocusMode(newValue, context);
3638
if (newValue) {
3739
alert(nls.localize('toggle.tabMovesFocus.on', "Pressing Tab will now move focus to the next focusable element"));
3840
} else {

src/vs/workbench/browser/parts/editor/editorStatus.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
2828
import { ILanguageService, ILanguageSelection } from 'vs/editor/common/languages/language';
2929
import { Range } from 'vs/editor/common/core/range';
3030
import { Selection } from 'vs/editor/common/core/selection';
31-
import { TabFocus } from 'vs/editor/browser/config/tabFocus';
31+
import { TabFocus, TabFocusContext } from 'vs/editor/browser/config/tabFocus';
3232
import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands';
3333
import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement';
3434
import { EncodingMode, IEncodingSupport, ILanguageSupport, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
@@ -52,6 +52,7 @@ import { themeColorFromId } from 'vs/platform/theme/common/themeService';
5252
import { ITelemetryData, ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
5353
import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput';
5454
import { AutomaticLanguageDetectionLikelyWrongClassification, AutomaticLanguageDetectionLikelyWrongId, IAutomaticLanguageDetectionLikelyWrongData, ILanguageDetectionService } from 'vs/workbench/services/languageDetection/common/languageDetectionWorkerService';
55+
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
5556

5657
class SideBySideEditorEncodingSupport implements IEncodingSupport {
5758
constructor(private primary: IEncodingSupport, private secondary: IEncodingSupport) { }
@@ -306,7 +307,8 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution {
306307
@ILanguageService private readonly languageService: ILanguageService,
307308
@ITextFileService private readonly textFileService: ITextFileService,
308309
@IStatusbarService private readonly statusbarService: IStatusbarService,
309-
@IInstantiationService private readonly instantiationService: IInstantiationService
310+
@IInstantiationService private readonly instantiationService: IInstantiationService,
311+
@IContextKeyService private readonly contextKeyService: IContextKeyService
310312
) {
311313
super();
312314

@@ -817,7 +819,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution {
817819
}
818820

819821
private onTabFocusModeChange(): void {
820-
const info: StateDelta = { type: 'tabFocusMode', tabFocusMode: TabFocus.getTabFocusMode() };
822+
const info: StateDelta = { type: 'tabFocusMode', tabFocusMode: TabFocus.getTabFocusMode(this.contextKeyService.getContextKeyValue('focusedView') === 'terminal' ? TabFocusContext.Terminal : TabFocusContext.Editor) };
821823

822824
this.updateState(info);
823825
}

src/vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import { Action2, registerAction2 } from 'vs/platform/actions/common/actions';
3232
import { ICommandService } from 'vs/platform/commands/common/commands';
3333
import { NEW_UNTITLED_FILE_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileConstants';
3434
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
35+
import { TabFocus, TabFocusContext } from 'vs/editor/browser/config/tabFocus';
3536

3637
const CONTEXT_ACCESSIBILITY_WIDGET_VISIBLE = new RawContextKey<boolean>('accessibilityHelpWidgetVisible', false);
3738

@@ -229,7 +230,7 @@ class AccessibilityHelpWidget extends Widget implements IOverlayWidget {
229230
const NLS_TAB_FOCUS_MODE_OFF = nls.localize('tabFocusModeOffMsg', "Pressing Tab in the current editor will insert the tab character. Toggle this behavior by pressing {0}.");
230231
const NLS_TAB_FOCUS_MODE_OFF_NO_KB = nls.localize('tabFocusModeOffMsgNoKb', "Pressing Tab in the current editor will insert the tab character. The command {0} is currently not triggerable by a keybinding.");
231232

232-
if (options.get(EditorOption.tabFocusMode)) {
233+
if (TabFocus.getTabFocusMode(TabFocusContext.Editor)) {
233234
text += '\n\n - ' + this._descriptionForCommand(ToggleTabFocusModeAction.ID, NLS_TAB_FOCUS_MODE_ON, NLS_TAB_FOCUS_MODE_ON_NO_KB);
234235
} else {
235236
text += '\n\n - ' + this._descriptionForCommand(ToggleTabFocusModeAction.ID, NLS_TAB_FOCUS_MODE_OFF, NLS_TAB_FOCUS_MODE_OFF_NO_KB);

src/vs/workbench/contrib/terminal/browser/terminalInstance.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { isMacintosh, isWindows, OperatingSystem, OS } from 'vs/base/common/plat
2525
import { ScrollbarVisibility } from 'vs/base/common/scrollable';
2626
import { withNullAsUndefined } from 'vs/base/common/types';
2727
import { URI } from 'vs/base/common/uri';
28-
import { TabFocus } from 'vs/editor/browser/config/tabFocus';
28+
import { TabFocus, TabFocusContext } from 'vs/editor/browser/config/tabFocus';
2929
import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState';
3030
import * as nls from 'vs/nls';
3131
import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility';
@@ -1024,7 +1024,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
10241024
}
10251025

10261026
// If tab focus mode is on, tab is not passed to the terminal
1027-
if (TabFocus.getTabFocusMode() && event.keyCode === 9) {
1027+
if (TabFocus.getTabFocusMode(TabFocusContext.Terminal) && event.keyCode === 9) {
10281028
return false;
10291029
}
10301030

src/vs/workbench/contrib/terminal/browser/terminalMainContribution.ts

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { Disposable } from 'vs/base/common/lifecycle';
77
import { Schemas } from 'vs/base/common/network';
8-
import { TabFocus } from 'vs/editor/browser/config/tabFocus';
8+
import { TabFocus, TabFocusContext } from 'vs/editor/browser/config/tabFocus';
99
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1010
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
1111
import { ILabelService } from 'vs/platform/label/common/label';
@@ -21,8 +21,6 @@ import { IEditorResolverService, RegisteredEditorPriority } from 'vs/workbench/s
2121
* be more relevant).
2222
*/
2323
export class TerminalMainContribution extends Disposable implements IWorkbenchContribution {
24-
private _editorTabFocus: boolean | undefined;
25-
private _terminalTabFocus: boolean | undefined;
2624
constructor(
2725
@IEditorResolverService editorResolverService: IEditorResolverService,
2826
@ILabelService labelService: ILabelService,
@@ -79,30 +77,16 @@ export class TerminalMainContribution extends Disposable implements IWorkbenchCo
7977

8078
const viewKey = new Set<string>();
8179
viewKey.add('focusedView');
82-
TabFocus.onDidChangeTabFocus(tabFocus => {
83-
if (contextKeyService.getContextKeyValue('focusedView') === 'terminal') {
84-
this._terminalTabFocus = tabFocus;
85-
} else {
86-
this._editorTabFocus = tabFocus;
87-
}
88-
});
80+
TabFocus.setTabFocusMode(configurationService.getValue('editor.tabFocusMode'), TabFocusContext.Editor);
81+
TabFocus.setTabFocusMode(configurationService.getValue(TerminalSettingId.TabFocusMode), TabFocusContext.Terminal);
8982
this._register(contextKeyService.onDidChangeContext((c) => {
9083
if (c.affectsSome(viewKey)) {
9184
if (contextKeyService.getContextKeyValue('focusedView') === 'terminal') {
92-
this._editorTabFocus = TabFocus.getTabFocusMode();
93-
TabFocus.setTabFocusMode(this._terminalTabFocus ?? configurationService.getValue(TerminalSettingId.TabFocusMode));
85+
TabFocus.setTabFocusMode(configurationService.getValue(TerminalSettingId.TabFocusMode), TabFocusContext.Terminal);
9486
} else {
95-
this._terminalTabFocus = TabFocus.getTabFocusMode();
96-
TabFocus.setTabFocusMode(this._editorTabFocus ?? configurationService.getValue('editor.tabFocusMode'));
87+
TabFocus.setTabFocusMode(configurationService.getValue('editor.tabFocusMode'), TabFocusContext.Editor);
9788
}
9889
}
9990
}));
100-
this._register(configurationService.onDidChangeConfiguration(async e => {
101-
if (e.affectsConfiguration('editor.tabFocusMode')) {
102-
this._editorTabFocus = undefined;
103-
} else if (e.affectsConfiguration(TerminalSettingId.TabFocusMode)) {
104-
this._terminalTabFocus = undefined;
105-
}
106-
}));
10791
}
10892
}

0 commit comments

Comments
 (0)