fix(tray): give the foreground back to the application we took it from
Hiding a window hands the foreground to nobody, so we stayed foreground while invisible. The next hotkey then captured our own window as its target and typed the password into it, and Ctrl+Shift+A opened a New entry with an empty title — the guard correctly refusing to prefill with "Password Manager". Track foreground changes with an EVENT_SYSTEM_FOREGROUND hook and keep the last window that is neither ours nor a shell one, then reactivate it just before hiding. Sampling on demand cannot work: by then the user's application is two foreground changes behind (their app, the taskbar they clicked, us), and reactivating after the hide is silently refused since only the current foreground owner may give focus away. Autofill paths pass AReturnForeground=False — they already placed the foreground on the window they filled. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -316,6 +316,18 @@ l'éditeur slideover : créer + éditer une entrée, ajouter/retirer des tags,
|
||||
- **Variantes** : match unique (pas de picker) → reste au tray ; app déjà visible → reste visible ; app **minimisée dans la barre des tâches** → n'est **pas** envoyée au tray (`not Self.Visible` est faux pour une fenêtre iconique) ; picker fermé par Esc sans choisir → l'app **repart au tray** elle aussi (symétrique de quick-search, qui se cache sur Esc) et le hotkey suivant n'hérite pas de l'état capturé.
|
||||
- **Historique** : seul le chemin quick-search capturait « était cachée » (`LWasHidden`) et le faisait remonter via `hide_after` ; JS n'envoie jamais ce paramètre depuis le picker d'autofill, donc l'app restait sur le bureau. Capturé désormais côté Delphi dans `BridgeAutofillRequest`, au moment du hotkey — après, le picker a déjà détruit l'information.
|
||||
|
||||
### H10 · le focus revient à l'application précédente ✅
|
||||
Cacher une fenêtre ne transfère le premier plan à personne (contrairement à une
|
||||
minimisation). On restait donc au premier plan **en étant invisible** : le
|
||||
hotkey suivant capturait **notre propre fenêtre** comme cible et tapait le mot
|
||||
de passe dedans, et `Ctrl+Shift+A` ouvrait un « New entry » au titre vide (le
|
||||
garde refusait, à raison, de pré-remplir avec « Password Manager »).
|
||||
- **ACTION** : depuis une application X → ouvrir l'app (icône du tray, hotkey, ou lancement à froid) → fermer par la croix.
|
||||
- **ATTENDU** : X reprend le focus. Puis un hotkey d'autofill depuis X doit cibler X, et `Ctrl+Shift+A` pré-remplir son titre.
|
||||
- **ACTION 2** : enchaîner plusieurs allers-retours en changeant d'application entre deux — c'est **toujours la dernière réellement utilisée** qui récupère le focus.
|
||||
- **Non-régression** : après un autofill (pick ou Esc), le focus reste sur la fenêtre **remplie** — ces deux chemins passent `AReturnForeground = False`, ayant déjà placé le premier plan eux-mêmes.
|
||||
- **Historique — quatre tentatives, toutes tranchées par le log** : (1) rendre le focus *après* avoir caché la fenêtre — Windows n'autorise que le propriétaire courant du premier plan à le céder, l'appel était silencieusement refusé ; (2) échantillonner le premier plan au moment du besoin — il vaut alors *notre* fenêtre, la capture se rejetait elle-même et n'apprenait jamais rien (`prev=<none>` à chaque fois) ; (3) capturer au clic sur l'icône du tray — on obtient une fenêtre du **shell** (`NotifyIconOverflowWindow`, « Fenêtre de dépassement de capacité de la barre d'état système ») ; (4) consommer la valeur après usage — le premier masquage marchait, les suivants plus. **Solution** : un hook `EVENT_SYSTEM_FOREGROUND` (`WINEVENT_OUTOFCONTEXT`, aucune injection) note *chaque* changement et garde le dernier qui n'est ni à nous ni au shell ; la restitution se fait **avant** de cacher.
|
||||
|
||||
### H7 · combo déjà pris par une autre application ✅
|
||||
- **ACTION** : assigner à un hotkey un combo qu'une autre app tient déjà en global (ex. `Ctrl+Shift+Q` si Quick Assist / un lanceur l'occupe ; sinon, tester en assignant le même combo dans deux apps).
|
||||
- **ATTENDU** : toast **nommant le combo refusé** — « Already used by another app: 2FA code — pick another combo » — **et** un ⚠ ambre persistant sur cette ligne de Settings, **et** une pastille ambre sur l'entrée *Settings* de la sidebar (seul indice hors du panneau). Le toast d'avertissement reste ~10 s et se ferme au clic. Les **autres** hotkeys restent fonctionnels (enregistrement best-effort, pas de tout-ou-rien).
|
||||
|
||||
Reference in New Issue
Block a user