diff --git a/Sources/Kapture/CaptureController.swift b/Sources/Kapture/CaptureController.swift index ae3d1eb..a7c2703 100644 --- a/Sources/Kapture/CaptureController.swift +++ b/Sources/Kapture/CaptureController.swift @@ -61,21 +61,26 @@ final class CaptureController: NSObject { } isSelecting = true previousApp = NSWorkspace.shared.frontmostApplication - // Force activation and log whether it stuck — inactive apps don't - // receive overlay clicks. - let activated = NSApp.activate(ignoringOtherApps: true) - CaptureController.log("begin: activate(ignoringOtherApps)=\(activated) active=\(NSApp.isActive)") - overlays = NSScreen.screens.map { screen in - OverlayWindow( - screen: screen, - onComplete: { [weak self] rect in self?.finishSelection(rect) }, - onCancel: { [weak self] in self?.cancelSelection() }, - onWindowPick: { [weak self] rect in self?.finishWindowPick(rect) } - ) + // Activation is ASYNC: isActive only flips on a later runloop tick + // (verified on macOS 26). Show overlays only once active, otherwise + // the first click can pass through to the windows below. + NSApp.activate(ignoringOtherApps: true) + CaptureController.log("begin: activate issued, active=\(NSApp.isActive)") + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { [weak self] in + guard let self, self.isSelecting else { return } + CaptureController.log("begin: active=\(NSApp.isActive) — showing overlays") + self.overlays = NSScreen.screens.map { screen in + OverlayWindow( + screen: screen, + onComplete: { [weak self] rect in self?.finishSelection(rect) }, + onCancel: { [weak self] in self?.cancelSelection() }, + onWindowPick: { [weak self] rect in self?.finishWindowPick(rect) } + ) + } + self.overlays.forEach { $0.makeKeyAndOrderFront(nil) } + self.overlayIDs = self.overlays.map { $0.windowNumber } + CaptureController.log("begin: \(self.overlays.count) overlays, ids=\(self.overlayIDs), active=\(NSApp.isActive)") } - overlays.forEach { $0.makeKeyAndOrderFront(nil) } - overlayIDs = overlays.map { $0.windowNumber } - CaptureController.log("begin: \(overlays.count) overlays, ids=\(overlayIDs), active=\(NSApp.isActive)") } /// A window was picked from hover — capture it with rounded corners. diff --git a/build-app.sh b/build-app.sh index 571ff51..db88268 100755 --- a/build-app.sh +++ b/build-app.sh @@ -108,9 +108,9 @@ cat > "$APP/Contents/Info.plist" <<'PLIST' CFBundleIconFile Icon CFBundleShortVersionString - 1.6.3 + 1.6.4 CFBundleVersion - 63 + 64 LSUIElement NSHighResolutionCapable