| | |
| | | |
| | | static NSWindow* g_window = nil; |
| | | static NSWindow* g_dragWindow = nil; |
| | | static int g_windowsOrderedOut = 1; |
| | | |
| | | static float desktopTopY(void) { |
| | | NSScreen* mainScreen = [NSScreen mainScreen]; |
| | |
| | | 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) { |
| | |
| | | [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; |
| | | } |
| | | |
| | |
| | | applyOverlayWindowPolicy(g_dragWindow); |
| | | [g_dragWindow orderFrontRegardless]; |
| | | } |
| | | markOverlayWindowsVisible(); |
| | | } |
| | | |
| | | // Reposition |
| | |
| | | |
| | | g_window = window; |
| | | g_view = view; |
| | | g_windowsOrderedOut = 1; |
| | | |
| | | PrivateVoiceOverlayWindow* dragWindow = [[PrivateVoiceOverlayWindow alloc] |
| | | initWithContentRect:NSMakeRect(0, 0, DRAG_W, DRAG_H) |
| | |
| | | applyOverlayWindowPolicy(g_dragWindow); |
| | | [g_dragWindow orderFrontRegardless]; |
| | | } |
| | | markOverlayWindowsVisible(); |
| | | } |
| | | |
| | | static void overlayShow(void) { |
| | |
| | | import "C" |
| | | |
| | | import ( |
| | | "sync" |
| | | "time" |
| | | "unsafe" |
| | | ) |
| | |
| | | // 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{} |
| | |
| | | } |
| | | |
| | | 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() { |