From 8058eb48fe3fd1b37be974b5183df6ffc69bfb2c Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Mon, 18 May 2026 16:33:56 +0800
Subject: [PATCH] fix: show overlay in fullscreen spaces

---
 VoiceSnapGo/internal/overlay/overlay_darwin.go |   40 +++++++++++++++++++++++++++++++---------
 1 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/VoiceSnapGo/internal/overlay/overlay_darwin.go b/VoiceSnapGo/internal/overlay/overlay_darwin.go
index 25ca770..423cb72 100755
--- a/VoiceSnapGo/internal/overlay/overlay_darwin.go
+++ b/VoiceSnapGo/internal/overlay/overlay_darwin.go
@@ -4,8 +4,9 @@
 
 /*
 #cgo CFLAGS: -x objective-c
-#cgo LDFLAGS: -framework Cocoa
+#cgo LDFLAGS: -framework Cocoa -framework ApplicationServices
 #import <Cocoa/Cocoa.h>
+#import <ApplicationServices/ApplicationServices.h>
 #include <dispatch/dispatch.h>
 #include <string.h>
 
@@ -118,8 +119,8 @@
 
 @end
 
-// ---- Custom NSWindow for drag tracking ----
-@interface VoiceSnapOverlayWindow : NSWindow {
+// ---- Custom NSPanel for drag tracking ----
+@interface VoiceSnapOverlayWindow : NSPanel {
 	NSPoint _dragStartOrigin;
 }
 @end
@@ -148,6 +149,7 @@
 }
 
 - (BOOL)canBecomeKeyWindow { return NO; }
+- (BOOL)canBecomeMainWindow { return NO; }
 
 @end
 
@@ -155,6 +157,21 @@
 static NSWindow* g_window = nil;
 static VoiceSnapOverlayView* g_view = nil;
 static NSTimer* g_timer = nil;
+
+static void applyOverlayWindowPolicy(NSWindow* window) {
+	if (!window) return;
+	[window setLevel:CGWindowLevelForKey(kCGStatusWindowLevelKey)];
+	[window setCollectionBehavior:
+		NSWindowCollectionBehaviorCanJoinAllSpaces |
+		NSWindowCollectionBehaviorStationary |
+		NSWindowCollectionBehaviorFullScreenAuxiliary |
+		NSWindowCollectionBehaviorTransient |
+		NSWindowCollectionBehaviorIgnoresCycle];
+	[window setCanHide:NO];
+	if ([window isKindOfClass:[NSPanel class]]) {
+		[(NSPanel*)window setHidesOnDeactivate:NO];
+	}
+}
 
 static void animateBars(void) {
 	g_state.animTime += 0.033f;
@@ -230,6 +247,7 @@
 	}
 
 	if (g_state.fadeTarget > 0 && ![g_window isVisible]) {
+		applyOverlayWindowPolicy(g_window);
 		[g_window orderFrontRegardless];
 	}
 
@@ -259,17 +277,13 @@
 
 	VoiceSnapOverlayWindow* window = [[VoiceSnapOverlayWindow alloc]
 		initWithContentRect:NSMakeRect(0, 0, CAP_W, CAP_H)
-		styleMask:NSWindowStyleMaskBorderless
+		styleMask:NSWindowStyleMaskBorderless | NSWindowStyleMaskNonactivatingPanel
 		backing:NSBackingStoreBuffered
 		defer:NO];
 
 	[window setOpaque:NO];
 	[window setBackgroundColor:[NSColor clearColor]];
-	[window setLevel:NSFloatingWindowLevel];
-	[window setCollectionBehavior:
-		NSWindowCollectionBehaviorCanJoinAllSpaces |
-		NSWindowCollectionBehaviorStationary |
-		NSWindowCollectionBehaviorFullScreenAuxiliary];
+	applyOverlayWindowPolicy(window);
 	[window setIgnoresMouseEvents:NO];
 	[window setMovableByWindowBackground:YES];
 	[window setHasShadow:NO];
@@ -307,11 +321,19 @@
 	g_state.hasPosition = 1;
 }
 
+static void doBringOverlayForward(void* ctx) {
+	(void)ctx;
+	if (!g_window) return;
+	applyOverlayWindowPolicy(g_window);
+	[g_window orderFrontRegardless];
+}
+
 static void overlayShow(void) {
 	g_state.fadeTarget = 1.0f;
 	if (!g_state.hasPosition) {
 		dispatch_async_f(dispatch_get_main_queue(), NULL, doAutoPosition);
 	}
+	dispatch_async_f(dispatch_get_main_queue(), NULL, doBringOverlayForward);
 }
 
 static void overlayHide(void) {

--
Gitblit v1.9.3