From 2ed5586d3c48d78c4dc9ad1ef00b2e47f7238915 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Sat, 30 May 2026 17:34:47 +0800
Subject: [PATCH] Prepare 7.8.4 quick search toggle release

---
 Release/AppStore-7.8.4-20260530.1727/QA_RELEASE_EVIDENCE.md                               |   34 +++++++++++
 Apptag/ApptagApp.swift                                                                    |   39 +++++++-----
 Release/AppStore-7.8.4-20260530.1727/README.md                                            |   26 ++++++++
 Apptag/Info.plist                                                                         |    4 
 Release/AppStore-7.8.4-20260530.1727/APP_STORE_ASSET_INVENTORY.md                         |   17 +++++
 CHANGELOG.md                                                                              |    6 ++
 Release/AppStore-7.8.4-20260530.1727/Archive/TagLauncher-7.8.4-20260530.1727-local-QA.dmg |    0 
 7 files changed, 107 insertions(+), 19 deletions(-)

diff --git a/Apptag/ApptagApp.swift b/Apptag/ApptagApp.swift
index 6f4c0b3..6b7c698 100644
--- a/Apptag/ApptagApp.swift
+++ b/Apptag/ApptagApp.swift
@@ -900,18 +900,7 @@
 
     private func handleOverlayEscapeKey() -> Bool {
         if isQuickSearchOpen || quickSearchOnlyOverlaySession {
-            let shouldHideOverlayAfterDismiss = quickSearchShouldHideOverlayOnClose || quickSearchOnlyOverlaySession
-            isQuickSearchOpen = false
-            removeQuickSearchExternalMouseMonitor()
-            updateOverlayLevelForTextInput()
-            NotificationCenter.default.post(name: .tagLauncherQuickSearchDismissRequested, object: nil)
-            if shouldHideOverlayAfterDismiss {
-                quickSearchShouldHideOverlayOnClose = false
-                quickSearchOnlyOverlaySession = false
-                DispatchQueue.main.async { [weak self] in
-                    self?.hideOverlay(force: true)
-                }
-            }
+            dismissQuickSearchFromKeyboard()
             return true
         }
         guard !isSettingsVisible,
@@ -920,6 +909,21 @@
         else { return false }
         hideOverlay(force: true)
         return true
+    }
+
+    private func dismissQuickSearchFromKeyboard() {
+        let shouldHideOverlayAfterDismiss = quickSearchShouldHideOverlayOnClose || quickSearchOnlyOverlaySession
+        isQuickSearchOpen = false
+        removeQuickSearchExternalMouseMonitor()
+        updateOverlayLevelForTextInput()
+        NotificationCenter.default.post(name: .tagLauncherQuickSearchDismissRequested, object: nil)
+        if shouldHideOverlayAfterDismiss {
+            quickSearchShouldHideOverlayOnClose = false
+            quickSearchOnlyOverlaySession = false
+            DispatchQueue.main.async { [weak self] in
+                self?.hideOverlay(force: true)
+            }
+        }
     }
 
     private func requestQuickSearch(source: String) {
@@ -1072,6 +1076,12 @@
 
     private func showQuickSearchFromGlobalHotkey() {
         let now = Date()
+        if overlayWindow?.isVisible == true, isQuickSearchOpen || quickSearchOnlyOverlaySession {
+            lastQuickSearchHotkeyAt = now
+            dismissQuickSearchFromKeyboard()
+            return
+        }
+
         if now.timeIntervalSince(lastQuickSearchHotkeyAt) < 0.28 {
             promoteOverlayToForegroundInput()
             updateOverlayLevelForTextInput()
@@ -1079,11 +1089,6 @@
         }
         lastQuickSearchHotkeyAt = now
 
-        if overlayWindow?.isVisible == true, isQuickSearchOpen || quickSearchOnlyOverlaySession {
-            promoteOverlayToForegroundInput()
-            updateOverlayLevelForTextInput()
-            return
-        }
         if overlayWindow?.isVisible == true {
             refreshLauncherChromeState(
                 activate: !overlayAvoidsSpaceSwitch,
diff --git a/Apptag/Info.plist b/Apptag/Info.plist
index 30a4d14..831eaef 100644
--- a/Apptag/Info.plist
+++ b/Apptag/Info.plist
@@ -19,9 +19,9 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>7.8.3</string>
+	<string>7.8.4</string>
 	<key>CFBundleVersion</key>
-	<string>20260530.1652</string>
+	<string>20260530.1727</string>
 	<key>LSApplicationCategoryType</key>
 	<string>public.app-category.utilities</string>
 	<key>LSMinimumSystemVersion</key>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e002bc9..ff2b069 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # TagLauncher Changelog
 
+## [7.8.4] — 2026-05-30
+
+- 修复全局 `Fn + Space` Quick Search 快捷键不能像 Spotlight 一样反复开关的问题;现在连续按会按 `出现 -> 消失 -> 出现 -> 消失` 循环
+- 复用键盘关闭路径,Quick Search-only 模式关闭时会同步隐藏 overlay,避免残留透明窗口
+- 版本号更新为 `7.8.4`,Build 更新为 `20260530.1727`
+
 ## [7.8.3] — 2026-05-30
 
 - 修复设置窗口宽度不足导致系统 `Navigation Tab Bar` 折叠入口固定出现的问题,设置页签恢复直接可见
diff --git a/Release/AppStore-7.8.4-20260530.1727/APP_STORE_ASSET_INVENTORY.md b/Release/AppStore-7.8.4-20260530.1727/APP_STORE_ASSET_INVENTORY.md
new file mode 100644
index 0000000..7333464
--- /dev/null
+++ b/Release/AppStore-7.8.4-20260530.1727/APP_STORE_ASSET_INVENTORY.md
@@ -0,0 +1,17 @@
+# App Store Asset Inventory
+
+This release pack freezes TagLauncher `7.8.4` build `20260530.1727`.
+
+## Included
+
+- `Archive/TagLauncher-7.8.4-20260530.1727-local-QA.dmg`
+- `README.md`
+- `QA_RELEASE_EVIDENCE.md`
+- `APP_STORE_ASSET_INVENTORY.md`
+
+## External Items Still Required For App Store Upload
+
+- Apple Developer Bundle ID selection/confirmation in App Store Connect.
+- Mac App Store signing certificate and provisioning profile.
+- Final App Store screenshots and metadata review before submission.
+
diff --git a/Release/AppStore-7.8.4-20260530.1727/Archive/TagLauncher-7.8.4-20260530.1727-local-QA.dmg b/Release/AppStore-7.8.4-20260530.1727/Archive/TagLauncher-7.8.4-20260530.1727-local-QA.dmg
new file mode 100644
index 0000000..d51477b
--- /dev/null
+++ b/Release/AppStore-7.8.4-20260530.1727/Archive/TagLauncher-7.8.4-20260530.1727-local-QA.dmg
Binary files differ
diff --git a/Release/AppStore-7.8.4-20260530.1727/QA_RELEASE_EVIDENCE.md b/Release/AppStore-7.8.4-20260530.1727/QA_RELEASE_EVIDENCE.md
new file mode 100644
index 0000000..dd14761
--- /dev/null
+++ b/Release/AppStore-7.8.4-20260530.1727/QA_RELEASE_EVIDENCE.md
@@ -0,0 +1,34 @@
+# QA Release Evidence
+
+## Build Under Test
+
+- Version: `7.8.4`
+- Build: `20260530.1727`
+- App: `/Users/ar/Projects/Taglauncher/build/TagLauncher.app`
+- DMG: `/Users/ar/Projects/Taglauncher/build/TagLauncher.dmg`
+- Archived DMG: `Archive/TagLauncher-7.8.4-20260530.1727-local-QA.dmg`
+- DMG SHA-256: `c843d06ed620bd2dd776fafef5e5de38d4abdb623e41e1ebc73ea525b63bf56c`
+
+## Checks
+
+- Version metadata:
+  - `CFBundleShortVersionString = 7.8.4`
+  - `CFBundleVersion = 20260530.1727`
+- Code signing:
+  - `codesign --verify --deep --strict --verbose=2 build/TagLauncher.app`
+  - Result: passed
+- Disk image:
+  - `hdiutil verify build/TagLauncher.dmg`
+  - Result: passed
+- Window logic:
+  - `APP_BUILD=20260530.1727 Scripts/window_logic_qa.sh`
+  - Result: `ALL WINDOW LOGIC QA PASSED`
+- Quick Search toggle:
+  - Four consecutive `Fn + Space` invocations produced on-screen TagLauncher window counts `2, 0, 2, 0`
+  - Result: passed
+
+## Targeted Fix Coverage
+
+- The Quick Search global hotkey now dismisses an already-open Quick Search instead of only refocusing it.
+- Quick Search-only dismissal hides the backing overlay window, matching the Spotlight-style toggle behavior.
+
diff --git a/Release/AppStore-7.8.4-20260530.1727/README.md b/Release/AppStore-7.8.4-20260530.1727/README.md
new file mode 100644
index 0000000..aa885e1
--- /dev/null
+++ b/Release/AppStore-7.8.4-20260530.1727/README.md
@@ -0,0 +1,26 @@
+# TagLauncher 7.8.4 Release Pack
+
+This folder freezes TagLauncher `7.8.4` build `20260530.1727` for local QA distribution and Mac App Store submission preparation.
+
+## Release Identity
+
+- Product: `TagLauncher`
+- Version: `7.8.4`
+- Build: `20260530.1727`
+- Branch: `codex/fix-quick-search-focus-routing`
+- Local QA DMG: `Archive/TagLauncher-7.8.4-20260530.1727-local-QA.dmg`
+- DMG SHA-256: `c843d06ed620bd2dd776fafef5e5de38d4abdb623e41e1ebc73ea525b63bf56c`
+
+## Changes Since 7.8.3
+
+- Fixed the global `Fn + Space` Quick Search shortcut so repeated presses toggle Quick Search like Spotlight.
+- Reused the keyboard-dismiss path so Quick Search-only sessions also close the backing overlay window.
+
+## Verification
+
+- App version metadata verified: `7.8.4 (20260530.1727)`
+- `codesign --verify --deep --strict --verbose=2 build/TagLauncher.app`: passed
+- `hdiutil verify build/TagLauncher.dmg`: passed
+- `Scripts/window_logic_qa.sh`: passed
+- Targeted `Fn + Space` loop: window counts `2 -> 0 -> 2 -> 0`
+

--
Gitblit v1.9.3