 33ef0d23a6
			
		
	
	
	
	
	33ef0d23a6* docs: fix minor grammar error 'punctuations' * docs: fix minor grammar error pluralizing Chromium * docs: fix typo 'updateCurrentActiviy' * docs: use consistent spelling of 'behavior' * docs: use 'macOS' instead of 'Mac OS' or 'OS X'. * docs: use 'GTK' instead of 'GTK+' https://mail.gnome.org/archives/gtk-devel-list/2019-February/msg00000.html * docs: minor capitalization: use 'TCP' not 'tcp' * Update docs/development/build-instructions-linux.md Co-Authored-By: Mark Lee <malept@users.noreply.github.com> Co-authored-by: Mark Lee <malept@users.noreply.github.com> Co-authored-by: John Kleinschmidt <jkleinsc@github.com>
		
			
				
	
	
		
			360 lines
		
	
	
	
		
			8 KiB
			
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			360 lines
		
	
	
	
		
			8 KiB
			
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Modules to control application life and create native browser window
 | |
| const {
 | |
|   BrowserWindow,
 | |
|   Menu,
 | |
|   MenuItem,
 | |
|   ipcMain,
 | |
|   app,
 | |
|   shell,
 | |
|   dialog
 | |
| } = require('electron')
 | |
| 
 | |
| const menu = new Menu()
 | |
| menu.append(new MenuItem({ label: 'Hello' }))
 | |
| menu.append(new MenuItem({ type: 'separator' }))
 | |
| menu.append(
 | |
|   new MenuItem({ label: 'Electron', type: 'checkbox', checked: true })
 | |
| )
 | |
| 
 | |
| const template = [
 | |
|   {
 | |
|     label: 'Edit',
 | |
|     submenu: [
 | |
|       {
 | |
|         label: 'Undo',
 | |
|         accelerator: 'CmdOrCtrl+Z',
 | |
|         role: 'undo'
 | |
|       },
 | |
|       {
 | |
|         label: 'Redo',
 | |
|         accelerator: 'Shift+CmdOrCtrl+Z',
 | |
|         role: 'redo'
 | |
|       },
 | |
|       {
 | |
|         type: 'separator'
 | |
|       },
 | |
|       {
 | |
|         label: 'Cut',
 | |
|         accelerator: 'CmdOrCtrl+X',
 | |
|         role: 'cut'
 | |
|       },
 | |
|       {
 | |
|         label: 'Copy',
 | |
|         accelerator: 'CmdOrCtrl+C',
 | |
|         role: 'copy'
 | |
|       },
 | |
|       {
 | |
|         label: 'Paste',
 | |
|         accelerator: 'CmdOrCtrl+V',
 | |
|         role: 'paste'
 | |
|       },
 | |
|       {
 | |
|         label: 'Select All',
 | |
|         accelerator: 'CmdOrCtrl+A',
 | |
|         role: 'selectall'
 | |
|       }
 | |
|     ]
 | |
|   },
 | |
|   {
 | |
|     label: 'View',
 | |
|     submenu: [
 | |
|       {
 | |
|         label: 'Reload',
 | |
|         accelerator: 'CmdOrCtrl+R',
 | |
|         click: (item, focusedWindow) => {
 | |
|           if (focusedWindow) {
 | |
|             // on reload, start fresh and close any old
 | |
|             // open secondary windows
 | |
|             if (focusedWindow.id === 1) {
 | |
|               BrowserWindow.getAllWindows().forEach(win => {
 | |
|                 if (win.id > 1) win.close()
 | |
|               })
 | |
|             }
 | |
|             focusedWindow.reload()
 | |
|           }
 | |
|         }
 | |
|       },
 | |
|       {
 | |
|         label: 'Toggle Full Screen',
 | |
|         accelerator: (() => {
 | |
|           if (process.platform === 'darwin') {
 | |
|             return 'Ctrl+Command+F'
 | |
|           } else {
 | |
|             return 'F11'
 | |
|           }
 | |
|         })(),
 | |
|         click: (item, focusedWindow) => {
 | |
|           if (focusedWindow) {
 | |
|             focusedWindow.setFullScreen(!focusedWindow.isFullScreen())
 | |
|           }
 | |
|         }
 | |
|       },
 | |
|       {
 | |
|         label: 'Toggle Developer Tools',
 | |
|         accelerator: (() => {
 | |
|           if (process.platform === 'darwin') {
 | |
|             return 'Alt+Command+I'
 | |
|           } else {
 | |
|             return 'Ctrl+Shift+I'
 | |
|           }
 | |
|         })(),
 | |
|         click: (item, focusedWindow) => {
 | |
|           if (focusedWindow) {
 | |
|             focusedWindow.toggleDevTools()
 | |
|           }
 | |
|         }
 | |
|       },
 | |
|       {
 | |
|         type: 'separator'
 | |
|       },
 | |
|       {
 | |
|         label: 'App Menu Demo',
 | |
|         click: function (item, focusedWindow) {
 | |
|           if (focusedWindow) {
 | |
|             const options = {
 | |
|               type: 'info',
 | |
|               title: 'Application Menu Demo',
 | |
|               buttons: ['Ok'],
 | |
|               message:
 | |
|                 'This demo is for the Menu section, showing how to create a clickable menu item in the application menu.'
 | |
|             }
 | |
|             dialog.showMessageBox(focusedWindow, options, function () {})
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     ]
 | |
|   },
 | |
|   {
 | |
|     label: 'Window',
 | |
|     role: 'window',
 | |
|     submenu: [
 | |
|       {
 | |
|         label: 'Minimize',
 | |
|         accelerator: 'CmdOrCtrl+M',
 | |
|         role: 'minimize'
 | |
|       },
 | |
|       {
 | |
|         label: 'Close',
 | |
|         accelerator: 'CmdOrCtrl+W',
 | |
|         role: 'close'
 | |
|       },
 | |
|       {
 | |
|         type: 'separator'
 | |
|       },
 | |
|       {
 | |
|         label: 'Reopen Window',
 | |
|         accelerator: 'CmdOrCtrl+Shift+T',
 | |
|         enabled: false,
 | |
|         key: 'reopenMenuItem',
 | |
|         click: () => {
 | |
|           app.emit('activate')
 | |
|         }
 | |
|       }
 | |
|     ]
 | |
|   },
 | |
|   {
 | |
|     label: 'Help',
 | |
|     role: 'help',
 | |
|     submenu: [
 | |
|       {
 | |
|         label: 'Learn More',
 | |
|         click: () => {
 | |
|           shell.openExternal('https://electronjs.org')
 | |
|         }
 | |
|       }
 | |
|     ]
 | |
|   }
 | |
| ]
 | |
| 
 | |
| function addUpdateMenuItems (items, position) {
 | |
|   if (process.mas) return
 | |
| 
 | |
|   const version = app.getVersion()
 | |
|   const updateItems = [
 | |
|     {
 | |
|       label: `Version ${version}`,
 | |
|       enabled: false
 | |
|     },
 | |
|     {
 | |
|       label: 'Checking for Update',
 | |
|       enabled: false,
 | |
|       key: 'checkingForUpdate'
 | |
|     },
 | |
|     {
 | |
|       label: 'Check for Update',
 | |
|       visible: false,
 | |
|       key: 'checkForUpdate',
 | |
|       click: () => {
 | |
|         require('electron').autoUpdater.checkForUpdates()
 | |
|       }
 | |
|     },
 | |
|     {
 | |
|       label: 'Restart and Install Update',
 | |
|       enabled: true,
 | |
|       visible: false,
 | |
|       key: 'restartToUpdate',
 | |
|       click: () => {
 | |
|         require('electron').autoUpdater.quitAndInstall()
 | |
|       }
 | |
|     }
 | |
|   ]
 | |
| 
 | |
|   items.splice.apply(items, [position, 0].concat(updateItems))
 | |
| }
 | |
| 
 | |
| function findReopenMenuItem () {
 | |
|   const menu = Menu.getApplicationMenu()
 | |
|   if (!menu) return
 | |
| 
 | |
|   let reopenMenuItem
 | |
|   menu.items.forEach(item => {
 | |
|     if (item.submenu) {
 | |
|       item.submenu.items.forEach(item => {
 | |
|         if (item.key === 'reopenMenuItem') {
 | |
|           reopenMenuItem = item
 | |
|         }
 | |
|       })
 | |
|     }
 | |
|   })
 | |
|   return reopenMenuItem
 | |
| }
 | |
| 
 | |
| if (process.platform === 'darwin') {
 | |
|   const name = app.getName()
 | |
|   template.unshift({
 | |
|     label: name,
 | |
|     submenu: [
 | |
|       {
 | |
|         label: `About ${name}`,
 | |
|         role: 'about'
 | |
|       },
 | |
|       {
 | |
|         type: 'separator'
 | |
|       },
 | |
|       {
 | |
|         label: 'Services',
 | |
|         role: 'services',
 | |
|         submenu: []
 | |
|       },
 | |
|       {
 | |
|         type: 'separator'
 | |
|       },
 | |
|       {
 | |
|         label: `Hide ${name}`,
 | |
|         accelerator: 'Command+H',
 | |
|         role: 'hide'
 | |
|       },
 | |
|       {
 | |
|         label: 'Hide Others',
 | |
|         accelerator: 'Command+Alt+H',
 | |
|         role: 'hideothers'
 | |
|       },
 | |
|       {
 | |
|         label: 'Show All',
 | |
|         role: 'unhide'
 | |
|       },
 | |
|       {
 | |
|         type: 'separator'
 | |
|       },
 | |
|       {
 | |
|         label: 'Quit',
 | |
|         accelerator: 'Command+Q',
 | |
|         click: () => {
 | |
|           app.quit()
 | |
|         }
 | |
|       }
 | |
|     ]
 | |
|   })
 | |
| 
 | |
|   // Window menu.
 | |
|   template[3].submenu.push(
 | |
|     {
 | |
|       type: 'separator'
 | |
|     },
 | |
|     {
 | |
|       label: 'Bring All to Front',
 | |
|       role: 'front'
 | |
|     }
 | |
|   )
 | |
| 
 | |
|   addUpdateMenuItems(template[0].submenu, 1)
 | |
| }
 | |
| 
 | |
| if (process.platform === 'win32') {
 | |
|   const helpMenu = template[template.length - 1].submenu
 | |
|   addUpdateMenuItems(helpMenu, 0)
 | |
| }
 | |
| // Keep a global reference of the window object, if you don't, the window will
 | |
| // be closed automatically when the JavaScript object is garbage collected.
 | |
| let mainWindow
 | |
| 
 | |
| function createWindow () {
 | |
|   // Create the browser window.
 | |
|   mainWindow = new BrowserWindow({
 | |
|     width: 800,
 | |
|     height: 600,
 | |
|     webPreferences: {
 | |
|       nodeIntegration: true
 | |
|     }
 | |
|   })
 | |
| 
 | |
|   // and load the index.html of the app.
 | |
|   mainWindow.loadFile('index.html')
 | |
| 
 | |
|   // Open the DevTools.
 | |
|   // mainWindow.webContents.openDevTools()
 | |
| 
 | |
|   // Emitted when the window is closed.
 | |
|   mainWindow.on('closed', function () {
 | |
|     // Dereference the window object, usually you would store windows
 | |
|     // in an array if your app supports multi windows, this is the time
 | |
|     // when you should delete the corresponding element.
 | |
|     mainWindow = null
 | |
|   })
 | |
| }
 | |
| 
 | |
| // This method will be called when Electron has finished
 | |
| // initialization and is ready to create browser windows.
 | |
| // Some APIs can only be used after this event occurs.
 | |
| app.whenReady().then(() => {
 | |
|   createWindow()
 | |
|   const menu = Menu.buildFromTemplate(template)
 | |
|   Menu.setApplicationMenu(menu)
 | |
| })
 | |
| 
 | |
| // Quit when all windows are closed.
 | |
| app.on('window-all-closed', function () {
 | |
|   // On macOS it is common for applications and their menu bar
 | |
|   // to stay active until the user quits explicitly with Cmd + Q
 | |
|   const reopenMenuItem = findReopenMenuItem()
 | |
|   if (reopenMenuItem) reopenMenuItem.enabled = true
 | |
| 
 | |
|   if (process.platform !== 'darwin') {
 | |
|     app.quit()
 | |
|   }
 | |
| })
 | |
| 
 | |
| app.on('activate', function () {
 | |
|   // On macOS it is common to re-create a window in the app when the
 | |
|   // dock icon is clicked and there are no other windows open.
 | |
|   if (mainWindow === null) {
 | |
|     createWindow()
 | |
|   }
 | |
| })
 | |
| 
 | |
| app.on('browser-window-created', (event, win) => {
 | |
|   const reopenMenuItem = findReopenMenuItem()
 | |
|   if (reopenMenuItem) reopenMenuItem.enabled = false
 | |
| 
 | |
|   win.webContents.on('context-menu', (e, params) => {
 | |
|     menu.popup(win, params.x, params.y)
 | |
|   })
 | |
| })
 | |
| 
 | |
| ipcMain.on('show-context-menu', event => {
 | |
|   const win = BrowserWindow.fromWebContents(event.sender)
 | |
|   menu.popup(win)
 | |
| })
 | |
| 
 | |
| // In this file you can include the rest of your app's specific main process
 | |
| // code. You can also put them in separate files and require them here.
 |