UNPKG

sussudio

Version:

An unofficial VS Code Internal API

137 lines (136 loc) 5.36 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { decodeKeybinding } from "../../../base/common/keybindings.mjs"; import { OS } from "../../../base/common/platform.mjs"; import { CommandsRegistry } from "../../commands/common/commands.mjs"; import { Registry } from "../../registry/common/platform.mjs"; import { combinedDisposable, DisposableStore, toDisposable } from "../../../base/common/lifecycle.mjs"; import { LinkedList } from "../../../base/common/linkedList.mjs"; export var KeybindingWeight; (function (KeybindingWeight) { KeybindingWeight[KeybindingWeight["EditorCore"] = 0] = "EditorCore"; KeybindingWeight[KeybindingWeight["EditorContrib"] = 100] = "EditorContrib"; KeybindingWeight[KeybindingWeight["WorkbenchContrib"] = 200] = "WorkbenchContrib"; KeybindingWeight[KeybindingWeight["BuiltinExtension"] = 300] = "BuiltinExtension"; KeybindingWeight[KeybindingWeight["ExternalExtension"] = 400] = "ExternalExtension"; })(KeybindingWeight || (KeybindingWeight = {})); class KeybindingsRegistryImpl { _coreKeybindings; _extensionKeybindings; _cachedMergedKeybindings; constructor() { this._coreKeybindings = new LinkedList(); this._extensionKeybindings = []; this._cachedMergedKeybindings = null; } /** * Take current platform into account and reduce to primary & secondary. */ static bindToCurrentPlatform(kb) { if (OS === 1 /* OperatingSystem.Windows */) { if (kb && kb.win) { return kb.win; } } else if (OS === 2 /* OperatingSystem.Macintosh */) { if (kb && kb.mac) { return kb.mac; } } else { if (kb && kb.linux) { return kb.linux; } } return kb; } registerKeybindingRule(rule) { const actualKb = KeybindingsRegistryImpl.bindToCurrentPlatform(rule); const result = new DisposableStore(); if (actualKb && actualKb.primary) { const kk = decodeKeybinding(actualKb.primary, OS); if (kk) { result.add(this._registerDefaultKeybinding(kk, rule.id, rule.args, rule.weight, 0, rule.when)); } } if (actualKb && Array.isArray(actualKb.secondary)) { for (let i = 0, len = actualKb.secondary.length; i < len; i++) { const k = actualKb.secondary[i]; const kk = decodeKeybinding(k, OS); if (kk) { result.add(this._registerDefaultKeybinding(kk, rule.id, rule.args, rule.weight, -i - 1, rule.when)); } } } return result; } setExtensionKeybindings(rules) { const result = []; let keybindingsLen = 0; for (const rule of rules) { if (rule.keybinding) { result[keybindingsLen++] = { keybinding: rule.keybinding, command: rule.id, commandArgs: rule.args, when: rule.when, weight1: rule.weight, weight2: 0, extensionId: rule.extensionId || null, isBuiltinExtension: rule.isBuiltinExtension || false }; } } this._extensionKeybindings = result; this._cachedMergedKeybindings = null; } registerCommandAndKeybindingRule(desc) { return combinedDisposable(this.registerKeybindingRule(desc), CommandsRegistry.registerCommand(desc)); } _registerDefaultKeybinding(keybinding, commandId, commandArgs, weight1, weight2, when) { const remove = this._coreKeybindings.push({ keybinding: keybinding, command: commandId, commandArgs: commandArgs, when: when, weight1: weight1, weight2: weight2, extensionId: null, isBuiltinExtension: false }); this._cachedMergedKeybindings = null; return toDisposable(() => { remove(); this._cachedMergedKeybindings = null; }); } getDefaultKeybindings() { if (!this._cachedMergedKeybindings) { this._cachedMergedKeybindings = Array.from(this._coreKeybindings).concat(this._extensionKeybindings); this._cachedMergedKeybindings.sort(sorter); } return this._cachedMergedKeybindings.slice(0); } } export const KeybindingsRegistry = new KeybindingsRegistryImpl(); // Define extension point ids export const Extensions = { EditorModes: 'platform.keybindingsRegistry' }; Registry.add(Extensions.EditorModes, KeybindingsRegistry); function sorter(a, b) { if (a.weight1 !== b.weight1) { return a.weight1 - b.weight1; } if (a.command && b.command) { if (a.command < b.command) { return -1; } if (a.command > b.command) { return 1; } } return a.weight2 - b.weight2; }