Skip to content

Commit 5812774

Browse files
author
Loïc Mangeonjean
committed
feat: add a way to override keycode locking
1 parent 910a2bf commit 5812774

File tree

2 files changed

+68
-3
lines changed

2 files changed

+68
-3
lines changed

src/service-override/keybindings.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ async function updateUserKeybindings(keybindingsJson: string): Promise<void> {
6464
)
6565
}
6666

67+
export interface LockKeyCodesOverride {
68+
(keyCodes: string[], next: (keyCodes: string[]) => void): void
69+
}
70+
6771
class DynamicWorkbenchKeybindingService
6872
extends WorkbenchKeybindingService
6973
implements DynamicKeybindingService
@@ -72,6 +76,7 @@ class DynamicWorkbenchKeybindingService
7276

7377
constructor(
7478
private shouldUseGlobalKeybindings: () => boolean,
79+
private _lockKeyCodesOverride: LockKeyCodesOverride,
7580
@IContextKeyService contextKeyService: IContextKeyService,
7681
@ICommandService commandService: ICommandService,
7782
@ITelemetryService telemetryService: ITelemetryService,
@@ -157,20 +162,31 @@ class DynamicWorkbenchKeybindingService
157162
...this.keybindingProviders.flatMap((provider) => provider.provideKeybindings())
158163
]
159164
}
165+
166+
protected override lockKeyCodes(keyCodes: string[]): void {
167+
this._lockKeyCodesOverride(keyCodes, (keyCodes) => super.lockKeyCodes(keyCodes))
168+
}
160169
}
161170

162-
interface KeybindingsProps {
171+
export interface KeybindingsProps {
163172
shouldUseGlobalKeybindings?: () => boolean
173+
/**
174+
* Allows to override the key code lock (for instance, ['Escape'] during full screen)
175+
*/
176+
lockKeyCodesOverride?: LockKeyCodesOverride
164177
}
165178

166179
export default function getServiceOverride({
167-
shouldUseGlobalKeybindings = () => false
180+
shouldUseGlobalKeybindings = () => false,
181+
lockKeyCodesOverride = (keyCodes, next) => {
182+
next(keyCodes)
183+
}
168184
}: KeybindingsProps = {}): IEditorOverrideServices {
169185
return {
170186
...getFileServiceOverride(),
171187
[IKeybindingService.toString()]: new SyncDescriptor(
172188
DynamicWorkbenchKeybindingService,
173-
[shouldUseGlobalKeybindings],
189+
[shouldUseGlobalKeybindings, lockKeyCodesOverride],
174190
false
175191
),
176192
[IKeyboardLayoutService.toString()]: new SyncDescriptor(BrowserKeyboardLayoutService, [], true),
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= <[email protected]>
3+
Date: Mon, 8 Dec 2025 16:12:34 +0100
4+
Subject: [PATCH] refactor: split code to be able to override behavior
5+
6+
---
7+
.../keybinding/browser/keybindingService.ts | 18 +++++++++++-------
8+
1 file changed, 11 insertions(+), 7 deletions(-)
9+
10+
diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts
11+
index 6929b00e4bd..61a33210678 100644
12+
--- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts
13+
+++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts
14+
@@ -245,17 +245,11 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService {
15+
return;
16+
}
17+
18+
- const keyboard: IKeyboard | null = (<INavigatorWithKeyboard>mainWindow.navigator).keyboard;
19+
-
20+
if (BrowserFeatures.keyboard === KeyboardSupport.None) {
21+
return;
22+
}
23+
24+
- if (browser.isFullscreen(mainWindow)) {
25+
- keyboard?.lock(['Escape']);
26+
- } else {
27+
- keyboard?.unlock();
28+
- }
29+
+ this.lockKeyCodes(browser.isFullscreen(mainWindow) ? ['Escape'] : []);
30+
31+
// update resolver which will bring back all unbound keyboard shortcuts
32+
this._cachedResolver = null;
33+
@@ -263,6 +257,16 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService {
34+
}));
35+
}
36+
37+
+ protected lockKeyCodes(keyCodes: string[]): void {
38+
+ const keyboard: IKeyboard | null = (<INavigatorWithKeyboard>mainWindow.navigator).keyboard;
39+
+
40+
+ if (keyCodes.length > 0) {
41+
+ keyboard?.lock(keyCodes);
42+
+ } else {
43+
+ keyboard?.unlock();
44+
+ }
45+
+ }
46+
+
47+
public override dispose(): void {
48+
this._contributions.forEach(c => c.listener?.dispose());
49+
this._contributions.length = 0;

0 commit comments

Comments
 (0)