Ariver
2026-05-10 43640e6e65fc798d7702531fa2189affc4a046df
Improve fullscreen overlay space handling
3 files modified
85 ■■■■■ changed files
Apptag/ApptagApp.swift 71 ●●●● patch | view | raw | blame | history
Apptag/Info.plist 2 ●●● patch | view | raw | blame | history
CHANGELOG.md 12 ●●●●● patch | view | raw | blame | history
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() {
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>
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 前置显示