docs/test-session-persistence-windows.md
Contexte : la persistance Windows (
PersistencyExtensions, 535 lignes d'extensions registre) a été remplacée par le moteur partagéLayoutPersistence(LittleBigMouse.Plugins/Persistence) branché surRegistryLayoutStore. Le mapping modèle↔DTO est désormais unique pour les deux OS.Déjà validé sous Linux : 46 tests verts (moteur complet sur store in-memory + format JSON), compilation de tous les projets, comportement Linux inchangé (DTOs déplacés verbatim).
Reste à valider : tout ce qui touche le runtime Windows réel — le
RegistryLayoutStoren'est pas testable sous Linux (API registre Windows-only), il n'est couvert que par relecture.
reg export "HKCU\SOFTWARE\Mgth\LittleBigMouse" %USERPROFILE%\lbm-backup.reg%LOCALAPPDATA%\Mgth\LittleBigMouse\Excluded.txt (et noter les autres fichiers du dossier)schtasks /query /fo list | findstr LittleBigMouseRollback à tout moment : fermer l'app, reg import %USERPROFILE%\lbm-backup.reg, restaurer Excluded.txt.
Avec le registre actuel déjà peuplé :
XLocationInMm/YLocationInMm),
ratios (PhysicalRatioX/Y), BorderResistance, source active, moniteurs exclusreg export avant/après lancement (sans sauvegarder) → diff vide, à une
exception près : ExcludedDefaultsVersion peut être écrit une fois si absent (migration top-up).
L'ancien code seedait le registre au chargement (GetOrSet) ; le nouveau ne doit RIEN écrire d'autre.REG_SZ, décimales avec point (culture invariante), bools en "1"/"0"reg export avant/après sauvegarde : uniquement les changements attendusAvant : Priority était sauvée en clé racine mais écrasée au chargement par la valeur
seedée "Normal" de la clé layout → ne persistait jamais.
Layouts\{id}\Priority est maintenant écrite à la sauvegardeRenommer HKCU\SOFTWARE\Mgth\LittleBigMouse (ex. suffixe .bak) et déplacer le dossier
%LOCALAPPDATA%\Mgth\LittleBigMouse :
Excluded.txt est créé et contient les 4 défauts (Epic, steamapps, Riot, XboxGames)Placed faux → placement auto) ;
changement assumé : au 2ᵉ lancement sans sauvegarde, ils sont TOUJOURS auto-placés
(l'ancien seeding les figeait dès le 2ᵉ lancement — la nouvelle sémantique est celle de Linux)Simuler un vieux profil dans regedit :
Priority, Pinned, AutoUpdate, StartMinimized, StartElevated, HomeCinema
de la clé racine et les créer dans Layouts\{id} → au chargement les valeurs sont reprises ;
après sauvegarde elles arrivent en clé racineShowMonitorActionWarning en ShowAttachDetachWarning (ancien nom) → la valeur
est relue ; après sauvegarde le nouveau nom est écritExcluded.txt uniquement les 3 défauts legacy (Epic, steamapps, Riot),
supprimer la valeur ExcludedDefaultsVersion → lancement : \XboxGames\ est ajouté au fichier,
ExcludedDefaultsVersion=1 écrit en clé racineIsLoading) : LoadAtStartup + StartElevated actifs,
redémarrer l'app → la tâche reste élevée (le chargement des options ne doit pas re-planifier
la tâche à mi-parcours et perdre l'élévation)SaveEnabled) : Layouts\{id}\Enabled mis à jour,
les autres valeurs de la clé layout sont intactes (c'est désormais un read-modify-write du
document complet — vérifier qu'aucune valeur n'est perdue ni altérée), tâche planifiée alignéeBorders sous PhysicalMonitors\{id}Borders\Left/Top/Right/Bottom écrites
pour ce moniteur uniquementBordersCustomized restauré, valeurs correctes, l'autre moniteur suit toujours son modèlemonitors\{pnp}\Borders + Size\Width/Height) : édition, sauvegarde, relecture OKActiveSource, DisplayName, Primary écrits sous PhysicalMonitors\{id}\{sourceId}\Layouts\{id} avec ses valeurs, sans contamination croiséeDaemonPort personnalisé dans le registre → toujours honoré (il n'est plus seedé au chargement,
mais il est maintenant écrit à la sauvegarde)Elevated détecté, UI cohérenteExcluded.txt, chemin inchangé)Placed ne devient vrai qu'après une vraie sauvegarde (install vierge : auto-placement à chaque
lancement tant qu'on n'a pas sauvé)SaveLive écrit toutes les options globales, pas seulement les 6 historiquesSaveEnabled réécrit le document layout complet (valeurs identiques) au lieu de la seule valeur EnabledHomeCinema n'est plus écrit dans la clé layout (global uniquement ; l'ancienne valeur layout
reste lue en fallback)Priority/PriorityUnhooked sont maintenant écrites aussi dans la clé layout (c'est le fix du §3)