From 3fe86413f666f0a1ce8b8118dcfb303d0f1b5420 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Fri, 29 May 2026 11:47:16 +0800
Subject: [PATCH] Harden app grid drop and keyboard routing

---
 Apptag/ApptagApp.swift |   50 ++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/Apptag/ApptagApp.swift b/Apptag/ApptagApp.swift
index 7f0fabc..ccc3c80 100644
--- a/Apptag/ApptagApp.swift
+++ b/Apptag/ApptagApp.swift
@@ -92,6 +92,9 @@
                     }
                 )
             },
+            handleOverlayKeyEvent: { [weak self] event in
+                self?.handleOverlayKeyEvent(event) ?? false
+            },
             installOverlayKeyMonitor: { [weak self] in
                 self?.installOverlayKeyMonitor()
             },
@@ -851,26 +854,45 @@
         guard overlayKeyMonitor == nil else { return }
         overlayKeyMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { [weak self] event in
             guard let self else { return event }
-            guard self.shouldHandleOverlayKeyEvent(event) else { return event }
-            if event.keyCode == 53 { // Escape
-                if self.isQuickSearchOpen {
-                    self.isQuickSearchOpen = false
-                    self.removeQuickSearchExternalMouseMonitor()
-                    self.updateOverlayLevelForTextInput()
-                    NotificationCenter.default.post(name: .tagLauncherQuickSearchDismissRequested, object: nil)
-                    return nil
-                }
-                self.hideOverlay(force: true)
-                return nil
-            }
-            if self.shouldOpenQuickSearch(for: event) {
-                self.requestQuickSearch(source: QuickSearchOpenSource.mainOverlay)
+            if self.handleOverlayKeyEvent(event) {
                 return nil
             }
             return event
         }
     }
 
+    @discardableResult
+    private func handleOverlayKeyEvent(_ event: NSEvent) -> Bool {
+        guard event.type == .keyDown,
+              shouldHandleOverlayKeyEvent(event)
+        else { return false }
+
+        if event.keyCode == UInt16(kVK_Escape) {
+            return handleOverlayEscapeKey()
+        }
+        if shouldOpenQuickSearch(for: event) {
+            requestQuickSearch(source: QuickSearchOpenSource.mainOverlay)
+            return true
+        }
+        return false
+    }
+
+    private func handleOverlayEscapeKey() -> Bool {
+        if isQuickSearchOpen {
+            isQuickSearchOpen = false
+            removeQuickSearchExternalMouseMonitor()
+            updateOverlayLevelForTextInput()
+            NotificationCenter.default.post(name: .tagLauncherQuickSearchDismissRequested, object: nil)
+            return true
+        }
+        guard !isSettingsVisible,
+              !isEditingAppNote,
+              !isModalInteractionActive
+        else { return false }
+        hideOverlay(force: true)
+        return true
+    }
+
     private func requestQuickSearch(source: String) {
         isQuickSearchOpen = true
         promoteOverlayToForegroundInput()

--
Gitblit v1.9.3