diff --git a/electron/main.js b/electron/main.js index ef0829d..4ed7433 100644 --- a/electron/main.js +++ b/electron/main.js @@ -1,5 +1,7 @@ const { app, BrowserWindow, session, shell, desktopCapturer, autoUpdater, dialog, ipcMain, Notification } = require('electron'); const path = require('path'); +const fs = require('fs'); +const os = require('os'); const { setupAdBlocker } = require('./ad-blocker'); // Handle Squirrel events (Windows installer) @@ -93,6 +95,9 @@ function createWindow() { setupAdBlocker(session.defaultSession); // Enable screen capture (getDisplayMedia) in Electron — always show picker + // IPC channel for picker result + const PICKER_CHANNEL = 'screen-picker-result'; + session.defaultSession.setDisplayMediaRequestHandler(async (_request, callback) => { const sources = await desktopCapturer.getSources({ types: ['screen', 'window'], thumbnailSize: { width: 320, height: 180 } }); if (sources.length === 0) { @@ -100,28 +105,14 @@ function createWindow() { return; } - // Build a picker window so the user always chooses - const picker = new BrowserWindow({ - width: 680, - height: 520, - parent: mainWindow, - modal: true, - resizable: false, - minimizable: false, - maximizable: false, - title: 'Bildschirm / Fenster ausw\u00e4hlen', - backgroundColor: '#1a1b1e', - autoHideMenuBar: true, - webPreferences: { contextIsolation: true, nodeIntegration: false }, - }); - const sourceData = sources.map(s => ({ id: s.id, name: s.name, thumbnail: s.thumbnail.toDataURL(), })); - const html = ` + // Write picker HTML to a temp file (data: URLs are blocked in Electron) + const pickerHtml = ` -

Bildschirm oder Fenster ausw\u00e4hlen

+

Bildschirm oder Fenster w\\u00e4hlen

-
+
`; - picker.loadURL('data:text/html;charset=utf-8,' + encodeURIComponent(html)); + const tmpFile = path.join(os.tmpdir(), 'gaming-hub-screen-picker.html'); + fs.writeFileSync(tmpFile, pickerHtml, 'utf-8'); + + const picker = new BrowserWindow({ + width: 680, + height: 520, + parent: mainWindow, + modal: true, + resizable: false, + minimizable: false, + maximizable: false, + title: 'Bildschirm / Fenster w\u00e4hlen', + backgroundColor: '#1a1b1e', + autoHideMenuBar: true, + webPreferences: { + contextIsolation: false, + nodeIntegration: true, + }, + }); + + picker.loadFile(tmpFile); let resolved = false; - picker.webContents.on('page-title-updated', (_ev, title) => { - if (!title.startsWith('PICK:')) return; + + const onPickerResult = (_event, selectedId) => { + if (resolved) return; resolved = true; - const selectedId = title.slice(5); + ipcMain.removeListener(PICKER_CHANNEL, onPickerResult); picker.close(); + try { fs.unlinkSync(tmpFile); } catch {} + if (!selectedId) { callback({}); return; @@ -171,10 +193,17 @@ function choose(id) { } else { callback({}); } - }); + }; + + ipcMain.on(PICKER_CHANNEL, onPickerResult); picker.on('closed', () => { - if (!resolved) callback({}); + try { fs.unlinkSync(tmpFile); } catch {} + if (!resolved) { + resolved = true; + ipcMain.removeListener(PICKER_CHANNEL, onPickerResult); + callback({}); + } }); });