Path: blob/main/src/vs/workbench/contrib/keybindings/browser/keybindings.contribution.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as nls from '../../../../nls.js';6import { Action2, registerAction2 } from '../../../../platform/actions/common/actions.js';7import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';8import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';9import { Categories } from '../../../../platform/action/common/actionCommonCategories.js';10import { ICommandService } from '../../../../platform/commands/common/commands.js';11import { showWindowLogActionId } from '../../../services/log/common/logConstants.js';12import { DisposableStore, IDisposable, toDisposable } from '../../../../base/common/lifecycle.js';13import { ILayoutService } from '../../../../platform/layout/browser/layoutService.js';14import { $, addDisposableListener, append, getDomNodePagePosition, getWindows, onDidRegisterWindow } from '../../../../base/browser/dom.js';15import { createCSSRule, createStyleSheet } from '../../../../base/browser/domStylesheets.js';16import { Emitter } from '../../../../base/common/event.js';1718class ToggleKeybindingsLogAction extends Action2 {19static disposable: IDisposable | undefined;2021constructor() {22super({23id: 'workbench.action.toggleKeybindingsLog',24title: nls.localize2('toggleKeybindingsLog', "Toggle Keyboard Shortcuts Troubleshooting"),25category: Categories.Developer,26f1: true27});28}2930run(accessor: ServicesAccessor): void {31const logging = accessor.get(IKeybindingService).toggleLogging();32if (logging) {33const commandService = accessor.get(ICommandService);34commandService.executeCommand(showWindowLogActionId);35}3637if (ToggleKeybindingsLogAction.disposable) {38ToggleKeybindingsLogAction.disposable.dispose();39ToggleKeybindingsLogAction.disposable = undefined;40return;41}4243const layoutService = accessor.get(ILayoutService);44const disposables = new DisposableStore();4546const container = layoutService.activeContainer;47const focusMarker = append(container, $('.focus-troubleshooting-marker'));48disposables.add(toDisposable(() => focusMarker.remove()));4950// Add CSS rule for focus marker51const stylesheet = createStyleSheet(undefined, undefined, disposables);52createCSSRule('.focus-troubleshooting-marker', `53position: fixed;54pointer-events: none;55z-index: 100000;56background-color: rgba(255, 0, 0, 0.2);57border: 2px solid rgba(255, 0, 0, 0.8);58border-radius: 2px;59display: none;60`, stylesheet);6162const onKeyDown = disposables.add(new Emitter<KeyboardEvent>());6364function registerWindowListeners(window: Window, disposables: DisposableStore): void {65disposables.add(addDisposableListener(window, 'keydown', e => onKeyDown.fire(e), true));66}6768for (const { window, disposables } of getWindows()) {69registerWindowListeners(window, disposables);70}7172disposables.add(onDidRegisterWindow(({ window, disposables }) => registerWindowListeners(window, disposables)));7374disposables.add(layoutService.onDidChangeActiveContainer(() => {75layoutService.activeContainer.appendChild(focusMarker);76}));7778disposables.add(onKeyDown.event(e => {79const target = e.target as HTMLElement;80if (target) {81const position = getDomNodePagePosition(target);82focusMarker.style.top = `${position.top}px`;83focusMarker.style.left = `${position.left}px`;84focusMarker.style.width = `${position.width}px`;85focusMarker.style.height = `${position.height}px`;86focusMarker.style.display = 'block';8788// Hide after timeout89setTimeout(() => {90focusMarker.style.display = 'none';91}, 800);92}93}));9495ToggleKeybindingsLogAction.disposable = disposables;96}97}9899registerAction2(ToggleKeybindingsLogAction);100101102