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
5852if ( 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