From cbf82f9317675c000715cd4b6684144d85602130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=93=D0=BB=D0=B0=D0=B7=D1=83?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2?= Date: Thu, 15 Jan 2026 19:28:45 +0300 Subject: [PATCH] Refactor screen capture handler to use system picker across all platforms --- src/utils/window.js | 91 +++++---------------------------------------- 1 file changed, 9 insertions(+), 82 deletions(-) diff --git a/src/utils/window.js b/src/utils/window.js index 6f91383..941b5b7 100644 --- a/src/utils/window.js +++ b/src/utils/window.js @@ -35,88 +35,15 @@ function createWindow(sendToRenderer, geminiSessionRef) { const { session, desktopCapturer } = require('electron'); // Setup display media request handler for screen capture - if (process.platform === 'darwin') { - // On macOS, use SystemAudioDump for audio (not browser loopback) - // So we just need to capture the screen - session.defaultSession.setDisplayMediaRequestHandler( - async (request, callback) => { - try { - const sources = await desktopCapturer.getSources({ - types: ['screen'], - thumbnailSize: { width: 0, height: 0 } // Skip thumbnail generation for speed - }); - - if (sources.length === 0) { - console.error('No screen sources available'); - callback(null); - return; - } - - // On macOS, directly use the first screen (system already granted permission) - // Audio is handled separately by SystemAudioDump - console.log('Screen capture source:', sources[0].name); - callback({ video: sources[0], audio: 'loopback' }); - } catch (error) { - console.error('Error getting screen sources:', error); - callback(null); - } - }, - { useSystemPicker: false } // Disable system picker, use our source directly - ); - } else if (process.platform === 'win32') { - // On Windows, use desktopCapturer with loopback audio - // This captures system audio via WASAPI without needing user interaction - session.defaultSession.setDisplayMediaRequestHandler( - async (request, callback) => { - try { - console.log('Windows: Getting screen sources with loopback audio...'); - const sources = await desktopCapturer.getSources({ - types: ['screen'], - thumbnailSize: { width: 0, height: 0 } - }); - - if (sources.length === 0) { - console.error('No screen sources available on Windows'); - callback(null); - return; - } - - console.log('Windows: Using screen source:', sources[0].name, 'with loopback audio'); - // 'loopback' enables system audio capture via WASAPI on Windows - callback({ video: sources[0], audio: 'loopback' }); - } catch (error) { - console.error('Error getting screen sources on Windows:', error); - callback(null); - } - }, - { useSystemPicker: false } - ); - } else { - // On Linux, try to get system audio via loopback - session.defaultSession.setDisplayMediaRequestHandler( - async (request, callback) => { - try { - const sources = await desktopCapturer.getSources({ - types: ['screen'], - thumbnailSize: { width: 0, height: 0 } - }); - - if (sources.length === 0) { - console.error('No screen sources available'); - callback(null); - return; - } - - console.log('Linux: Using screen source with loopback audio'); - callback({ video: sources[0], audio: 'loopback' }); - } catch (error) { - console.error('Error getting screen sources:', error); - callback(null); - } - }, - { useSystemPicker: false } - ); - } + // Use system picker on all platforms to let user choose screen/window and audio + session.defaultSession.setDisplayMediaRequestHandler( + (request, callback) => { + // Don't call callback - let system picker handle the selection + // The system will call callback with user's choice + console.log('Showing system screen picker dialog...'); + }, + { useSystemPicker: true } + ); mainWindow.setResizable(false); mainWindow.setContentProtection(true);