From b957414e48fe980c1158a84562a45c4b1504e4da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=98=89=E4=BC=9F?= <8473136@qq.com> Date: Fri, 1 Dec 2023 15:00:11 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E5=A2=9E=E5=8A=A0=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=89=98=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/main/index.ts | 200 +++++++++++++++++++++++++---------------- 1 file changed, 125 insertions(+), 75 deletions(-) diff --git a/electron/main/index.ts b/electron/main/index.ts index 99d44c2..35e6b77 100644 --- a/electron/main/index.ts +++ b/electron/main/index.ts @@ -1,11 +1,11 @@ -import { app, BrowserWindow, ipcMain, shell } from "electron"; -import { release } from "node:os"; -import { join } from "node:path"; -import { initGitHubApi } from "../api/github"; -import { initConfigApi } from "../api/config"; -import { initProxyApi } from "../api/proxy"; -import { initFrpcApi } from "../api/frpc"; -import { initLoggerApi } from "../api/logger"; +import {app, BrowserWindow, ipcMain, Menu, MenuItem, MenuItemConstructorOptions, shell, Tray} from "electron"; +import {release} from "node:os"; +import node_path, {join} from "node:path"; +import {initGitHubApi} from "../api/github"; +import {initConfigApi} from "../api/config"; +import {initProxyApi} from "../api/proxy"; +import {initFrpcApi} from "../api/frpc"; +import {initLoggerApi} from "../api/logger"; import {initFileApi} from "../api/file"; // The built directory structure // @@ -20,8 +20,8 @@ import {initFileApi} from "../api/file"; 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; + ? join(process.env.DIST_ELECTRON, "../public") + : process.env.DIST; // Disable GPU Acceleration for Windows 7 if (release().startsWith("6.1")) app.disableHardwareAcceleration(); @@ -30,8 +30,8 @@ if (release().startsWith("6.1")) app.disableHardwareAcceleration(); if (process.platform === "win32") app.setAppUserModelId(app.getName()); if (!app.requestSingleInstanceLock()) { - app.quit(); - process.exit(0); + app.quit(); + process.exit(0); } // Remove electron security warnings @@ -40,98 +40,148 @@ if (!app.requestSingleInstanceLock()) { // process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true' let win: BrowserWindow | null = null; +let tray = null; // Here, you can also use other preload const preload = join(__dirname, "../preload/index.js"); const url = process.env.VITE_DEV_SERVER_URL; const indexHtml = join(process.env.DIST, "index.html"); +let isQuiting; async function createWindow() { - win = new BrowserWindow({ - title: "Main window", - icon: join(process.env.VITE_PUBLIC, "favicon.ico"), - webPreferences: { - preload, - // Warning: Enable nodeIntegration and disable contextIsolation is not secure in production - // Consider using contextBridge.exposeInMainWorld - // Read more on https://www.electronjs.org/docs/latest/tutorial/context-isolation - nodeIntegration: true, - contextIsolation: false + win = new BrowserWindow({ + title: "Frpc Desktop", + icon: join(process.env.VITE_PUBLIC, "logo/16x16.png"), + webPreferences: { + preload, + // Warning: Enable nodeIntegration and disable contextIsolation is not secure in production + // Consider using contextBridge.exposeInMainWorld + // Read more on https://www.electronjs.org/docs/latest/tutorial/context-isolation + nodeIntegration: true, + contextIsolation: false + } + }); + if (process.env.VITE_DEV_SERVER_URL) { + // electron-vite-vue#298 + win.loadURL(url); + // Open devTool if the app is not packaged + win.webContents.openDevTools(); + } else { + win.loadFile(indexHtml); } - }); - if (process.env.VITE_DEV_SERVER_URL) { - // electron-vite-vue#298 - win.loadURL(url); - // Open devTool if the app is not packaged - win.webContents.openDevTools(); - } else { - win.loadFile(indexHtml); - } + // Test actively push message to the Electron-Renderer + win.webContents.on("did-finish-load", () => { + win?.webContents.send("main-process-message", new Date().toLocaleString()); + }); - // Test actively push message to the Electron-Renderer - win.webContents.on("did-finish-load", () => { - win?.webContents.send("main-process-message", new Date().toLocaleString()); - }); + // Make all links open with the browser, not with the application + win.webContents.setWindowOpenHandler(({url}) => { + if (url.startsWith("https:")) shell.openExternal(url); + return {action: "deny"}; + }); - // Make all links open with the browser, not with the application - win.webContents.setWindowOpenHandler(({ url }) => { - if (url.startsWith("https:")) shell.openExternal(url); - return { action: "deny" }; - }); + // 隐藏菜单栏 + const {Menu} = require("electron"); + Menu.setApplicationMenu(null); + // hide menu for Mac + if (process.platform !== "darwin") { + app.dock.hide(); + } + + win.on('minimize', function (event) { + event.preventDefault(); + win.hide(); + }); + + win.on('close', function (event) { + if (!isQuiting) { + event.preventDefault(); + win.hide(); + if (process.platform === "darwin") { + app.dock.hide(); + } + } + return false; + }); - // 隐藏菜单栏 - const { Menu } = require("electron"); - Menu.setApplicationMenu(null); - // hide menu for Mac - if (process.platform !== "darwin") { - app.dock.hide(); - } - // win.webContents.on('will-navigate', (event, url) => { }) #344 } -app.whenReady().then(createWindow); +export const createTray = () => { + let menu: Array<(MenuItemConstructorOptions) | (MenuItem)> = [ + { + label: '显示主窗口', click: function () { + win.show(); + if (process.platform === "darwin") { + app.dock.show(); + } + } + }, + { + label: '退出', + click: () => { + isQuiting = true; + app.quit(); + } + } + ]; + tray = new Tray(node_path.join(process.env.VITE_PUBLIC, "logo/16x16.png")) + tray.setToolTip('Frpc Desktop') + const contextMenu = Menu.buildFromTemplate(menu) + tray.setContextMenu(contextMenu) +} + +app.whenReady().then(() => { + createWindow().then(r => { + createTray() + }) +}); app.on("window-all-closed", () => { - win = null; - if (process.platform !== "darwin") app.quit(); + win = null; + if (process.platform !== "darwin") app.quit(); }); app.on("second-instance", () => { - if (win) { - // Focus on the main window if the user tried to open another - if (win.isMinimized()) win.restore(); - win.focus(); - } + if (win) { + // Focus on the main window if the user tried to open another + if (win.isMinimized()) win.restore(); + win.focus(); + } }); app.on("activate", () => { - const allWindows = BrowserWindow.getAllWindows(); - if (allWindows.length) { - allWindows[0].focus(); - } else { - createWindow(); - } + const allWindows = BrowserWindow.getAllWindows(); + if (allWindows.length) { + allWindows[0].focus(); + } else { + createWindow(); + } }); +app.on('before-quit', () => { + isQuiting = true; +}) + // New window example arg: new windows url ipcMain.handle("open-win", (_, arg) => { - const childWindow = new BrowserWindow({ - webPreferences: { - preload, - nodeIntegration: true, - contextIsolation: false - } - }); + const childWindow = new BrowserWindow({ + webPreferences: { + preload, + nodeIntegration: true, + contextIsolation: false + } + }); - if (process.env.VITE_DEV_SERVER_URL) { - childWindow.loadURL(`${url}#${arg}`); - } else { - childWindow.loadFile(indexHtml, { hash: arg }); - } + if (process.env.VITE_DEV_SERVER_URL) { + childWindow.loadURL(`${url}#${arg}`); + } else { + childWindow.loadFile(indexHtml, {hash: arg}); + } }); ipcMain.on('open-url', (event, url) => { - shell.openExternal(url).then(r => {}); + shell.openExternal(url).then(r => { + }); }); initGitHubApi();