@@ -10,6 +10,7 @@ import {
1010 createNewWaveWindow ,
1111 createWorkspace ,
1212 focusedWaveWindow ,
13+ getWaveWindowByWorkspaceId ,
1314 relaunchBrowserWindows ,
1415 WaveBrowserWindow ,
1516} from "./emain-window" ;
@@ -36,15 +37,14 @@ function getWindowWebContents(window: electron.BaseWindow): electron.WebContents
3637 return null ;
3738}
3839
39- async function getWorkspaceMenu ( ) : Promise < Electron . MenuItemConstructorOptions [ ] > {
40+ async function getWorkspaceMenu ( ww ?: WaveBrowserWindow ) : Promise < Electron . MenuItemConstructorOptions [ ] > {
4041 const workspaceList = await RpcApi . WorkspaceListCommand ( ElectronWshClient ) ;
4142 console . log ( "workspaceList:" , workspaceList ) ;
4243 const workspaceMenu : Electron . MenuItemConstructorOptions [ ] = [
4344 {
4445 label : "Create New Workspace" ,
4546 click : ( _ , window ) => {
46- const ww = window as WaveBrowserWindow ;
47- fireAndForget ( ( ) => createWorkspace ( ww ) ) ;
47+ fireAndForget ( ( ) => createWorkspace ( ( window as WaveBrowserWindow ) ?? ww ) ) ;
4848 } ,
4949 } ,
5050 ] ;
@@ -65,8 +65,7 @@ async function getWorkspaceMenu(): Promise<Electron.MenuItemConstructorOptions[]
6565 return {
6666 label : `Switch to ${ workspace . workspacedata . name } (${ workspace . workspacedata . oid . slice ( 0 , 5 ) } )` ,
6767 click : ( _ , window ) => {
68- const ww = window as WaveBrowserWindow ;
69- ww . switchWorkspace ( workspace . workspacedata . oid ) ;
68+ ( ( window as WaveBrowserWindow ) ?? ww ) ?. switchWorkspace ( workspace . workspacedata . oid ) ;
7069 } ,
7170 accelerator : getWorkspaceSwitchAccelerator ( i ) ,
7271 } ;
@@ -75,7 +74,8 @@ async function getWorkspaceMenu(): Promise<Electron.MenuItemConstructorOptions[]
7574 return workspaceMenu ;
7675}
7776
78- async function getAppMenu ( callbacks : AppMenuCallbacks ) : Promise < Electron . Menu > {
77+ async function getAppMenu ( callbacks : AppMenuCallbacks , workspaceId ?: string ) : Promise < Electron . Menu > {
78+ const ww = workspaceId && getWaveWindowByWorkspaceId ( workspaceId ) ;
7979 const fileMenu : Electron . MenuItemConstructorOptions [ ] = [
8080 {
8181 label : "New Window" ,
@@ -94,7 +94,7 @@ async function getAppMenu(callbacks: AppMenuCallbacks): Promise<Electron.Menu> {
9494 {
9595 label : "About Wave Terminal" ,
9696 click : ( _ , window ) => {
97- getWindowWebContents ( window ) ?. send ( "menu-item-about" ) ;
97+ getWindowWebContents ( window ?? ww ) ?. send ( "menu-item-about" ) ;
9898 } ,
9999 } ,
100100 {
@@ -172,7 +172,7 @@ async function getAppMenu(callbacks: AppMenuCallbacks): Promise<Electron.Menu> {
172172 label : "Reload Tab" ,
173173 accelerator : "Shift+CommandOrControl+R" ,
174174 click : ( _ , window ) => {
175- getWindowWebContents ( window ) ?. reloadIgnoringCache ( ) ;
175+ getWindowWebContents ( window ?? ww ) ?. reloadIgnoringCache ( ) ;
176176 } ,
177177 } ,
178178 {
@@ -191,7 +191,7 @@ async function getAppMenu(callbacks: AppMenuCallbacks): Promise<Electron.Menu> {
191191 label : "Toggle DevTools" ,
192192 accelerator : devToolsAccel ,
193193 click : ( _ , window ) => {
194- let wc = getWindowWebContents ( window ) ;
194+ let wc = getWindowWebContents ( window ?? ww ) ;
195195 wc ?. toggleDevTools ( ) ;
196196 } ,
197197 } ,
@@ -202,14 +202,14 @@ async function getAppMenu(callbacks: AppMenuCallbacks): Promise<Electron.Menu> {
202202 label : "Reset Zoom" ,
203203 accelerator : "CommandOrControl+0" ,
204204 click : ( _ , window ) => {
205- getWindowWebContents ( window ) ?. setZoomFactor ( 1 ) ;
205+ getWindowWebContents ( window ?? ww ) ?. setZoomFactor ( 1 ) ;
206206 } ,
207207 } ,
208208 {
209209 label : "Zoom In" ,
210210 accelerator : "CommandOrControl+=" ,
211211 click : ( _ , window ) => {
212- const wc = getWindowWebContents ( window ) ;
212+ const wc = getWindowWebContents ( window ?? ww ) ;
213213 if ( wc == null ) {
214214 return ;
215215 }
@@ -223,7 +223,7 @@ async function getAppMenu(callbacks: AppMenuCallbacks): Promise<Electron.Menu> {
223223 label : "Zoom In (hidden)" ,
224224 accelerator : "CommandOrControl+Shift+=" ,
225225 click : ( _ , window ) => {
226- const wc = getWindowWebContents ( window ) ;
226+ const wc = getWindowWebContents ( window ?? ww ) ;
227227 if ( wc == null ) {
228228 return ;
229229 }
@@ -239,7 +239,7 @@ async function getAppMenu(callbacks: AppMenuCallbacks): Promise<Electron.Menu> {
239239 label : "Zoom Out" ,
240240 accelerator : "CommandOrControl+-" ,
241241 click : ( _ , window ) => {
242- const wc = getWindowWebContents ( window ) ;
242+ const wc = getWindowWebContents ( window ?? ww ) ;
243243 if ( wc == null ) {
244244 return ;
245245 }
@@ -253,7 +253,7 @@ async function getAppMenu(callbacks: AppMenuCallbacks): Promise<Electron.Menu> {
253253 label : "Zoom Out (hidden)" ,
254254 accelerator : "CommandOrControl+Shift+-" ,
255255 click : ( _ , window ) => {
256- const wc = getWindowWebContents ( window ) ;
256+ const wc = getWindowWebContents ( window ?? ww ) ;
257257 if ( wc == null ) {
258258 return ;
259259 }
@@ -313,11 +313,14 @@ async function getAppMenu(callbacks: AppMenuCallbacks): Promise<Electron.Menu> {
313313 return electron . Menu . buildFromTemplate ( menuTemplate ) ;
314314}
315315
316- export function instantiateAppMenu ( ) : Promise < electron . Menu > {
317- return getAppMenu ( {
318- createNewWaveWindow,
319- relaunchBrowserWindows,
320- } ) ;
316+ export function instantiateAppMenu ( workspaceId ?: string ) : Promise < electron . Menu > {
317+ return getAppMenu (
318+ {
319+ createNewWaveWindow,
320+ relaunchBrowserWindows,
321+ } ,
322+ workspaceId
323+ ) ;
321324}
322325
323326export function makeAppMenu ( ) {
@@ -332,4 +335,43 @@ waveEventSubscribe({
332335 handler : makeAppMenu ,
333336} ) ;
334337
338+ function convertMenuDefArrToMenu ( workspaceId : string , menuDefArr : ElectronContextMenuItem [ ] ) : electron . Menu {
339+ const menuItems : electron . MenuItem [ ] = [ ] ;
340+ for ( const menuDef of menuDefArr ) {
341+ const menuItemTemplate : electron . MenuItemConstructorOptions = {
342+ role : menuDef . role as any ,
343+ label : menuDef . label ,
344+ type : menuDef . type ,
345+ click : ( _ , window ) => {
346+ const ww = ( window as WaveBrowserWindow ) ?? getWaveWindowByWorkspaceId ( workspaceId ) ;
347+ if ( ! ww ) {
348+ console . error ( "invalid window for context menu click handler:" , ww , window , workspaceId ) ;
349+ return ;
350+ }
351+ ww ?. activeTabView ?. webContents ?. send ( "contextmenu-click" , menuDef . id ) ;
352+ } ,
353+ checked : menuDef . checked ,
354+ } ;
355+ if ( menuDef . submenu != null ) {
356+ menuItemTemplate . submenu = convertMenuDefArrToMenu ( workspaceId , menuDef . submenu ) ;
357+ }
358+ const menuItem = new electron . MenuItem ( menuItemTemplate ) ;
359+ menuItems . push ( menuItem ) ;
360+ }
361+ return electron . Menu . buildFromTemplate ( menuItems ) ;
362+ }
363+
364+ electron . ipcMain . on ( "contextmenu-show" , ( event , workspaceId : string , menuDefArr ?: ElectronContextMenuItem [ ] ) => {
365+ if ( menuDefArr ?. length === 0 ) {
366+ return ;
367+ }
368+ fireAndForget ( async ( ) => {
369+ const menu = menuDefArr
370+ ? convertMenuDefArrToMenu ( workspaceId , menuDefArr )
371+ : await instantiateAppMenu ( workspaceId ) ;
372+ menu . popup ( ) ;
373+ } ) ;
374+ event . returnValue = true ;
375+ } ) ;
376+
335377export { getAppMenu } ;
0 commit comments