diff --git a/electron/main.ts b/electron/main.ts index 4adcc99c..f00f264d 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -891,8 +891,22 @@ app.whenReady().then(async () => { // ignored by the native capture pipeline. session.defaultSession.setDisplayMediaRequestHandler(async (_request, callback) => { try { - const sources = await desktopCapturer.getSources({ types: ["screen", "window"] }); const sourceId = getSelectedSourceId(); + // On Linux/Wayland, calling desktopCapturer.getSources() itself + // invokes the xdg-desktop-portal picker. If we then return one of + // those sources, Chromium triggers a SECOND portal because the + // pre-enumerated source IDs are stale on Wayland. To collapse this + // into a single portal invocation, when the Linux portal sentinel + // is set we skip getSources entirely and hand back a synthetic + // source id; Chromium then opens the portal once to actually + // resolve the capture. + const isLinuxPortalSentinel = + process.platform === "linux" && sourceId === "screen:linux-portal"; + if (isLinuxPortalSentinel) { + callback({ video: { id: "screen:0:0", name: "Entire screen" } }); + return; + } + const sources = await desktopCapturer.getSources({ types: ["screen", "window"] }); const source = sourceId ? (sources.find((s) => s.id === sourceId) ?? sources[0]) : sources[0]; diff --git a/electron/windows.ts b/electron/windows.ts index 7439f716..819c2b5c 100644 --- a/electron/windows.ts +++ b/electron/windows.ts @@ -788,6 +788,11 @@ export function createEditorWindow(): BrowserWindow { win.webContents.on("did-finish-load", () => { console.log("[editor-window] did-finish-load", win.webContents.getURL()); win?.webContents.send("main-process-message", new Date().toLocaleString()); + // Fallback for Linux/Wayland where `ready-to-show` may not fire reliably. + if (!win.isDestroyed() && !win.isVisible()) { + console.log("[editor-window] forcing show after did-finish-load"); + win.show(); + } }); win.webContents.on("did-fail-load", (_event, errorCode, errorDescription, validatedURL) => { diff --git a/src/components/launch/LaunchWindow.tsx b/src/components/launch/LaunchWindow.tsx index 2b12ea29..9bbcd2f0 100644 --- a/src/components/launch/LaunchWindow.tsx +++ b/src/components/launch/LaunchWindow.tsx @@ -1144,7 +1144,11 @@ export function LaunchWindow() {