Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/keybindings/browser/keybindings.contribution.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import * as nls from '../../../../nls.js';
7
import { Action2, registerAction2 } from '../../../../platform/actions/common/actions.js';
8
import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
9
import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';
10
import { Categories } from '../../../../platform/action/common/actionCommonCategories.js';
11
import { ICommandService } from '../../../../platform/commands/common/commands.js';
12
import { showWindowLogActionId } from '../../../services/log/common/logConstants.js';
13
import { DisposableStore, IDisposable, toDisposable } from '../../../../base/common/lifecycle.js';
14
import { ILayoutService } from '../../../../platform/layout/browser/layoutService.js';
15
import { $, addDisposableListener, append, getDomNodePagePosition, getWindows, onDidRegisterWindow } from '../../../../base/browser/dom.js';
16
import { createCSSRule, createStyleSheet } from '../../../../base/browser/domStylesheets.js';
17
import { Emitter } from '../../../../base/common/event.js';
18
19
class ToggleKeybindingsLogAction extends Action2 {
20
static disposable: IDisposable | undefined;
21
22
constructor() {
23
super({
24
id: 'workbench.action.toggleKeybindingsLog',
25
title: nls.localize2('toggleKeybindingsLog', "Toggle Keyboard Shortcuts Troubleshooting"),
26
category: Categories.Developer,
27
f1: true
28
});
29
}
30
31
run(accessor: ServicesAccessor): void {
32
const logging = accessor.get(IKeybindingService).toggleLogging();
33
if (logging) {
34
const commandService = accessor.get(ICommandService);
35
commandService.executeCommand(showWindowLogActionId);
36
}
37
38
if (ToggleKeybindingsLogAction.disposable) {
39
ToggleKeybindingsLogAction.disposable.dispose();
40
ToggleKeybindingsLogAction.disposable = undefined;
41
return;
42
}
43
44
const layoutService = accessor.get(ILayoutService);
45
const disposables = new DisposableStore();
46
47
const container = layoutService.activeContainer;
48
const focusMarker = append(container, $('.focus-troubleshooting-marker'));
49
disposables.add(toDisposable(() => focusMarker.remove()));
50
51
// Add CSS rule for focus marker
52
const stylesheet = createStyleSheet(undefined, undefined, disposables);
53
createCSSRule('.focus-troubleshooting-marker', `
54
position: fixed;
55
pointer-events: none;
56
z-index: 100000;
57
background-color: rgba(255, 0, 0, 0.2);
58
border: 2px solid rgba(255, 0, 0, 0.8);
59
border-radius: 2px;
60
display: none;
61
`, stylesheet);
62
63
const onKeyDown = disposables.add(new Emitter<KeyboardEvent>());
64
65
function registerWindowListeners(window: Window, disposables: DisposableStore): void {
66
disposables.add(addDisposableListener(window, 'keydown', e => onKeyDown.fire(e), true));
67
}
68
69
for (const { window, disposables } of getWindows()) {
70
registerWindowListeners(window, disposables);
71
}
72
73
disposables.add(onDidRegisterWindow(({ window, disposables }) => registerWindowListeners(window, disposables)));
74
75
disposables.add(layoutService.onDidChangeActiveContainer(() => {
76
layoutService.activeContainer.appendChild(focusMarker);
77
}));
78
79
disposables.add(onKeyDown.event(e => {
80
const target = e.target as HTMLElement;
81
if (target) {
82
const position = getDomNodePagePosition(target);
83
focusMarker.style.top = `${position.top}px`;
84
focusMarker.style.left = `${position.left}px`;
85
focusMarker.style.width = `${position.width}px`;
86
focusMarker.style.height = `${position.height}px`;
87
focusMarker.style.display = 'block';
88
89
// Hide after timeout
90
setTimeout(() => {
91
focusMarker.style.display = 'none';
92
}, 800);
93
}
94
}));
95
96
ToggleKeybindingsLogAction.disposable = disposables;
97
}
98
}
99
100
registerAction2(ToggleKeybindingsLogAction);
101
102