Ariver
2026-07-03 5fbe9789faf05ce99bbff6ec4cd0b905519acbd0
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.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() {