feat(autofill): un bouton Open, et le menu ne passe plus sous la barrette

Quand la barrette est allumee, elle est souvent la seule chose de
l'application a l'ecran : revenir au coffre ne doit pas demander de
retrouver l'icone du tray.

Le menu d'opacite passait derriere : le battement qui repose la barrette
en tete de la bande TOPMOST cinq fois par seconde recouvrait le menu que
la barrette venait d'ouvrir - lui aussi dans cette bande. TrackPopupMenu
est modal, donc le minuteur battait pendant tout ce temps. Il s'arrete
maintenant le temps du menu.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-26 17:35:36 +01:00
parent 6b908e73a5
commit 0604cca148
2 changed files with 25 additions and 6 deletions
+16 -2
View File
@@ -403,6 +403,7 @@ const
LAZY_ID_PWD = 102;
LAZY_ID_TOTP = 103;
LAZY_ID_CLOSE = 104;
LAZY_ID_OPEN = 105;
// LE SONDAGE PLUTOT QUE TrackMouseEvent. La barrette a quatre fenetres
// enfants : passer d'elle a un bouton envoie deja un WM_MOUSELEAVE au parent,
// et il faudrait donc suivre la souris sur les cinq fenetres pour recoller
@@ -417,7 +418,7 @@ const
// Coin haut-gauche retenu, 'x,y'. Meme raison que l'opacite d'etre une pref
// DPAPI : la barrette s'allume parfois coffre ferme.
LAZY_POS_KEY = 'lazyPos';
LAZY_W = 236;
LAZY_W = 298;
LAZY_H = 40;
// Palette de la barrette, en COLORREF ($00BBGGRR - les octets sont INVERSES
@@ -1169,6 +1170,12 @@ begin
MF_STRING or IfThen(FLazyAlphaPct = CHOICES[I], MF_CHECKED, MF_UNCHECKED),
CHOICES[I], PChar(Format('%d%% when the mouse leaves', [CHOICES[I]])));
// LE BATTEMENT DOIT S'ARRETER PENDANT LE MENU. Il repose la barrette en
// tete de la bande TOPMOST cinq fois par seconde - or le menu deroulant est
// lui aussi dans cette bande, et se retrouvait donc recouvert par la
// barrette qui venait de l'ouvrir. TrackPopupMenu est modal : le minuteur
// continuerait de battre pendant tout ce temps.
KillTimer(FLazyWnd, LAZY_TIMER_ID);
GetCursorPos(LPt);
// Le proprietaire du menu est la fenetre message-only, JAMAIS la barrette :
// TrackPopupMenu exige un SetForegroundWindow pour se refermer tout seul, et
@@ -1187,6 +1194,8 @@ begin
end;
finally
DestroyMenu(LMenu);
if FLazyWnd <> 0 then
SetTimer(FLazyWnd, LAZY_TIMER_ID, LAZY_POLL_MS, nil);
end;
end;
@@ -1277,6 +1286,7 @@ begin
LAZY_ID_FULL: FireAutofillRequest(akFull);
LAZY_ID_PWD: FireAutofillRequest(akPasswordOnly);
LAZY_ID_TOTP: FireAutofillRequest(akTotp);
LAZY_ID_OPEN: if Assigned(FOnTrayRestore) then FOnTrayRestore();
LAZY_ID_CLOSE: PostMessage(FMsgWindow, WM_LAZY_CLOSE, 0, 0);
end;
AMsg.Result := 0;
@@ -1333,9 +1343,13 @@ begin
MakeButton(LAZY_ID_FULL, 'Full', 5, 56);
MakeButton(LAZY_ID_PWD, 'Password', 67, 76);
MakeButton(LAZY_ID_TOTP, '2FA', 149, 52);
// Meme raison que le X : quand la barrette est allumee, elle est souvent la
// seule chose de l'application a l'ecran. Revenir au coffre ne doit pas
// demander de retrouver l'icone du tray.
MakeButton(LAZY_ID_OPEN, 'Open', 207, 56);
// Fermer la barrette sans passer par le menu du tray : elle flotte au-dessus
// de tout, donc s'en debarrasser doit se faire la ou elle est.
MakeButton(LAZY_ID_CLOSE, 'X', 207, 24);
MakeButton(LAZY_ID_CLOSE, 'X', 269, 24);
// Bottom right of the WORK area, so it does not start life under the
// taskbar. From there the user drags it wherever the login form is.