Skip to content

Commit c5bd62f

Browse files
committed
adopt keybindings to user data service
1 parent f75bbdb commit c5bd62f

10 files changed

Lines changed: 78 additions & 160 deletions

File tree

src/vs/platform/environment/common/environment.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ export interface IEnvironmentService {
9797
appNameLong: string;
9898
appQuality?: string;
9999
appSettingsHome: URI;
100-
keybindingsResource: URI;
101100
keyboardLayoutResource: URI;
102101

103102
machineSettingsHome: URI;

src/vs/platform/environment/node/environmentService.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,6 @@ export class EnvironmentService implements IEnvironmentService {
132132
@memoize
133133
get settingsSearchUrl(): string | undefined { return product.settingsSearchUrl; }
134134

135-
@memoize
136-
get keybindingsResource(): URI { return resources.joinPath(this.appSettingsHome, 'keybindings.json'); }
137-
138135
@memoize
139136
get keyboardLayoutResource(): URI { return resources.joinPath(this.appSettingsHome, 'keyboardLayout.json'); }
140137

src/vs/platform/keybinding/common/keybinding.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'
1010
import { IResolveResult } from 'vs/platform/keybinding/common/keybindingResolver';
1111
import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem';
1212

13+
export const USER_KEYBINDINGS_KEY = 'keybindings.json';
14+
1315
export interface IUserFriendlyKeybinding {
1416
key: string;
1517
command: string;

src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import { ILabelService } from 'vs/platform/label/common/label';
4040
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
4141
import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts';
4242
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
43+
import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing';
4344

4445
Registry.as<IEditorRegistry>(EditorExtensions.Editors).registerEditor(
4546
new EditorDescriptor(
@@ -371,6 +372,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon
371372

372373
constructor(
373374
@IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService,
375+
@IKeybindingEditingService keybindingEditingService: IKeybindingEditingService,
374376
@IConfigurationService configurationService: IConfigurationService,
375377
@IPreferencesService private readonly preferencesService: IPreferencesService,
376378
@IWorkspaceContextService private readonly workpsaceContextService: IWorkspaceContextService,
@@ -387,7 +389,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon
387389
dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg`))
388390
}
389391
},
390-
when: ResourceContextKey.Resource.isEqualTo(environmentService.keybindingsResource.toString()),
392+
when: ResourceContextKey.Resource.isEqualTo(keybindingEditingService.userKeybindingsResource.toString()),
391393
group: 'navigation',
392394
order: 1
393395
});

src/vs/workbench/services/environment/browser/environmentService.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService {
7171
this.configuration.remoteAuthority = configuration.remoteAuthority;
7272

7373
this.appSettingsHome = joinPath(URI.revive(JSON.parse(document.getElementById('vscode-remote-user-data-uri')!.getAttribute('data-settings')!)), 'User');
74-
this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json');
7574
this.keyboardLayoutResource = joinPath(this.appSettingsHome, 'keyboardLayout.json');
7675

7776
this.logsPath = '/web/logs';
@@ -96,7 +95,6 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService {
9695
appNameLong: string;
9796
appQuality?: string;
9897
appSettingsHome: URI;
99-
keybindingsResource: URI;
10098
keyboardLayoutResource: URI;
10199
machineSettingsHome: URI;
102100
machineSettingsResource: URI;

src/vs/workbench/services/keybinding/browser/keybindingService.ts

Lines changed: 12 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/commo
1919
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
2020
import { Extensions, IJSONContributionRegistry } from 'vs/platform/jsonschemas/common/jsonContributionRegistry';
2121
import { AbstractKeybindingService } from 'vs/platform/keybinding/common/abstractKeybindingService';
22-
import { IKeyboardEvent, IUserFriendlyKeybinding, KeybindingSource, IKeybindingService, IKeybindingEvent } from 'vs/platform/keybinding/common/keybinding';
22+
import { IKeyboardEvent, IUserFriendlyKeybinding, KeybindingSource, IKeybindingService, IKeybindingEvent, USER_KEYBINDINGS_KEY } from 'vs/platform/keybinding/common/keybinding';
2323
import { KeybindingResolver } from 'vs/platform/keybinding/common/keybindingResolver';
2424
import { IKeybindingItem, IKeybindingRule2, KeybindingWeight, KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry';
2525
import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem';
@@ -36,17 +36,15 @@ import { MenuRegistry } from 'vs/platform/actions/common/actions';
3636
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
3737
// tslint:disable-next-line: import-patterns
3838
import { commandsExtensionPoint } from 'vs/workbench/api/common/menusExtensionPoint';
39-
import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
39+
import { Disposable } from 'vs/base/common/lifecycle';
4040
import { RunOnceScheduler } from 'vs/base/common/async';
41-
import { URI } from 'vs/base/common/uri';
42-
import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files';
43-
import { dirname, isEqual } from 'vs/base/common/resources';
4441
import { parse } from 'vs/base/common/json';
4542
import * as objects from 'vs/base/common/objects';
4643
import { IKeymapService } from 'vs/workbench/services/keybinding/common/keymapInfo';
4744
import { getDispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig';
4845
import { isArray } from 'vs/base/common/types';
4946
import { INavigatorWithKeyboard } from 'vs/workbench/services/keybinding/common/navigatorKeyboard';
47+
import { IUserDataService } from 'vs/workbench/services/userData/common/userData';
5048

5149
interface ContributedKeyBinding {
5250
command: string;
@@ -158,8 +156,8 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService {
158156
@IConfigurationService configurationService: IConfigurationService,
159157
@IWindowService private readonly windowService: IWindowService,
160158
@IExtensionService extensionService: IExtensionService,
161-
@IFileService fileService: IFileService,
162-
@IKeymapService private readonly keymapService: IKeymapService
159+
@IKeymapService private readonly keymapService: IKeymapService,
160+
@IUserDataService userDataService: IUserDataService,
163161
) {
164162
super(contextKeyService, commandService, telemetryService, notificationService);
165163

@@ -185,7 +183,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService {
185183

186184
this._cachedResolver = null;
187185

188-
this.userKeybindings = this._register(new UserKeybindings(environmentService.keybindingsResource, fileService));
186+
this.userKeybindings = this._register(new UserKeybindings(userDataService));
189187
this.userKeybindings.initialize().then(() => {
190188
if (this.userKeybindings.keybindings.length) {
191189
this.updateResolver({ source: KeybindingSource.User });
@@ -552,100 +550,40 @@ class UserKeybindings extends Disposable {
552550

553551
private _keybindings: IUserFriendlyKeybinding[] = [];
554552
get keybindings(): IUserFriendlyKeybinding[] { return this._keybindings; }
553+
555554
private readonly reloadConfigurationScheduler: RunOnceScheduler;
555+
556556
protected readonly _onDidChange: Emitter<void> = this._register(new Emitter<void>());
557557
readonly onDidChange: Event<void> = this._onDidChange.event;
558558

559-
private fileWatcherDisposable: IDisposable = Disposable.None;
560-
private directoryWatcherDisposable: IDisposable = Disposable.None;
561-
562559
constructor(
563-
private readonly keybindingsResource: URI,
564-
private readonly fileService: IFileService
560+
private readonly userDataService: IUserDataService
565561
) {
566562
super();
567563

568-
this._register(fileService.onFileChanges(e => this.handleFileEvents(e)));
564+
this._register(Event.filter(this.userDataService.onDidChange, e => e.contains(USER_KEYBINDINGS_KEY))(() => this.reloadConfigurationScheduler.schedule()));
569565
this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(changed => {
570566
if (changed) {
571567
this._onDidChange.fire();
572568
}
573569
}), 50));
574-
this._register(toDisposable(() => {
575-
this.stopWatchingResource();
576-
this.stopWatchingDirectory();
577-
}));
578-
}
579-
580-
private watchResource(): void {
581-
this.fileWatcherDisposable = this.fileService.watch(this.keybindingsResource);
582-
}
583-
584-
private stopWatchingResource(): void {
585-
this.fileWatcherDisposable.dispose();
586-
this.fileWatcherDisposable = Disposable.None;
587-
}
588-
589-
private watchDirectory(): void {
590-
const directory = dirname(this.keybindingsResource);
591-
this.directoryWatcherDisposable = this.fileService.watch(directory);
592-
}
593-
594-
private stopWatchingDirectory(): void {
595-
this.directoryWatcherDisposable.dispose();
596-
this.directoryWatcherDisposable = Disposable.None;
597570
}
598571

599572
async initialize(): Promise<void> {
600-
const exists = await this.fileService.exists(this.keybindingsResource);
601-
this.onResourceExists(exists);
602573
await this.reload();
603574
}
604575

605576
private async reload(): Promise<boolean> {
606577
const existing = this._keybindings;
607578
try {
608-
const content = await this.fileService.readFile(this.keybindingsResource);
609-
const value = parse(content.value.toString());
579+
const content = (await this.userDataService.read(USER_KEYBINDINGS_KEY)) || '[]';
580+
const value = parse(content);
610581
this._keybindings = isArray(value) ? value : [];
611582
} catch (e) {
612583
this._keybindings = [];
613584
}
614585
return existing ? !objects.equals(existing, this._keybindings) : true;
615586
}
616-
617-
private async handleFileEvents(event: FileChangesEvent): Promise<void> {
618-
const events = event.changes;
619-
620-
let affectedByChanges = false;
621-
622-
// Find changes that affect the resource
623-
for (const event of events) {
624-
affectedByChanges = isEqual(this.keybindingsResource, event.resource);
625-
if (affectedByChanges) {
626-
if (event.type === FileChangeType.ADDED) {
627-
this.onResourceExists(true);
628-
} else if (event.type === FileChangeType.DELETED) {
629-
this.onResourceExists(false);
630-
}
631-
break;
632-
}
633-
}
634-
635-
if (affectedByChanges) {
636-
this.reloadConfigurationScheduler.schedule();
637-
}
638-
}
639-
640-
private onResourceExists(exists: boolean): void {
641-
if (exists) {
642-
this.stopWatchingDirectory();
643-
this.watchResource();
644-
} else {
645-
this.stopWatchingResource();
646-
this.watchDirectory();
647-
}
648-
}
649587
}
650588

651589
let schemaId = 'vscode://schemas/keybindings';

0 commit comments

Comments
 (0)