Path: blob/main/src/vs/base/parts/contextmenu/electron-browser/contextmenu.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 { CONTEXT_MENU_CHANNEL, CONTEXT_MENU_CLOSE_CHANNEL, IContextMenuEvent, IContextMenuItem, IPopupOptions, ISerializableContextMenuItem } from '../common/contextmenu.js';6import { ipcRenderer } from '../../sandbox/electron-browser/globals.js';78let contextMenuIdPool = 0;910export function popup(items: IContextMenuItem[], options?: IPopupOptions, onHide?: () => void): void {11const processedItems: IContextMenuItem[] = [];1213const contextMenuId = contextMenuIdPool++;14const onClickChannel = `vscode:onContextMenu${contextMenuId}`;15const onClickChannelHandler = (event: unknown, itemId: number, context: IContextMenuEvent) => {16const item = processedItems[itemId];17item.click?.(context);18};1920ipcRenderer.once(onClickChannel, onClickChannelHandler);21ipcRenderer.once(CONTEXT_MENU_CLOSE_CHANNEL, (event: unknown, closedContextMenuId: number) => {22if (closedContextMenuId !== contextMenuId) {23return;24}2526ipcRenderer.removeListener(onClickChannel, onClickChannelHandler);2728onHide?.();29});3031ipcRenderer.send(CONTEXT_MENU_CHANNEL, contextMenuId, items.map(item => createItem(item, processedItems)), onClickChannel, options);32}3334function createItem(item: IContextMenuItem, processedItems: IContextMenuItem[]): ISerializableContextMenuItem {35const serializableItem: ISerializableContextMenuItem = {36id: processedItems.length,37label: item.label,38type: item.type,39accelerator: item.accelerator,40checked: item.checked,41enabled: typeof item.enabled === 'boolean' ? item.enabled : true,42visible: typeof item.visible === 'boolean' ? item.visible : true43};4445processedItems.push(item);4647// Submenu48if (Array.isArray(item.submenu)) {49serializableItem.submenu = item.submenu.map(submenuItem => createItem(submenuItem, processedItems));50}5152return serializableItem;53}545556