From 3d217e82d4cb841bb137e58127de56fd5b77cd10 Mon Sep 17 00:00:00 2001 From: r-zakarya <82443831+r-zakarya@users.noreply.github.com> Date: Sun, 12 Jul 2026 20:20:24 +0100 Subject: [PATCH] fix(quick-search): Esc closes only the modal; cancel returns focus to target - The qsInput Esc handler didn't stopPropagation, so the SAME keystroke fell through to the document-level Esc handlers which, seeing the modal now closed, also closed (or discard-prompted) the dirty slideover behind it. - autofill/cancel now hands the foreground back to the saved target HWND: Esc after a fill-mode hotkey returns the user to the window they came from instead of leaving our app focused. Locked-vault path still ends focused on us (cancelAutofill runs before focusApp). Co-Authored-By: Claude Opus 4.8 --- delphi-backend/UMainForm.pas | 5 +++++ js/app.js | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/delphi-backend/UMainForm.pas b/delphi-backend/UMainForm.pas index 95a4000..891cf31 100644 --- a/delphi-backend/UMainForm.pas +++ b/delphi-backend/UMainForm.pas @@ -921,8 +921,13 @@ begin end // cancel: JS found no match or user dismissed the picker — nothing to type. + // Hand the foreground back to the window the hotkey came from (Esc in the + // quick-search means "never mind, return me to where I was"). We're the + // foreground process at that moment, so plain SetForegroundWindow works. else if ACmd = 'autofill/cancel' then begin + if FAutofillTargetHWND <> 0 then + SetForegroundWindow(FAutofillTargetHWND); FAutofillTargetHWND := 0; LogLine('Autofill cancelled (no match or dismissed)'); end diff --git a/js/app.js b/js/app.js index 93fac4c..42b3f84 100644 --- a/js/app.js +++ b/js/app.js @@ -7964,6 +7964,10 @@ async function init() { const rows = document.querySelectorAll('#quickSearchResults .quick-search-row'); if (e.key === 'Escape') { e.preventDefault(); + // Kill the keystroke: without this the SAME Esc reaches the + // document-level handlers, which now see "no modal open" + // (we just closed it) and also close the dirty slideover. + e.stopPropagation(); closeQuickSearchModal(); } else if (e.key === 'ArrowDown') { e.preventDefault();