@theia/monaco 1.77.0-next.56 → 1.77.0-next.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/browser/monaco-init.spec.js +28 -1
- package/lib/browser/monaco-init.spec.js.map +1 -1
- package/lib/browser/monaco-keybinding.d.ts +1 -0
- package/lib/browser/monaco-keybinding.d.ts.map +1 -1
- package/lib/browser/monaco-keybinding.js +9 -2
- package/lib/browser/monaco-keybinding.js.map +1 -1
- package/lib/browser/monaco-keybinding.spec.d.ts +2 -0
- package/lib/browser/monaco-keybinding.spec.d.ts.map +1 -0
- package/lib/browser/monaco-keybinding.spec.js +94 -0
- package/lib/browser/monaco-keybinding.spec.js.map +1 -0
- package/lib/browser/monaco-resolved-keybinding.d.ts.map +1 -1
- package/lib/browser/monaco-resolved-keybinding.js +6 -3
- package/lib/browser/monaco-resolved-keybinding.js.map +1 -1
- package/package.json +8 -8
- package/src/browser/monaco-init.spec.ts +28 -1
- package/src/browser/monaco-keybinding.spec.ts +117 -0
- package/src/browser/monaco-keybinding.ts +13 -3
- package/src/browser/monaco-resolved-keybinding.ts +6 -3
|
@@ -17,6 +17,20 @@
|
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
const jsdom_1 = require("@theia/core/lib/browser/test/jsdom");
|
|
19
19
|
let disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
20
|
+
if (typeof CSS === 'undefined') {
|
|
21
|
+
Object.assign(globalThis, { CSS: { escape: (value) => value } });
|
|
22
|
+
}
|
|
23
|
+
window.matchMedia = () => ({
|
|
24
|
+
matches: false,
|
|
25
|
+
media: '',
|
|
26
|
+
// eslint-disable-next-line no-null/no-null
|
|
27
|
+
onchange: null,
|
|
28
|
+
addListener: () => undefined,
|
|
29
|
+
removeListener: () => undefined,
|
|
30
|
+
addEventListener: () => undefined,
|
|
31
|
+
removeEventListener: () => undefined,
|
|
32
|
+
dispatchEvent: () => false
|
|
33
|
+
});
|
|
20
34
|
const chai_1 = require("chai");
|
|
21
35
|
const core_1 = require("@theia/core");
|
|
22
36
|
const standaloneServices_1 = require("@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices");
|
|
@@ -41,7 +55,20 @@ disableJSDOM();
|
|
|
41
55
|
* the corresponding code in `monaco-init.ts` must be updated to match.
|
|
42
56
|
*/
|
|
43
57
|
describe('Monaco InstantiationService internals', () => {
|
|
44
|
-
before(() =>
|
|
58
|
+
before(() => {
|
|
59
|
+
disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
60
|
+
window.matchMedia = () => ({
|
|
61
|
+
matches: false,
|
|
62
|
+
media: '',
|
|
63
|
+
// eslint-disable-next-line no-null/no-null
|
|
64
|
+
onchange: null,
|
|
65
|
+
addListener: () => undefined,
|
|
66
|
+
removeListener: () => undefined,
|
|
67
|
+
addEventListener: () => undefined,
|
|
68
|
+
removeEventListener: () => undefined,
|
|
69
|
+
dispatchEvent: () => false
|
|
70
|
+
});
|
|
71
|
+
});
|
|
45
72
|
after(() => disableJSDOM());
|
|
46
73
|
it('StandaloneServices.get(IInstantiationService) should be an instance of InstantiationService', () => {
|
|
47
74
|
const instantiationService = standaloneServices_1.StandaloneServices.get(instantiation_1.IInstantiationService);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monaco-init.spec.js","sourceRoot":"","sources":["../../src/browser/monaco-init.spec.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+CAA+C;AAC/C,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;AAEhF,8DAAiE;AACjE,IAAI,YAAY,GAAG,IAAA,mBAAW,GAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"monaco-init.spec.js","sourceRoot":"","sources":["../../src/browser/monaco-init.spec.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+CAA+C;AAC/C,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;AAEhF,8DAAiE;AACjE,IAAI,YAAY,GAAG,IAAA,mBAAW,GAAE,CAAC;AACjC,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE,CAAC;IAC7B,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC;AACD,MAAM,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC;IACvB,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,EAAE;IACT,2CAA2C;IAC3C,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS;IAC5B,cAAc,EAAE,GAAG,EAAE,CAAC,SAAS;IAC/B,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS;IACjC,mBAAmB,EAAE,GAAG,EAAE,CAAC,SAAS;IACpC,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK;CAC7B,CAAC,CAAC;AAEH,+BAA8B;AAC9B,sCAAyC;AACzC,sHAAmH;AACnH,gHAAqH;AACrH,8HAA2H;AAC3H,wHAAqH;AAErH,YAAY,EAAE,CAAC;AAEf;;;;;;;;;;;;;;;GAeG;AACH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IAEnD,MAAM,CAAC,GAAG,EAAE;QACR,YAAY,GAAG,IAAA,mBAAW,GAAE,CAAC;QAC7B,MAAM,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE;YACT,2CAA2C;YAC3C,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS;YAC5B,cAAc,EAAE,GAAG,EAAE,CAAC,SAAS;YAC/B,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS;YACjC,mBAAmB,EAAE,GAAG,EAAE,CAAC,SAAS;YACpC,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK;SAC7B,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IAE5B,EAAE,CAAC,6FAA6F,EAAE,GAAG,EAAE;QACnG,MAAM,oBAAoB,GAAG,uCAAkB,CAAC,GAAG,CAAC,qCAAqB,CAAC,CAAC;QAC3E,IAAA,aAAM,EAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,2CAAoB,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4GAA4G,EAAE,GAAG,EAAE;QAClH,MAAM,oBAAoB,GAAG,uCAAkB,CAAC,GAAG,CAAC,qCAAqB,CAAC,CAAC;QAC3E,8DAA8D;QAC9D,MAAM,QAAQ,GAAI,oBAA4B,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;QACrC,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,qCAAiB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,2EAA2E;IAC3E,6EAA6E;IAC7E,0EAA0E;IAC1E,oEAAoE;IACpE,EAAE,CAAC,iGAAiG,EAAE,GAAG,EAAE;QACvG,2EAA2E;QAC3E,uCAAkB,CAAC,GAAG,CAAC,qCAAqB,CAAC,CAAC;QAE9C,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,uCAAkB,CAAC,YAAY,CAAC,GAAG,EAAE;YACjC,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,iBAAU,CAAC,IAAI,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IAC9B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -12,6 +12,7 @@ export declare class MonacoKeybindingContribution implements KeybindingContribut
|
|
|
12
12
|
protected init(): void;
|
|
13
13
|
registerKeybindings(registry: KeybindingRegistry): void;
|
|
14
14
|
protected updateMonacoKeybindings(): void;
|
|
15
|
+
protected isMonacoRepresentable(codes: KeyCode[]): boolean;
|
|
15
16
|
protected toMonacoKeybindingNumber(codes: KeyCode[]): number;
|
|
16
17
|
protected toSingleMonacoKeybindingNumber(code: KeyCode): number;
|
|
17
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monaco-keybinding.d.ts","sourceRoot":"","sources":["../../src/browser/monaco-keybinding.ts"],"names":[],"mappings":"AAiBA,OAAO,
|
|
1
|
+
{"version":3,"file":"monaco-keybinding.d.ts","sourceRoot":"","sources":["../../src/browser/monaco-keybinding.ts"],"names":[],"mappings":"AAiBA,OAAO,EACH,sBAAsB,EAAE,kBAAkB,EAAmB,OAAO,EACvE,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAsB,OAAO,EAAE,MAAM,aAAa,CAAC;AAKjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAIvE,qBACa,4BAA6B,YAAW,sBAAsB;IAEvE,SAAS,CAAC,2BAA2B,uBAA8B;IAEpC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IACtD,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACtD,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,eAAe,CAAC;IACjD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;IAG/F,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAGnC,SAAS,CAAC,IAAI,IAAI,IAAI;IAItB,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAiBvD,SAAS,CAAC,uBAAuB,IAAI,IAAI;IAyBzC,SAAS,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO;IAK1D,SAAS,CAAC,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM;IAU5D,SAAS,CAAC,8BAA8B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM;CAiBlE"}
|
|
@@ -59,6 +59,9 @@ let MonacoKeybindingContribution = class MonacoKeybindingContribution {
|
|
|
59
59
|
this.toDisposeOnKeybindingChange.dispose();
|
|
60
60
|
for (const binding of this.keybindings.getKeybindingsByScope(browser_1.KeybindingScope.USER).concat(this.keybindings.getKeybindingsByScope(browser_1.KeybindingScope.WORKSPACE))) {
|
|
61
61
|
const resolved = this.keybindings.resolveKeybinding(binding);
|
|
62
|
+
if (this.keybindings.isKeybindingInactive(binding) || !this.isMonacoRepresentable(resolved)) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
62
65
|
const command = binding.command;
|
|
63
66
|
const when = binding.when
|
|
64
67
|
? this.contextKeyService.parse(binding.when)
|
|
@@ -69,6 +72,10 @@ let MonacoKeybindingContribution = class MonacoKeybindingContribution {
|
|
|
69
72
|
}
|
|
70
73
|
}
|
|
71
74
|
}
|
|
75
|
+
isMonacoRepresentable(codes) {
|
|
76
|
+
return codes.length <= 2 && codes.every(code => code.key && monaco_keycode_map_1.KEY_CODE_MAP[code.key.keyCode] !== undefined
|
|
77
|
+
&& !(0, browser_1.layoutModifiersIncludeAltGraph)(code.layoutModifiers));
|
|
78
|
+
}
|
|
72
79
|
toMonacoKeybindingNumber(codes) {
|
|
73
80
|
const [firstPart, secondPart] = codes;
|
|
74
81
|
if (codes.length > 2) {
|
|
@@ -84,11 +91,11 @@ let MonacoKeybindingContribution = class MonacoKeybindingContribution {
|
|
|
84
91
|
if (code.alt) {
|
|
85
92
|
encoded |= monaco.KeyMod.Alt;
|
|
86
93
|
}
|
|
87
|
-
if (code.shift) {
|
|
94
|
+
if (code.shift || (0, browser_1.layoutModifiersIncludeShift)(code.layoutModifiers)) {
|
|
88
95
|
encoded |= monaco.KeyMod.Shift;
|
|
89
96
|
}
|
|
90
97
|
if (code.ctrl) {
|
|
91
|
-
encoded |= monaco.KeyMod.WinCtrl;
|
|
98
|
+
encoded |= core_1.isOSX ? monaco.KeyMod.WinCtrl : monaco.KeyMod.CtrlCmd;
|
|
92
99
|
}
|
|
93
100
|
if (code.meta && core_1.isOSX) {
|
|
94
101
|
encoded |= monaco.KeyMod.CtrlCmd;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monaco-keybinding.js","sourceRoot":"","sources":["../../src/browser/monaco-keybinding.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4DAAwF;AACxF,
|
|
1
|
+
{"version":3,"file":"monaco-keybinding.js","sourceRoot":"","sources":["../../src/browser/monaco-keybinding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monaco-keybinding.spec.d.ts","sourceRoot":"","sources":["../../src/browser/monaco-keybinding.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 EclipseSource and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
10
|
+
// *****************************************************************************
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const tslib_1 = require("tslib");
|
|
13
|
+
const jsdom_1 = require("@theia/core/lib/browser/test/jsdom");
|
|
14
|
+
let disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
15
|
+
const chai_1 = require("chai");
|
|
16
|
+
const browser_1 = require("@theia/core/lib/browser");
|
|
17
|
+
const os = tslib_1.__importStar(require("@theia/core/lib/common/os"));
|
|
18
|
+
const monaco = tslib_1.__importStar(require("@theia/monaco-editor-core"));
|
|
19
|
+
const MonacoPlatform = tslib_1.__importStar(require("@theia/monaco-editor-core/esm/vs/base/common/platform"));
|
|
20
|
+
const keybindings_1 = require("@theia/monaco-editor-core/esm/vs/base/common/keybindings");
|
|
21
|
+
const usLayoutResolvedKeybinding_1 = require("@theia/monaco-editor-core/esm/vs/platform/keybinding/common/usLayoutResolvedKeybinding");
|
|
22
|
+
const sinon = tslib_1.__importStar(require("sinon"));
|
|
23
|
+
const monaco_keybinding_1 = require("./monaco-keybinding");
|
|
24
|
+
const monaco_resolved_keybinding_1 = require("./monaco-resolved-keybinding");
|
|
25
|
+
class TestMonacoKeybindingContribution extends monaco_keybinding_1.MonacoKeybindingContribution {
|
|
26
|
+
encode(code) {
|
|
27
|
+
return this.toSingleMonacoKeybindingNumber(code);
|
|
28
|
+
}
|
|
29
|
+
representable(codes) {
|
|
30
|
+
return this.isMonacoRepresentable(codes);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
disableJSDOM();
|
|
34
|
+
describe('Monaco keybinding adapter', () => {
|
|
35
|
+
let contribution;
|
|
36
|
+
before(() => disableJSDOM = (0, jsdom_1.enableJSDOM)());
|
|
37
|
+
after(() => disableJSDOM());
|
|
38
|
+
beforeEach(() => contribution = new TestMonacoKeybindingContribution());
|
|
39
|
+
afterEach(() => sinon.restore());
|
|
40
|
+
it('encodes non-macOS Ctrl as Monaco CtrlCmd', () => {
|
|
41
|
+
sinon.stub(os, 'isOSX').value(false);
|
|
42
|
+
const encoded = contribution.encode(new browser_1.KeyCode({ key: browser_1.Key.KEY_A, ctrl: true }));
|
|
43
|
+
(0, chai_1.expect)(encoded & monaco.KeyMod.CtrlCmd).to.equal(monaco.KeyMod.CtrlCmd);
|
|
44
|
+
(0, chai_1.expect)(encoded & monaco.KeyMod.WinCtrl).to.equal(0);
|
|
45
|
+
});
|
|
46
|
+
it('preserves macOS Ctrl and Command encoding', () => {
|
|
47
|
+
sinon.stub(os, 'isOSX').value(true);
|
|
48
|
+
const encoded = contribution.encode(new browser_1.KeyCode({ key: browser_1.Key.KEY_A, ctrl: true, meta: true }));
|
|
49
|
+
(0, chai_1.expect)(encoded & monaco.KeyMod.WinCtrl).to.equal(monaco.KeyMod.WinCtrl);
|
|
50
|
+
(0, chai_1.expect)(encoded & monaco.KeyMod.CtrlCmd).to.equal(monaco.KeyMod.CtrlCmd);
|
|
51
|
+
});
|
|
52
|
+
it('accepts layout Shift but rejects layout AltGraph and unmapped keys', () => {
|
|
53
|
+
(0, chai_1.expect)(contribution.representable([
|
|
54
|
+
new browser_1.KeyCode({ key: browser_1.Key.DIGIT7, layoutModifiers: 'shift' })
|
|
55
|
+
])).to.be.true;
|
|
56
|
+
(0, chai_1.expect)(contribution.representable([
|
|
57
|
+
new browser_1.KeyCode({ key: browser_1.Key.DIGIT8, layoutModifiers: 'altGraph' })
|
|
58
|
+
])).to.be.false;
|
|
59
|
+
(0, chai_1.expect)(contribution.representable([new browser_1.KeyCode({ key: browser_1.Key.F20 })])).to.be.false;
|
|
60
|
+
});
|
|
61
|
+
it('uses formatted logical characters in resolved labels', () => {
|
|
62
|
+
const registry = Object.create(browser_1.KeybindingRegistry.prototype);
|
|
63
|
+
const bracket = new monaco_resolved_keybinding_1.MonacoResolvedKeybinding([
|
|
64
|
+
new browser_1.KeyCode({ key: browser_1.Key.DIGIT8, ctrl: true, character: '[', layoutModifiers: 'altGraph' })
|
|
65
|
+
], registry);
|
|
66
|
+
const letter = new monaco_resolved_keybinding_1.MonacoResolvedKeybinding([
|
|
67
|
+
new browser_1.KeyCode({ key: browser_1.Key.KEY_P, ctrl: true, character: 'p' })
|
|
68
|
+
], registry);
|
|
69
|
+
const controlLabel = MonacoPlatform.OS === 2 /* MonacoPlatform.OperatingSystem.Macintosh */ ? '⌃' : 'Ctrl+';
|
|
70
|
+
(0, chai_1.expect)(bracket.getLabel()).to.equal(`${controlLabel}[`);
|
|
71
|
+
(0, chai_1.expect)(letter.getLabel()).to.equal(`${controlLabel}P`);
|
|
72
|
+
});
|
|
73
|
+
it('includes layout Shift in dispatch chords but not in labels', () => {
|
|
74
|
+
const registry = Object.create(browser_1.KeybindingRegistry.prototype);
|
|
75
|
+
const resolved = new monaco_resolved_keybinding_1.MonacoResolvedKeybinding([
|
|
76
|
+
new browser_1.KeyCode({ key: browser_1.Key.DIGIT7, ctrl: true, character: '/', layoutModifiers: 'shift' })
|
|
77
|
+
], registry);
|
|
78
|
+
const expectedDispatch = usLayoutResolvedKeybinding_1.USLayoutResolvedKeybinding.getDispatchStr(new keybindings_1.KeyCodeChord(true, true, false, false, 28 /* MonacoKeyCode.Digit7 */));
|
|
79
|
+
const controlLabel = MonacoPlatform.OS === 2 /* MonacoPlatform.OperatingSystem.Macintosh */ ? '⌃' : 'Ctrl+';
|
|
80
|
+
(0, chai_1.expect)(resolved.getDispatchChords()).to.deep.equal([expectedDispatch]);
|
|
81
|
+
(0, chai_1.expect)(resolved.getLabel()).to.equal(`${controlLabel}/`);
|
|
82
|
+
});
|
|
83
|
+
it('shows layout Shift in labels when it produces an uppercase letter', () => {
|
|
84
|
+
const registry = Object.create(browser_1.KeybindingRegistry.prototype);
|
|
85
|
+
const resolved = new monaco_resolved_keybinding_1.MonacoResolvedKeybinding([
|
|
86
|
+
new browser_1.KeyCode({ key: browser_1.Key.KEY_P, ctrl: true, character: 'P', layoutModifiers: 'shift' })
|
|
87
|
+
], registry);
|
|
88
|
+
const expectedDispatch = usLayoutResolvedKeybinding_1.USLayoutResolvedKeybinding.getDispatchStr(new keybindings_1.KeyCodeChord(true, true, false, false, 46 /* MonacoKeyCode.KeyP */));
|
|
89
|
+
const isMac = MonacoPlatform.OS === 2 /* MonacoPlatform.OperatingSystem.Macintosh */;
|
|
90
|
+
(0, chai_1.expect)(resolved.getDispatchChords()).to.deep.equal([expectedDispatch]);
|
|
91
|
+
(0, chai_1.expect)(resolved.getLabel()).to.equal(isMac ? '⌃⇧P' : 'Ctrl+Shift+P');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=monaco-keybinding.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monaco-keybinding.spec.js","sourceRoot":"","sources":["../../src/browser/monaco-keybinding.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monaco-resolved-keybinding.d.ts","sourceRoot":"","sources":["../../src/browser/monaco-resolved-keybinding.ts"],"names":[],"mappings":"AAiBA,OAAO,EACH,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAgB,KAAK,EAC9E,MAAM,0DAA0D,CAAC;AAIlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,WAAW,EAA+B,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"monaco-resolved-keybinding.d.ts","sourceRoot":"","sources":["../../src/browser/monaco-resolved-keybinding.ts"],"names":[],"mappings":"AAiBA,OAAO,EACH,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAgB,KAAK,EAC9E,MAAM,0DAA0D,CAAC;AAIlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,WAAW,EAA+B,MAAM,8BAA8B,CAAC;AAKjG,qBAAa,wBAAyB,SAAQ,kBAAkB;IAIhD,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW;IAFvD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;gBAEZ,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,kBAAkB;IAmB9F,QAAQ,IAAI,MAAM,GAAG,IAAI;IAIzB,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,sBAAsB,IAAI,MAAM,GAAG,IAAI;IASvC,oBAAoB,IAAI,MAAM,GAAG,IAAI;IAIrC,SAAS,IAAI,OAAO;IAIpB,iBAAiB,IAAI,OAAO;IAI5B,iBAAiB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE;IAItC,+BAA+B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,EAAE;IAIjE,SAAS,CAAC,6BAA6B,CAAC,IAAI,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI;IAmBlF,OAAO,CAAC,YAAY;IAUb,SAAS,IAAI,aAAa,EAAE;IAInC,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM;IAItD,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,GAAG,OAAO;IAyB1C,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,WAAW;IAIpD,OAAO,CAAC,MAAM,CAAC,qBAAqB;CASvC"}
|
|
@@ -22,6 +22,7 @@ const keybindingLabels_1 = require("@theia/monaco-editor-core/esm/vs/base/common
|
|
|
22
22
|
const usLayoutResolvedKeybinding_1 = require("@theia/monaco-editor-core/esm/vs/platform/keybinding/common/usLayoutResolvedKeybinding");
|
|
23
23
|
const MonacoPlatform = tslib_1.__importStar(require("@theia/monaco-editor-core/esm/vs/base/common/platform"));
|
|
24
24
|
const keys_1 = require("@theia/core/lib/browser/keys");
|
|
25
|
+
const keys_2 = require("@theia/core/lib/common/keys");
|
|
25
26
|
const os_1 = require("@theia/core/lib/common/os");
|
|
26
27
|
const monaco_keycode_map_1 = require("./monaco-keycode-map");
|
|
27
28
|
class MonacoResolvedKeybinding extends keybindings_1.ResolvedKeybinding {
|
|
@@ -29,10 +30,12 @@ class MonacoResolvedKeybinding extends keybindings_1.ResolvedKeybinding {
|
|
|
29
30
|
super();
|
|
30
31
|
this.keySequence = keySequence;
|
|
31
32
|
this.chords = keySequence.map(keyCode => {
|
|
33
|
+
const components = keybindingService.componentsForKeyCode(keyCode);
|
|
32
34
|
// eslint-disable-next-line no-null/no-null
|
|
33
|
-
const keyLabel = keyCode.key ?
|
|
35
|
+
const keyLabel = keyCode.key ? components[components.length - 1] : null;
|
|
34
36
|
const keyAriaLabel = keyLabel;
|
|
35
|
-
|
|
37
|
+
// The label uses the logical character, so layout Shift only appears when it produced an uppercase letter.
|
|
38
|
+
return new keybindings_1.ResolvedChord(keyCode.ctrl, keybindingService.displaysShift(keyCode), keyCode.alt, keyCode.meta, keyLabel, keyAriaLabel);
|
|
36
39
|
});
|
|
37
40
|
}
|
|
38
41
|
getLabel() {
|
|
@@ -83,7 +86,7 @@ class MonacoResolvedKeybinding extends keybindings_1.ResolvedKeybinding {
|
|
|
83
86
|
return null; // eslint-disable-line no-null/no-null
|
|
84
87
|
}
|
|
85
88
|
toKeybinding(keyCode) {
|
|
86
|
-
return new keybindings_1.KeyCodeChord(keyCode.ctrl, keyCode.shift, keyCode.alt, keyCode.meta, monaco_keycode_map_1.KEY_CODE_MAP[keyCode.key.keyCode]);
|
|
89
|
+
return new keybindings_1.KeyCodeChord(keyCode.ctrl, keyCode.shift || (0, keys_2.layoutModifiersIncludeShift)(keyCode.layoutModifiers), keyCode.alt, keyCode.meta, monaco_keycode_map_1.KEY_CODE_MAP[keyCode.key.keyCode]);
|
|
87
90
|
}
|
|
88
91
|
getChords() {
|
|
89
92
|
return this.chords;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monaco-resolved-keybinding.js","sourceRoot":"","sources":["../../src/browser/monaco-resolved-keybinding.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAGhF,0FAEkE;AAClE,oGAA6J;AAC7J,uIAAoI;AACpI,8GAAwF;AAExF,uDAAiG;AACjG,kDAAkD;AAClD,6DAAoD;AAEpD,MAAa,wBAAyB,SAAQ,gCAAkB;IAI5D,YAA+B,WAAwB,EAAE,iBAAqC;QAC1F,KAAK,EAAE,CAAC;QADmB,gBAAW,GAAX,WAAW,CAAa;QAEnD,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YACpC,2CAA2C;YAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"monaco-resolved-keybinding.js","sourceRoot":"","sources":["../../src/browser/monaco-resolved-keybinding.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/monaco",
|
|
3
|
-
"version": "1.77.0-next.
|
|
3
|
+
"version": "1.77.0-next.57+81ea5f939",
|
|
4
4
|
"description": "Theia - Monaco Extension",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/core": "1.77.0-next.
|
|
7
|
-
"@theia/editor": "1.77.0-next.
|
|
8
|
-
"@theia/filesystem": "1.77.0-next.
|
|
9
|
-
"@theia/markers": "1.77.0-next.
|
|
6
|
+
"@theia/core": "1.77.0-next.57+81ea5f939",
|
|
7
|
+
"@theia/editor": "1.77.0-next.57+81ea5f939",
|
|
8
|
+
"@theia/filesystem": "1.77.0-next.57+81ea5f939",
|
|
9
|
+
"@theia/markers": "1.77.0-next.57+81ea5f939",
|
|
10
10
|
"@theia/monaco-editor-core": "1.108.201",
|
|
11
|
-
"@theia/outline-view": "1.77.0-next.
|
|
12
|
-
"@theia/workspace": "1.77.0-next.
|
|
11
|
+
"@theia/outline-view": "1.77.0-next.57+81ea5f939",
|
|
12
|
+
"@theia/workspace": "1.77.0-next.57+81ea5f939",
|
|
13
13
|
"fast-plist": "^0.1.3",
|
|
14
14
|
"idb": "^4.0.5",
|
|
15
15
|
"jsonc-parser": "^3.3.1",
|
|
@@ -57,5 +57,5 @@
|
|
|
57
57
|
"nyc": {
|
|
58
58
|
"extends": "../../configs/nyc.json"
|
|
59
59
|
},
|
|
60
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "81ea5f939c40c905de91083d07e284bfd7437fac"
|
|
61
61
|
}
|
|
@@ -16,6 +16,20 @@
|
|
|
16
16
|
|
|
17
17
|
import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom';
|
|
18
18
|
let disableJSDOM = enableJSDOM();
|
|
19
|
+
if (typeof CSS === 'undefined') {
|
|
20
|
+
Object.assign(globalThis, { CSS: { escape: (value: string) => value } });
|
|
21
|
+
}
|
|
22
|
+
window.matchMedia = () => ({
|
|
23
|
+
matches: false,
|
|
24
|
+
media: '',
|
|
25
|
+
// eslint-disable-next-line no-null/no-null
|
|
26
|
+
onchange: null,
|
|
27
|
+
addListener: () => undefined,
|
|
28
|
+
removeListener: () => undefined,
|
|
29
|
+
addEventListener: () => undefined,
|
|
30
|
+
removeEventListener: () => undefined,
|
|
31
|
+
dispatchEvent: () => false
|
|
32
|
+
});
|
|
19
33
|
|
|
20
34
|
import { expect } from 'chai';
|
|
21
35
|
import { Disposable } from '@theia/core';
|
|
@@ -44,7 +58,20 @@ disableJSDOM();
|
|
|
44
58
|
*/
|
|
45
59
|
describe('Monaco InstantiationService internals', () => {
|
|
46
60
|
|
|
47
|
-
before(() =>
|
|
61
|
+
before(() => {
|
|
62
|
+
disableJSDOM = enableJSDOM();
|
|
63
|
+
window.matchMedia = () => ({
|
|
64
|
+
matches: false,
|
|
65
|
+
media: '',
|
|
66
|
+
// eslint-disable-next-line no-null/no-null
|
|
67
|
+
onchange: null,
|
|
68
|
+
addListener: () => undefined,
|
|
69
|
+
removeListener: () => undefined,
|
|
70
|
+
addEventListener: () => undefined,
|
|
71
|
+
removeEventListener: () => undefined,
|
|
72
|
+
dispatchEvent: () => false
|
|
73
|
+
});
|
|
74
|
+
});
|
|
48
75
|
after(() => disableJSDOM());
|
|
49
76
|
|
|
50
77
|
it('StandaloneServices.get(IInstantiationService) should be an instance of InstantiationService', () => {
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2026 EclipseSource and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
9
|
+
// *****************************************************************************
|
|
10
|
+
|
|
11
|
+
import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom';
|
|
12
|
+
let disableJSDOM = enableJSDOM();
|
|
13
|
+
|
|
14
|
+
import { expect } from 'chai';
|
|
15
|
+
import { Key, KeybindingRegistry, KeyCode } from '@theia/core/lib/browser';
|
|
16
|
+
import * as os from '@theia/core/lib/common/os';
|
|
17
|
+
import * as monaco from '@theia/monaco-editor-core';
|
|
18
|
+
import * as MonacoPlatform from '@theia/monaco-editor-core/esm/vs/base/common/platform';
|
|
19
|
+
import { KeyCode as MonacoKeyCode } from '@theia/monaco-editor-core/esm/vs/base/common/keyCodes';
|
|
20
|
+
import { KeyCodeChord } from '@theia/monaco-editor-core/esm/vs/base/common/keybindings';
|
|
21
|
+
import { USLayoutResolvedKeybinding } from '@theia/monaco-editor-core/esm/vs/platform/keybinding/common/usLayoutResolvedKeybinding';
|
|
22
|
+
import * as sinon from 'sinon';
|
|
23
|
+
import { MonacoKeybindingContribution } from './monaco-keybinding';
|
|
24
|
+
import { MonacoResolvedKeybinding } from './monaco-resolved-keybinding';
|
|
25
|
+
|
|
26
|
+
class TestMonacoKeybindingContribution extends MonacoKeybindingContribution {
|
|
27
|
+
encode(code: KeyCode): number {
|
|
28
|
+
return this.toSingleMonacoKeybindingNumber(code);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
representable(codes: KeyCode[]): boolean {
|
|
32
|
+
return this.isMonacoRepresentable(codes);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
disableJSDOM();
|
|
37
|
+
|
|
38
|
+
describe('Monaco keybinding adapter', () => {
|
|
39
|
+
let contribution: TestMonacoKeybindingContribution;
|
|
40
|
+
|
|
41
|
+
before(() => disableJSDOM = enableJSDOM());
|
|
42
|
+
after(() => disableJSDOM());
|
|
43
|
+
|
|
44
|
+
beforeEach(() => contribution = new TestMonacoKeybindingContribution());
|
|
45
|
+
|
|
46
|
+
afterEach(() => sinon.restore());
|
|
47
|
+
|
|
48
|
+
it('encodes non-macOS Ctrl as Monaco CtrlCmd', () => {
|
|
49
|
+
sinon.stub(os, 'isOSX').value(false);
|
|
50
|
+
|
|
51
|
+
const encoded = contribution.encode(new KeyCode({ key: Key.KEY_A, ctrl: true }));
|
|
52
|
+
|
|
53
|
+
expect(encoded & monaco.KeyMod.CtrlCmd).to.equal(monaco.KeyMod.CtrlCmd);
|
|
54
|
+
expect(encoded & monaco.KeyMod.WinCtrl).to.equal(0);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('preserves macOS Ctrl and Command encoding', () => {
|
|
58
|
+
sinon.stub(os, 'isOSX').value(true);
|
|
59
|
+
|
|
60
|
+
const encoded = contribution.encode(new KeyCode({ key: Key.KEY_A, ctrl: true, meta: true }));
|
|
61
|
+
|
|
62
|
+
expect(encoded & monaco.KeyMod.WinCtrl).to.equal(monaco.KeyMod.WinCtrl);
|
|
63
|
+
expect(encoded & monaco.KeyMod.CtrlCmd).to.equal(monaco.KeyMod.CtrlCmd);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('accepts layout Shift but rejects layout AltGraph and unmapped keys', () => {
|
|
67
|
+
expect(contribution.representable([
|
|
68
|
+
new KeyCode({ key: Key.DIGIT7, layoutModifiers: 'shift' })
|
|
69
|
+
])).to.be.true;
|
|
70
|
+
expect(contribution.representable([
|
|
71
|
+
new KeyCode({ key: Key.DIGIT8, layoutModifiers: 'altGraph' })
|
|
72
|
+
])).to.be.false;
|
|
73
|
+
expect(contribution.representable([new KeyCode({ key: Key.F20 })])).to.be.false;
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('uses formatted logical characters in resolved labels', () => {
|
|
77
|
+
const registry = Object.create(KeybindingRegistry.prototype) as KeybindingRegistry;
|
|
78
|
+
const bracket = new MonacoResolvedKeybinding([
|
|
79
|
+
new KeyCode({ key: Key.DIGIT8, ctrl: true, character: '[', layoutModifiers: 'altGraph' })
|
|
80
|
+
], registry);
|
|
81
|
+
const letter = new MonacoResolvedKeybinding([
|
|
82
|
+
new KeyCode({ key: Key.KEY_P, ctrl: true, character: 'p' })
|
|
83
|
+
], registry);
|
|
84
|
+
|
|
85
|
+
const controlLabel = MonacoPlatform.OS === MonacoPlatform.OperatingSystem.Macintosh ? '⌃' : 'Ctrl+';
|
|
86
|
+
expect(bracket.getLabel()).to.equal(`${controlLabel}[`);
|
|
87
|
+
expect(letter.getLabel()).to.equal(`${controlLabel}P`);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('includes layout Shift in dispatch chords but not in labels', () => {
|
|
91
|
+
const registry = Object.create(KeybindingRegistry.prototype) as KeybindingRegistry;
|
|
92
|
+
const resolved = new MonacoResolvedKeybinding([
|
|
93
|
+
new KeyCode({ key: Key.DIGIT7, ctrl: true, character: '/', layoutModifiers: 'shift' })
|
|
94
|
+
], registry);
|
|
95
|
+
const expectedDispatch = USLayoutResolvedKeybinding.getDispatchStr(
|
|
96
|
+
new KeyCodeChord(true, true, false, false, MonacoKeyCode.Digit7)
|
|
97
|
+
);
|
|
98
|
+
const controlLabel = MonacoPlatform.OS === MonacoPlatform.OperatingSystem.Macintosh ? '⌃' : 'Ctrl+';
|
|
99
|
+
|
|
100
|
+
expect(resolved.getDispatchChords()).to.deep.equal([expectedDispatch]);
|
|
101
|
+
expect(resolved.getLabel()).to.equal(`${controlLabel}/`);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('shows layout Shift in labels when it produces an uppercase letter', () => {
|
|
105
|
+
const registry = Object.create(KeybindingRegistry.prototype) as KeybindingRegistry;
|
|
106
|
+
const resolved = new MonacoResolvedKeybinding([
|
|
107
|
+
new KeyCode({ key: Key.KEY_P, ctrl: true, character: 'P', layoutModifiers: 'shift' })
|
|
108
|
+
], registry);
|
|
109
|
+
const expectedDispatch = USLayoutResolvedKeybinding.getDispatchStr(
|
|
110
|
+
new KeyCodeChord(true, true, false, false, MonacoKeyCode.KeyP)
|
|
111
|
+
);
|
|
112
|
+
const isMac = MonacoPlatform.OS === MonacoPlatform.OperatingSystem.Macintosh;
|
|
113
|
+
|
|
114
|
+
expect(resolved.getDispatchChords()).to.deep.equal([expectedDispatch]);
|
|
115
|
+
expect(resolved.getLabel()).to.equal(isMac ? '⌃⇧P' : 'Ctrl+Shift+P');
|
|
116
|
+
});
|
|
117
|
+
});
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import { injectable, inject, postConstruct, named } from '@theia/core/shared/inversify';
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
KeybindingContribution, KeybindingRegistry, KeybindingScope, KeyCode, layoutModifiersIncludeAltGraph, layoutModifiersIncludeShift
|
|
20
|
+
} from '@theia/core/lib/browser';
|
|
19
21
|
import { MonacoCommands } from './monaco-command';
|
|
20
22
|
import { MonacoCommandRegistry } from './monaco-command-registry';
|
|
21
23
|
import { CommandRegistry, DisposableCollection, environment, isOSX, ILogger } from '@theia/core';
|
|
@@ -68,6 +70,9 @@ export class MonacoKeybindingContribution implements KeybindingContribution {
|
|
|
68
70
|
this.toDisposeOnKeybindingChange.dispose();
|
|
69
71
|
for (const binding of this.keybindings.getKeybindingsByScope(KeybindingScope.USER).concat(this.keybindings.getKeybindingsByScope(KeybindingScope.WORKSPACE))) {
|
|
70
72
|
const resolved = this.keybindings.resolveKeybinding(binding);
|
|
73
|
+
if (this.keybindings.isKeybindingInactive(binding) || !this.isMonacoRepresentable(resolved)) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
71
76
|
const command = binding.command;
|
|
72
77
|
const when = binding.when
|
|
73
78
|
? this.contextKeyService.parse(binding.when)
|
|
@@ -84,6 +89,11 @@ export class MonacoKeybindingContribution implements KeybindingContribution {
|
|
|
84
89
|
}
|
|
85
90
|
}
|
|
86
91
|
|
|
92
|
+
protected isMonacoRepresentable(codes: KeyCode[]): boolean {
|
|
93
|
+
return codes.length <= 2 && codes.every(code => code.key && KEY_CODE_MAP[code.key.keyCode] !== undefined
|
|
94
|
+
&& !layoutModifiersIncludeAltGraph(code.layoutModifiers));
|
|
95
|
+
}
|
|
96
|
+
|
|
87
97
|
protected toMonacoKeybindingNumber(codes: KeyCode[]): number {
|
|
88
98
|
const [firstPart, secondPart] = codes;
|
|
89
99
|
if (codes.length > 2) {
|
|
@@ -100,11 +110,11 @@ export class MonacoKeybindingContribution implements KeybindingContribution {
|
|
|
100
110
|
if (code.alt) {
|
|
101
111
|
encoded |= monaco.KeyMod.Alt;
|
|
102
112
|
}
|
|
103
|
-
if (code.shift) {
|
|
113
|
+
if (code.shift || layoutModifiersIncludeShift(code.layoutModifiers)) {
|
|
104
114
|
encoded |= monaco.KeyMod.Shift;
|
|
105
115
|
}
|
|
106
116
|
if (code.ctrl) {
|
|
107
|
-
encoded |= monaco.KeyMod.WinCtrl;
|
|
117
|
+
encoded |= isOSX ? monaco.KeyMod.WinCtrl : monaco.KeyMod.CtrlCmd;
|
|
108
118
|
}
|
|
109
119
|
if (code.meta && isOSX) {
|
|
110
120
|
encoded |= monaco.KeyMod.CtrlCmd;
|
|
@@ -23,6 +23,7 @@ import { USLayoutResolvedKeybinding } from '@theia/monaco-editor-core/esm/vs/pla
|
|
|
23
23
|
import * as MonacoPlatform from '@theia/monaco-editor-core/esm/vs/base/common/platform';
|
|
24
24
|
import { KeybindingRegistry } from '@theia/core/lib/browser/keybinding';
|
|
25
25
|
import { KeyCode, KeySequence, Keystroke, Key, KeyModifier } from '@theia/core/lib/browser/keys';
|
|
26
|
+
import { layoutModifiersIncludeShift } from '@theia/core/lib/common/keys';
|
|
26
27
|
import { isOSX } from '@theia/core/lib/common/os';
|
|
27
28
|
import { KEY_CODE_MAP } from './monaco-keycode-map';
|
|
28
29
|
|
|
@@ -33,12 +34,14 @@ export class MonacoResolvedKeybinding extends ResolvedKeybinding {
|
|
|
33
34
|
constructor(protected readonly keySequence: KeySequence, keybindingService: KeybindingRegistry) {
|
|
34
35
|
super();
|
|
35
36
|
this.chords = keySequence.map(keyCode => {
|
|
37
|
+
const components = keybindingService.componentsForKeyCode(keyCode);
|
|
36
38
|
// eslint-disable-next-line no-null/no-null
|
|
37
|
-
const keyLabel = keyCode.key ?
|
|
39
|
+
const keyLabel = keyCode.key ? components[components.length - 1] : null;
|
|
38
40
|
const keyAriaLabel = keyLabel;
|
|
41
|
+
// The label uses the logical character, so layout Shift only appears when it produced an uppercase letter.
|
|
39
42
|
return new ResolvedChord(
|
|
40
43
|
keyCode.ctrl,
|
|
41
|
-
keyCode
|
|
44
|
+
keybindingService.displaysShift(keyCode),
|
|
42
45
|
keyCode.alt,
|
|
43
46
|
keyCode.meta,
|
|
44
47
|
keyLabel,
|
|
@@ -106,7 +109,7 @@ export class MonacoResolvedKeybinding extends ResolvedKeybinding {
|
|
|
106
109
|
private toKeybinding(keyCode: KeyCode): KeyCodeChord {
|
|
107
110
|
return new KeyCodeChord(
|
|
108
111
|
keyCode.ctrl,
|
|
109
|
-
keyCode.shift,
|
|
112
|
+
keyCode.shift || layoutModifiersIncludeShift(keyCode.layoutModifiers),
|
|
110
113
|
keyCode.alt,
|
|
111
114
|
keyCode.meta,
|
|
112
115
|
KEY_CODE_MAP[keyCode.key!.keyCode]
|