From 3f6853e425234ddad657df4c1df263b7d921d293 Mon Sep 17 00:00:00 2001 From: chbndrhnns Date: Tue, 30 Jun 2026 11:18:37 +0200 Subject: [PATCH 1/3] fix: highlight selected recording target Fixes webadderallorg/Recordly#718 --- electron/electron-env.d.ts | 6 +- electron/ipc/cursor/bounds.ts | 50 +++ electron/ipc/paths/binaries.ts | 27 +- electron/ipc/register/recording.ts | 2 + electron/ipc/register/sources.ts | 358 +++++++----------- electron/ipc/types.ts | 5 + electron/main.ts | 3 + .../native/ScreenCaptureKitWindowList.swift | 206 +++++++++- .../bin/darwin-arm64/recordly-window-list | Bin 116024 -> 123720 bytes .../bin/darwin-x64/recordly-window-list | Bin 82424 -> 101712 bytes electron/preload.ts | 10 +- electron/sourceHighlight.ts | 46 +++ electron/sourceHighlightController.test.ts | 117 ++++++ electron/sourceHighlightController.ts | 178 +++++++++ src/components/launch/LaunchWindow.tsx | 36 +- src/components/launch/SourceSelector.tsx | 28 +- .../launch/hooks/useLaunchWindowActions.ts | 33 +- .../launch/popovers/SourcePopover.tsx | 88 ++++- .../popovers/sourcePreviewRequestGate.test.ts | 14 + .../popovers/sourcePreviewRequestGate.ts | 13 + src/components/video-editor/VideoPlayback.tsx | 1 - src/hooks/useScreenRecorder.ts | 20 + 22 files changed, 1008 insertions(+), 233 deletions(-) create mode 100644 electron/sourceHighlight.ts create mode 100644 electron/sourceHighlightController.test.ts create mode 100644 electron/sourceHighlightController.ts create mode 100644 src/components/launch/popovers/sourcePreviewRequestGate.test.ts create mode 100644 src/components/launch/popovers/sourcePreviewRequestGate.ts diff --git a/electron/electron-env.d.ts b/electron/electron-env.d.ts index 2aa748b49..7e747140c 100644 --- a/electron/electron-env.d.ts +++ b/electron/electron-env.d.ts @@ -222,7 +222,11 @@ interface Window { switchToEditor: () => Promise; openSourceSelector: () => Promise; selectSource: (source: ProcessedDesktopSource) => Promise; - showSourceHighlight: (source: ProcessedDesktopSource) => Promise<{ success: boolean }>; + showSourceHighlight: ( + source: ProcessedDesktopSource, + options?: { activateWindow?: boolean }, + ) => Promise<{ success: boolean }>; + clearSourceHighlight: () => Promise<{ success: boolean }>; getSelectedSource: () => Promise; onSelectedSourceChanged: ( callback: (source: ProcessedDesktopSource | null) => void, diff --git a/electron/ipc/cursor/bounds.ts b/electron/ipc/cursor/bounds.ts index 02fb3c754..15cc45848 100644 --- a/electron/ipc/cursor/bounds.ts +++ b/electron/ipc/cursor/bounds.ts @@ -86,6 +86,39 @@ export function getWindowBoundsFromNativeSource( return { x, y, width, height }; } +export function getVisibleWindowBoundsFromNativeSource( + source?: NativeMacWindowSource | null, +): WindowBounds | null { + if (!source || source.visible === false) { + return null; + } + + const { + visibleX: x, + visibleY: y, + visibleWidth: width, + visibleHeight: height, + } = source; + if ( + typeof x !== "number" || + !Number.isFinite(x) || + typeof y !== "number" || + !Number.isFinite(y) || + typeof width !== "number" || + !Number.isFinite(width) || + typeof height !== "number" || + !Number.isFinite(height) + ) { + return getWindowBoundsFromNativeSource(source); + } + + if (width <= 0 || height <= 0) { + return null; + } + + return { x, y, width, height }; +} + export async function resolveMacWindowBounds(source: SelectedSource): Promise { const windowId = parseWindowId(source.id); if (!windowId) { @@ -101,6 +134,23 @@ export async function resolveMacWindowBounds(source: SelectedSource): Promise { + const windowId = parseWindowId(source.id); + if (!windowId) { + return null; + } + + try { + const nativeSources = await getNativeMacWindowSources({ maxAgeMs: 0 }); + const matchedSource = nativeSources.find((entry) => parseWindowId(entry.id) === windowId); + return getVisibleWindowBoundsFromNativeSource(matchedSource); + } catch { + return null; + } +} + export function parseXwininfoBounds(stdout: string): WindowBounds | null { const absX = stdout.match(/Absolute upper-left X:\s+(-?\d+)/); const absY = stdout.match(/Absolute upper-left Y:\s+(-?\d+)/); diff --git a/electron/ipc/paths/binaries.ts b/electron/ipc/paths/binaries.ts index 739f7df84..8e6575713 100644 --- a/electron/ipc/paths/binaries.ts +++ b/electron/ipc/paths/binaries.ts @@ -4,10 +4,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import { promisify } from "node:util"; import { app } from "electron"; -import { - nativeHelperMigrationPromise, - setNativeHelperMigrationPromise, -} from "../state"; +import { nativeHelperMigrationPromise, setNativeHelperMigrationPromise } from "../state"; const execFileAsync = promisify(execFile); @@ -49,6 +46,20 @@ export function getPrebundledNativeHelperPath(binaryName: string): string { return resolveUnpackedAppPath("electron", "native", "bin", getNativeArchTag(), binaryName); } +function getWindowsNativeArchTag(): string { + return process.arch === "arm64" ? "win32-arm64" : "win32-x64"; +} + +function getPrebundledWindowsNativeHelperPath(binaryName: string): string { + return resolveUnpackedAppPath( + "electron", + "native", + "bin", + getWindowsNativeArchTag(), + binaryName, + ); +} + export function resolvePreferredWindowsNativeHelperPath( helperDirectory: string, binaryName: string, @@ -61,7 +72,7 @@ export function resolvePreferredWindowsNativeHelperPath( "Release", binaryName, ); - const prebundledPath = getPrebundledNativeHelperPath(binaryName); + const prebundledPath = getPrebundledWindowsNativeHelperPath(binaryName); if (app.isPackaged && existsSync(prebundledPath)) { return prebundledPath; @@ -128,7 +139,11 @@ export function getCursorMonitorExePath(): string { async function migrateLegacyNativeHelperBinaries(): Promise { const legacyToCurrentPaths: Array<[string, string]> = [ [ - path.join(app.getPath("userData"), "native-tools", "openscreen-screencapturekit-helper"), + path.join( + app.getPath("userData"), + "native-tools", + "openscreen-screencapturekit-helper", + ), getNativeCaptureHelperBinaryPath(), ], [ diff --git a/electron/ipc/register/recording.ts b/electron/ipc/register/recording.ts index b13453c74..9f2604251 100644 --- a/electron/ipc/register/recording.ts +++ b/electron/ipc/register/recording.ts @@ -13,6 +13,7 @@ import { systemPreferences, } from "electron"; import { showCursor } from "../../cursorHider"; +import { clearSourceHighlightWindow } from "../../sourceHighlight"; import { getMonitorHandles } from "../monitorResolver"; import { ALLOW_RECORDLY_WINDOW_CAPTURE } from "../constants"; import { startWindowBoundsCapture, stopWindowBoundsCapture } from "../cursor/bounds"; @@ -1827,6 +1828,7 @@ export function registerRecordingHandlers( startCursorSampling(); void startInteractionCapture(); } else { + clearSourceHighlightWindow(); setIsCursorCaptureActive(false); stopCursorCapture(); stopInteractionCapture(); diff --git a/electron/ipc/register/sources.ts b/electron/ipc/register/sources.ts index 33c9ee74c..0c9ca5310 100644 --- a/electron/ipc/register/sources.ts +++ b/electron/ipc/register/sources.ts @@ -4,17 +4,19 @@ import { app, BrowserWindow, desktopCapturer, ipcMain } from "electron"; import { ALLOW_RECORDLY_WINDOW_CAPTURE } from "../constants"; import { selectedSource, setSelectedSource } from "../state"; import type { SelectedSource } from "../types"; -import { getScreen, parseWindowId } from "../utils"; +import { getScreen } from "../utils"; import { getDisplayBoundsForSource, getDisplayWorkAreaForSource } from "../recording/ffmpeg"; import { getScreenSourceIdForDisplay } from "./sourceMapping"; import { getNativeMacWindowSources, - resolveMacWindowBounds, + resolveMacWindowVisibleBounds, resolveWindowsWindowBounds, - resolveLinuxWindowBounds, stopWindowBoundsCapture, } from "../cursor/bounds"; -import { reassertHudOverlayMousePassthrough } from "../../windows"; +import { + clearSourceHighlightWindow, + showSourceHighlightWindow, +} from "../../sourceHighlight"; const execFileAsync = promisify(execFile); const SOURCE_LIST_CACHE_TTL_MS = 1200; @@ -26,10 +28,43 @@ let sourceListCache: } | null = null; +type SourceHighlightIpcOptions = { + activateWindow?: boolean; +}; + function normalizeDesktopSourceName(value: string) { return value.trim().replace(/\s+/g, " ").toLowerCase(); } +function intersectBounds( + first: { x: number; y: number; width: number; height: number }, + second: { x: number; y: number; width: number; height: number }, +) { + const x = Math.max(first.x, second.x); + const y = Math.max(first.y, second.y); + const right = Math.min(first.x + first.width, second.x + second.width); + const bottom = Math.min(first.y + first.height, second.y + second.height); + const width = right - x; + const height = bottom - y; + + return width > 0 && height > 0 ? { x, y, width, height } : null; +} + +function getVisibleWindowHighlightBounds(bounds: { + x: number; + y: number; + width: number; + height: number; +}) { + const intersections = getScreen() + .getAllDisplays() + .map((display) => intersectBounds(bounds, display.bounds)) + .filter((candidate): candidate is typeof bounds => candidate !== null) + .sort((left, right) => right.width * right.height - left.width * left.height); + + return intersections[0] ?? null; +} + function broadcastSelectedSourceChange() { for (const window of BrowserWindow.getAllWindows()) { if (!window.isDestroyed()) { @@ -316,227 +351,126 @@ export function registerSourceHandlers({ return selectedSource; }); - ipcMain.handle("show-source-highlight", async (_, source: SelectedSource) => { - try { - const isWindow = source.id?.startsWith("window:"); - const windowId = isWindow ? parseWindowId(source.id) : null; - - // ── 1. Bring window to front ── - if (isWindow && process.platform === "darwin") { - const rawAppName = source.appName || source.name?.split(" — ")[0]?.trim(); - const appName = - rawAppName && /^[\w .&()+'-]{1,64}$/.test(rawAppName) ? rawAppName : null; - if (appName) { - try { - await execFileAsync( - "osascript", - [ - "-e", - "on run argv", - "-e", - "tell application (item 1 of argv) to activate", - "-e", - "end run", - "--", - appName, - ], - { timeout: 2000 }, - ); - await new Promise((resolve) => setTimeout(resolve, 350)); - } catch { - /* ignore */ - } + ipcMain.handle( + "show-source-highlight", + async (_, source: SelectedSource, options?: SourceHighlightIpcOptions) => { + try { + const isWindow = source.id?.startsWith("window:"); + const shouldActivateWindow = options?.activateWindow !== false; + + if (process.platform === "linux") { + clearSourceHighlightWindow(); + return { success: false }; } - } else if (windowId && process.platform === "linux") { - try { - await execFileAsync("wmctrl", ["-i", "-a", `0x${windowId.toString(16)}`], { - timeout: 1500, - }); - } catch { - try { - await execFileAsync("xdotool", ["windowactivate", String(windowId)], { - timeout: 1500, - }); - } catch { - /* not available */ + + // ── 1. Bring window to front ── + if (shouldActivateWindow && isWindow && process.platform === "darwin") { + const rawAppName = source.appName || source.name?.split(" — ")[0]?.trim(); + const appName = + rawAppName && /^[\w .&()+'-]{1,64}$/.test(rawAppName) + ? rawAppName + : null; + if (appName) { + try { + await execFileAsync( + "osascript", + [ + "-e", + "on run argv", + "-e", + "tell application (item 1 of argv) to activate", + "-e", + "end run", + "--", + appName, + ], + { timeout: 2000 }, + ); + await new Promise((resolve) => setTimeout(resolve, 350)); + } catch { + /* ignore */ + } } } - await new Promise((resolve) => setTimeout(resolve, 250)); - } - // ── 2. Resolve bounds ── - let bounds: { x: number; y: number; width: number; height: number } | null = null; - - if (source.id?.startsWith("screen:")) { - bounds = - process.platform === "darwin" - ? getDisplayWorkAreaForSource(source) - : getDisplayBoundsForSource(source); - } else if (isWindow) { - if (process.platform === "darwin") { - bounds = await resolveMacWindowBounds(source); - } else if (process.platform === "win32") { - bounds = await resolveWindowsWindowBounds(source); - } else if (process.platform === "linux") { - bounds = await resolveLinuxWindowBounds(source); + // ── 2. Resolve bounds ── + let bounds: { x: number; y: number; width: number; height: number } | null = + null; + + if (source.id?.startsWith("screen:")) { + bounds = + process.platform === "darwin" + ? getDisplayWorkAreaForSource(source) + : getDisplayBoundsForSource(source); + } else if (isWindow) { + if (process.platform === "darwin") { + bounds = await resolveMacWindowVisibleBounds(source); + } else if (process.platform === "win32") { + bounds = await resolveWindowsWindowBounds(source); + } } - } - - if (!bounds || bounds.width <= 0 || bounds.height <= 0) { - bounds = getDisplayBoundsForSource(source); - } - if (!bounds || bounds.width <= 0 || bounds.height <= 0) { - const primaryBounds = getScreen().getPrimaryDisplay().bounds; - if (primaryBounds.width <= 0 || primaryBounds.height <= 0) { - return { success: false }; + if (isWindow) { + if (!bounds || bounds.width <= 0 || bounds.height <= 0) { + clearSourceHighlightWindow(); + return { success: false }; + } + const visibleBounds = getVisibleWindowHighlightBounds(bounds); + if (!visibleBounds) { + clearSourceHighlightWindow(); + return { success: false }; + } + bounds = visibleBounds; } - bounds = primaryBounds; - } - const resolvedBounds = bounds; - - // ── 3. Show traveling wave highlight ── - // On macOS, screen highlights use workArea and no outward padding — - // macOS clamps window positions below the menu bar so outward - // padding only works on the left/top while right/bottom run off-screen. - const isScreen = source.id?.startsWith("screen:"); - const isMacScreen = isScreen && process.platform === "darwin"; - const pad = isMacScreen ? 0 : 6; - const highlightWin = new BrowserWindow({ - x: resolvedBounds.x - pad, - y: resolvedBounds.y - pad, - width: resolvedBounds.width + pad * 2, - height: resolvedBounds.height + pad * 2, - frame: false, - transparent: true, - alwaysOnTop: true, - skipTaskbar: true, - hasShadow: false, - resizable: false, - focusable: false, - webPreferences: { nodeIntegration: false, contextIsolation: true }, - }); - - highlightWin.setIgnoreMouseEvents(true); - - const borderRadius = isMacScreen ? 0 : 10; - const glowInset = isMacScreen ? 0 : -4; - const glowRadius = isMacScreen ? 0 : 14; - const glowPad = isMacScreen ? 3 : 6; - - const html = ` - -
-
-` + ipcMain.handle("clear-source-highlight", () => { + clearSourceHighlightWindow(); + return { success: true }; + }); - try { - await highlightWin.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(html)}`) - } catch (loadError) { - if (!highlightWin.isDestroyed()) { - highlightWin.close() - } - throw loadError - } + ipcMain.handle("get-selected-source", () => { + return selectedSource; + }); - // The highlight window appearing (even with focusable:false) can corrupt - // the WS_EX_TRANSPARENT flag on the HUD on Windows 11+, breaking hover - // detection until the user moves their mouse over the bar again. - // Re-assert passthrough immediately so click-through is restored at once. - reassertHudOverlayMousePassthrough(); - - const highlightCloseTimer = setTimeout(() => { - if (!highlightWin.isDestroyed()) highlightWin.close() - }, 1700) - - highlightWin.on("closed", () => { - clearTimeout(highlightCloseTimer); - // Re-assert once more when the window is actually destroyed so the - // native flag is clean regardless of timing. - reassertHudOverlayMousePassthrough(); - }); - - return { success: true } - } catch (error) { - console.error('Failed to show source highlight:', error) - return { success: false } - } - }) - - ipcMain.handle('get-selected-source', () => { - return selectedSource - }) - - ipcMain.handle('open-source-selector', () => { - const sourceSelectorWin = getSourceSelectorWindow() - if (sourceSelectorWin) { - sourceSelectorWin.focus() - return - } - createSourceSelectorWindow() - }) - ipcMain.handle('switch-to-editor', () => { - console.log('[switch-to-editor] Opening editor window') - const sourceSelectorWin = getSourceSelectorWindow() - if (sourceSelectorWin && !sourceSelectorWin.isDestroyed()) { - sourceSelectorWin.close() - } - createEditorWindow() - }) + ipcMain.handle("open-source-selector", () => { + const sourceSelectorWin = getSourceSelectorWindow(); + if (sourceSelectorWin) { + sourceSelectorWin.focus(); + return; + } + createSourceSelectorWindow(); + }); + ipcMain.handle("switch-to-editor", () => { + console.log("[switch-to-editor] Opening editor window"); + const sourceSelectorWin = getSourceSelectorWindow(); + if (sourceSelectorWin && !sourceSelectorWin.isDestroyed()) { + sourceSelectorWin.close(); + } + createEditorWindow(); + }); } diff --git a/electron/ipc/types.ts b/electron/ipc/types.ts index 58f5425bd..6afcb4764 100644 --- a/electron/ipc/types.ts +++ b/electron/ipc/types.ts @@ -118,6 +118,11 @@ export type NativeMacWindowSource = { y?: number; width?: number; height?: number; + visible?: boolean; + visibleX?: number; + visibleY?: number; + visibleWidth?: number; + visibleHeight?: number; }; export type HookEventName = "mousedown" | "mouseup" | "mousemove"; diff --git a/electron/main.ts b/electron/main.ts index ed05ffeb6..7f8515f2a 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -27,6 +27,7 @@ import { } from "./ipc/handlers"; import { ensureMediaServer } from "./mediaServer"; import { ensurePackagedRendererServer } from "./rendererServer"; +import { clearSourceHighlightWindow } from "./sourceHighlight"; import type { UpdateToastPayload } from "./updater"; import { checkForAppUpdates, @@ -851,6 +852,7 @@ function createSourceSelectorWindowWrapper() { // On macOS, applications and their menu bar stay active until the user quits // explicitly with Cmd + Q. app.on("before-quit", () => { + clearSourceHighlightWindow(); killWindowsCaptureProcess(); showCursor(); cleanupNativeVideoExportSessions(); @@ -917,6 +919,7 @@ app.whenReady().then(async () => { } ipcMain.on("hud-overlay-close", () => { + clearSourceHighlightWindow(); const hud = getHudOverlayWindow(); if (hud) { console.log("[main] Closing HUD window via hud-overlay-close"); diff --git a/electron/native/ScreenCaptureKitWindowList.swift b/electron/native/ScreenCaptureKitWindowList.swift index cdb2f5757..018d4464e 100644 --- a/electron/native/ScreenCaptureKitWindowList.swift +++ b/electron/native/ScreenCaptureKitWindowList.swift @@ -1,6 +1,7 @@ import Foundation import CoreGraphics import ScreenCaptureKit +import AppKit struct WindowListEntry: Codable { let id: String @@ -13,6 +14,38 @@ struct WindowListEntry: Codable { let y: Double let width: Double let height: Double + let visible: Bool + let visibleX: Double? + let visibleY: Double? + let visibleWidth: Double? + let visibleHeight: Double? +} + +struct WindowRect { + let x: Double + let y: Double + let width: Double + let height: Double + + var right: Double { x + width } + var bottom: Double { y + height } + + func intersection(_ other: WindowRect) -> WindowRect? { + let nextX = max(x, other.x) + let nextY = max(y, other.y) + let nextRight = min(right, other.right) + let nextBottom = min(bottom, other.bottom) + let nextWidth = nextRight - nextX + let nextHeight = nextBottom - nextY + return nextWidth > 0 && nextHeight > 0 + ? WindowRect(x: nextX, y: nextY, width: nextWidth, height: nextHeight) + : nil + } +} + +struct WindowVisibility { + let visible: Bool + let bounds: WindowRect? } func normalize(_ value: String?) -> String? { @@ -38,6 +71,168 @@ let excludedWindowTitles: Set = [ "Wallpaper-", ] +func rectFromCgWindowBounds(_ value: Any?) -> WindowRect? { + guard let dictionary = value as? NSDictionary else { + return nil + } + + var rect = CGRect.zero + if CGRectMakeWithDictionaryRepresentation(dictionary, &rect) { + return WindowRect( + x: Double(rect.origin.x), + y: Double(rect.origin.y), + width: Double(rect.width), + height: Double(rect.height) + ) + } + + return nil +} + +func subtract(_ cutout: WindowRect, from source: WindowRect) -> [WindowRect] { + guard let overlap = source.intersection(cutout) else { + return [source] + } + + var pieces: [WindowRect] = [] + + if overlap.y > source.y { + pieces.append(WindowRect( + x: source.x, + y: source.y, + width: source.width, + height: overlap.y - source.y + )) + } + + if overlap.bottom < source.bottom { + pieces.append(WindowRect( + x: source.x, + y: overlap.bottom, + width: source.width, + height: source.bottom - overlap.bottom + )) + } + + if overlap.x > source.x { + pieces.append(WindowRect( + x: source.x, + y: overlap.y, + width: overlap.x - source.x, + height: overlap.height + )) + } + + if overlap.right < source.right { + pieces.append(WindowRect( + x: overlap.right, + y: overlap.y, + width: source.right - overlap.right, + height: overlap.height + )) + } + + return pieces.filter { $0.width > 0 && $0.height > 0 } +} + +func unionRect(_ rects: [WindowRect]) -> WindowRect? { + guard let first = rects.first else { + return nil + } + + var minX = first.x + var minY = first.y + var maxRight = first.right + var maxBottom = first.bottom + + for rect in rects.dropFirst() { + minX = min(minX, rect.x) + minY = min(minY, rect.y) + maxRight = max(maxRight, rect.right) + maxBottom = max(maxBottom, rect.bottom) + } + + return WindowRect(x: minX, y: minY, width: maxRight - minX, height: maxBottom - minY) +} + +func shouldIgnoreWindowStackEntry(_ entry: [String: Any]) -> Bool { + let layer = entry[kCGWindowLayer as String] as? Int ?? 0 + if layer != 0 { + return true + } + + let alpha = entry[kCGWindowAlpha as String] as? Double ?? 1 + if alpha <= 0 { + return true + } + + if let appName = normalize(entry[kCGWindowOwnerName as String] as? String), + appName == "Recordly" { + return true + } + + let ownerPid = entry[kCGWindowOwnerPID as String] as? pid_t + let bundleId = ownerPid.flatMap { pid in + normalize(NSRunningApplication(processIdentifier: pid)?.bundleIdentifier) + } + if let bundleId, excludedBundleIds.contains(bundleId) { + return true + } + + if let windowTitle = normalize(entry[kCGWindowName as String] as? String), + excludedWindowTitles.contains(windowTitle) { + return true + } + + guard let bounds = rectFromCgWindowBounds(entry[kCGWindowBounds as String]), + bounds.width >= 1, + bounds.height >= 1 else { + return true + } + + return false +} + +func buildVisibilityByWindowId() -> [UInt32: WindowVisibility] { + guard let windowInfo = CGWindowListCopyWindowInfo( + [.optionOnScreenOnly, .excludeDesktopElements], + kCGNullWindowID + ) as? [[String: Any]] else { + return [:] + } + + var visibilityByWindowId: [UInt32: WindowVisibility] = [:] + var coveringRects: [WindowRect] = [] + + for entry in windowInfo { + guard let windowNumber = entry[kCGWindowNumber as String] as? UInt32, + let bounds = rectFromCgWindowBounds(entry[kCGWindowBounds as String]) else { + continue + } + + if shouldIgnoreWindowStackEntry(entry) { + continue + } + + var visibleRects = [bounds] + for cover in coveringRects { + visibleRects = visibleRects.flatMap { subtract(cover, from: $0) } + if visibleRects.isEmpty { + break + } + } + + visibilityByWindowId[windowNumber] = WindowVisibility( + visible: !visibleRects.isEmpty, + bounds: unionRect(visibleRects) + ) + + coveringRects.append(bounds) + } + + return visibilityByWindowId +} + // Force CoreGraphics Services initialization before asking ScreenCaptureKit for // shareable content. Without this, the helper can stall sporadically when run // as a standalone CLI process from Electron. @@ -49,6 +244,8 @@ group.enter() Task { do { let shareableContent = try await SCShareableContent.excludingDesktopWindows(false, onScreenWindowsOnly: true) + let visibilityByWindowId = buildVisibilityByWindowId() + let hasVisibilityStack = !visibilityByWindowId.isEmpty struct RawWindowEntry { let entry: WindowListEntry @@ -61,6 +258,8 @@ Task { let windowTitle = normalize(window.title) let bundleId = normalize(window.owningApplication?.bundleIdentifier) let frame = window.frame + let visibility = visibilityByWindowId[window.windowID] + let visibleBounds = visibility?.bounds guard window.windowLayer == 0 else { return nil @@ -104,7 +303,12 @@ Task { x: Double(frame.origin.x), y: Double(frame.origin.y), width: Double(frame.width), - height: Double(frame.height) + height: Double(frame.height), + visible: hasVisibilityStack ? (visibility?.visible ?? false) : true, + visibleX: visibleBounds?.x, + visibleY: visibleBounds?.y, + visibleWidth: visibleBounds?.width, + visibleHeight: visibleBounds?.height ) return RawWindowEntry(entry: entry, hasRawTitle: windowTitle != nil, bundleId: bundleId) diff --git a/electron/native/bin/darwin-arm64/recordly-window-list b/electron/native/bin/darwin-arm64/recordly-window-list index 76a7dab4a2dab0351d09f7d82e8fdbbc517d6bd5..3189bf315a1cac733024285a9b7e4dd398de7b0f 100755 GIT binary patch literal 123720 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 literal 116024 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

FrAuB$7Qj3-@hH--P0dM47Y? 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 literal 82424 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

~BIUfY3^T+~Mgs@>hB$UjOetW)$>tE=|{d((_ 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 Uy0@q*CuT1;sg_D!*nGbK1&wCq`v3p{ diff --git a/electron/preload.ts b/electron/preload.ts index 9a15edb99..9c634afdc 100644 --- a/electron/preload.ts +++ b/electron/preload.ts @@ -485,8 +485,14 @@ contextBridge.exposeInMainWorld("electronAPI", { selectSource: (source: ProcessedDesktopSource) => { return ipcRenderer.invoke("select-source", source); }, - showSourceHighlight: (source: ProcessedDesktopSource) => { - return ipcRenderer.invoke("show-source-highlight", source); + showSourceHighlight: ( + source: ProcessedDesktopSource, + options?: { activateWindow?: boolean }, + ) => { + return ipcRenderer.invoke("show-source-highlight", source, options); + }, + clearSourceHighlight: () => { + return ipcRenderer.invoke("clear-source-highlight"); }, getSelectedSource: () => { return ipcRenderer.invoke("get-selected-source"); diff --git a/electron/sourceHighlight.ts b/electron/sourceHighlight.ts new file mode 100644 index 000000000..e1ca9b8a2 --- /dev/null +++ b/electron/sourceHighlight.ts @@ -0,0 +1,46 @@ +import { BrowserWindow } from "electron"; +import type { WindowBounds } from "./ipc/types"; +import { + createSourceHighlightController, + type SourceHighlightWindowBoundsOptions, +} from "./sourceHighlightController"; +import { reassertHudOverlayMousePassthrough } from "./windows"; + +const sourceHighlightController = createSourceHighlightController({ + createWindow: (bounds: WindowBounds) => + new BrowserWindow({ + x: bounds.x, + y: bounds.y, + width: bounds.width, + height: bounds.height, + frame: false, + transparent: true, + backgroundColor: "#00000000", + alwaysOnTop: true, + skipTaskbar: true, + hasShadow: false, + resizable: false, + minimizable: false, + maximizable: false, + fullscreenable: false, + focusable: false, + show: false, + webPreferences: { + nodeIntegration: false, + contextIsolation: true, + backgroundThrottling: false, + }, + }), + reassertHudOverlayMousePassthrough, +}); + +export function showSourceHighlightWindow( + bounds: WindowBounds, + options?: SourceHighlightWindowBoundsOptions, +): Promise { + return sourceHighlightController.show(bounds, options); +} + +export function clearSourceHighlightWindow(): void { + sourceHighlightController.clear(); +} diff --git a/electron/sourceHighlightController.test.ts b/electron/sourceHighlightController.test.ts new file mode 100644 index 000000000..a85d9a9db --- /dev/null +++ b/electron/sourceHighlightController.test.ts @@ -0,0 +1,117 @@ +import { describe, expect, it, vi } from "vitest"; +import type { WindowBounds } from "./ipc/types"; +import { + createSourceHighlightController, + getSourceHighlightWindowBounds, +} from "./sourceHighlightController"; + +function createMockHighlightWindow() { + return { + close: vi.fn(), + isDestroyed: vi.fn(() => false), + loadURL: vi.fn(async () => undefined), + moveTop: vi.fn(), + on: vi.fn(), + setAlwaysOnTop: vi.fn(), + setBounds: vi.fn(), + setContentProtection: vi.fn(), + setIgnoreMouseEvents: vi.fn(), + setVisibleOnAllWorkspaces: vi.fn(), + showInactive: vi.fn(), + }; +} + +describe("getSourceHighlightWindowBounds", () => { + it("adds a small outer pad for window targets", () => { + expect( + getSourceHighlightWindowBounds({ + x: 100, + y: 200, + width: 640, + height: 360, + }), + ).toEqual({ + x: 94, + y: 194, + width: 652, + height: 372, + }); + }); + + it("does not push macOS screen highlights under the menu bar", () => { + const bounds: WindowBounds = { + x: 0, + y: 25, + width: 1440, + height: 875, + }; + + expect(getSourceHighlightWindowBounds(bounds, { isMacScreen: true })).toEqual(bounds); + }); +}); + +describe("createSourceHighlightController", () => { + it("creates a capture-protected click-through green outline window", async () => { + const highlightWindow = createMockHighlightWindow(); + const controller = createSourceHighlightController({ + createWindow: vi.fn(() => highlightWindow), + reassertHudOverlayMousePassthrough: vi.fn(), + }); + + await expect( + controller.show({ + x: 10, + y: 20, + width: 300, + height: 200, + }), + ).resolves.toBe(true); + + expect(highlightWindow.setContentProtection).toHaveBeenCalledWith(true); + expect(highlightWindow.setIgnoreMouseEvents).toHaveBeenCalledWith(true); + expect(highlightWindow.setVisibleOnAllWorkspaces).toHaveBeenCalledWith(true, { + visibleOnFullScreen: true, + }); + const loadedUrl = String(highlightWindow.loadURL.mock.calls[0]?.[0]); + const loadedHtml = Buffer.from(loadedUrl.split(",")[1] ?? "", "base64").toString("utf8"); + expect(loadedHtml).toContain("#00d166"); + expect(loadedHtml).toContain("border-radius:22px"); + }); + + it("redraws hover changes by moving the existing outline instead of replacing it", async () => { + const highlightWindow = createMockHighlightWindow(); + const createWindow = vi.fn(() => highlightWindow); + const controller = createSourceHighlightController({ + createWindow, + reassertHudOverlayMousePassthrough: vi.fn(), + }); + + await controller.show({ x: 0, y: 0, width: 200, height: 100 }); + await controller.show({ x: 300, y: 120, width: 500, height: 280 }); + + expect(createWindow).toHaveBeenCalledTimes(1); + expect(highlightWindow.setBounds).toHaveBeenCalledWith( + { + x: 294, + y: 114, + width: 512, + height: 292, + }, + false, + ); + expect(highlightWindow.close).not.toHaveBeenCalled(); + }); + + it("clears the persistent recording outline explicitly", async () => { + const highlightWindow = createMockHighlightWindow(); + const controller = createSourceHighlightController({ + createWindow: vi.fn(() => highlightWindow), + reassertHudOverlayMousePassthrough: vi.fn(), + }); + + await controller.show({ x: 0, y: 0, width: 200, height: 100 }); + controller.clear(); + + expect(highlightWindow.close).toHaveBeenCalledTimes(1); + }); +}); diff --git a/electron/sourceHighlightController.ts b/electron/sourceHighlightController.ts new file mode 100644 index 000000000..1575a84c0 --- /dev/null +++ b/electron/sourceHighlightController.ts @@ -0,0 +1,178 @@ +import { Buffer } from "node:buffer"; +import type { WindowBounds } from "./ipc/types"; + +const SOURCE_HIGHLIGHT_PAD = 6; +const SOURCE_HIGHLIGHT_COLOR = "#00d166"; +const SOURCE_HIGHLIGHT_INSET = 3; +const SOURCE_HIGHLIGHT_RADIUS = 22; + +type SourceHighlightAlwaysOnTopLevel = + | "normal" + | "status" + | "floating" + | "torn-off-menu" + | "modal-panel" + | "main-menu" + | "pop-up-menu" + | "screen-saver" + | "dock"; + +export type SourceHighlightWindowBoundsOptions = { + isMacScreen?: boolean; +}; + +export interface SourceHighlightWindowLike { + close: () => void; + isDestroyed: () => boolean; + loadURL: (url: string) => Promise; + moveTop?: () => void; + on?: (event: "closed", listener: () => void) => void; + setAlwaysOnTop?: (flag: boolean, level?: SourceHighlightAlwaysOnTopLevel) => void; + setBounds: (bounds: WindowBounds, animate?: boolean) => void; + setContentProtection?: (enable: boolean) => void; + setIgnoreMouseEvents?: (ignore: boolean) => void; + setVisibleOnAllWorkspaces?: ( + visible: boolean, + options?: { visibleOnFullScreen?: boolean }, + ) => void; + showInactive?: () => void; +} + +export type SourceHighlightControllerDependencies = { + createWindow: (bounds: WindowBounds) => SourceHighlightWindowLike; + reassertHudOverlayMousePassthrough: () => void; +}; + +export type SourceHighlightController = { + clear: () => void; + show: (bounds: WindowBounds, options?: SourceHighlightWindowBoundsOptions) => Promise; +}; + +export function getSourceHighlightWindowBounds( + bounds: WindowBounds, + options: SourceHighlightWindowBoundsOptions = {}, +): WindowBounds { + const pad = options.isMacScreen ? 0 : SOURCE_HIGHLIGHT_PAD; + + return { + x: Math.round(bounds.x - pad), + y: Math.round(bounds.y - pad), + width: Math.round(bounds.width + pad * 2), + height: Math.round(bounds.height + pad * 2), + }; +} + +export function createSourceHighlightHtml(): string { + return ` + + + + + + +

+ +`; +} + +function createDataUrl(html: string): string { + return `data:text/html;charset=utf-8;base64,${Buffer.from(html, "utf8").toString("base64")}`; +} + +function isUsableBounds(bounds: WindowBounds): boolean { + return ( + Number.isFinite(bounds.x) && + Number.isFinite(bounds.y) && + Number.isFinite(bounds.width) && + Number.isFinite(bounds.height) && + bounds.width > 0 && + bounds.height > 0 + ); +} + +export function createSourceHighlightController({ + createWindow, + reassertHudOverlayMousePassthrough, +}: SourceHighlightControllerDependencies): SourceHighlightController { + let highlightWindow: SourceHighlightWindowLike | null = null; + + const getActiveWindow = () => { + if (highlightWindow && !highlightWindow.isDestroyed()) { + return highlightWindow; + } + highlightWindow = null; + return null; + }; + + const clear = () => { + const window = getActiveWindow(); + highlightWindow = null; + if (window) { + window.close(); + reassertHudOverlayMousePassthrough(); + } + }; + + const show = async ( + targetBounds: WindowBounds, + options: SourceHighlightWindowBoundsOptions = {}, + ) => { + if (!isUsableBounds(targetBounds)) { + clear(); + return false; + } + + const windowBounds = getSourceHighlightWindowBounds(targetBounds, options); + const activeWindow = getActiveWindow(); + if (activeWindow) { + activeWindow.setBounds(windowBounds, false); + activeWindow.showInactive?.(); + activeWindow.moveTop?.(); + reassertHudOverlayMousePassthrough(); + return true; + } + + const window = createWindow(windowBounds); + highlightWindow = window; + window.setContentProtection?.(true); + window.setIgnoreMouseEvents?.(true); + window.setVisibleOnAllWorkspaces?.(true, { visibleOnFullScreen: true }); + window.setAlwaysOnTop?.(true, "screen-saver"); + window.on?.("closed", () => { + if (highlightWindow === window) { + highlightWindow = null; + } + reassertHudOverlayMousePassthrough(); + }); + + try { + await window.loadURL(createDataUrl(createSourceHighlightHtml())); + } catch (error) { + if (highlightWindow !== window) { + return false; + } + if (!window.isDestroyed()) { + window.close(); + } + throw error; + } + + window.showInactive?.(); + window.moveTop?.(); + reassertHudOverlayMousePassthrough(); + return true; + }; + + return { clear, show }; +} diff --git a/src/components/launch/LaunchWindow.tsx b/src/components/launch/LaunchWindow.tsx index d7dc51bc4..4ac07c571 100644 --- a/src/components/launch/LaunchWindow.tsx +++ b/src/components/launch/LaunchWindow.tsx @@ -176,26 +176,54 @@ function LaunchWindowContent() { useEffect(() => { let mounted = true; + const canShowSourceHighlight = platform !== null && platform !== "linux"; + const showSelectedSourceHighlight = (source: ProcessedDesktopSource) => { + const highlightPromise = window.electronAPI.showSourceHighlight?.(source, { + activateWindow: false, + }); + if (highlightPromise) { + void highlightPromise.catch((error) => { + console.warn("Failed to show selected source highlight:", error); + }); + } + }; void window.electronAPI.getSelectedSource().then((source) => { - if (mounted) syncSelectedSource(source); + if (!mounted) return; + syncSelectedSource(source); + if (source && canShowSourceHighlight) { + showSelectedSourceHighlight(source); + } else if (platform === "linux") { + void window.electronAPI.clearSourceHighlight?.(); + } }); const cleanup = window.electronAPI.onSelectedSourceChanged((source) => { - if (mounted) syncSelectedSource(source); + if (!mounted) return; + syncSelectedSource(source); + if (source && canShowSourceHighlight) { + showSelectedSourceHighlight(source); + } else { + void window.electronAPI.clearSourceHighlight?.(); + } }); return () => { mounted = false; cleanup?.(); }; - }, [syncSelectedSource]); + }, [platform, syncSelectedSource]); const hudStateTransition = { duration: 0.24, ease: [0.22, 1, 0.36, 1] as const, }; + const hideIdleHud = () => { + void window.electronAPI?.clearSourceHighlight?.(); + window.electronAPI?.hudOverlayHide?.(); + }; + const recordingControls = ( window.electronAPI?.hudOverlayHide?.()} + onClick={hideIdleHud} title={t("recording.hideHud")} > diff --git a/src/components/launch/SourceSelector.tsx b/src/components/launch/SourceSelector.tsx index 158b53e16..ac4fc3f68 100644 --- a/src/components/launch/SourceSelector.tsx +++ b/src/components/launch/SourceSelector.tsx @@ -26,6 +26,10 @@ interface SourceSelectorProps { loading?: boolean; /** Callback when a source is selected */ onSourceSelect?: (source: DesktopSource) => void; + /** Callback when a source option is previewed */ + onSourceHover?: (source: DesktopSource) => void; + /** Callback when source option preview ends */ + onSourceHoverEnd?: () => void; /** Callback to fetch sources */ onFetchSources?: () => Promise; /** Whether the popover is open */ @@ -81,7 +85,18 @@ export const SourceSelectorContent = ({ selectedSource = "Screen", loading = false, onSourceSelect = () => {}, -}: Pick) => { + onSourceHover, + onSourceHoverEnd, +}: Pick< + SourceSelectorProps, + | "screenSources" + | "windowSources" + | "selectedSource" + | "loading" + | "onSourceSelect" + | "onSourceHover" + | "onSourceHoverEnd" +>) => { const t = useScopedT("launch"); const renderSourceItem = (source: DesktopSource, index: number) => { const isSelected = selectedSource === source.name; @@ -94,6 +109,8 @@ export const SourceSelectorContent = ({ isSelected && "source-selector-item-selected", )} onClick={() => onSourceSelect(source)} + onFocus={() => onSourceHover?.(source)} + onPointerEnter={() => onSourceHover?.(source)} >
{source.thumbnail ? ( @@ -139,7 +156,10 @@ export const SourceSelectorContent = ({ } return ( -
+
{hasAnySources ? ( <> {screenSources.length > 0 ? ( @@ -190,6 +210,8 @@ export const SourceSelector = React.memo(function SourceSelector({ selectedSource: propsSelectedSource, loading: propsLoading, onSourceSelect: propsOnSourceSelect, + onSourceHover: propsOnSourceHover, + onSourceHoverEnd: propsOnSourceHoverEnd, onFetchSources: propsOnFetchSources, open: propsOpen, onOpenChange: propsOnOpenChange, @@ -365,6 +387,8 @@ export const SourceSelector = React.memo(function SourceSelector({ selectedSource={selectedSource} loading={loading} onSourceSelect={onSourceSelect} + onSourceHover={propsOnSourceHover} + onSourceHoverEnd={propsOnSourceHoverEnd} /> diff --git a/src/components/launch/hooks/useLaunchWindowActions.ts b/src/components/launch/hooks/useLaunchWindowActions.ts index 7dba168e7..c663079eb 100644 --- a/src/components/launch/hooks/useLaunchWindowActions.ts +++ b/src/components/launch/hooks/useLaunchWindowActions.ts @@ -11,11 +11,42 @@ export function useLaunchWindowActions() { await window.electronAPI.selectSource(source); setSelectedSource(source.name); setHasSelectedSource(true); - window.electronAPI.showSourceHighlight?.({ + + try { + const platform = await window.electronAPI.getPlatform(); + if (platform === "linux") { + const clearPromise = window.electronAPI.clearSourceHighlight?.(); + if (clearPromise) { + void clearPromise.catch((error) => { + console.warn("Failed to clear Linux source highlight:", error); + }); + } + return; + } + } catch (error) { + console.warn("Failed to check platform before source highlight:", error); + const clearPromise = window.electronAPI.clearSourceHighlight?.(); + if (clearPromise) { + void clearPromise.catch((clearError) => { + console.warn( + "Failed to clear source highlight after platform check failed:", + clearError, + ); + }); + } + return; + } + + const highlightPromise = window.electronAPI.showSourceHighlight?.({ ...source, name: source.appName ? `${source.appName} — ${source.name}` : source.name, appName: source.appName, }); + if (highlightPromise) { + void highlightPromise.catch((error) => { + console.warn("Failed to show selected source highlight:", error); + }); + } }, []); const openVideoFile = useCallback(async () => { diff --git a/src/components/launch/popovers/SourcePopover.tsx b/src/components/launch/popovers/SourcePopover.tsx index 5459fae14..0ac9caf43 100644 --- a/src/components/launch/popovers/SourcePopover.tsx +++ b/src/components/launch/popovers/SourcePopover.tsx @@ -1,15 +1,24 @@ -import { useCallback, useMemo, type ReactNode, useState } from "react"; +import { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from "react"; import { SourceSelector } from "../SourceSelector"; import { useLaunchPopoverCoordinator } from "./LaunchPopoverCoordinator"; import { - mapRawSource, + type DesktopSource, isScreenSource, isWindowSource, - type DesktopSource, + mapRawSource, } from "./launchPopoverTypes"; +import { createSourcePreviewRequestGate } from "./sourcePreviewRequestGate"; const POPOVER_ID = "sources"; +function getHighlightSource(source: DesktopSource): DesktopSource { + return { + ...source, + name: source.appName ? `${source.appName} — ${source.name}` : source.name, + appName: source.appName, + }; +} + export function SourcePopover({ trigger, selectedSource, @@ -25,6 +34,8 @@ export function SourcePopover({ const [sources, setSources] = useState([]); const [loading, setLoading] = useState(false); const open = isOpen(POPOVER_ID); + const wasOpenRef = useRef(open); + const previewRequestGate = useMemo(() => createSourcePreviewRequestGate(), []); const fetchSources = useCallback(async () => { if (!window.electronAPI) return; @@ -45,6 +56,75 @@ export function SourcePopover({ const screenSources = useMemo(() => sources.filter(isScreenSource), [sources]); const windowSources = useMemo(() => sources.filter(isWindowSource), [sources]); + const clearSourceHighlight = useCallback((context: string) => { + const clearPromise = window.electronAPI?.clearSourceHighlight?.(); + if (clearPromise) { + void clearPromise.catch((error) => { + console.warn(`Failed to clear source highlight ${context}:`, error); + }); + } + }, []); + const showSourcePreview = useCallback( + (source: DesktopSource) => { + const requestId = previewRequestGate.next(); + void (async () => { + const platform = await window.electronAPI.getPlatform(); + if (!previewRequestGate.isCurrent(requestId)) { + return; + } + if (platform === "linux") { + clearSourceHighlight("for Linux preview"); + return; + } + await window.electronAPI?.showSourceHighlight?.(getHighlightSource(source), { + activateWindow: false, + }); + })().catch((error) => { + console.warn("Failed to preview source highlight:", error); + }); + }, + [clearSourceHighlight, previewRequestGate], + ); + const restoreSelectedSourcePreview = useCallback(() => { + const requestId = previewRequestGate.next(); + void (async () => { + const platform = await window.electronAPI.getPlatform(); + if (!previewRequestGate.isCurrent(requestId)) { + return; + } + if (platform === "linux") { + clearSourceHighlight("for Linux restore"); + return; + } + const selected = await window.electronAPI?.getSelectedSource?.(); + if (!previewRequestGate.isCurrent(requestId)) { + return; + } + if (selected) { + await window.electronAPI?.showSourceHighlight?.(selected, { + activateWindow: false, + }); + return; + } + clearSourceHighlight("with no selected source"); + })().catch((error) => { + console.error("Failed to restore source highlight:", error); + clearSourceHighlight("after restore failed"); + }); + }, [clearSourceHighlight, previewRequestGate]); + + useEffect(() => { + if (wasOpenRef.current && !open) { + restoreSelectedSourcePreview(); + } + wasOpenRef.current = open; + }, [open, restoreSelectedSourcePreview]); + + useEffect(() => { + return () => { + restoreSelectedSourcePreview(); + }; + }, [restoreSelectedSourcePreview]); return ( { try { await onSourceSelect(source); diff --git a/src/components/launch/popovers/sourcePreviewRequestGate.test.ts b/src/components/launch/popovers/sourcePreviewRequestGate.test.ts new file mode 100644 index 000000000..f6ee5f076 --- /dev/null +++ b/src/components/launch/popovers/sourcePreviewRequestGate.test.ts @@ -0,0 +1,14 @@ +import { describe, expect, it } from "vitest"; +import { createSourcePreviewRequestGate } from "./sourcePreviewRequestGate"; + +describe("createSourcePreviewRequestGate", () => { + it("marks an earlier restore request stale after a newer hover starts", () => { + const gate = createSourcePreviewRequestGate(); + + const restoreRequestId = gate.next(); + const hoverRequestId = gate.next(); + + expect(gate.isCurrent(restoreRequestId)).toBe(false); + expect(gate.isCurrent(hoverRequestId)).toBe(true); + }); +}); diff --git a/src/components/launch/popovers/sourcePreviewRequestGate.ts b/src/components/launch/popovers/sourcePreviewRequestGate.ts new file mode 100644 index 000000000..2ed6b1535 --- /dev/null +++ b/src/components/launch/popovers/sourcePreviewRequestGate.ts @@ -0,0 +1,13 @@ +export function createSourcePreviewRequestGate() { + let currentRequestId = 0; + + return { + next() { + currentRequestId += 1; + return currentRequestId; + }, + isCurrent(requestId: number) { + return requestId === currentRequestId; + }, + }; +} diff --git a/src/components/video-editor/VideoPlayback.tsx b/src/components/video-editor/VideoPlayback.tsx index 4c739f1c1..ea05346a0 100644 --- a/src/components/video-editor/VideoPlayback.tsx +++ b/src/components/video-editor/VideoPlayback.tsx @@ -169,7 +169,6 @@ import { import { clampFocusToStage as clampFocusToStageUtil } from "./videoPlayback/focusUtils"; import { layoutVideoContent as layoutVideoContentUtil, - scalePreviewBorderRadius, } from "./videoPlayback/layoutUtils"; import { updateOverlayIndicator } from "./videoPlayback/overlayUtils"; import { createVideoEventHandlers } from "./videoPlayback/videoEventHandlers"; diff --git a/src/hooks/useScreenRecorder.ts b/src/hooks/useScreenRecorder.ts index c5cd70056..40bd46dea 100644 --- a/src/hooks/useScreenRecorder.ts +++ b/src/hooks/useScreenRecorder.ts @@ -376,6 +376,24 @@ export function useScreenRecorder(): UseScreenRecorderReturn { const requestedBrowserMicrophoneProfile = useRef(null); const hideEditorOverlayCursorByDefault = useRef(false); + const showRecordingSourceHighlight = useCallback( + (source: ProcessedDesktopSource, platform: string) => { + if (platform === "linux") { + return; + } + + const highlightPromise = window.electronAPI?.showSourceHighlight?.(source, { + activateWindow: false, + }); + if (highlightPromise) { + void highlightPromise.catch((error) => { + console.warn("Failed to show recording source highlight:", error); + }); + } + }, + [], + ); + const notifyRecordingFinalizationFailure = useCallback(async (message: string) => { setFinalizing(false); toast.error(message, { duration: 10000 }); @@ -1501,6 +1519,7 @@ export function useScreenRecorder(): UseScreenRecorderReturn { webcamStartTime.current === null ? 0 : webcamStartTime.current - mainStartedAt; + showRecordingSourceHighlight(selectedSource, platform); // When native mic capture is unavailable or explicitly bypassed, // record mic via browser getUserMedia as a sidecar file. @@ -1907,6 +1926,7 @@ export function useScreenRecorder(): UseScreenRecorderReturn { webcamTimeOffsetMs.current = webcamStartTime.current === null ? 0 : webcamStartTime.current - mainStartedAt; recorder.start(RECORDER_TIMESLICE_MS); + showRecordingSourceHighlight(selectedSource, platform); setRecording(true); try { await window.electronAPI?.setRecordingState(true); From 80f74636021d2c18d7ae5f9a40583060071557fd Mon Sep 17 00:00:00 2001 From: chbndrhnns Date: Tue, 30 Jun 2026 12:15:42 +0200 Subject: [PATCH 2/3] fix: address source highlight review feedback --- electron/ipc/register/sources.ts | 21 ++- ...ScreenCaptureKitWindowListGeometry.test.ts | 130 ++++++++++++++++++ electron/sourceHighlightController.test.ts | 5 +- src/components/launch/LaunchWindow.tsx | 2 +- .../launch/popovers/SourcePopover.tsx | 30 +++- 5 files changed, 178 insertions(+), 10 deletions(-) create mode 100644 electron/native/ScreenCaptureKitWindowListGeometry.test.ts diff --git a/electron/ipc/register/sources.ts b/electron/ipc/register/sources.ts index 0c9ca5310..30ee77ac9 100644 --- a/electron/ipc/register/sources.ts +++ b/electron/ipc/register/sources.ts @@ -59,10 +59,25 @@ function getVisibleWindowHighlightBounds(bounds: { const intersections = getScreen() .getAllDisplays() .map((display) => intersectBounds(bounds, display.bounds)) - .filter((candidate): candidate is typeof bounds => candidate !== null) - .sort((left, right) => right.width * right.height - left.width * left.height); + .filter((candidate): candidate is typeof bounds => candidate !== null); - return intersections[0] ?? null; + if (intersections.length === 0) { + return null; + } + + return intersections.reduce((combined, current) => { + const x = Math.min(combined.x, current.x); + const y = Math.min(combined.y, current.y); + const right = Math.max(combined.x + combined.width, current.x + current.width); + const bottom = Math.max(combined.y + combined.height, current.y + current.height); + + return { + x, + y, + width: right - x, + height: bottom - y, + }; + }); } function broadcastSelectedSourceChange() { diff --git a/electron/native/ScreenCaptureKitWindowListGeometry.test.ts b/electron/native/ScreenCaptureKitWindowListGeometry.test.ts new file mode 100644 index 000000000..fad27243d --- /dev/null +++ b/electron/native/ScreenCaptureKitWindowListGeometry.test.ts @@ -0,0 +1,130 @@ +import { spawnSync } from "node:child_process"; +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { describe, expect, it } from "vitest"; + +const describeOnDarwin = process.platform === "darwin" ? describe : describe.skip; + +function sliceRequired(source: string, startMarker: string, endMarker: string): string { + const start = source.indexOf(startMarker); + expect(start).toBeGreaterThanOrEqual(0); + const end = source.indexOf(endMarker, start); + expect(end).toBeGreaterThan(start); + return source.slice(start, end); +} + +describeOnDarwin("ScreenCaptureKitWindowList geometry", () => { + it("keeps subtract and unionRect behavior stable", () => { + const swiftcCheck = spawnSync("swiftc", ["--version"], { encoding: "utf8" }); + if (swiftcCheck.status !== 0) { + console.warn("Skipping Swift geometry test because swiftc is unavailable."); + return; + } + + const sourcePath = path.join( + process.cwd(), + "electron", + "native", + "ScreenCaptureKitWindowList.swift", + ); + const source = readFileSync(sourcePath, "utf8"); + const windowRectDeclaration = sliceRequired( + source, + "struct WindowRect", + "struct WindowVisibility", + ); + const geometryDeclarations = sliceRequired( + source, + "func subtract", + "func shouldIgnoreWindowStackEntry", + ); + + const tempDir = mkdtempSync(path.join(os.tmpdir(), "recordly-window-geometry-")); + try { + const testPath = path.join(tempDir, "GeometryTest.swift"); + const outputPath = path.join(tempDir, "GeometryTest"); + writeFileSync( + testPath, + ` +${windowRectDeclaration} +${geometryDeclarations} + +extension WindowRect: Equatable {} + +func describe(_ rect: WindowRect) -> String { + return "(x: \\(rect.x), y: \\(rect.y), width: \\(rect.width), height: \\(rect.height))" +} + +func expectRect(_ actual: WindowRect, _ expected: WindowRect, _ label: String) { + if actual != expected { + fatalError("\\(label): expected \\(describe(expected)), got \\(describe(actual))") + } +} + +func expectRects(_ actual: [WindowRect], _ expected: [WindowRect], _ label: String) { + if actual.count != expected.count { + fatalError("\\(label): expected \\(expected.count) pieces, got \\(actual.count)") + } + for (index, pair) in zip(actual, expected).enumerated() { + expectRect(pair.0, pair.1, "\\(label)[\\(index)]") + } +} + +let source = WindowRect(x: 0, y: 0, width: 10, height: 10) + +expectRects( + subtract(WindowRect(x: 10, y: 0, width: 5, height: 10), from: source), + [source], + "touching edges" +) + +expectRects( + subtract(WindowRect(x: -5, y: -5, width: 20, height: 20), from: source), + [], + "full occlusion" +) + +let nestedPieces = [ + WindowRect(x: 0, y: 0, width: 10, height: 2), + WindowRect(x: 0, y: 6, width: 10, height: 4), + WindowRect(x: 0, y: 2, width: 2, height: 4), + WindowRect(x: 6, y: 2, width: 4, height: 4), +] +expectRects( + subtract(WindowRect(x: 2, y: 2, width: 4, height: 4), from: source), + nestedPieces, + "nested occluder" +) +expectRect(unionRect(nestedPieces)!, source, "nested occluder union") + +expectRect( + unionRect([ + WindowRect(x: 0, y: 0, width: 5, height: 5), + WindowRect(x: 10, y: 5, width: 5, height: 5), + ])!, + WindowRect(x: 0, y: 0, width: 15, height: 10), + "disjoint visible region union" +) + +if unionRect([]) != nil { + fatalError("empty union should be nil") +} +`, + "utf8", + ); + + const compile = spawnSync("swiftc", [testPath, "-o", outputPath], { + encoding: "utf8", + }); + expect([compile.stdout, compile.stderr].filter(Boolean).join("\n")).toBe(""); + expect(compile.status).toBe(0); + + const run = spawnSync(outputPath, { encoding: "utf8" }); + expect([run.stdout, run.stderr].filter(Boolean).join("\n")).toBe(""); + expect(run.status).toBe(0); + } finally { + rmSync(tempDir, { recursive: true, force: true }); + } + }); +}); diff --git a/electron/sourceHighlightController.test.ts b/electron/sourceHighlightController.test.ts index a85d9a9db..2c6ca1cde 100644 --- a/electron/sourceHighlightController.test.ts +++ b/electron/sourceHighlightController.test.ts @@ -104,14 +104,17 @@ describe("createSourceHighlightController", () => { it("clears the persistent recording outline explicitly", async () => { const highlightWindow = createMockHighlightWindow(); + const reassertHudOverlayMousePassthrough = vi.fn(); const controller = createSourceHighlightController({ createWindow: vi.fn(() => highlightWindow), - reassertHudOverlayMousePassthrough: vi.fn(), + reassertHudOverlayMousePassthrough, }); await controller.show({ x: 0, y: 0, width: 200, height: 100 }); + reassertHudOverlayMousePassthrough.mockClear(); controller.clear(); expect(highlightWindow.close).toHaveBeenCalledTimes(1); + expect(reassertHudOverlayMousePassthrough).toHaveBeenCalledTimes(1); }); }); diff --git a/src/components/launch/LaunchWindow.tsx b/src/components/launch/LaunchWindow.tsx index 4ac07c571..4e978609c 100644 --- a/src/components/launch/LaunchWindow.tsx +++ b/src/components/launch/LaunchWindow.tsx @@ -193,7 +193,7 @@ function LaunchWindowContent() { syncSelectedSource(source); if (source && canShowSourceHighlight) { showSelectedSourceHighlight(source); - } else if (platform === "linux") { + } else { void window.electronAPI.clearSourceHighlight?.(); } }); diff --git a/src/components/launch/popovers/SourcePopover.tsx b/src/components/launch/popovers/SourcePopover.tsx index 0ac9caf43..e7a051e2a 100644 --- a/src/components/launch/popovers/SourcePopover.tsx +++ b/src/components/launch/popovers/SourcePopover.tsx @@ -76,11 +76,23 @@ export function SourcePopover({ clearSourceHighlight("for Linux preview"); return; } - await window.electronAPI?.showSourceHighlight?.(getHighlightSource(source), { - activateWindow: false, - }); + const result = await window.electronAPI?.showSourceHighlight?.( + getHighlightSource(source), + { + activateWindow: false, + }, + ); + if (!previewRequestGate.isCurrent(requestId)) { + return; + } + if (result && !result.success) { + clearSourceHighlight("after preview failed"); + } })().catch((error) => { console.warn("Failed to preview source highlight:", error); + if (previewRequestGate.isCurrent(requestId)) { + clearSourceHighlight("after preview failed"); + } }); }, [clearSourceHighlight, previewRequestGate], @@ -101,15 +113,23 @@ export function SourcePopover({ return; } if (selected) { - await window.electronAPI?.showSourceHighlight?.(selected, { + const result = await window.electronAPI?.showSourceHighlight?.(selected, { activateWindow: false, }); + if (!previewRequestGate.isCurrent(requestId)) { + return; + } + if (result && !result.success) { + clearSourceHighlight("after restore failed"); + } return; } clearSourceHighlight("with no selected source"); })().catch((error) => { console.error("Failed to restore source highlight:", error); - clearSourceHighlight("after restore failed"); + if (previewRequestGate.isCurrent(requestId)) { + clearSourceHighlight("after restore failed"); + } }); }, [clearSourceHighlight, previewRequestGate]); From 5bef9ec573ca5fafa14c5db297b3db4fbd58653b Mon Sep 17 00:00:00 2001 From: chbndrhnns Date: Tue, 30 Jun 2026 13:13:50 +0200 Subject: [PATCH 3/3] test: tolerate swift compiler warnings --- electron/native/ScreenCaptureKitWindowListGeometry.test.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/electron/native/ScreenCaptureKitWindowListGeometry.test.ts b/electron/native/ScreenCaptureKitWindowListGeometry.test.ts index fad27243d..e6cc004cd 100644 --- a/electron/native/ScreenCaptureKitWindowListGeometry.test.ts +++ b/electron/native/ScreenCaptureKitWindowListGeometry.test.ts @@ -117,7 +117,12 @@ if unionRect([]) != nil { const compile = spawnSync("swiftc", [testPath, "-o", outputPath], { encoding: "utf8", }); - expect([compile.stdout, compile.stderr].filter(Boolean).join("\n")).toBe(""); + if (compile.status !== 0) { + const output = [compile.stdout, compile.stderr].filter(Boolean).join("\n"); + if (output) { + console.error(output); + } + } expect(compile.status).toBe(0); const run = spawnSync(outputPath, { encoding: "utf8" });