diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts index 5d4f2adf..9ca30ac3 100644 --- a/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts +++ b/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts @@ -1,7 +1,8 @@ import { injectable } from 'inversify' import { remote } from 'electron'; +import { isOSX } from '@theia/core/lib/common/os'; import { Keybinding } from '@theia/core/lib/common/keybinding'; -import { CompositeMenuNode } from '@theia/core/lib/common/menu'; +import { CompositeMenuNode, MAIN_MENU_BAR, MenuPath } from '@theia/core/lib/common/menu'; import { ElectronMainMenuFactory as TheiaElectronMainMenuFactory, ElectronMenuOptions } from '@theia/core/lib/electron-browser/menu/electron-main-menu-factory'; import { ArduinoMenus, PlaceholderMenuNode } from '../../../browser/menu/arduino-menus'; @@ -10,7 +11,33 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { createMenuBar(): Electron.Menu { this._toggledCommands.clear(); // https://github.com/eclipse-theia/theia/issues/8977 - return super.createMenuBar(); + const menuModel = this.menuProvider.getMenu(MAIN_MENU_BAR); + const template = this.fillMenuTemplate([], menuModel); + if (isOSX) { + template.unshift(this.createOSXMenu()); + } + const menu = remote.Menu.buildFromTemplate(this.escapeAmpersand(template)); + this._menu = menu; + return menu; + } + + createContextMenu(menuPath: MenuPath, args?: any[]): Electron.Menu { + const menuModel = this.menuProvider.getMenu(menuPath); + const template = this.fillMenuTemplate([], menuModel, args, { showDisabled: false }); + return remote.Menu.buildFromTemplate(this.escapeAmpersand(template)); + } + + // TODO: remove after https://github.com/eclipse-theia/theia/pull/9231 + private escapeAmpersand(template: Electron.MenuItemConstructorOptions[]): Electron.MenuItemConstructorOptions[] { + for (const option of template) { + if (option.label) { + option.label = option.label.replace(/\&+/g, '&$&'); + } + if (option.submenu) { + this.escapeAmpersand(option.submenu as Electron.MenuItemConstructorOptions[]); + } + } + return template; } protected acceleratorFor(keybinding: Keybinding): string {