mirror of
https://github.com/wavetermdev/waveterm.git
synced 2025-02-12 01:01:50 +01:00
install special new handlers for Cmd+N and Cmd+T when no windows are open (#1839)
This commit is contained in:
parent
bba94a62d0
commit
038ba8e132
30
emain/emain-events.ts
Normal file
30
emain/emain-events.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// Copyright 2025, Command Line Inc.
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
import { EventEmitter } from "events";
|
||||||
|
|
||||||
|
interface GlobalEvents {
|
||||||
|
"windows-updated": () => void; // emitted whenever a window is opened/closed
|
||||||
|
}
|
||||||
|
|
||||||
|
class GlobalEventEmitter extends EventEmitter {
|
||||||
|
emit<K extends keyof GlobalEvents>(event: K, ...args: Parameters<GlobalEvents[K]>): boolean {
|
||||||
|
return super.emit(event, ...args);
|
||||||
|
}
|
||||||
|
|
||||||
|
on<K extends keyof GlobalEvents>(event: K, listener: GlobalEvents[K]): this {
|
||||||
|
return super.on(event, listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
once<K extends keyof GlobalEvents>(event: K, listener: GlobalEvents[K]): this {
|
||||||
|
return super.once(event, listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
off<K extends keyof GlobalEvents>(event: K, listener: GlobalEvents[K]): this {
|
||||||
|
return super.off(event, listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const globalEvents = new GlobalEventEmitter();
|
||||||
|
|
||||||
|
export { globalEvents };
|
@ -5,6 +5,7 @@ import { ClientService, ObjectService, WindowService, WorkspaceService } from "@
|
|||||||
import { RpcApi } from "@/app/store/wshclientapi";
|
import { RpcApi } from "@/app/store/wshclientapi";
|
||||||
import { fireAndForget } from "@/util/util";
|
import { fireAndForget } from "@/util/util";
|
||||||
import { BaseWindow, BaseWindowConstructorOptions, dialog, globalShortcut, ipcMain, screen } from "electron";
|
import { BaseWindow, BaseWindowConstructorOptions, dialog, globalShortcut, ipcMain, screen } from "electron";
|
||||||
|
import { globalEvents } from "emain/emain-events";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { debounce } from "throttle-debounce";
|
import { debounce } from "throttle-debounce";
|
||||||
import {
|
import {
|
||||||
@ -293,6 +294,7 @@ export class WaveBrowserWindow extends BaseWindow {
|
|||||||
console.log("win quitting or updating", this.waveWindowId);
|
console.log("win quitting or updating", this.waveWindowId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
setTimeout(() => globalEvents.emit("windows-updated"), 50);
|
||||||
waveWindowMap.delete(this.waveWindowId);
|
waveWindowMap.delete(this.waveWindowId);
|
||||||
if (focusedWaveWindow == this) {
|
if (focusedWaveWindow == this) {
|
||||||
focusedWaveWindow = null;
|
focusedWaveWindow = null;
|
||||||
@ -309,6 +311,7 @@ export class WaveBrowserWindow extends BaseWindow {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
waveWindowMap.set(waveWindow.oid, this);
|
waveWindowMap.set(waveWindow.oid, this);
|
||||||
|
setTimeout(() => globalEvents.emit("windows-updated"), 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
private removeAllChildViews() {
|
private removeAllChildViews() {
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
import { RpcApi } from "@/app/store/wshclientapi";
|
import { RpcApi } from "@/app/store/wshclientapi";
|
||||||
import * as electron from "electron";
|
import * as electron from "electron";
|
||||||
|
import { globalEvents } from "emain/emain-events";
|
||||||
import { FastAverageColor } from "fast-average-color";
|
import { FastAverageColor } from "fast-average-color";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import * as child_process from "node:child_process";
|
import * as child_process from "node:child_process";
|
||||||
@ -572,6 +573,17 @@ process.on("uncaughtException", (error) => {
|
|||||||
electronApp.quit();
|
electronApp.quit();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let lastWaveWindowCount = 0;
|
||||||
|
globalEvents.on("windows-updated", () => {
|
||||||
|
const wwCount = getAllWaveWindows().length;
|
||||||
|
if (wwCount == lastWaveWindowCount) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lastWaveWindowCount = wwCount;
|
||||||
|
console.log("windows-updated", wwCount);
|
||||||
|
makeAppMenu();
|
||||||
|
});
|
||||||
|
|
||||||
async function appMain() {
|
async function appMain() {
|
||||||
// Set disableHardwareAcceleration as early as possible, if required.
|
// Set disableHardwareAcceleration as early as possible, if required.
|
||||||
const launchSettings = getLaunchSettings();
|
const launchSettings = getLaunchSettings();
|
||||||
|
@ -10,6 +10,7 @@ import {
|
|||||||
createNewWaveWindow,
|
createNewWaveWindow,
|
||||||
createWorkspace,
|
createWorkspace,
|
||||||
focusedWaveWindow,
|
focusedWaveWindow,
|
||||||
|
getAllWaveWindows,
|
||||||
getWaveWindowByWorkspaceId,
|
getWaveWindowByWorkspaceId,
|
||||||
relaunchBrowserWindows,
|
relaunchBrowserWindows,
|
||||||
WaveBrowserWindow,
|
WaveBrowserWindow,
|
||||||
@ -67,7 +68,11 @@ async function getWorkspaceMenu(ww?: WaveBrowserWindow): Promise<Electron.MenuIt
|
|||||||
return workspaceMenu;
|
return workspaceMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getAppMenu(callbacks: AppMenuCallbacks, workspaceId?: string): Promise<Electron.Menu> {
|
async function getAppMenu(
|
||||||
|
numWaveWindows: number,
|
||||||
|
callbacks: AppMenuCallbacks,
|
||||||
|
workspaceId?: string
|
||||||
|
): Promise<Electron.Menu> {
|
||||||
const ww = workspaceId && getWaveWindowByWorkspaceId(workspaceId);
|
const ww = workspaceId && getWaveWindowByWorkspaceId(workspaceId);
|
||||||
const fileMenu: Electron.MenuItemConstructorOptions[] = [
|
const fileMenu: Electron.MenuItemConstructorOptions[] = [
|
||||||
{
|
{
|
||||||
@ -83,6 +88,22 @@ async function getAppMenu(callbacks: AppMenuCallbacks, workspaceId?: string): Pr
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
if (numWaveWindows == 0) {
|
||||||
|
fileMenu.push({
|
||||||
|
label: "New Window (hidden-1)",
|
||||||
|
accelerator: unamePlatform === "darwin" ? "Command+N" : "Alt+N",
|
||||||
|
acceleratorWorksWhenHidden: true,
|
||||||
|
visible: false,
|
||||||
|
click: () => fireAndForget(callbacks.createNewWaveWindow),
|
||||||
|
});
|
||||||
|
fileMenu.push({
|
||||||
|
label: "New Window (hidden-2)",
|
||||||
|
accelerator: unamePlatform === "darwin" ? "Command+T" : "Alt+T",
|
||||||
|
acceleratorWorksWhenHidden: true,
|
||||||
|
visible: false,
|
||||||
|
click: () => fireAndForget(callbacks.createNewWaveWindow),
|
||||||
|
});
|
||||||
|
}
|
||||||
const appMenu: Electron.MenuItemConstructorOptions[] = [
|
const appMenu: Electron.MenuItemConstructorOptions[] = [
|
||||||
{
|
{
|
||||||
label: "About Wave Terminal",
|
label: "About Wave Terminal",
|
||||||
@ -299,8 +320,9 @@ async function getAppMenu(callbacks: AppMenuCallbacks, workspaceId?: string): Pr
|
|||||||
return electron.Menu.buildFromTemplate(menuTemplate);
|
return electron.Menu.buildFromTemplate(menuTemplate);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function instantiateAppMenu(workspaceId?: string): Promise<electron.Menu> {
|
export function instantiateAppMenu(numWindows: number, workspaceId?: string): Promise<electron.Menu> {
|
||||||
return getAppMenu(
|
return getAppMenu(
|
||||||
|
numWindows,
|
||||||
{
|
{
|
||||||
createNewWaveWindow,
|
createNewWaveWindow,
|
||||||
relaunchBrowserWindows,
|
relaunchBrowserWindows,
|
||||||
@ -311,7 +333,8 @@ export function instantiateAppMenu(workspaceId?: string): Promise<electron.Menu>
|
|||||||
|
|
||||||
export function makeAppMenu() {
|
export function makeAppMenu() {
|
||||||
fireAndForget(async () => {
|
fireAndForget(async () => {
|
||||||
const menu = await instantiateAppMenu();
|
const wwCount = getAllWaveWindows().length;
|
||||||
|
const menu = await instantiateAppMenu(wwCount);
|
||||||
electron.Menu.setApplicationMenu(menu);
|
electron.Menu.setApplicationMenu(menu);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -351,10 +374,11 @@ electron.ipcMain.on("contextmenu-show", (event, workspaceId: string, menuDefArr?
|
|||||||
if (menuDefArr?.length === 0) {
|
if (menuDefArr?.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const wwCount = getAllWaveWindows().length;
|
||||||
fireAndForget(async () => {
|
fireAndForget(async () => {
|
||||||
const menu = menuDefArr
|
const menu = menuDefArr
|
||||||
? convertMenuDefArrToMenu(workspaceId, menuDefArr)
|
? convertMenuDefArrToMenu(workspaceId, menuDefArr)
|
||||||
: await instantiateAppMenu(workspaceId);
|
: await instantiateAppMenu(wwCount, workspaceId);
|
||||||
menu.popup();
|
menu.popup();
|
||||||
});
|
});
|
||||||
event.returnValue = true;
|
event.returnValue = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user