From 5fbe9789faf05ce99bbff6ec4cd0b905519acbd0 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Fri, 03 Jul 2026 05:18:07 +0800
Subject: [PATCH] Freeze R221 2.2.2 source baseline

---
 C1.source/privatevoice.src/internal/overlay/overlay_darwin.go |   35 ++++++++++++++++++++++++++++-------
 1 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/C1.source/privatevoice.src/internal/overlay/overlay_darwin.go b/C1.source/privatevoice.src/internal/overlay/overlay_darwin.go
index a3aecb7..b364993 100755
--- a/C1.source/privatevoice.src/internal/overlay/overlay_darwin.go
+++ b/C1.source/privatevoice.src/internal/overlay/overlay_darwin.go
@@ -151,6 +151,7 @@
 
 static NSWindow* g_window = nil;
 static NSWindow* g_dragWindow = nil;
+static int g_windowsOrderedOut = 1;
 
 static float desktopTopY(void) {
 	NSScreen* mainScreen = [NSScreen mainScreen];
@@ -180,6 +181,17 @@
 	if (g_dragWindow) {
 		[g_dragWindow setFrameOrigin:dragOriginForVisualOrigin(visualOrigin)];
 	}
+}
+
+static void orderOverlayWindowsOutOnce(void) {
+	if (g_windowsOrderedOut) return;
+	if (g_window) [g_window orderOut:nil];
+	if (g_dragWindow) [g_dragWindow orderOut:nil];
+	g_windowsOrderedOut = 1;
+}
+
+static void markOverlayWindowsVisible(void) {
+	g_windowsOrderedOut = 0;
 }
 
 static void storeDragPositionFromVisualOrigin(NSPoint visualOrigin) {
@@ -669,8 +681,7 @@
 	[g_window setAlphaValue:eased];
 
 	if (g_state.fadeProgress <= 0 && g_state.fadeTarget == 0) {
-		[g_window orderOut:nil];
-		if (g_dragWindow) [g_dragWindow orderOut:nil];
+		orderOverlayWindowsOutOnce();
 		return;
 	}
 
@@ -683,6 +694,7 @@
 			applyOverlayWindowPolicy(g_dragWindow);
 			[g_dragWindow orderFrontRegardless];
 		}
+		markOverlayWindowsVisible();
 	}
 
 	// Reposition
@@ -724,6 +736,7 @@
 
 	g_window = window;
 	g_view = view;
+	g_windowsOrderedOut = 1;
 
 	PrivateVoiceOverlayWindow* dragWindow = [[PrivateVoiceOverlayWindow alloc]
 		initWithContentRect:NSMakeRect(0, 0, DRAG_W, DRAG_H)
@@ -789,6 +802,7 @@
 		applyOverlayWindowPolicy(g_dragWindow);
 		[g_dragWindow orderFrontRegardless];
 	}
+	markOverlayWindowsVisible();
 }
 
 static void overlayShow(void) {
@@ -882,6 +896,7 @@
 import "C"
 
 import (
+	"sync"
 	"time"
 	"unsafe"
 )
@@ -894,6 +909,7 @@
 // darwinOverlay uses a native NSWindow + Core Graphics to render
 // the floating indicator, matching the Windows GDI+ implementation.
 type darwinOverlay struct {
+	mu      sync.Mutex
 	dragCb  func(int, int)
 	created bool
 	done    chan struct{}
@@ -906,12 +922,17 @@
 }
 
 func (o *darwinOverlay) ensureCreated() {
-	if !o.created {
-		C.overlayCreate()
-		o.created = true
-		time.Sleep(50 * time.Millisecond)
-		go o.pollDrag()
+	o.mu.Lock()
+	if o.created {
+		o.mu.Unlock()
+		return
 	}
+	o.created = true
+	o.mu.Unlock()
+
+	C.overlayCreate()
+	time.Sleep(50 * time.Millisecond)
+	go o.pollDrag()
 }
 
 func (o *darwinOverlay) Show() {

--
Gitblit v1.9.3