StarRailCopilot/webapp/packages/main/src/index.ts
2023-09-11 18:52:48 +08:00

140 lines
4.3 KiB
TypeScript

import {app, BrowserWindow} from 'electron';
import './security-restrictions';
import {createApp} from '/@/createApp';
import logger from '/@/logger';
import {dpiScaling} from '/@/config';
/**
* Prevent electron from running multiple instances.
*/
const isSingleInstance = app.requestSingleInstanceLock();
logger.info(`isSingleInstance:${isSingleInstance}`);
if (!isSingleInstance) {
app.quit();
} else {
app.on('second-instance', async () => {
logger.info('second-instance');
const [curWindow] = BrowserWindow.getAllWindows();
if (!curWindow) {
logger.info('------createApp------');
await createApp();
} else {
logger.info('------curWindow.restore------');
if (curWindow.isMinimized?.()) curWindow.restore?.();
logger.info('------curWindow.show------');
if (!curWindow.isVisible?.()) curWindow.show?.();
logger.info('------curWindow.focus------');
curWindow.focus?.();
}
});
}
/**
* Disable Hardware Acceleration to save more system resources.
* Also `in-process-gpu` to avoid creating a gpu process which may `exited unexpectedly`
* See https://github.com/electron/electron/issues/30966
*/
app.disableHardwareAcceleration();
app.commandLine.appendSwitch('disable-gpu');
app.commandLine.appendSwitch('disable-software-rasterizer');
app.commandLine.appendSwitch('disable-gpu-compositing');
app.commandLine.appendSwitch('disable-gpu-rasterization');
app.commandLine.appendSwitch('disable-gpu-sandbox');
app.commandLine.appendSwitch('in-process-gpu');
app.commandLine.appendSwitch('no-sandbox');
// No DPI scaling
if (!dpiScaling) {
app.commandLine.appendSwitch('high-dpi-support', '1');
app.commandLine.appendSwitch('force-device-scale-factor', '1');
}
/**
*Set App Error Log Path
*/
// app.setAppLogsPath(join(app.getAppPath(), '/AlasAppError'));
/**
* Shout down background process if all windows was closed
*/
app.on('window-all-closed', () => {
app.quit();
});
/**
* @see https://www.electronjs.org/docs/latest/api/app#event-activate-macos Event: 'activate'.
*/
// app.on('activate', createWindow);
/**
* Create the application window when the background process is ready.
*/
// app
// .whenReady()
// .then(createWindow)
// .then(loadURL)
// .catch(e => console.error('Failed create window:', e));
/**
* Install Vue.js or any other extension in development mode only.
* Note: You must install `electron-devtools-installer` manually
*/
// if (import.meta.env.DEV) {
// app
// .whenReady()
// .then(() => import('electron-devtools-installer'))
// .then(module => {
// const {default: installExtension, VUEJS3_DEVTOOLS} =
// // @ts-expect-error Hotfix for https://github.com/cawa-93/vite-electron-builder/issues/915
// typeof module.default === 'function' ? module : (module.default as typeof module);
//
// return installExtension(VUEJS3_DEVTOOLS, {
// loadExtensionOptions: {
// allowFileAccess: true,
// },
// });
// })
// .catch(e => console.error('Failed install extension:', e));
// }
/**
* Check for app updates, install it in background and notify user that new version was installed.
* No reason run this in non-production build.
* @see https://www.electron.build/auto-update.html#quick-setup-guide
*
* Note: It may throw "ENOENT: no such file app-update.yml"
* if you compile production app without publishing it to distribution server.
* Like `npm run compile` does. It's ok 😅
*/
// if (import.meta.env.PROD) {
// app
// .whenReady()
// .then(() => import('electron-updater'))
// .then(module => {
// const autoUpdater =
// module.autoUpdater ||
// // @ts-expect-error Hotfix for https://github.com/electron-userland/electron-builder/issues/7338
// (module.default.autoUpdater as (typeof module)['autoUpdater']);
// return autoUpdater.checkForUpdatesAndNotify();
// })
// .catch(e => console.error('Failed check and install updates:', e));
// }
app
.whenReady()
.then(createApp)
.catch(e => {
logger.error('Failed create window:' + e);
});
app.on('activate', async () => {
logger.info('------app activate------');
const [curWindow] = BrowserWindow.getAllWindows();
if (!curWindow) {
logger.info('------createApp------');
await createApp();
} else {
logger.info('------curWindow.focus------');
curWindow.focus();
}
});