import { BrowserWindow, screen } from 'electron' import { ipcMain } from 'electron' import path from 'node:path' import { fileURLToPath } from 'node:url' const __dirname = path.dirname(fileURLToPath(import.meta.url)) const APP_ROOT = path.join(__dirname, '..') const VITE_DEV_SERVER_URL = process.env['VITE_DEV_SERVER_URL'] const RENDERER_DIST = path.join(APP_ROOT, 'dist') let hudOverlayWindow: BrowserWindow | null = null; ipcMain.on('hud-overlay-hide', () => { if (hudOverlayWindow && !hudOverlayWindow.isDestroyed()) { hudOverlayWindow.minimize(); } }); export function createHudOverlayWindow(): BrowserWindow { const primaryDisplay = screen.getPrimaryDisplay(); const { workArea } = primaryDisplay; const windowWidth = 500; const windowHeight = 100; const x = Math.floor(workArea.x + (workArea.width - windowWidth) / 2); const y = Math.floor(workArea.y + workArea.height - windowHeight - 5); const win = new BrowserWindow({ width: windowWidth, height: windowHeight, minWidth: 500, maxWidth: 500, minHeight: 100, maxHeight: 100, x: x, y: y, frame: false, transparent: true, resizable: false, alwaysOnTop: true, skipTaskbar: true, hasShadow: false, webPreferences: { preload: path.join(__dirname, 'preload.mjs'), nodeIntegration: false, contextIsolation: true, backgroundThrottling: false, }, }) win.webContents.on('did-finish-load', () => { win?.webContents.send('main-process-message', (new Date).toLocaleString()) }) hudOverlayWindow = win; win.on('closed', () => { if (hudOverlayWindow === win) { hudOverlayWindow = null; } }); if (VITE_DEV_SERVER_URL) { win.loadURL(VITE_DEV_SERVER_URL + '?windowType=hud-overlay') } else { win.loadFile(path.join(RENDERER_DIST, 'index.html'), { query: { windowType: 'hud-overlay' } }) } return win } export function createEditorWindow(): BrowserWindow { const win = new BrowserWindow({ width: 1200, height: 800, minWidth: 800, minHeight: 600, titleBarStyle: 'hiddenInset', trafficLightPosition: { x: 12, y: 12 }, transparent: false, resizable: true, alwaysOnTop: false, skipTaskbar: false, title: 'OpenScreen', backgroundColor: '#000000', webPreferences: { preload: path.join(__dirname, 'preload.mjs'), nodeIntegration: false, contextIsolation: true, webSecurity: false, backgroundThrottling: false, }, }) // Maximize the window by default win.maximize(); win.webContents.on('did-finish-load', () => { win?.webContents.send('main-process-message', (new Date).toLocaleString()) }) if (VITE_DEV_SERVER_URL) { win.loadURL(VITE_DEV_SERVER_URL + '?windowType=editor') } else { win.loadFile(path.join(RENDERER_DIST, 'index.html'), { query: { windowType: 'editor' } }) } return win } export function createSourceSelectorWindow(): BrowserWindow { const { width, height } = screen.getPrimaryDisplay().workAreaSize const win = new BrowserWindow({ width: 620, height: 420, minHeight: 350, maxHeight: 500, x: Math.round((width - 620) / 2), y: Math.round((height - 420) / 2), frame: false, resizable: false, alwaysOnTop: true, transparent: true, backgroundColor: '#00000000', webPreferences: { preload: path.join(__dirname, 'preload.mjs'), nodeIntegration: false, contextIsolation: true, }, }) if (VITE_DEV_SERVER_URL) { win.loadURL(VITE_DEV_SERVER_URL + '?windowType=source-selector') } else { win.loadFile(path.join(RENDERER_DIST, 'index.html'), { query: { windowType: 'source-selector' } }) } return win }