Skip to content

Commit a36f388

Browse files
committed
Fix menu item shortcuts, and context menu types
1 parent d1cb4b8 commit a36f388

File tree

3 files changed

+50
-21
lines changed

3 files changed

+50
-21
lines changed

src/electron-context-menu.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
declare module 'electron-context-menu' {
2+
function registerContextMenu(options: {}): void;
3+
export = registerContextMenu;
4+
}

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as os from 'os';
33
import * as path from 'path';
44
import { app, BrowserWindow, shell, Menu } from 'electron';
55

6-
import * as registerContextMenu from 'electron-context-menu';
6+
import registerContextMenu = require('electron-context-menu');
77
registerContextMenu({
88
showSaveImageAs: true
99
});

src/menu.ts

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,16 @@
1-
import { app, Menu } from 'electron';
1+
import { app, Menu, MenuItemConstructorOptions } from 'electron';
22

3-
const template = [
4-
{
5-
label: '&File',
6-
submenu: [
7-
{ role: 'quit' }
8-
]
9-
},
3+
const menuTemplate: MenuItemConstructorOptions[] = [
104
{
115
label: '&Edit',
126
submenu: [
137
{ role: 'undo' },
148
{ role: 'redo' },
159
{ type: 'separator' },
16-
{ role: 'cut' },
17-
{ role: 'copy' },
18-
{ role: 'paste' },
19-
{ role: 'pasteandmatchstyle' },
10+
{ role: 'cut', registerAccelerator: false },
11+
{ role: 'copy', registerAccelerator: false },
12+
{ role: 'paste', registerAccelerator: false },
13+
{ role: 'pasteandmatchstyle', registerAccelerator: false },
2014
{ role: 'delete' },
2115
{ role: 'selectall' }
2216
]
@@ -53,10 +47,10 @@ const template = [
5347
}
5448
]
5549
}
56-
]
50+
];
5751

5852
if (process.platform === 'darwin') {
59-
template.unshift({
53+
menuTemplate.unshift({
6054
label: app.getName(),
6155
submenu: [
6256
{ role: 'about' },
@@ -69,10 +63,10 @@ if (process.platform === 'darwin') {
6963
{ type: 'separator' },
7064
{ role: 'quit' }
7165
]
72-
})
66+
});
7367

7468
// Edit menu
75-
template[1].submenu.push(
69+
(menuTemplate[1].submenu as MenuItemConstructorOptions[]).push(
7670
{ type: 'separator' },
7771
{
7872
label: 'Speech',
@@ -81,16 +75,47 @@ if (process.platform === 'darwin') {
8175
{ role: 'stopspeaking' }
8276
]
8377
}
84-
)
78+
);
8579

8680
// Window menu
87-
template[3].submenu = [
81+
menuTemplate[3].submenu = [
8882
{ role: 'close' },
8983
{ role: 'minimize' },
9084
{ role: 'zoom' },
9185
{ type: 'separator' },
9286
{ role: 'front' }
93-
]
87+
];
88+
} else {
89+
menuTemplate.unshift({
90+
label: '&File',
91+
submenu: [
92+
{ role: 'quit' }
93+
]
94+
});
95+
}
96+
97+
// Mutate menu templates to fix https://github.com/electron/electron/issues/16303
98+
// by forcibly defaulting registerAccelerator to true on role menu items.
99+
function fixAccelerators(menuTemplates: MenuItemConstructorOptions[]): MenuItemConstructorOptions[] {
100+
return menuTemplates.map((template) => {
101+
if (template.role && !template.hasOwnProperty('registerAccelerator')) {
102+
template.registerAccelerator = true;
103+
}
104+
105+
const { submenu } = template;
106+
107+
if (submenu) {
108+
if (Array.isArray(submenu)) {
109+
template.submenu = fixAccelerators(submenu);
110+
} else {
111+
template.submenu = fixAccelerators([submenu]);
112+
}
113+
}
114+
115+
return template;
116+
});
94117
}
95118

96-
export const menu = Menu.buildFromTemplate(template)
119+
export const menu = Menu.buildFromTemplate(
120+
fixAccelerators(menuTemplate)
121+
);

0 commit comments

Comments
 (0)