From 43640e6e65fc798d7702531fa2189affc4a046df Mon Sep 17 00:00:00 2001
From: Ariver <ar@MacBook-Air.local>
Date: Sun, 10 May 2026 19:36:04 +0800
Subject: [PATCH] Improve fullscreen overlay space handling

---
 Apptag/ApptagApp.swift |   71 ++++++++++++++++++-----------------
 Apptag/Info.plist      |    2 
 CHANGELOG.md           |   12 ++++++
 3 files changed, 49 insertions(+), 36 deletions(-)

diff --git a/Apptag/ApptagApp.swift b/Apptag/ApptagApp.swift
index f3f3948..1bf3836 100644
--- a/Apptag/ApptagApp.swift
+++ b/Apptag/ApptagApp.swift
@@ -216,41 +216,10 @@
             NSMouseInRect(mousePoint, $0.frame, false)
         }) ?? NSScreen.main ?? NSScreen.screens.first else { return }
 
-        if overlayWindow == nil {
-            let panel = OverlayPanel(
-                contentRect: screen.frame,
-                styleMask: [.borderless, .fullSizeContentView, .nonactivatingPanel],
-                backing: .buffered,
-                defer: false
-            )
-            panel.isFloatingPanel = true
-            panel.hidesOnDeactivate = false
-            overlayWindow = panel
-            overlayWindow?.collectionBehavior = [
-                .canJoinAllSpaces,
-                .fullScreenAuxiliary,
-                .stationary,
-                .transient,
-                .ignoresCycle
-            ]
-            overlayWindow?.isOpaque = false
-            overlayWindow?.backgroundColor = .clear
-            overlayWindow?.hasShadow = false
-            overlayWindow?.titlebarAppearsTransparent = true
-            overlayWindow?.titleVisibility = .hidden
-            overlayWindow?.isReleasedWhenClosed = false
-
-            overlayWindow?.contentView = DismissibleHostingView(
-                rootView: ContentView(hideOverlay: { [weak self] in
-                    self?.hideOverlay()
-                }),
-                onBackdropTap: { [weak self] in
-                    self?.hideOverlay()
-                }
-            )
-        }
+        overlayWindow?.orderOut(nil)
+        overlayWindow = makeOverlayWindow(on: screen)
         overlayWindow?.setFrame(screen.frame, display: true)
-        overlayWindow?.level = .screenSaver
+        overlayWindow?.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.maximumWindow)))
 
         // Local key monitor: catch Escape while overlay is up
         NSEvent.addLocalMonitorForEvents(matching: .keyDown) { [weak self] event in
@@ -263,7 +232,39 @@
 
         overlayWindow?.makeKeyAndOrderFront(nil)
         overlayWindow?.orderFrontRegardless()
-        NSApp.activate(ignoringOtherApps: true)
+    }
+
+    private func makeOverlayWindow(on screen: NSScreen) -> NSWindow {
+        let panel = OverlayPanel(
+            contentRect: screen.frame,
+            styleMask: [.borderless, .fullSizeContentView, .nonactivatingPanel],
+            backing: .buffered,
+            defer: false
+        )
+        panel.isFloatingPanel = true
+        panel.hidesOnDeactivate = false
+        panel.collectionBehavior = [
+            .moveToActiveSpace,
+            .fullScreenAuxiliary,
+            .stationary,
+            .transient,
+            .ignoresCycle
+        ]
+        panel.isOpaque = false
+        panel.backgroundColor = .clear
+        panel.hasShadow = false
+        panel.titlebarAppearsTransparent = true
+        panel.titleVisibility = .hidden
+        panel.isReleasedWhenClosed = false
+        panel.contentView = DismissibleHostingView(
+            rootView: ContentView(hideOverlay: { [weak self] in
+                self?.hideOverlay()
+            }),
+            onBackdropTap: { [weak self] in
+                self?.hideOverlay()
+            }
+        )
+        return panel
     }
 
     private func hideOverlay() {
diff --git a/Apptag/Info.plist b/Apptag/Info.plist
index 3086fd3..302e010 100644
--- a/Apptag/Info.plist
+++ b/Apptag/Info.plist
@@ -19,7 +19,7 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>3.1.29</string>
+	<string>3.1.32</string>
 	<key>CFBundleVersion</key>
 	<string>1</string>
 	<key>LSMinimumSystemVersion</key>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 442ca8e..8076b40 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,17 @@
 # Apptag Changelog
 
+## [3.1.32] — 2026-05-10
+
+- 提升 overlay 到 CoreGraphics maximum window level,进一步避免被全屏应用窗口层遮挡
+
+## [3.1.31] — 2026-05-10
+
+- 强化全屏 Space 唤出逻辑:每次显示 overlay 都重新创建绑定当前 Space 的 NSPanel,避免复用旧窗口导致全屏空间迁移失败
+
+## [3.1.30] — 2026-05-10
+
+- 再次修复全屏 Space 唤出不可见问题:overlay 显示时移动到当前活跃 Space,并避免激活 App 导致窗口回到非全屏空间
+
 ## [3.1.29] — 2026-05-10
 
 - 继续修复全屏 Space 唤出不可见问题:overlay 改为非激活 NSPanel,并加入 stationary/transient 全屏辅助行为,确保在当前全屏 Space 前置显示

--
Gitblit v1.9.3