DawnLauncher/electron/main/index.ts

173 lines
4.9 KiB
TypeScript

import { app, BrowserWindow, dialog } from "electron";
import { join, dirname, basename } from "node:path";
import indexIpcEvent from "./main/ipcEvent";
import classificationIpcEvent from "./classification/ipcEvent";
import { init as classificationDataInit } from "./classification/data";
import { init as itemDataInit } from "./item/data";
import { initSystemItem } from "./item/commons/data";
import commonIpcEvent from "./commons/ipcEvent";
import itemIpcEvent from "./item/ipcEvent";
import settingIpcEvent from "./setting/ipcEvent";
import { init as settingDataInit } from "./setting/data";
import { setShortcutKey } from "./setting";
import searchIpcEvent from "./search/ipcEvent";
import { createMainWindow } from "./main";
import { closeAllChildProcess } from "./commons";
import { createQuickSearchWindow } from "./search";
import { getLanguage } from "../../commons/data/languages";
import aboutIpcEvent from "./about/ipcEvent";
import dataIpcEvent from "./data/ipcEvent";
// 数据存储目录
if (
process.env.NODE_ENV !== "development" &&
import.meta.env.VITE_INSTALL === "false"
) {
app.setPath("appData", join(dirname(process.execPath), "data"));
app.setPath("userData", join(dirname(process.execPath), "data"));
app.setPath("sessionData", join(dirname(process.execPath), "data"));
}
process.env.DIST_ELECTRON = join(__dirname, "..");
process.env.DIST = join(process.env.DIST_ELECTRON, "../dist");
process.env.VITE_PUBLIC = process.env.VITE_DEV_SERVER_URL
? join(process.env.DIST_ELECTRON, "../public")
: process.env.DIST;
// 解决透明窗口闪烁
app.commandLine.appendSwitch("wm-window-animations-disabled");
// 解决创建窗口屏幕闪烁问题
app.disableHardwareAcceleration();
// Set application name for Windows 10+ notifications
if (process.platform === "win32") app.setAppUserModelId(app.getName());
if (!app.requestSingleInstanceLock()) {
app.quit();
process.exit(0);
}
// Remove electron security warnings
// This warning only shows in development mode
// Read more on https://www.electronjs.org/docs/latest/tutorial/security
// process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'
app.whenReady().then(() => {
try {
// 禁止多开
const instanceLock = app.requestSingleInstanceLock();
if (!instanceLock) {
app.quit();
return;
}
// addon
global.addon = require("../../native/addon.node");
// 初始化数据
settingDataInit();
// 获取语言
global.language = getLanguage(global.setting.general.language);
// 禁用debugtron
for (let i = 0; i < process.argv.length; i++) {
const arg = process.argv[i];
if (
arg.indexOf("--inspect") !== -1 ||
arg.indexOf("--remote-debugging-port") !== -1
) {
dialog.showMessageBoxSync({
message: "达咩呦达咩达咩~",
buttons: [global.language.ok],
type: "error",
noLink: true,
});
app.quit();
return;
}
}
// 初始化数据
classificationDataInit();
itemDataInit();
initSystemItem();
// 初始化监听
indexIpcEvent();
commonIpcEvent();
classificationIpcEvent();
itemIpcEvent();
settingIpcEvent();
searchIpcEvent();
aboutIpcEvent();
dataIpcEvent();
// 创建主窗口
createMainWindow();
if (global.setting.quickSearch.enable) {
// 创建快速搜索窗口
createQuickSearchWindow();
}
// 设置快捷键
setShortcutKey();
// 每次开启软件时都设置一次开机启动选项
if (process.env.NODE_ENV !== "development") {
const exeName = basename(process.execPath);
app.setLoginItemSettings({
openAtLogin: global.setting.general.startup,
openAsHidden: false,
path: process.execPath,
args: ["--processStart", `"${exeName}"`],
});
}
} catch (e) {
if (process.env.NODE_ENV === "development") {
console.log(e);
} else {
dialog.showMessageBoxSync({
type: "error",
title: "Dawn Launcher",
message: e.stack,
});
app.quit();
}
}
});
// 全局异常
process.on("uncaughtException", (err) => {
dialog.showMessageBoxSync({
type: "error",
title: "Dawn Launcher",
message: err.stack,
});
// 关闭所有子进程
closeAllChildProcess();
// 退出
app.quit();
});
app.on("before-quit", () => {
// 关闭所有子进程
closeAllChildProcess();
});
app.on("window-all-closed", () => {
if (process.platform !== "darwin") app.quit();
});
app.on("second-instance", () => {
if (global.mainWindow) {
if (!global.mainWindow.isVisible()) {
global.mainWindow.show();
global.mainWindow.focus();
global.blurHide = true;
} else {
global.mainWindow.focus();
}
}
});
app.on("activate", () => {
const allWindows = BrowserWindow.getAllWindows();
if (allWindows.length) {
allWindows[0].focus();
} else {
createMainWindow();
}
});