|
@@ -1,4 +1,4 @@
|
|
-import { app, shell, BrowserWindow, protocol, net } from 'electron';
|
|
|
|
|
|
+import { app, shell, BrowserWindow, protocol, net, ipcMain } from 'electron';
|
|
import { join, resolve } from 'path';
|
|
import { join, resolve } from 'path';
|
|
import url from 'url';
|
|
import url from 'url';
|
|
import { electronApp, optimizer, is } from '@electron-toolkit/utils';
|
|
import { electronApp, optimizer, is } from '@electron-toolkit/utils';
|
|
@@ -7,98 +7,122 @@ import useElectron from './useElectron';
|
|
import useWinProcess from './useWinProcess';
|
|
import useWinProcess from './useWinProcess';
|
|
import log from './logger';
|
|
import log from './logger';
|
|
|
|
|
|
-// 免登录流程
|
|
|
|
-function silenceAuthorityHandle(mainWindow: BrowserWindow) {
|
|
|
|
- const arg = process.argv;
|
|
|
|
- log.info(`process.argv:${JSON.stringify(arg)}`);
|
|
|
|
- if (!arg[1].startsWith('trd://')) return;
|
|
|
|
- mainWindow.webContents.send('silence-authority', arg[1]);
|
|
|
|
- // mainWindow.webContents.send(
|
|
|
|
- // 'silence-authority',
|
|
|
|
- // 'zgiOtrHS2nq9q3SOr0iOYAW1JJsG2w1lrqdv0PB2IrT9ijPBsKxT7I7u2077RaKAPbwfEj+9f/zr+RHzOZFsaYZo5GuoJLMdJPKvvOnpG/3jk6GsdPFlMooCjs5LzJKutFiFOj/xsXoOGdxqIYXWWH6sROZQAKhvBIu2Mfem6+fZhy66baK/s0ihec59gOTQ8lsjyJzf8To2K0EyapRWGVpFwljAmaQ1HfhfUUoRIYTIHW89wqRU3KYjB5oJQRQnVYLA7v0H9kK0smmX3N3Kbc0V9LtHUIiU/teGvWaa6ty43SAJqci9IRZEh35xzM9IjtzvR/9LHQWZqTLuVSZ+JmCwfKKGFV39ewYjrjmFk34tIW5yvmQ9oUugpi2T3xhdMA7aeNkkoK0tgm3hwqri3KdziGcqdEdkqhfW2vapwPDy4m5g/JH7ulNLI0nfDmPpTNsWgWXjUnmAQNWAp4In1oH8TMRNHImMbsxz4RhcBz/z/YCWl89zk/vA4TOtQDV99s66+8kVhTQEjDXffz6z2T5hZTGaPMv/lSCo1Fo01VM='
|
|
|
|
- // );
|
|
|
|
-}
|
|
|
|
|
|
+const ULR_SCHEME_PROTOCOL = 'trd://';
|
|
|
|
+let mainWindow: BrowserWindow | null = null;
|
|
|
|
|
|
-function createWindow(): void {
|
|
|
|
- // Create the browser window.
|
|
|
|
- const mainWindow = new BrowserWindow({
|
|
|
|
- width: is.dev ? 1428 : 1024,
|
|
|
|
- height: 700,
|
|
|
|
- minWidth: 1024,
|
|
|
|
- minHeight: 600,
|
|
|
|
- show: false,
|
|
|
|
- ...(process.platform === 'linux' ? { icon } : {}),
|
|
|
|
- webPreferences: {
|
|
|
|
- preload: join(__dirname, '../preload/index.js'),
|
|
|
|
- sandbox: false,
|
|
|
|
- webSecurity: false,
|
|
|
|
- },
|
|
|
|
- });
|
|
|
|
|
|
+function main() {
|
|
|
|
+ const gotTheLock = app.requestSingleInstanceLock();
|
|
|
|
+ log.info(`gotTheLock:${gotTheLock}`);
|
|
|
|
+ if (!gotTheLock) {
|
|
|
|
+ app.quit();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
|
|
- mainWindow.on('ready-to-show', () => {
|
|
|
|
- mainWindow.show();
|
|
|
|
- silenceAuthorityHandle(mainWindow);
|
|
|
|
- });
|
|
|
|
|
|
+ function createWindow(): void {
|
|
|
|
+ // Create the browser window.
|
|
|
|
+ mainWindow = new BrowserWindow({
|
|
|
|
+ width: is.dev ? 1428 : 1024,
|
|
|
|
+ height: 700,
|
|
|
|
+ minWidth: 1024,
|
|
|
|
+ minHeight: 600,
|
|
|
|
+ show: false,
|
|
|
|
+ ...(process.platform === 'linux' ? { icon } : {}),
|
|
|
|
+ webPreferences: {
|
|
|
|
+ preload: join(__dirname, '../preload/index.js'),
|
|
|
|
+ sandbox: false,
|
|
|
|
+ webSecurity: false,
|
|
|
|
+ },
|
|
|
|
+ });
|
|
|
|
+ if (!mainWindow) return;
|
|
|
|
|
|
- mainWindow.webContents.setWindowOpenHandler((details) => {
|
|
|
|
- shell.openExternal(details.url);
|
|
|
|
- return { action: 'deny' };
|
|
|
|
- });
|
|
|
|
|
|
+ mainWindow.on('ready-to-show', () => {
|
|
|
|
+ mainWindow?.show();
|
|
|
|
+ });
|
|
|
|
|
|
- // HMR for renderer base on electron-vite cli.
|
|
|
|
- // Load the remote URL for development or the local html file for production.
|
|
|
|
- if (is.dev && process.env.ELECTRON_RENDERER_URL) {
|
|
|
|
- mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL);
|
|
|
|
- mainWindow.webContents.openDevTools();
|
|
|
|
- } else {
|
|
|
|
- mainWindow.loadFile(join(__dirname, '../renderer/index.html'));
|
|
|
|
|
|
+ mainWindow.webContents.setWindowOpenHandler((details) => {
|
|
|
|
+ shell.openExternal(details.url);
|
|
|
|
+ return { action: 'deny' };
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // HMR for renderer base on electron-vite cli.
|
|
|
|
+ // Load the remote URL for development or the local html file for production.
|
|
|
|
+ if (is.dev && process.env.ELECTRON_RENDERER_URL) {
|
|
|
|
+ mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL);
|
|
|
|
+ mainWindow.webContents.openDevTools();
|
|
|
|
+ } else {
|
|
|
|
+ mainWindow.loadFile(join(__dirname, '../renderer/index.html'));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
-}
|
|
|
|
|
|
|
|
-// 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(() => {
|
|
|
|
- // Set app user model id for windows
|
|
|
|
- electronApp.setAppUserModelId('com.electron');
|
|
|
|
-
|
|
|
|
- // Default open or close DevTools by F12 in development
|
|
|
|
- // and ignore CommandOrControl + R in production.
|
|
|
|
- // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
|
|
|
|
- app.on('browser-window-created', (_, window) => {
|
|
|
|
- optimizer.watchWindowShortcuts(window);
|
|
|
|
- });
|
|
|
|
|
|
+ // 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(() => {
|
|
|
|
+ // Set app user model id for windows
|
|
|
|
+ electronApp.setAppUserModelId('com.electron');
|
|
|
|
+
|
|
|
|
+ // Default open or close DevTools by F12 in development
|
|
|
|
+ // and ignore CommandOrControl + R in production.
|
|
|
|
+ // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
|
|
|
|
+ app.on('browser-window-created', (_, window) => {
|
|
|
|
+ optimizer.watchWindowShortcuts(window);
|
|
|
|
+ });
|
|
|
|
|
|
- // use electron
|
|
|
|
- useElectron();
|
|
|
|
- // use multiple window porcess
|
|
|
|
- useWinProcess();
|
|
|
|
|
|
+ // use electron
|
|
|
|
+ useElectron();
|
|
|
|
+ // use multiple window porcess
|
|
|
|
+ useWinProcess();
|
|
|
|
+ // 渲染进程加载好之后,会发起check-silence-authority
|
|
|
|
+ ipcMain.handleOnce('check-silence-authority', () => {
|
|
|
|
+ const argv = process.argv;
|
|
|
|
+ log.info(`check-silence-authority process.argv:${JSON.stringify(argv)}`);
|
|
|
|
+ const urlScheme = argv.find((arg) => arg.startsWith(ULR_SCHEME_PROTOCOL));
|
|
|
|
+ return urlScheme || '';
|
|
|
|
+ });
|
|
|
|
|
|
- createWindow();
|
|
|
|
|
|
+ createWindow();
|
|
|
|
|
|
- // protocol
|
|
|
|
- protocol.handle('local', (request) => {
|
|
|
|
- const filePath = request.url.slice('local://'.length);
|
|
|
|
- return net.fetch(
|
|
|
|
- url.pathToFileURL(resolve(__dirname, filePath)).toString()
|
|
|
|
- );
|
|
|
|
|
|
+ // protocol
|
|
|
|
+ protocol.handle('local', (request) => {
|
|
|
|
+ const filePath = request.url.slice('local://'.length);
|
|
|
|
+ return net.fetch(
|
|
|
|
+ url.pathToFileURL(resolve(__dirname, filePath)).toString()
|
|
|
|
+ );
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ app.on('activate', () => {
|
|
|
|
+ // On macOS it's common to re-create a window in the app when the
|
|
|
|
+ // dock icon is clicked and there are no other windows open.
|
|
|
|
+ if (BrowserWindow.getAllWindows().length === 0) createWindow();
|
|
|
|
+ });
|
|
});
|
|
});
|
|
|
|
|
|
- app.on('activate', () => {
|
|
|
|
- // On macOS it's common to re-create a window in the app when the
|
|
|
|
- // dock icon is clicked and there are no other windows open.
|
|
|
|
- if (BrowserWindow.getAllWindows().length === 0) createWindow();
|
|
|
|
|
|
+ // Quit when all windows are closed, except on macOS. There, it's common
|
|
|
|
+ // for applications and their menu bar to stay active until the user quits
|
|
|
|
+ // explicitly with Cmd + Q.
|
|
|
|
+ app.on('window-all-closed', () => {
|
|
|
|
+ if (process.platform !== 'darwin') {
|
|
|
|
+ app.quit();
|
|
|
|
+ }
|
|
});
|
|
});
|
|
-});
|
|
|
|
|
|
|
|
-// Quit when all windows are closed, except on macOS. There, it's common
|
|
|
|
-// for applications and their menu bar to stay active until the user quits
|
|
|
|
-// explicitly with Cmd + Q.
|
|
|
|
-app.on('window-all-closed', () => {
|
|
|
|
- if (process.platform !== 'darwin') {
|
|
|
|
- app.quit();
|
|
|
|
|
|
+ // 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.
|
|
|
|
+
|
|
|
|
+ // simple instance
|
|
|
|
+ app.on('second-instance', (event, argv) => {
|
|
|
|
+ silenceAuthorityHandle(argv);
|
|
|
|
+ mainWindow?.show();
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 免登录流程
|
|
|
|
+ function silenceAuthorityHandle(argv: string[]) {
|
|
|
|
+ log.info(`second-instance process.argv:${JSON.stringify(argv)}`);
|
|
|
|
+ const urlScheme = argv.find((arg) => arg.startsWith(ULR_SCHEME_PROTOCOL));
|
|
|
|
+ if (urlScheme && mainWindow) {
|
|
|
|
+ mainWindow.webContents.send('silence-authority', urlScheme);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
-});
|
|
|
|
|
|
+}
|
|
|
|
|
|
-// 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.
|
|
|
|
|
|
+main();
|