1- const { Menu, app, dialog, shell, protocol, BrowserWindow, ipcMain } = require ( "electron" )
1+ const {
2+ Menu,
3+ app,
4+ dialog,
5+ shell,
6+ protocol,
7+ BrowserWindow,
8+ Tray,
9+ ipcMain } = require ( "electron" )
210const path = require ( "path" )
311const defaultMenu = require ( "electron-default-menu" )
412const windowStateKeeper = require ( "electron-window-state" )
@@ -7,6 +15,7 @@ const queryString = require("query-string")
715
816let windows = new Set ( )
917let sbot = null
18+ let tray = null
1019
1120const createWindow = ( data = false , windowState = false ) => {
1221 let win
@@ -18,6 +27,7 @@ const createWindow = (data = false, windowState = false) => {
1827 win = new BrowserWindow ( {
1928 width : 800 ,
2029 height : 800 ,
30+ show : false ,
2131 webPreferences : {
2232 nodeIntegration : true ,
2333 contextIsolation : false ,
@@ -27,6 +37,7 @@ const createWindow = (data = false, windowState = false) => {
2737 win = new BrowserWindow ( {
2838 x : windowState . x ,
2939 y : windowState . y ,
40+ show : false ,
3041 width : windowState . width ,
3142 height : windowState . height ,
3243 webPreferences : {
@@ -49,6 +60,10 @@ const createWindow = (data = false, windowState = false) => {
4960 win . webContents . send ( "window:focus" )
5061 } )
5162
63+ win . once ( "ready-to-show" , ( ) => {
64+ win . show ( )
65+ } )
66+
5267 win . webContents . on ( "will-navigate" , ( event , url ) => {
5368 console . log ( "event" , event )
5469 console . log ( "url" , url )
@@ -152,6 +167,9 @@ ipcMain.on("menu:set", (event, group) => {
152167 createWindow ( )
153168 } ,
154169 } ,
170+ {
171+ role : "shareMenu"
172+ }
155173 ] ,
156174 }
157175
@@ -180,11 +198,95 @@ ipcMain.on("menu:set", (event, group) => {
180198 Menu . setApplicationMenu ( finalMenu )
181199} )
182200
201+ ipcMain . on ( "tray:set" , ( event , group ) => {
202+ // console.log("received menu", JSON.stringify(group, null, 2))
203+ let menu = [ ]
204+ let keys = Object . keys ( group )
205+
206+ // console.log(JSON.stringify(menu,null,2))
207+
208+ const makeSubmenu = subgroup => {
209+ let toPush = [ ]
210+ subgroup . forEach ( m => {
211+ m . items . forEach ( i => {
212+ let m = {
213+ label : i . label ,
214+ click : ( item , win ) => {
215+ win . webContents . send ( "menu:trigger" , {
216+ event : i . event ,
217+ data : i . data ,
218+ } )
219+ } ,
220+ }
221+
222+ if ( i ?. shortcut ) {
223+ m . accelerator = i . shortcut
224+ }
225+
226+ toPush . push ( m )
227+ } )
228+ toPush . push ( { type : "separator" } )
229+ } )
230+ toPush . pop ( )
231+ return toPush
232+ }
233+
234+ keys . forEach ( k => {
235+ let m = {
236+ label : k ,
237+ submenu : makeSubmenu ( group [ k ] ) ,
238+ }
239+
240+ if ( k . toLowerCase ( ) == "help" ) {
241+ m . role = "help"
242+ }
243+
244+ menu . push ( m )
245+ } )
246+
247+ // FIXME: menu has wrong order for toplevel items.
248+ let topItems = [
249+ {
250+ label : "New Window" ,
251+ accelerator : "CmdOrCtrl+Shift+N" ,
252+ click : ( ) => {
253+ createWindow ( )
254+ } ,
255+ }
256+ ]
257+
258+ let bottomItems = [
259+ {
260+ type : "separator"
261+ } ,
262+ {
263+ label : "Quit" ,
264+ click ( ) { app . quit ( ) }
265+ }
266+ ]
267+
268+ let finalMenu = Menu . buildFromTemplate ( [ ...topItems , ...menu , ...bottomItems ] )
269+
270+ tray . setContextMenu ( finalMenu )
271+ } )
272+
183273// This method will be called when Electron has finished
184274// initialization and is ready to create browser windows.
185275// Some APIs can only be used after this event occurs.
186276app . on ( "ready" , ( ) => {
187277 console . log ( "Attempting to start server..." )
278+
279+ tray = new Tray ( `${ __dirname } /ui/assets/images/patchfox_pixel_16.png` )
280+ tray . setToolTip ( "Patchfox" )
281+
282+ const initialMenu = Menu . buildFromTemplate ( [
283+ {
284+ label : "Quit" ,
285+ click ( ) { app . quit ( ) }
286+ }
287+ ] )
288+ tray . setContextMenu ( initialMenu )
289+
188290 startDefaultPatchfoxServer ( ( err , ssb ) => {
189291 console . log ( "Server started!" , ssb . id )
190292 sbot = ssb
0 commit comments