123 lines
3.5 KiB
TypeScript
Raw Normal View History

2022-12-22 00:58:54 +07:00
import { app, BrowserWindow, shell, ipcMain } from 'electron'
import { release } from 'node:os'
import { join, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
2022-12-22 00:58:54 +07:00
2022-09-16 08:53:14 +08:00
// The built directory structure
//
// ├─┬ dist-electron
// │ ├─┬ main
// │ │ └── index.js > Electron-Main
// │ └─┬ preload
// │ └── index.mjs > Preload-Scripts
2022-09-16 08:53:14 +08:00
// ├─┬ dist
// │ └── index.html > Electron-Renderer
//
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
2022-09-16 08:53:14 +08:00
2022-06-14 20:21:14 +08:00
// Disable GPU Acceleration for Windows 7
if (release().startsWith('6.1')) 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)
}
2022-06-29 08:36:04 +08:00
// 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'
2022-06-14 20:21:14 +08:00
let win: BrowserWindow | null = null
// Here, you can also use other preload
const preload = join(__dirname, '../preload/index.mjs')
const url = process.env.VITE_DEV_SERVER_URL
const indexHtml = join(process.env.DIST, 'index.html')
2022-06-14 20:21:14 +08:00
async function createWindow() {
win = new BrowserWindow({
title: 'Main window',
icon: join(process.env.VITE_PUBLIC, 'favicon.ico'),
2022-06-14 20:21:14 +08:00
webPreferences: {
2022-06-29 07:33:37 +08:00
preload,
// Warning: Enable nodeIntegration and disable contextIsolation is not secure in production
// nodeIntegration: true,
// Consider using contextBridge.exposeInMainWorld
// Read more on https://www.electronjs.org/docs/latest/tutorial/context-isolation
2022-06-14 20:21:14 +08:00
contextIsolation: false,
},
})
2022-11-06 18:10:36 +08:00
if (process.env.VITE_DEV_SERVER_URL) { // electron-vite-vue#298
2022-06-14 20:21:14 +08:00
win.loadURL(url)
// Open devTool if the app is not packaged
win.webContents.openDevTools()
} else {
win.loadFile(indexHtml)
2022-06-14 20:21:14 +08:00
}
2022-06-29 08:36:04 +08:00
// Test actively push message to the Electron-Renderer
2022-06-14 20:21:14 +08:00
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' }
2022-06-14 20:21:14 +08:00
})
// win.webContents.on('will-navigate', (event, url) => { }) #344
2022-06-14 20:21:14 +08:00
}
app.whenReady().then(createWindow)
app.on('window-all-closed', () => {
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()
}
})
app.on('activate', () => {
const allWindows = BrowserWindow.getAllWindows()
if (allWindows.length) {
allWindows[0].focus()
} else {
createWindow()
}
})
// New window example arg: new windows url
2022-12-22 00:58:54 +07:00
ipcMain.handle('open-win', (_, arg) => {
2022-06-14 20:21:14 +08:00
const childWindow = new BrowserWindow({
webPreferences: {
2022-06-29 07:33:37 +08:00
preload,
nodeIntegration: true,
contextIsolation: false,
2022-06-14 20:21:14 +08:00
},
})
if (process.env.VITE_DEV_SERVER_URL) {
childWindow.loadURL(`${url}#${arg}`)
} else {
childWindow.loadFile(indexHtml, { hash: arg })
2022-06-14 20:21:14 +08:00
}
})