817 lines
24 KiB
JavaScript
817 lines
24 KiB
JavaScript
|
import appInit from "./appInit";
|
|||
|
import { app, BrowserWindow, dialog, ipcMain, Menu, protocol, Tray, screen } from "electron";
|
|||
|
import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
|
|||
|
import classificationIpcEvent from "./classification/ipcEvent";
|
|||
|
import itemIpcEvent from "./item/ipcEvent";
|
|||
|
import settingIpcEvent from "./setting/ipcEvent";
|
|||
|
import ipcEvent from "./ipcEvent";
|
|||
|
import settingIndex from "./setting/index";
|
|||
|
import path from "path";
|
|||
|
import util from "./util";
|
|||
|
import itemIndex from "./item/index";
|
|||
|
import cacheData from "./cache/data";
|
|||
|
import data from "./data";
|
|||
|
|
|||
|
// 解决透明窗口闪烁
|
|||
|
app.commandLine.appendSwitch("wm-window-animations-disabled");
|
|||
|
|
|||
|
// 数据
|
|||
|
const settingData = require("./setting/data");
|
|||
|
|
|||
|
protocol.registerSchemesAsPrivileged([{ scheme: "app", privileges: { secure: true, standard: true } }]);
|
|||
|
|
|||
|
// 主窗口
|
|||
|
let mainWindow = null;
|
|||
|
// 设置窗口
|
|||
|
let settingWindow = null;
|
|||
|
// 搜索框
|
|||
|
let searchWindow = null;
|
|||
|
|
|||
|
/**
|
|||
|
* 创建主窗口
|
|||
|
* @param init
|
|||
|
* @returns {Promise<void>}
|
|||
|
*/
|
|||
|
async function createWindow(init) {
|
|||
|
// 浏览器开发者工具
|
|||
|
let devTools;
|
|||
|
// 环境判断
|
|||
|
if (process.env.NODE_ENV !== "production") {
|
|||
|
// 开发
|
|||
|
devTools = true;
|
|||
|
} else {
|
|||
|
// 正式
|
|||
|
devTools = false;
|
|||
|
}
|
|||
|
if (init) {
|
|||
|
// 初始化监听
|
|||
|
await ipcEvent();
|
|||
|
await classificationIpcEvent();
|
|||
|
await itemIpcEvent();
|
|||
|
await settingIpcEvent();
|
|||
|
// 初始化数据
|
|||
|
await settingData.initData();
|
|||
|
await data.initData();
|
|||
|
await data.splitData();
|
|||
|
await data.validData();
|
|||
|
// watch
|
|||
|
global.mapDirectoryWatcher = new Map();
|
|||
|
}
|
|||
|
// 记录是否透明
|
|||
|
if (global.setting.appearance.backgroundTransparency == 1) {
|
|||
|
global.backgroundTransparency = false;
|
|||
|
} else {
|
|||
|
global.backgroundTransparency = true;
|
|||
|
}
|
|||
|
// 主窗口
|
|||
|
global.mainWindow = mainWindow = new BrowserWindow({
|
|||
|
minWidth: 300,
|
|||
|
minHeight: 400,
|
|||
|
width: 800,
|
|||
|
height: 600,
|
|||
|
frame: false,
|
|||
|
show: false,
|
|||
|
maximizable: false,
|
|||
|
minimizable: false,
|
|||
|
fullscreenable: false,
|
|||
|
transparent: global.backgroundTransparency,
|
|||
|
skipTaskbar: true,
|
|||
|
webPreferences: {
|
|||
|
backgroundThrottling: false,
|
|||
|
nodeIntegration: true,
|
|||
|
contextIsolation: false,
|
|||
|
spellcheck: false,
|
|||
|
devTools: devTools,
|
|||
|
},
|
|||
|
});
|
|||
|
// 加载页面
|
|||
|
if (process.env.WEBPACK_DEV_SERVER_URL) {
|
|||
|
// Load the url of the dev server if in development mode
|
|||
|
mainWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
|
|||
|
} else {
|
|||
|
createProtocol("app");
|
|||
|
// Load the index.html when not in development
|
|||
|
mainWindow.loadURL("app://./index.html");
|
|||
|
}
|
|||
|
// 加载完webContents后再显示窗口
|
|||
|
mainWindow.webContents.on("did-finish-load", function () {
|
|||
|
// 透明度
|
|||
|
mainWindow.setOpacity(Number(global.setting.appearance.transparency));
|
|||
|
// 永远居中不可移动
|
|||
|
if (global.setting.general.alwaysCenter) {
|
|||
|
// 是否可移动
|
|||
|
mainWindow.setMovable(false);
|
|||
|
} else {
|
|||
|
// 是否可移动
|
|||
|
mainWindow.setMovable(!global.setting.general.fixedPosition);
|
|||
|
}
|
|||
|
// 恢复上一次的位置
|
|||
|
let bounds = cacheData.cacheStore.get("bounds");
|
|||
|
if (bounds != null) {
|
|||
|
mainWindow.setBounds(bounds);
|
|||
|
}
|
|||
|
// 永远置顶
|
|||
|
if (global.setting.general.alwaysTop) {
|
|||
|
mainWindow.setAlwaysOnTop(true, "screen-saver");
|
|||
|
}
|
|||
|
// 是否托盘化启动
|
|||
|
if (!global.setting.general.startupTray) {
|
|||
|
mainWindow.show();
|
|||
|
}
|
|||
|
// 锁定尺寸
|
|||
|
mainWindow.setResizable(!global.setting.general.lockSize);
|
|||
|
// 检查更新
|
|||
|
let checkUpdate = cacheData.cacheStore.get("checkUpdate");
|
|||
|
if (checkUpdate == null || checkUpdate) {
|
|||
|
util.checkUpdate("init");
|
|||
|
}
|
|||
|
// 永远居中
|
|||
|
if (global.setting.general.alwaysCenter) {
|
|||
|
mainWindow.center();
|
|||
|
}
|
|||
|
// 判断窗口位置
|
|||
|
let displays = util.getWindowInScreen();
|
|||
|
if (displays.length == 0) {
|
|||
|
// 代表窗口的位置不再任一屏幕内,将窗口位置移动到主窗口
|
|||
|
mainWindow.center();
|
|||
|
}
|
|||
|
// 边缘吸附
|
|||
|
util.edgeAdsorb();
|
|||
|
});
|
|||
|
// 禁用标题栏右键
|
|||
|
mainWindow.hookWindowMessage(278, function (e) {
|
|||
|
// 窗口禁用
|
|||
|
mainWindow.setEnabled(false);
|
|||
|
// 延时太快会立刻启动,太慢会妨碍窗口其他操作,可自行测试最佳时间
|
|||
|
setTimeout(() => {
|
|||
|
mainWindow.setEnabled(true);
|
|||
|
}, 100);
|
|||
|
return true;
|
|||
|
});
|
|||
|
// 窗口移动完毕
|
|||
|
mainWindow.on("moved", () => {
|
|||
|
// 永远居中
|
|||
|
if (global.setting.general.alwaysCenter) {
|
|||
|
mainWindow.center();
|
|||
|
}
|
|||
|
// 记录位置
|
|||
|
cacheData.cacheStore.set("bounds", mainWindow.getBounds());
|
|||
|
// 边缘吸附
|
|||
|
util.edgeAdsorb();
|
|||
|
});
|
|||
|
// 改变窗口大小完毕
|
|||
|
mainWindow.on("resized", () => {
|
|||
|
// 永远居中
|
|||
|
if (global.setting.general.alwaysCenter) {
|
|||
|
mainWindow.center();
|
|||
|
}
|
|||
|
// 记录位置
|
|||
|
cacheData.cacheStore.set("bounds", mainWindow.getBounds());
|
|||
|
});
|
|||
|
// 监听鼠标移动
|
|||
|
const mouseEvent = require("./mouse");
|
|||
|
mouseEvent.on("mousemove", (data) => {
|
|||
|
if (global.setting.general.edgeAutoHide && (global.blurHide == null || !global.blurHide) && !global.setting.general.alwaysCenter) {
|
|||
|
autoHide(data, 40, true);
|
|||
|
}
|
|||
|
});
|
|||
|
// 监听鼠标抬起
|
|||
|
mouseEvent.on("mouseup", (data) => {
|
|||
|
// 中键单击
|
|||
|
if (data.button == 3 && global.setting.general.showHideMouseWheelClick) {
|
|||
|
if (util.notDisturb()) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (global.mainWindow.isVisible()) {
|
|||
|
// global.mainWindow.hide();
|
|||
|
global.mainWindow.webContents.send("hideMainWindowBefore");
|
|||
|
} else {
|
|||
|
util.showFollowMousePosition();
|
|||
|
global.mainWindow.show();
|
|||
|
global.mainWindow.focus();
|
|||
|
global.blurHide = true;
|
|||
|
}
|
|||
|
}
|
|||
|
// 双击任务栏显示/隐藏窗口
|
|||
|
if (global.setting.general.doubleClickTaskbar) {
|
|||
|
// 不是左键的话
|
|||
|
if (data.button != 1) {
|
|||
|
// 清除timeout
|
|||
|
clearTimeout(global.doubleClickTimer);
|
|||
|
// 清空
|
|||
|
global.doubleClickCounter = 0;
|
|||
|
return;
|
|||
|
}
|
|||
|
// 双击操作
|
|||
|
let displays = util.getWindowInScreen();
|
|||
|
if (displays.length > 1 || displays.length == 0) {
|
|||
|
// 清除timeout
|
|||
|
clearTimeout(global.doubleClickTimer);
|
|||
|
// 清空
|
|||
|
global.doubleClickCounter = 0;
|
|||
|
return;
|
|||
|
}
|
|||
|
// 获取鼠标位置
|
|||
|
let point = screen.getCursorScreenPoint();
|
|||
|
// 判断鼠标是否在当前屏幕内
|
|||
|
if (
|
|||
|
point.x >= displays[0].bounds.x &&
|
|||
|
point.x <= displays[0].bounds.x + displays[0].bounds.width &&
|
|||
|
point.y >= displays[0].bounds.y &&
|
|||
|
point.y <= displays[0].bounds.y + displays[0].bounds.height
|
|||
|
) {
|
|||
|
// 判断是否双击在任务栏上
|
|||
|
let flag = false;
|
|||
|
// 判断任务栏在哪一侧
|
|||
|
if (displays[0].bounds.height > displays[0].workArea.height) {
|
|||
|
if (displays[0].bounds.y == displays[0].workArea.y) {
|
|||
|
// 底部
|
|||
|
let top = displays[0].workArea.y + displays[0].workArea.height;
|
|||
|
let bottom = displays[0].bounds.y + displays[0].bounds.height;
|
|||
|
if (point.y >= top && point.y <= bottom) {
|
|||
|
flag = true;
|
|||
|
}
|
|||
|
} else {
|
|||
|
// 顶部
|
|||
|
if (point.y >= displays[0].bounds.y && point.y <= displays[0].workArea.y) {
|
|||
|
flag = true;
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (displays[0].bounds.width > displays[0].workArea.width) {
|
|||
|
if (displays[0].bounds.x == displays[0].workArea.x) {
|
|||
|
// 右侧
|
|||
|
let left = displays[0].workArea.x + displays[0].workArea.width;
|
|||
|
let right = displays[0].bounds.x + displays[0].bounds.width;
|
|||
|
if (point.x >= left && point.x <= right) {
|
|||
|
flag = true;
|
|||
|
}
|
|||
|
} else {
|
|||
|
// 左侧
|
|||
|
if (point.x >= displays[0].bounds.x && point.x <= displays[0].workArea.x) {
|
|||
|
flag = true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (flag) {
|
|||
|
// 监听双击
|
|||
|
if (global.doubleClickCounter == null) {
|
|||
|
global.doubleClickCounter = 0;
|
|||
|
}
|
|||
|
// +1
|
|||
|
global.doubleClickCounter++;
|
|||
|
// 等于2就是双击
|
|||
|
if (global.doubleClickCounter != null && global.doubleClickCounter == 2) {
|
|||
|
// 清除timeout
|
|||
|
clearTimeout(global.doubleClickTimer);
|
|||
|
// 清空
|
|||
|
global.doubleClickCounter = 0;
|
|||
|
let className = global.api.getCursorPosWindowClassName();
|
|||
|
if (className.indexOf("MSTask") >= 0 || className == "Shell_TrayWnd") {
|
|||
|
if (mainWindow.isVisible()) {
|
|||
|
// mainWindow.hide();
|
|||
|
global.mainWindow.webContents.send("hideMainWindowBefore");
|
|||
|
} else {
|
|||
|
util.showFollowMousePosition();
|
|||
|
mainWindow.show();
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
// 间隔为500毫秒,如果超过500毫秒就代表不是双击
|
|||
|
global.doubleClickTimer = setTimeout(function () {
|
|||
|
global.doubleClickCounter = 0;
|
|||
|
}, 500);
|
|||
|
}
|
|||
|
} else {
|
|||
|
// 清除timeout
|
|||
|
clearTimeout(global.doubleClickTimer);
|
|||
|
// 清空
|
|||
|
global.doubleClickCounter = 0;
|
|||
|
}
|
|||
|
} else {
|
|||
|
// 清除timeout
|
|||
|
clearTimeout(global.doubleClickTimer);
|
|||
|
// 清空
|
|||
|
global.doubleClickCounter = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
// 失去焦点
|
|||
|
mainWindow.on("blur", () => {
|
|||
|
if (global.setting.general.edgeAutoHide && global.blurHide) {
|
|||
|
let scaleFactor = screen.getPrimaryDisplay().scaleFactor;
|
|||
|
let data = {
|
|||
|
x: screen.getCursorScreenPoint().x * scaleFactor,
|
|||
|
y: screen.getCursorScreenPoint().y * scaleFactor,
|
|||
|
};
|
|||
|
autoHide(data, 0, false);
|
|||
|
}
|
|||
|
if (mainWindow.isVisible()) {
|
|||
|
if (global.setting.general.hideLosingFocus && !global.setting.general.alwaysTop) {
|
|||
|
// 隐藏
|
|||
|
// mainWindow.hide();
|
|||
|
global.mainWindow.webContents.send("hideMainWindowBefore");
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
// 显示窗口
|
|||
|
mainWindow.on("show", () => {
|
|||
|
// 检测无效项目
|
|||
|
if (global.setting.item.checkInvalidItem) {
|
|||
|
global.mainWindow.webContents.send("checkInvalidItemResult", JSON.stringify(itemIndex.checkInvalidItem()));
|
|||
|
}
|
|||
|
// 边缘吸附
|
|||
|
util.edgeAdsorb();
|
|||
|
// 显示窗口时将输入法切换为英文模式
|
|||
|
if (global.setting.general.switchEnglish) {
|
|||
|
global.api.SwitchEnglish(mainWindow.getNativeWindowHandle());
|
|||
|
}
|
|||
|
});
|
|||
|
// 隐藏窗口
|
|||
|
mainWindow.on("hide", () => {
|
|||
|
global.blurHide = null;
|
|||
|
});
|
|||
|
// 关闭窗口事件
|
|||
|
mainWindow.on("close", () => {
|
|||
|
// 关闭搜索框
|
|||
|
if (searchWindow != null && !searchWindow.isDestroyed()) {
|
|||
|
searchWindow.close();
|
|||
|
}
|
|||
|
// 释放鼠标监听
|
|||
|
global.api.disableMouseMove();
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 创建搜索窗口
|
|||
|
* @returns {Promise<void>}
|
|||
|
*/
|
|||
|
async function createSettingWindow() {
|
|||
|
// 浏览器开发者工具
|
|||
|
let devTools;
|
|||
|
// 环境判断
|
|||
|
if (process.env.NODE_ENV !== "production") {
|
|||
|
// 开发
|
|||
|
devTools = true;
|
|||
|
} else {
|
|||
|
// 正式
|
|||
|
devTools = false;
|
|||
|
}
|
|||
|
// 设置窗口
|
|||
|
global.settingWindow = settingWindow = new BrowserWindow({
|
|||
|
width: 600,
|
|||
|
height: 500,
|
|||
|
frame: false,
|
|||
|
show: false,
|
|||
|
maximizable: false,
|
|||
|
minimizable: false,
|
|||
|
fullscreenable: false,
|
|||
|
skipTaskbar: true,
|
|||
|
parent: mainWindow,
|
|||
|
resizable: false,
|
|||
|
webPreferences: {
|
|||
|
nodeIntegration: true,
|
|||
|
contextIsolation: false,
|
|||
|
spellcheck: false,
|
|||
|
devTools: devTools,
|
|||
|
},
|
|||
|
});
|
|||
|
// 加载页面
|
|||
|
if (process.env.WEBPACK_DEV_SERVER_URL) {
|
|||
|
// Load the url of the dev server if in development mode
|
|||
|
settingWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL + "#/setting");
|
|||
|
} else {
|
|||
|
createProtocol("app");
|
|||
|
// Load the index.html when not in development
|
|||
|
settingWindow.loadURL("app://./index.html#setting");
|
|||
|
}
|
|||
|
// 加载完webContents后再显示窗口
|
|||
|
settingWindow.webContents.on("did-finish-load", function () {
|
|||
|
// 显示窗口
|
|||
|
settingWindow.show();
|
|||
|
});
|
|||
|
// 禁用标题栏右键
|
|||
|
settingWindow.hookWindowMessage(278, function (e) {
|
|||
|
// 窗口禁用
|
|||
|
settingWindow.setEnabled(false);
|
|||
|
// 延时太快会立刻启动,太慢会妨碍窗口其他操作,可自行测试最佳时间
|
|||
|
setTimeout(() => {
|
|||
|
settingWindow.setEnabled(true);
|
|||
|
}, 100);
|
|||
|
return true;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 创建搜索窗口
|
|||
|
* @returns {Promise<void>}
|
|||
|
*/
|
|||
|
async function createSearchWindow() {
|
|||
|
// 是否可以显示
|
|||
|
global.searchWindowShow = false;
|
|||
|
if (searchWindow != null && !searchWindow.isDestroyed()) {
|
|||
|
searchWindow.destroy();
|
|||
|
}
|
|||
|
// 浏览器开发者工具
|
|||
|
let devTools;
|
|||
|
// 环境判断
|
|||
|
if (process.env.NODE_ENV !== "production") {
|
|||
|
// 开发
|
|||
|
devTools = true;
|
|||
|
} else {
|
|||
|
// 正式
|
|||
|
devTools = false;
|
|||
|
}
|
|||
|
// 窗口
|
|||
|
global.searchWindow = searchWindow = new BrowserWindow({
|
|||
|
width: 600,
|
|||
|
height: 44,
|
|||
|
type: "toolbar",
|
|||
|
frame: false,
|
|||
|
show: false,
|
|||
|
maximizable: false,
|
|||
|
minimizable: false,
|
|||
|
fullscreenable: false,
|
|||
|
resizable: false,
|
|||
|
alwaysOnTop: true,
|
|||
|
backgroundColor: global.setting.appearance.theme.mainBackground.replace("bg-[", "").replace("]", ""),
|
|||
|
webPreferences: {
|
|||
|
backgroundThrottling: false,
|
|||
|
nodeIntegration: true,
|
|||
|
contextIsolation: false,
|
|||
|
spellcheck: false,
|
|||
|
devTools: devTools,
|
|||
|
},
|
|||
|
});
|
|||
|
// 加载页面
|
|||
|
if (process.env.WEBPACK_DEV_SERVER_URL) {
|
|||
|
// Load the url of the dev server if in development mode
|
|||
|
searchWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL + "#/searchWindow");
|
|||
|
} else {
|
|||
|
createProtocol("app");
|
|||
|
// Load the index.html when not in development
|
|||
|
searchWindow.loadURL("app://./index.html#searchWindow");
|
|||
|
}
|
|||
|
// 加载完webContents后再显示窗口
|
|||
|
searchWindow.webContents.on("did-finish-load", function () {
|
|||
|
// 恢复上一次的位置
|
|||
|
let bounds = cacheData.cacheStore.get("searchWindowBounds");
|
|||
|
if (bounds != null) {
|
|||
|
searchWindow.setBounds({ x: bounds.x, y: bounds.y });
|
|||
|
}
|
|||
|
// 设置可以显示
|
|||
|
global.searchWindowShow = true;
|
|||
|
});
|
|||
|
// 隐藏窗口
|
|||
|
searchWindow.on("hide", () => {
|
|||
|
searchWindow.setBounds({ height: 44 });
|
|||
|
searchWindow.webContents.send("hideSearchWindowOperation");
|
|||
|
});
|
|||
|
// 显示窗口
|
|||
|
searchWindow.on("show", () => {
|
|||
|
searchWindow.setBackgroundColor(global.setting.appearance.theme.mainBackground.replace("bg-[", "").replace("]", ""));
|
|||
|
// 显示窗口时将输入法切换为英文模式
|
|||
|
if (global.setting.general.switchEnglish) {
|
|||
|
global.api.SwitchEnglish(searchWindow.getNativeWindowHandle());
|
|||
|
}
|
|||
|
});
|
|||
|
// 窗口移动完毕
|
|||
|
searchWindow.on("moved", () => {
|
|||
|
// 记录位置
|
|||
|
cacheData.cacheStore.set("searchWindowBounds", searchWindow.getBounds());
|
|||
|
});
|
|||
|
// 失去焦点
|
|||
|
searchWindow.on("blur", () => {
|
|||
|
if (searchWindow.isVisible() && global.setting.quickSearch.hideLosingFocus) {
|
|||
|
global.searchWindow.webContents.send("hideSearchWindowBefore");
|
|||
|
}
|
|||
|
});
|
|||
|
// 禁用标题栏右键
|
|||
|
searchWindow.hookWindowMessage(278, function (e) {
|
|||
|
// 窗口禁用
|
|||
|
searchWindow.setEnabled(false);
|
|||
|
// 延时太快会立刻启动,太慢会妨碍窗口其他操作,可自行测试最佳时间
|
|||
|
setTimeout(() => {
|
|||
|
searchWindow.setEnabled(true);
|
|||
|
}, 100);
|
|||
|
return true;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 自动隐藏
|
|||
|
* @param data
|
|||
|
* @param size
|
|||
|
* @param timer
|
|||
|
*/
|
|||
|
function autoHide(data, size, timer) {
|
|||
|
if (global.mainWindow.isDestroyed()) {
|
|||
|
return;
|
|||
|
}
|
|||
|
try {
|
|||
|
let displays = util.getWindowInScreen();
|
|||
|
if (displays.length > 1 || displays.length == 0) {
|
|||
|
return;
|
|||
|
}
|
|||
|
let workArea = displays[0].workArea;
|
|||
|
let scaleFactor = displays[0].scaleFactor;
|
|||
|
let bounds = mainWindow.getBounds();
|
|||
|
if (mainWindow.isVisible()) {
|
|||
|
let flag = false;
|
|||
|
if (bounds.x + bounds.width >= workArea.x + workArea.width) {
|
|||
|
// 右侧
|
|||
|
flag = data.x <= bounds.x * scaleFactor - size || data.y <= bounds.y * scaleFactor - size || data.y >= (bounds.y + bounds.height) * scaleFactor + size;
|
|||
|
} else if (bounds.x == workArea.x) {
|
|||
|
// 左侧
|
|||
|
flag =
|
|||
|
data.x > (bounds.x + bounds.width) * scaleFactor + size ||
|
|||
|
data.y <= bounds.y * scaleFactor - size ||
|
|||
|
data.y >= (bounds.y + bounds.height) * scaleFactor + size;
|
|||
|
} else if (bounds.y + bounds.height >= workArea.y + workArea.height) {
|
|||
|
// 底部
|
|||
|
flag = data.y < bounds.y * scaleFactor - size || data.x <= bounds.x * scaleFactor - size || data.x >= (bounds.x + bounds.width) * scaleFactor + size;
|
|||
|
} else if (bounds.y == workArea.y) {
|
|||
|
// 顶部
|
|||
|
flag =
|
|||
|
data.y > (bounds.y + bounds.height) * scaleFactor + size ||
|
|||
|
data.x <= bounds.x * scaleFactor - size ||
|
|||
|
data.x >= (bounds.x + bounds.width) * scaleFactor + size;
|
|||
|
}
|
|||
|
if (flag) {
|
|||
|
if (global.menuShow != null && global.menuShow) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (timer && global.setting.general.delayHidingMS > 0 && global.autoHideTimer == null) {
|
|||
|
global.autoHideTimer = setTimeout(function () {
|
|||
|
// 隐藏
|
|||
|
// mainWindow.hide();
|
|||
|
global.mainWindow.webContents.send("hideMainWindowBefore");
|
|||
|
}, global.setting.general.delayHidingMS);
|
|||
|
} else if (global.setting.general.delayHidingMS == 0 || !timer) {
|
|||
|
// 隐藏
|
|||
|
// mainWindow.hide();
|
|||
|
global.mainWindow.webContents.send("hideMainWindowBefore");
|
|||
|
}
|
|||
|
} else {
|
|||
|
clearTimeout(global.autoHideTimer);
|
|||
|
global.autoHideTimer = null;
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (global.direction != "none") {
|
|||
|
let flag = false;
|
|||
|
let x = bounds.x * scaleFactor;
|
|||
|
let y = bounds.y * scaleFactor;
|
|||
|
let windowWidthPosition = (bounds.x + bounds.width) * scaleFactor;
|
|||
|
let windowHeightPosition = (bounds.y + bounds.height) * scaleFactor;
|
|||
|
if (global.direction == "right" && data.x >= windowWidthPosition - 1 && data.y >= y && data.y <= windowHeightPosition) {
|
|||
|
// 右侧
|
|||
|
flag = true;
|
|||
|
} else if (global.direction == "left" && data.x <= workArea.x && data.y >= y && data.y <= windowHeightPosition) {
|
|||
|
// 左侧
|
|||
|
flag = true;
|
|||
|
} else if (global.direction == "bottom" && data.y >= windowHeightPosition - 1 && data.x >= x && data.x <= windowWidthPosition) {
|
|||
|
// 底部
|
|||
|
flag = true;
|
|||
|
} else if (global.direction == "top" && data.y <= workArea.y && data.x >= x && data.x <= windowWidthPosition) {
|
|||
|
// 顶部
|
|||
|
flag = true;
|
|||
|
}
|
|||
|
if (flag) {
|
|||
|
if (util.notDisturb()) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (timer && global.setting.general.delayDisplayMS > 0 && global.autoHideTimer == null) {
|
|||
|
global.autoHideTimer = setTimeout(function () {
|
|||
|
// 显示
|
|||
|
mainWindow.show();
|
|||
|
if (!global.setting.general.alwaysTop) {
|
|||
|
global.mainWindow.setAlwaysOnTop(true, "screen-saver");
|
|||
|
global.mainWindow.setAlwaysOnTop(false);
|
|||
|
}
|
|||
|
}, global.setting.general.delayDisplayMS);
|
|||
|
} else if (global.setting.general.delayDisplayMS == 0 || !timer) {
|
|||
|
// 显示
|
|||
|
mainWindow.show();
|
|||
|
if (!global.setting.general.alwaysTop) {
|
|||
|
global.mainWindow.setAlwaysOnTop(true, "screen-saver");
|
|||
|
global.mainWindow.setAlwaysOnTop(false);
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
clearTimeout(global.autoHideTimer);
|
|||
|
global.autoHideTimer = null;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
} catch (e) {
|
|||
|
if (process.env.NODE_ENV !== "production") {
|
|||
|
console.log(e);
|
|||
|
}
|
|||
|
global.mainWindow.setBounds({ x: 1, y: 1 });
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 显示设置窗口
|
|||
|
*/
|
|||
|
function showSettingWindow() {
|
|||
|
if (settingWindow != null && !settingWindow.isDestroyed()) {
|
|||
|
if (!settingWindow.isVisible()) {
|
|||
|
settingWindow.show();
|
|||
|
}
|
|||
|
settingWindow.focus();
|
|||
|
} else {
|
|||
|
createSettingWindow();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
app.whenReady().then(() => {
|
|||
|
// 禁用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(global.mainWindow, {
|
|||
|
title: "Dawn Launcher",
|
|||
|
message: "达咩呦达咩达咩~",
|
|||
|
buttons: ["确定"],
|
|||
|
type: "error",
|
|||
|
noLink: true,
|
|||
|
});
|
|||
|
app.quit();
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
// 禁止多开
|
|||
|
const instanceLock = app.requestSingleInstanceLock();
|
|||
|
if (!instanceLock) {
|
|||
|
app.quit();
|
|||
|
return;
|
|||
|
}
|
|||
|
// 设置快捷键
|
|||
|
let setting = settingData.get();
|
|||
|
settingIndex.setShortcutKey(setting);
|
|||
|
// 引用c++
|
|||
|
try {
|
|||
|
global.api = require("bindings")({
|
|||
|
bindings: "api.node",
|
|||
|
module_root: process.env.NODE_ENV !== "production" ? path.resolve(".") : path.dirname(process.execPath),
|
|||
|
});
|
|||
|
} catch (e) {
|
|||
|
dialog.showMessageBoxSync(global.mainWindow, {
|
|||
|
title: "Dawn Launcher",
|
|||
|
message: "缺少DLL文件,请重新下载安装包,安装后运行。",
|
|||
|
buttons: ["确定"],
|
|||
|
type: "error",
|
|||
|
noLink: true,
|
|||
|
});
|
|||
|
app.quit();
|
|||
|
return;
|
|||
|
}
|
|||
|
// 创建窗口
|
|||
|
createWindow(true);
|
|||
|
});
|
|||
|
|
|||
|
app.on("second-instance", (event, commandLine, workingDirectory) => {
|
|||
|
if (mainWindow) {
|
|||
|
if (!mainWindow.isVisible()) {
|
|||
|
mainWindow.show();
|
|||
|
mainWindow.focus();
|
|||
|
global.blurHide = true;
|
|||
|
} else {
|
|||
|
mainWindow.focus();
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
app.on("window-all-closed", () => {
|
|||
|
// 释放鼠标监听
|
|||
|
global.api.disableMouseMove();
|
|||
|
if (process.platform !== "darwin") {
|
|||
|
app.quit();
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
app.on("activate", () => {
|
|||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
|||
|
createWindow(false).then((r) => {});
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (process.env.NODE_ENV === "production") {
|
|||
|
// 开机启动
|
|||
|
const exeName = path.basename(process.execPath);
|
|||
|
ipcMain.on("setAutoLaunch", (event, args) => {
|
|||
|
app.setLoginItemSettings({
|
|||
|
openAtLogin: args,
|
|||
|
openAsHidden: false,
|
|||
|
path: process.execPath,
|
|||
|
args: ["--processStart", `"${exeName}"`],
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// 设置当前语言
|
|||
|
ipcMain.on("setCurrentLanguage", (event, args) => {
|
|||
|
let currentLanguage = JSON.parse(args);
|
|||
|
global.currentLanguage = currentLanguage;
|
|||
|
// 托盘菜单
|
|||
|
setTray(!global.setting.general.hideTray);
|
|||
|
});
|
|||
|
|
|||
|
/**
|
|||
|
* 托盘
|
|||
|
*/
|
|||
|
function setTray(show) {
|
|||
|
// 获取语言
|
|||
|
if (show) {
|
|||
|
if (global.tray == null) {
|
|||
|
// 环境判断
|
|||
|
if (process.env.NODE_ENV !== "production") {
|
|||
|
// 开发
|
|||
|
global.tray = new Tray("./public/images/logo-thick.ico");
|
|||
|
} else {
|
|||
|
// 正式
|
|||
|
global.tray = new Tray(path.join(__dirname, "./images/logo-thick.ico"));
|
|||
|
}
|
|||
|
}
|
|||
|
let contextMenu = Menu.buildFromTemplate([
|
|||
|
{
|
|||
|
label: global.currentLanguage.displayMainInterface,
|
|||
|
click: function () {
|
|||
|
mainWindow.show();
|
|||
|
global.blurHide = true;
|
|||
|
},
|
|||
|
},
|
|||
|
{
|
|||
|
label: global.currentLanguage.setting,
|
|||
|
click: function () {
|
|||
|
showSettingWindow();
|
|||
|
},
|
|||
|
},
|
|||
|
{
|
|||
|
// 点击退出菜单退出程序
|
|||
|
label: global.currentLanguage.exit,
|
|||
|
click: function () {
|
|||
|
mainWindow.close();
|
|||
|
},
|
|||
|
},
|
|||
|
]);
|
|||
|
// 托盘
|
|||
|
global.tray.setToolTip("Dawn Launcher");
|
|||
|
global.tray.setContextMenu(contextMenu);
|
|||
|
// 点击托盘图标,显示主窗口
|
|||
|
global.tray.on("click", () => {
|
|||
|
mainWindow.show();
|
|||
|
global.blurHide = true;
|
|||
|
});
|
|||
|
} else {
|
|||
|
// 隐藏托盘
|
|||
|
if (global.tray != null) {
|
|||
|
if (!global.tray.isDestroyed()) {
|
|||
|
global.tray.destroy();
|
|||
|
global.tray = null;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 创建搜索窗口
|
|||
|
ipcMain.on("createSearchWindow", () => {
|
|||
|
// 搜索框
|
|||
|
createSearchWindow();
|
|||
|
});
|
|||
|
|
|||
|
// 托盘
|
|||
|
ipcMain.on("setTray", (event, args) => {
|
|||
|
setTray(args);
|
|||
|
});
|
|||
|
|
|||
|
// 开启快捷搜索
|
|||
|
ipcMain.on("setEnableQuickSearch", (event, args) => {
|
|||
|
// 设置快捷键
|
|||
|
let setting = settingData.get();
|
|||
|
setting.quickSearch.enable = args;
|
|||
|
settingIndex.setShortcutKey(setting);
|
|||
|
});
|
|||
|
|
|||
|
// 设置背景透明度
|
|||
|
ipcMain.on("setBackgroundTransparency", (event, args) => {
|
|||
|
if ((Number(args) == 1 && global.backgroundTransparency) || (Number(args) != 1 && !global.backgroundTransparency)) {
|
|||
|
mainWindow.destroy();
|
|||
|
global.mainWindow = mainWindow = null;
|
|||
|
createWindow(false);
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
// 创建设置窗口
|
|||
|
ipcMain.on("createSettingWindow", (event, args) => {
|
|||
|
showSettingWindow();
|
|||
|
});
|
|||
|
|
|||
|
// 显示搜索窗口
|
|||
|
ipcMain.on("searchWindowShow", (event, args) => {
|
|||
|
if (args != null) {
|
|||
|
searchWindow.setBounds({ height: args });
|
|||
|
}
|
|||
|
searchWindow.show();
|
|||
|
});
|