From 91c39ecf9b85ce4a0053dad6b8973a7d856d4f31 Mon Sep 17 00:00:00 2001 From: fy59 Date: Thu, 22 Oct 2026 11:12:55 +0200 Subject: [PATCH] perf(quickshell): smooth dock hover and soften floating shadow --- docs/quickshell-dock-tela-polish-v2.md | 137 ++ .../applications.log | 12 + .../quickshell-dock-tela-polish-v2/closed.png | Bin 0 -> 4320 bytes .../quickshell-dock-tela-polish-v2/compat.log | 18 + .../headless.log | 1 + .../javascript.log | 2 + .../keyring-backend.log | 59 + .../keyring-focus.log | 5 + .../keyring-keyring-runtime.log | 4 + .../keyring-keyring-ui.log | 9 + .../keyring-p0-runtime.log | 5 + .../keyring-path-runtime.log | 5 + .../keyring-phase3b-ui.log | 7 + .../keyring-qml-qt.log | 10 + .../keyring-qml-unit.log | 5 + .../keyring-results.json | 13 + .../keyring-scratchpad-runtime.log | 2 + .../keyring.log | 12 + .../quickshell-dock-tela-polish-v2/open.png | Bin 0 -> 29577 bytes .../result.json | 1637 +++++++++++++++++ .../session.log | 152 ++ .../quickshell-dock-tela-polish-v2/shell.log | 1 + .../quickshell-dock-tela-polish-v2/unit.log | 11 + .../validation.json | 39 + .../zoom-light.png | Bin 0 -> 31109 bytes .../quickshell-dock-tela-polish-v2/zoom.png | Bin 0 -> 29374 bytes .../quickshell/labfy-sway/dock/AutoHide.js | 6 +- .../quickshell/labfy-sway/dock/Dock.qml | 50 +- sway/.config/sway/swayfx | 7 +- tests/dock/headless.py | 92 +- tests/dock/test_models.js | 11 +- 31 files changed, 2280 insertions(+), 32 deletions(-) create mode 100644 docs/quickshell-dock-tela-polish-v2.md create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/applications.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/closed.png create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/compat.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/headless.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/javascript.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/keyring-backend.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/keyring-focus.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/keyring-keyring-runtime.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/keyring-keyring-ui.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/keyring-p0-runtime.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/keyring-path-runtime.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/keyring-phase3b-ui.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/keyring-qml-qt.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/keyring-qml-unit.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/keyring-results.json create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/keyring-scratchpad-runtime.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/keyring.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/open.png create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/result.json create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/session.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/shell.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/unit.log create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/validation.json create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/zoom-light.png create mode 100644 docs/validation/quickshell-dock-tela-polish-v2/zoom.png diff --git a/docs/quickshell-dock-tela-polish-v2.md b/docs/quickshell-dock-tela-polish-v2.md new file mode 100644 index 000000000..1c15ebba4 --- /dev/null +++ b/docs/quickshell-dock-tela-polish-v2.md @@ -0,0 +1,137 @@ +# QuickShell Dock Tela — Polish V2 + +Livraison isolée du 22 octobre 2026, base `d4e2a001`, branche +`quickshell-dock-tela-polish-v2`, worktree +`/home/fy59/.dotfiles-worktrees/quickshell-dock-tela-polish-v2`. +La configuration du bureau actif n’a pas été modifiée ou rechargée. + +## Cause et correction du hover + +La V1 animait la largeur de chaque case de la `Row` et celle de chaque +`ApplicationIcon`. Chaque déplacement du pointeur modifiait donc les positions +suivantes, la largeur de la rangée et potentiellement celle de la surface. +De plus, `ApplicationIcon` calcule le `sourceSize` de son image depuis sa largeur : +la variation de taille demandait de nouvelles résolutions de rasterisation pour +les SVG Tela asynchrones. Ces deux chemins constituent les causes structurelles +identifiées des saccades et du risque de clignotement. Aucun profilage GPU du +bureau physique n’est revendiqué. + +Les cases gardent désormais une largeur de 54 px (plus le séparateur éventuel), +un pas de 57 px et des cibles souris fixes. Les images restent à 46 × 46 px, +avec une résolution demandée fixe de 92 × 92 px. Seul leur `scale` varie de +1 à 1,39, ancré en bas, avec une interpolation OutCubic de 80 ms. La taille +visuelle maximale est ainsi d’environ 64 px. Les deux marges de 12 px à +l’intérieur du viewport protègent aussi les icônes agrandies aux extrémités, +y compris après défilement sur un petit écran. + +L’influence du pointeur est une courbe smoothstep, symétrique, de rayon 76 px. +Ce rayon est inférieur à un pas et demi : seules la case la plus proche et ses +voisines immédiates peuvent recevoir une cible de grossissement non nulle. +Les positions de référence restent indépendantes de la transformation. +Les transitions peuvent brièvement finir leur interpolation après la sortie +du rayon. Aucun IPC, blur, chargement d’image ni relayout n’est déclenché par +l’animation elle-même. Les petits calculs d’influence restent liés au pointeur ; +aucun timer de polling ou délai de regroupement supplémentaire n’est nécessaire. + +## Fond flottant + +Le voile principal passe de 89 % à **16 % d’opacité**, sa hauteur de 70 à 58 px, +avec une bordure de 1 px à 9 % d’opacité. Une `RectangularShadow` QtQuick.Effects, +de géométrie fixe, produit l’ombre diffuse (blur 24, spread 2, noir à 32 %). +Elle ne capture ni les icônes ni le bureau. Le mode de contraste élevé conserve +un fond plus soutenu à 94 % et une bordure à 50 % pour la lisibilité. + +La règle SwayFX du seul namespace `labfy-sway-dock` désactive le flou du fond. +Le compromis retenu est un verre teinté très transparent, sans réfraction ni +flou des fenêtres derrière. Le rendu ne dépend donc plus d’un flou compositeur +recalculé pendant le hover. Les effets de la barre restent inchangés. +`RectangularShadow` nécessite Qt ≥ 6.9 ; l’hôte testé utilise Qt 6.12.0, +QuickShell 0.3.2 et SwayFX 0.6 (Sway 1.12.0). + +## Contrats préservés + +La machine auto-hide conserve sa bande de 4 px, son armement de 180 ms, +sa grâce de sortie de 450 ms et son animation verticale de 210 ms. +`WlrKeyboardFocus.None`, couche Top, `exclusiveZone: 0` et le masque d’entrée +restent en place. Aucune place permanente n’est réservée à l’écran. +Le menu, `FavoritesService`, la résolution Tela et le format des favoris +partagés sont inchangés. Aucun fichier Session V2, Keyring, PAM, greetd ou +logique de session n’a été modifié. + +## Validation + +Les tests s’exécutent dans un Sway privé headless, avec HOME, XDG, +sockets Wayland/Sway et profil Firefox privés, sans bus de session hérité. Les enfants sont arrêtés par +le laboratoire. Les journaux et résultats sont conservés dans +[validation/quickshell-dock-tela-polish-v2](validation/quickshell-dock-tela-polish-v2/). + +Commandes reproductibles depuis le worktree : + +```sh +python -m unittest discover -s tests/applications -v +node tests/applications/test_model.js +python -m unittest discover -s tests/dock -v +node tests/dock/test_models.js +python -m unittest discover -s tests/session_v2 -v +python tests/dock/headless.py +python tests/dock/shell_load.py +python tests/dock/session_compat.py +python tests/session_v2/validate_keyring.py --sway /usr/bin/sway +git diff --check +``` + +Résultats : 7 tests applications, 6 tests dock, 93 tests Session V2 backend, +les deux suites JavaScript, le chargement du shell complet, le scénario dock +et les scénarios Session V2/Keyring avec dock passent. Le validateur Keyring +complet termine avec ses onze contrôles à zéro (succès). + +Le test dock vérifie notamment : + +- 73 positions latérales sans changement de géométrie, sans changement d’état + des images et avec au plus trois influences non nulles ; +- 4,5 secondes de balayage continu, un mouvement souris par frame Qt, + sans changement de géométrie ni d’état de chargement des images ; +- extrémités non rognées après défilement sur une sortie de 400 px ; +- auto-hide, maintien pendant le menu contextuel, drag réel et redémarrage vide ; +- synchronisation menu/dock/client externe et réordonnancement durable ; +- absence de vol de focus vers le dock, fenêtres Kitty/Firefox privées, + reconnexion IPC et changements de résolution ; +- navigation clavier du menu et présence de la règle SwayFX sans blur du dock. + +Le dernier passage mesure 281 intervalles : moyenne 16.00 ms, +95e percentile 16.46 ms, maximum 16.62 ms. +Les intervalles d’animation sont conservés dans `result.json` ; ce sont des +mesures de cadence Qt avec rendu logiciel, pas des timestamps de présentation +matérielle. Ils établissent la stabilité du laboratoire privé. La perception +sur le GPU, le fond d’écran et les sorties physiques de la session active reste +à confirmer après intégration, sans prétendre l’avoir observée ici. + +Captures issues de `grim`, sans retouche : + +- [Dock fermé](validation/quickshell-dock-tela-polish-v2/closed.png). +- [Dock ouvert](validation/quickshell-dock-tela-polish-v2/open.png). +- [Dock survolé](validation/quickshell-dock-tela-polish-v2/zoom.png). +- [Survol sur fond clair : ombre et transparence](validation/quickshell-dock-tela-polish-v2/zoom-light.png). + +## Intégration + +Le patch complet, fichiers nouveaux et PNG compris, se trouve à côté du worktree : +`/home/fy59/.dotfiles-worktrees/quickshell-dock-tela-polish-v2.patch`. +Les changements restent non commités et aucun fichier de favoris n’est livré. + +Après revue, depuis le dépôt principal à la base compatible : + +```sh +cd /home/fy59/.dotfiles +git apply --check /home/fy59/.dotfiles-worktrees/quickshell-dock-tela-polish-v2.patch +git apply /home/fy59/.dotfiles-worktrees/quickshell-dock-tela-polish-v2.patch +swaymsg reload +systemctl --user restart quickshell-labfy-sway.service +``` + +La vérification `git apply --check` est effectuée à la livraison. Les trois +commandes d’application/rechargement restent à exécuter lors de l’intégration. +Le redémarrage QuickShell recharge aussi les autres composants du shell. +Après intégration, vérifier visuellement un balayage latéral, l’auto-hide et +le menu sur les sorties physiques. Il n’est pas nécessaire de réécrire les +favoris ou de redémarrer la session utilisateur. diff --git a/docs/validation/quickshell-dock-tela-polish-v2/applications.log b/docs/validation/quickshell-dock-tela-polish-v2/applications.log new file mode 100644 index 000000000..da2433f55 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/applications.log @@ -0,0 +1,12 @@ +test_bad_state_does_not_get_overwritten (test_backend.FavoritesTests.test_bad_state_does_not_get_overwritten) ... ok +test_seed_order_atomic_update_and_missing_entry (test_backend.FavoritesTests.test_seed_order_atomic_update_and_missing_entry) ... ok +test_graphical_uses_desktop_id_and_uwsm_service (test_backend.LaunchTests.test_graphical_uses_desktop_id_and_uwsm_service) ... ok +test_invalid_id_and_missing_entry (test_backend.LaunchTests.test_invalid_id_and_missing_entry) ... ok +test_nodisplay_entry_is_refused_before_launch (test_backend.LaunchTests.test_nodisplay_entry_is_refused_before_launch) ... ok +test_terminal_entry_already_running_kitty_is_not_wrapped_twice (test_backend.LaunchTests.test_terminal_entry_already_running_kitty_is_not_wrapped_twice) ... ok +test_terminal_preserves_desktop_exec_fields_and_kitty (test_backend.LaunchTests.test_terminal_preserves_desktop_exec_fields_and_kitty) ... ok + +---------------------------------------------------------------------- +Ran 7 tests in 0.004s + +OK diff --git a/docs/validation/quickshell-dock-tela-polish-v2/closed.png b/docs/validation/quickshell-dock-tela-polish-v2/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5c96b47a041abda9ea41d6554b6101ada18aac GIT binary patch literal 4320 zcmeAS@N?(olHy`uVBq!ia0y~yUs8~~Ck5(z+3h{pg(a literal 0 HcmV?d00001 diff --git a/docs/validation/quickshell-dock-tela-polish-v2/compat.log b/docs/validation/quickshell-dock-tela-polish-v2/compat.log new file mode 100644 index 000000000..feee4bbbe --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/compat.log @@ -0,0 +1,18 @@ +/tmp/labfy-session-v2-TEST_ONLY-s23v41ci +ready PASS +accept PASS +cancel PASS +timeout PASS +absent PASS +still-locked PASS +different PASS +quickshell-restart-during-unlock PASS +keyring_ui WITH_DOCK PASS +success PASS +failure PASS +invalid PASS +new PASS +claimed PASS +real PASS +deferred-real PASS +phase3b_ui WITH_DOCK PASS diff --git a/docs/validation/quickshell-dock-tela-polish-v2/headless.log b/docs/validation/quickshell-dock-tela-polish-v2/headless.log new file mode 100644 index 000000000..f9d4e28be --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/headless.log @@ -0,0 +1 @@ +Dock headless: PASS /tmp/labfy-session-v2-TEST_ONLY-dlggtemr diff --git a/docs/validation/quickshell-dock-tela-polish-v2/javascript.log b/docs/validation/quickshell-dock-tela-polish-v2/javascript.log new file mode 100644 index 000000000..9e80b1e99 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/javascript.log @@ -0,0 +1,2 @@ +Dock state and window models: PASS +ApplicationsModel: PASS diff --git a/docs/validation/quickshell-dock-tela-polish-v2/keyring-backend.log b/docs/validation/quickshell-dock-tela-polish-v2/keyring-backend.log new file mode 100644 index 000000000..9755ec110 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/keyring-backend.log @@ -0,0 +1,59 @@ +............................/usr/lib/python3.14/site-packages/gi/events.py:803: DeprecationWarning: 'asyncio.AbstractEventLoopPolicy' is deprecated and slated for removal in Python 3.16 + AbstractEventLoopPolicy = getattr(asyncio, "AbstractEventLoopPolicy", object) +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +../usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +./usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +../usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +../usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +.......................................................... +---------------------------------------------------------------------- +Ran 93 tests in 8.443s + +OK diff --git a/docs/validation/quickshell-dock-tela-polish-v2/keyring-focus.log b/docs/validation/quickshell-dock-tela-polish-v2/keyring-focus.log new file mode 100644 index 000000000..d52c179d5 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/keyring-focus.log @@ -0,0 +1,5 @@ +............................. +---------------------------------------------------------------------- +Ran 29 tests in 0.129s + +OK diff --git a/docs/validation/quickshell-dock-tela-polish-v2/keyring-keyring-runtime.log b/docs/validation/quickshell-dock-tela-polish-v2/keyring-keyring-runtime.log new file mode 100644 index 000000000..dc5357997 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/keyring-keyring-runtime.log @@ -0,0 +1,4 @@ +/tmp/labfy-session-v2-TEST_ONLY-0p63m0if +stable-final-focus PASS +/tmp/labfy-session-v2-TEST_ONLY-vn3vcup_ +late-refused PASS diff --git a/docs/validation/quickshell-dock-tela-polish-v2/keyring-keyring-ui.log b/docs/validation/quickshell-dock-tela-polish-v2/keyring-keyring-ui.log new file mode 100644 index 000000000..7a130bce1 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/keyring-keyring-ui.log @@ -0,0 +1,9 @@ +/tmp/labfy-session-v2-TEST_ONLY-p4jqsmpt +ready PASS +accept PASS +cancel PASS +timeout PASS +absent PASS +still-locked PASS +different PASS +quickshell-restart-during-unlock PASS diff --git a/docs/validation/quickshell-dock-tela-polish-v2/keyring-p0-runtime.log b/docs/validation/quickshell-dock-tela-polish-v2/keyring-p0-runtime.log new file mode 100644 index 000000000..b7b3e4ebe --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/keyring-p0-runtime.log @@ -0,0 +1,5 @@ +guard-replacement PASS APPLICATION_MEMBERSHIP_CHANGED +guard-extra PASS APPLICATION_MEMBERSHIP_CHANGED +last-capture-layout PASS FINAL_TREE_MISMATCH +last-capture-swap PASS RECOVERY_ORDER_CHANGED +guard-finish-layout PASS FINAL_TREE_MISMATCH diff --git a/docs/validation/quickshell-dock-tela-polish-v2/keyring-path-runtime.log b/docs/validation/quickshell-dock-tela-polish-v2/keyring-path-runtime.log new file mode 100644 index 000000000..97b5bd712 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/keyring-path-runtime.log @@ -0,0 +1,5 @@ +pendant-guard SUCCÈS : quatre swaps, quatre slots, arbre exact, focus vérifié +apres-phase0 SUCCÈS : quatre swaps, quatre slots, arbre exact, focus vérifié +deux-frontieres SUCCÈS : quatre swaps, quatre slots, arbre exact, focus vérifié +autotiling-guard SUCCÈS : quatre swaps, quatre slots, arbre exact, focus vérifié +provider-unaire SUCCÈS : changement externe refusé avant IPC suivant diff --git a/docs/validation/quickshell-dock-tela-polish-v2/keyring-phase3b-ui.log b/docs/validation/quickshell-dock-tela-polish-v2/keyring-phase3b-ui.log new file mode 100644 index 000000000..a87285cee --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/keyring-phase3b-ui.log @@ -0,0 +1,7 @@ +success PASS +failure PASS +invalid PASS +new PASS +claimed PASS +real PASS +deferred-real PASS diff --git a/docs/validation/quickshell-dock-tela-polish-v2/keyring-qml-qt.log b/docs/validation/quickshell-dock-tela-polish-v2/keyring-qml-qt.log new file mode 100644 index 000000000..d9926e9bb --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/keyring-qml-qt.log @@ -0,0 +1,10 @@ +********* Start testing of qmltestrunner ********* +Config: Using QtTest library 6.12.0, Qt 6.12.0 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 16.2.1 20260810), arch unknown +PASS : qmltestrunner::SessionExitGateV2::initTestCase() +PASS : qmltestrunner::SessionExitGateV2::test_backend_reason_is_visible_and_logout_stays_gated() +PASS : qmltestrunner::SessionExitGateV2::test_error_or_legacy_success_never_exits() +PASS : qmltestrunner::SessionExitGateV2::test_quit_without_saving_requires_explicit_call() +PASS : qmltestrunner::SessionExitGateV2::test_saved_releases_only_confirmed_action() +PASS : qmltestrunner::SessionExitGateV2::cleanupTestCase() +Totals: 6 passed, 0 failed, 0 skipped, 0 blacklisted, 5ms +********* Finished testing of qmltestrunner ********* diff --git a/docs/validation/quickshell-dock-tela-polish-v2/keyring-qml-unit.log b/docs/validation/quickshell-dock-tela-polish-v2/keyring-qml-unit.log new file mode 100644 index 000000000..59acbb363 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/keyring-qml-unit.log @@ -0,0 +1,5 @@ +............... +---------------------------------------------------------------------- +Ran 15 tests in 20.330s + +OK diff --git a/docs/validation/quickshell-dock-tela-polish-v2/keyring-results.json b/docs/validation/quickshell-dock-tela-polish-v2/keyring-results.json new file mode 100644 index 000000000..316f4fc7b --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/keyring-results.json @@ -0,0 +1,13 @@ +{ + "backend": 0, + "focus": 0, + "qml-unit": 0, + "qml-qt": 0, + "keyring-ui": 0, + "keyring-runtime": 0, + "scratchpad-runtime": 0, + "phase3b-ui": 0, + "p0-runtime": 0, + "path-runtime": 0, + "diff-check": 0 +} diff --git a/docs/validation/quickshell-dock-tela-polish-v2/keyring-scratchpad-runtime.log b/docs/validation/quickshell-dock-tela-polish-v2/keyring-scratchpad-runtime.log new file mode 100644 index 000000000..ee49c089b --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/keyring-scratchpad-runtime.log @@ -0,0 +1,2 @@ +/tmp/labfy-session-v2-TEST_ONLY-1lfda8ji +PASS save/store/restore/show/hide/new-membership/all-hidden/cold-kitty/no-duplicate diff --git a/docs/validation/quickshell-dock-tela-polish-v2/keyring.log b/docs/validation/quickshell-dock-tela-polish-v2/keyring.log new file mode 100644 index 000000000..65a9f8759 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/keyring.log @@ -0,0 +1,12 @@ +/tmp/labfy-keyring-validation-ibq2bukh +backend 0 +focus 0 +qml-unit 0 +qml-qt 0 +keyring-ui 0 +keyring-runtime 0 +scratchpad-runtime 0 +phase3b-ui 0 +p0-runtime 0 +path-runtime 0 +diff-check 0 diff --git a/docs/validation/quickshell-dock-tela-polish-v2/open.png b/docs/validation/quickshell-dock-tela-polish-v2/open.png new file mode 100644 index 0000000000000000000000000000000000000000..49ff0ae8a9b25aea6c7509d57a9ab902c0bbf803 GIT binary patch literal 29577 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 literal 0 HcmV?d00001 diff --git a/docs/validation/quickshell-dock-tela-polish-v2/result.json b/docs/validation/quickshell-dock-tela-polish-v2/result.json new file mode 100644 index 000000000..52c73c6e0 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/result.json @@ -0,0 +1,1637 @@ +{ + "status": "PASS", + "initial": { + "ready": true, + "ids": [ + "firefox.desktop", + "kitty.desktop", + "yazi.desktop", + "nvim.desktop", + "org.darktable.darktable.desktop", + "orca-slicer.desktop", + "org.freecad.FreeCAD.desktop", + "org.kde.digikam.desktop", + "AppFlowy.desktop" + ], + "error": "", + "phase": "hidden", + "revealed": false, + "entries": [ + { + "id": "firefox.desktop", + "name": "Mozilla Firefox", + "genericName": "Web Browser", + "keywords": [ + "Internet", + "WWW", + "Browser", + "Web", + "Explorer" + ], + "icon": "firefox", + "iconSource": "file:///usr/share/icons/Tela-circle-purple-dark/scalable/apps/firefox.svg", + "aliases": [ + "firefox" + ], + "newInstance": false, + "category": "Internet", + "pinned": true, + "windows": [] + }, + { + "id": "kitty.desktop", + "name": "kitty", + "genericName": "Terminal emulator", + "keywords": [], + "icon": "kitty", + "iconSource": "file:///usr/share/icons/Tela-circle-purple-dark/scalable/apps/kitty.svg", + "aliases": [ + "kitty" + ], + "newInstance": true, + "category": "Syst\u00e8me", + "pinned": true, + "windows": [] + }, + { + "id": "yazi.desktop", + "name": "Yazi File Manager", + "genericName": "", + "keywords": [ + "File", + "Manager", + "Explorer", + "Browser", + "Launcher" + ], + "icon": "yazi", + "iconSource": "file:///usr/share/icons/hicolor/48x48/apps/yazi.png", + "aliases": [ + "yazi" + ], + "newInstance": false, + "category": "Syst\u00e8me", + "pinned": true, + "windows": [] + }, + { + "id": "nvim.desktop", + "name": "Neovim", + "genericName": "Text Editor", + "keywords": [ + "Text", + "editor" + ], + "icon": "nvim", + "iconSource": "file:///usr/share/icons/Tela-circle-purple-dark/scalable/apps/nvim.svg", + "aliases": [ + "nvim" + ], + "newInstance": false, + "category": "D\u00e9veloppement", + "pinned": true, + "windows": [] + }, + { + "id": "org.darktable.darktable.desktop", + "name": "Darktable Photo Workflow Software", + "genericName": "Virtual Lighttable and Darkroom", + "keywords": [ + "graphics", + "photography", + "raw" + ], + "icon": "darktable", + "iconSource": "file:///usr/share/icons/Tela-circle-purple-dark/scalable/apps/darktable.svg", + "aliases": [ + "darktable", + "org.darktable.darktable" + ], + "newInstance": false, + "category": "Graphisme", + "pinned": true, + "windows": [] + }, + { + "id": "orca-slicer.desktop", + "name": "OrcaSlicer", + "genericName": "", + "keywords": [], + "icon": "OrcaSlicer", + "iconSource": "file:///usr/share/icons/hicolor/192x192/apps/OrcaSlicer.png", + "aliases": [ + "apprun", + "orca-slicer" + ], + "newInstance": false, + "category": "Utilitaires", + "pinned": true, + "windows": [] + }, + { + "id": "org.freecad.FreeCAD.desktop", + "name": "FreeCAD", + "genericName": "CAD Application", + "keywords": [], + "icon": "org.freecad.FreeCAD", + "iconSource": "file:///usr/share/icons/Tela-circle-purple-dark/scalable/apps/org.freecad.FreeCAD.svg", + "aliases": [ + "freecad", + "org.freecad.freecad" + ], + "newInstance": false, + "category": "Graphisme", + "pinned": true, + "windows": [] + }, + { + "id": "org.kde.digikam.desktop", + "name": "digiKam", + "genericName": "Photo Management Program", + "keywords": [], + "icon": "digikam", + "iconSource": "file:///usr/share/icons/Tela-circle-purple-dark/scalable/apps/digikam.svg", + "aliases": [ + "digikam", + "org.kde.digikam" + ], + "newInstance": false, + "category": "Graphisme", + "pinned": true, + "windows": [] + }, + { + "id": "AppFlowy.desktop", + "name": "AppFlowy", + "genericName": "", + "keywords": [ + "Notes" + ], + "icon": "appflowy", + "iconSource": "file:///usr/share/icons/hicolor/scalable/apps/appflowy.svg", + "aliases": [ + "appflowy" + ], + "newInstance": false, + "category": "Internet", + "pinned": true, + "windows": [] + } + ], + "theme": "Tela-circle-purple-dark", + "menu": null, + "searchFocused": false, + "navFocused": false, + "gridFocused": false, + "screenWidth": 1280, + "bodyY": 364, + "width": 562, + "pointerX": -1000, + "tileWidth": 54, + "tiles": [ + { + "x": 0, + "width": 54, + "growth": 0, + "scale": 1, + "visualLeft": 16, + "visualRight": 62, + "iconWidth": 46, + "imageStatus": 1 + }, + { + "x": 57, + "width": 54, + "growth": 0, + "scale": 1, + "visualLeft": 73, + "visualRight": 119, + "iconWidth": 46, + "imageStatus": 1 + }, + { + "x": 114, + "width": 54, + "growth": 0, + "scale": 1, + "visualLeft": 130, + "visualRight": 176, + "iconWidth": 46, + "imageStatus": 1 + }, + { + "x": 171, + "width": 54, + "growth": 0, + "scale": 1, + "visualLeft": 187, + "visualRight": 233, + "iconWidth": 46, + "imageStatus": 1 + }, + { + "x": 228, + "width": 54, + "growth": 0, + "scale": 1, + "visualLeft": 244, + "visualRight": 290, + "iconWidth": 46, + "imageStatus": 1 + }, + { + "x": 285, + "width": 54, + "growth": 0, + "scale": 1, + "visualLeft": 301, + "visualRight": 347, + "iconWidth": 46, + "imageStatus": 1 + }, + { + "x": 342, + "width": 54, + "growth": 0, + "scale": 1, + "visualLeft": 358, + "visualRight": 404, + "iconWidth": 46, + "imageStatus": 1 + }, + { + "x": 399, + "width": 54, + "growth": 0, + "scale": 1, + "visualLeft": 415, + "visualRight": 461, + "iconWidth": 46, + "imageStatus": 1 + }, + { + "x": 456, + "width": 54, + "growth": 0, + "scale": 1, + "visualLeft": 472, + "visualRight": 518, + "iconWidth": 46, + "imageStatus": 1 + } + ], + "context": false + }, + "hoverSamples": [ + { + "pointerX": 45, + "scales": [ + 1.363804782038198, + 1.0157095258055109, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 51, + "scales": [ + 1.3882699550557924, + 1.0548027323828943, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 57, + "scales": [ + 1.3843136851862765, + 1.091309228253847, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 63, + "scales": [ + 1.373286850141958, + 1.1206986191125898, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 69, + "scales": [ + 1.3408528358586607, + 1.1776019752381606, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 75, + "scales": [ + 1.305681608388378, + 1.2234332799799008, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 81, + "scales": [ + 1.2580024360560373, + 1.2748487289194408, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 87, + "scales": [ + 1.2196026259959813, + 1.3090104233033235, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 93, + "scales": [ + 1.1741498267604817, + 1.3432409357273196, + 1.0024931307890408, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 99, + "scales": [ + 1.1416728912650975, + 1.3628458983572371, + 1.0109736368982896, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 105, + "scales": [ + 1.0873033026767522, + 1.3854422056168032, + 1.0394622691784017, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 111, + "scales": [ + 1.0615376146658617, + 1.3882249143461145, + 1.0621942601060335, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 117, + "scales": [ + 1.0241429672683096, + 1.3775922781514893, + 1.1111828894698241, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 123, + "scales": [ + 1.0065390307321243, + 1.3555244887699822, + 1.1548417092675867, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 129, + "scales": [ + 1.0016381307786313, + 1.334227800805353, + 1.186696970448121, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 135, + "scales": [ + 1, + 1.2857378080404833, + 1.245990942981073, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 141, + "scales": [ + 1, + 1.2426400446073833, + 1.2888160829061537, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 147, + "scales": [ + 1, + 1.2098712046539537, + 1.316621264396069, + 1.0001027272553589, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 153, + "scales": [ + 1, + 1.1651762764597622, + 1.348701019112463, + 1.0048592500011324, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 159, + "scales": [ + 1, + 1.1210207885160686, + 1.3729180386449071, + 1.0198319687657567, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 165, + "scales": [ + 1, + 1.0685981037928376, + 1.3884777989704347, + 1.0549030997871813, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 171, + "scales": [ + 1, + 1.036552155625594, + 1.3843246457052127, + 1.0913145210661823, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 177, + "scales": [ + 1, + 1.0196469552617207, + 1.3732869709621067, + 1.1206986774563943, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 183, + "scales": [ + 1, + 1.0022753856578528, + 1.3408528385041445, + 1.1776019765156591, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 189, + "scales": [ + 1, + 1.0001252792877882, + 1.3168184087535504, + 1.2096279270453352, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 195, + "scales": [ + 1, + 1, + 1.2646255664435333, + 1.2678817124001625, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 201, + "scales": [ + 1, + 1, + 1.2200364356853728, + 1.308553983154517, + 1, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 207, + "scales": [ + 1, + 1, + 1.1731284917173772, + 1.3440476564587591, + 1.002532753157348, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 213, + "scales": [ + 1, + 1, + 1.1287313369884162, + 1.3699002407890941, + 1.015529441631054, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 219, + "scales": [ + 1, + 1, + 1.0874106773358652, + 1.3854975925447648, + 1.039272178046402, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 225, + "scales": [ + 1, + 1, + 1.062353360346548, + 1.3882249143461145, + 1.0613770391697144, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 231, + "scales": [ + 1, + 1, + 1.0241428681567737, + 1.3775922781514893, + 1.111182923603433, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 237, + "scales": [ + 1, + 1, + 1.0065390255055393, + 1.3555244887699822, + 1.1548417110676013, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 243, + "scales": [ + 1, + 1, + 1.001571315438749, + 1.3334517260736825, + 1.1877654820586214, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 249, + "scales": [ + 1, + 1, + 1, + 1.2852112500207933, + 1.2465951521847594, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 255, + "scales": [ + 1, + 1, + 1, + 1.2422315830896524, + 1.2892849275943337, + 1, + 1, + 1, + 1 + ] + }, + { + "pointerX": 261, + "scales": [ + 1, + 1, + 1, + 1.197097072168452, + 1.3268074123175235, + 1.000160070329069, + 1, + 1, + 1 + ] + }, + { + "pointerX": 267, + "scales": [ + 1, + 1, + 1, + 1.1510118807674257, + 1.3579525725649766, + 1.007467520384492, + 1, + 1, + 1 + ] + }, + { + "pointerX": 273, + "scales": [ + 1, + 1, + 1, + 1.108024748464491, + 1.3788864904903757, + 1.0259707460414806, + 1, + 1, + 1 + ] + }, + { + "pointerX": 279, + "scales": [ + 1, + 1, + 1, + 1.079565649932684, + 1.3865718264665194, + 1.0459330060333922, + 1, + 1, + 1 + ] + }, + { + "pointerX": 285, + "scales": [ + 1, + 1, + 1, + 1.0462598464917812, + 1.3862846725543692, + 1.0795371532009201, + 1, + 1, + 1 + ] + }, + { + "pointerX": 291, + "scales": [ + 1, + 1, + 1, + 1.0136379141577305, + 1.3676152122568639, + 1.13317790498388, + 1, + 1, + 1 + ] + }, + { + "pointerX": 297, + "scales": [ + 1, + 1, + 1, + 1.002068961498849, + 1.340664330436317, + 1.178023299851276, + 1, + 1, + 1 + ] + }, + { + "pointerX": 303, + "scales": [ + 1, + 1, + 1, + 1.0001392322308533, + 1.3056716676727467, + 1.2234554982700454, + 1, + 1, + 1 + ] + }, + { + "pointerX": 309, + "scales": [ + 1, + 1, + 1, + 1, + 1.2646406775018222, + 1.2678580979378713, + 1, + 1, + 1 + ] + }, + { + "pointerX": 315, + "scales": [ + 1, + 1, + 1, + 1, + 1.233665522909586, + 1.2966355960016418, + 1, + 1, + 1 + ] + }, + { + "pointerX": 321, + "scales": [ + 1, + 1, + 1, + 1, + 1.1741498266418597, + 1.3432409359924493, + 1.0024931307890408, + 1, + 1 + ] + }, + { + "pointerX": 327, + "scales": [ + 1, + 1, + 1, + 1, + 1.129349274890679, + 1.3695476988829187, + 1.0153328423621721, + 1, + 1 + ] + }, + { + "pointerX": 333, + "scales": [ + 1, + 1, + 1, + 1, + 1.0991118526368178, + 1.381642492341664, + 1.0317914813699147, + 1, + 1 + ] + }, + { + "pointerX": 339, + "scales": [ + 1, + 1, + 1, + 1, + 1.0515551133187797, + 1.3882249143461145, + 1.072290857131641, + 1, + 1 + ] + }, + { + "pointerX": 345, + "scales": [ + 1, + 1, + 1, + 1, + 1.031302112818197, + 1.3814012791361672, + 1.0998593954820672, + 1, + 1 + ] + }, + { + "pointerX": 351, + "scales": [ + 1, + 1, + 1, + 1, + 1.0113010253633286, + 1.362713089675657, + 1.141529633350545, + 1, + 1 + ] + }, + { + "pointerX": 357, + "scales": [ + 1, + 1, + 1, + 1, + 1.0008131200005774, + 1.324146205446569, + 1.2005421506786613, + 1, + 1 + ] + }, + { + "pointerX": 363, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1.2857508471322725, + 1.245966768372768, + 1, + 1 + ] + }, + { + "pointerX": 369, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1.2559053818860124, + 1.2761665810744798, + 1, + 1 + ] + }, + { + "pointerX": 375, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1.1970970750539196, + 1.3268074069680855, + 1.000160070329069, + 1 + ] + }, + { + "pointerX": 381, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1.151486270447754, + 1.3575686559483435, + 1.0074655480065615, + 1 + ] + }, + { + "pointerX": 387, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1.1070407821140205, + 1.3794115185542348, + 1.0263251664385529, + 1 + ] + }, + { + "pointerX": 393, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1.0685753058608392, + 1.3884925759026732, + 1.0549074341167726, + 1 + ] + }, + { + "pointerX": 399, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1.0453616958182157, + 1.3864488384842315, + 1.08026193510416, + 1 + ] + }, + { + "pointerX": 405, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1.0139062780445325, + 1.3678663125832273, + 1.1326239577178407, + 1 + ] + }, + { + "pointerX": 411, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1.0022912412325862, + 1.3408564174454372, + 1.1775823431330856, + 1 + ] + }, + { + "pointerX": 417, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1.0000496853136491, + 1.3053851325913794, + 1.2239032141967106, + 1 + ] + }, + { + "pointerX": 423, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1.2646255672533906, + 1.2678817079574416, + 1 + ] + }, + { + "pointerX": 429, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1.22003643572808, + 1.3085539829202328, + 1 + ] + }, + { + "pointerX": 435, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1.1869415232944303, + 1.3340494428249292, + 1.001599999729484 + ] + }, + { + "pointerX": 441, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1.1287313369884275, + 1.3699002407890322, + 1.015529441631054 + ] + }, + { + "pointerX": 447, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1.0990870533766723, + 1.3816564407471799, + 1.0317995774913613 + ] + }, + { + "pointerX": 453, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1.0625003528527146, + 1.3881672014501516, + 1.061576792831316 + ] + }, + { + "pointerX": 459, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1.0321703297321074, + 1.3814012791361672, + 1.0990095389269032 + ] + }, + { + "pointerX": 465, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1.0065401423812486, + 1.3555244887699822, + 1.1548409962939408 + ] + }, + { + "pointerX": 471, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1.0008141225084088, + 1.324146205446569, + 1.200541169371066 + ] + }, + { + "pointerX": 477, + "scales": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1.2854107423974463, + 1.246443367916735 + ] + } + ], + "animationTiming": { + "frames": 281, + "meanMs": 15.999635021352313, + "p95Ms": 16.464266000000002, + "maxMs": 16.616559 + }, + "frameSweep": { + "running": false, + "intervals": [ + 15.897642999999999, + 16.411628, + 16.057852, + 16.185438, + 15.240653, + 16.151425, + 16.27814, + 16.183565, + 15.298279999999998, + 16.457805, + 16.308977, + 15.391464000000001, + 16.426786, + 15.367889, + 16.315631, + 16.361515, + 15.333606, + 16.300752000000003, + 16.370462, + 15.413794999999999, + 16.340566000000003, + 16.353811, + 15.348243, + 16.350755000000003, + 16.310109999999998, + 15.317406, + 16.381382, + 16.275386, + 15.363381, + 16.245078, + 16.21301, + 16.376303, + 15.33599, + 16.382474000000002, + 15.361187, + 16.378216000000002, + 16.373799, + 15.369182, + 16.375811, + 16.439491, + 15.462925, + 16.377736, + 15.325671000000002, + 16.593166, + 15.361547, + 16.325098, + 16.464266000000002, + 15.399378, + 16.403033, + 15.398947, + 16.50952, + 15.384971, + 16.463074000000002, + 16.454839, + 15.414386, + 16.544324999999997, + 15.378048, + 16.373507, + 15.35751, + 16.352349, + 16.390179, + 15.376846, + 16.375832, + 16.358379, + 15.344857, + 16.325899, + 16.362486999999998, + 15.53487, + 16.32085, + 15.301837, + 16.316482, + 16.378566, + 15.360706, + 16.352108, + 16.276989, + 15.323697000000001, + 16.406329, + 16.424963, + 15.476421, + 16.545237, + 15.317005, + 16.370290999999998, + 16.374099, + 15.381103999999999, + 16.368118000000003, + 15.362149, + 16.353711, + 16.363297999999997, + 15.339215999999999, + 16.358921, + 16.367907000000002, + 15.337994, + 16.297967, + 16.340567, + 15.320390999999999, + 16.424693, + 16.316330999999998, + 15.326884000000002, + 16.335707000000003, + 16.349794, + 15.417752, + 16.381693, + 15.296035, + 16.303969000000002, + 16.230742, + 16.205566, + 15.333245, + 16.322263, + 16.32127, + 15.321914000000001, + 16.223279, + 16.281457, + 15.560717, + 16.367206, + 16.327382, + 15.224113, + 16.173396, + 16.210784999999998, + 16.371474, + 15.296096, + 16.363379000000002, + 16.338152, + 15.404727, + 16.384068000000003, + 16.332181000000002, + 15.525362, + 16.392622999999997, + 15.364123000000001, + 16.470388, + 15.423582999999999, + 16.379929, + 16.353651, + 15.420055999999999, + 16.414144, + 15.430926, + 16.423711, + 16.406439, + 15.579593, + 16.391892000000002, + 15.372037, + 16.317694, + 16.411829, + 15.379441, + 16.437907000000003, + 15.416981, + 16.408763, + 15.4758, + 16.450751, + 16.421446999999997, + 15.550208, + 16.353571000000002, + 15.526164, + 16.386360999999997, + 15.339256, + 16.323385, + 16.335176, + 15.458298000000001, + 16.429130999999998, + 15.353423, + 16.436715, + 16.437176, + 15.586034, + 16.399176, + 15.451715, + 15.851508, + 16.432367, + 15.388147, + 16.431536, + 16.415997, + 15.342602000000001, + 16.373848, + 16.453447, + 15.460361, + 16.537803, + 15.47078, + 16.388455999999998, + 15.449351, + 16.368969, + 15.398525999999999, + 16.386663, + 16.45047, + 15.407713999999999, + 16.413171000000002, + 15.424294, + 16.441765, + 15.602365, + 16.418250999999998, + 15.399467999999999, + 16.274634, + 16.318436, + 16.242975, + 15.305053000000001, + 16.406459, + 15.460402, + 16.39663, + 16.448447, + 15.436517, + 16.564523, + 15.348944, + 16.332081, + 16.352228, + 15.268595, + 16.348251, + 16.349393, + 15.272803, + 16.418201, + 16.383176, + 15.370424, + 16.369390000000003, + 15.439743, + 16.395849000000002, + 16.376714, + 15.374161, + 16.370853, + 15.39483, + 16.505743, + 16.340697000000002, + 15.306916000000001, + 16.356947, + 16.364030000000003, + 15.383779, + 16.566246, + 15.363391, + 16.385831, + 15.375684, + 16.500604, + 16.399145, + 15.332324, + 16.330778000000002, + 16.309108, + 15.334909000000001, + 16.36962, + 16.005775, + 16.057651, + 16.134884, + 16.153147999999998, + 15.149434, + 16.356547, + 16.436064000000002, + 15.247686, + 16.340595999999998, + 16.368918999999998, + 15.350518000000001, + 16.370222000000002, + 16.342209, + 15.365936, + 16.533545, + 15.351359, + 16.367627, + 16.366515000000003, + 15.372027, + 16.405117, + 15.358281999999999, + 16.303327, + 16.344063, + 15.430556, + 16.406169000000002, + 16.403072, + 15.543726000000001, + 16.337401, + 15.328857, + 16.407861999999998, + 16.391361, + 15.333165, + 16.274773999999997, + 16.333574, + 15.275027, + 16.422698999999998, + 16.33167, + 15.35709, + 16.414784, + 15.407844, + 16.415516, + 16.323034, + 15.38384, + 16.539375, + 15.468908, + 16.501946, + 15.531704, + 16.616559, + 15.40557 + ], + "geometryChanged": false, + "imageChanged": false + }, + "reordered": [ + "kitty.desktop", + "firefox.desktop", + "yazi.desktop", + "nvim.desktop", + "org.darktable.darktable.desktop", + "orca-slicer.desktop", + "org.freecad.FreeCAD.desktop", + "org.kde.digikam.desktop", + "AppFlowy.desktop" + ], + "checks": [ + "shared favorites", + "menu and dock mutations", + "durable reorder", + "empty restart", + "autohide", + "context hold", + "kitty multi-window", + "floating scratchpad explicit focus", + "window close", + "no hover focus", + "real pointer drag", + "fixed layout transform hover", + "stable SVG readiness", + "lateral sweep 73 samples", + "IPC reconnect", + "Firefox private profile", + "desktop install/remove monitoring", + "external writer", + "keyboard menu navigation", + "resolution change", + "SwayFX dock blur disabled" + ] +} diff --git a/docs/validation/quickshell-dock-tela-polish-v2/session.log b/docs/validation/quickshell-dock-tela-polish-v2/session.log new file mode 100644 index 000000000..8c95e3b20 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/session.log @@ -0,0 +1,152 @@ +test_absent_last_existing_directory (test_bootstrap.BootstrapTests.test_absent_last_existing_directory) ... ok +test_absent_no_creation (test_bootstrap.BootstrapTests.test_absent_no_creation) ... ok +test_allowlist_denied (test_bootstrap.BootstrapTests.test_allowlist_denied) ... ok +test_checkpoint_created_between_observations (test_bootstrap.BootstrapTests.test_checkpoint_created_between_observations) ... ok +test_empty_sessions_with_or_without_automatic_allows_without_creation (test_bootstrap.BootstrapTests.test_empty_sessions_with_or_without_automatic_allows_without_creation) ... ok +test_envelope_and_framing_rejected (test_bootstrap.BootstrapTests.test_envelope_and_framing_rejected) ... ok +test_home_fallback_matches_canonical_location (test_bootstrap.BootstrapTests.test_home_fallback_matches_canonical_location) ... ok +test_interleaved_operations_map_unchanged (test_bootstrap.BootstrapTests.test_interleaved_operations_map_unchanged) ... ok +test_last_with_sessions_absent_refuses (test_bootstrap.BootstrapTests.test_last_with_sessions_absent_refuses) ... ok +test_named_only_without_automatic_refuses (test_bootstrap.BootstrapTests.test_named_only_without_automatic_refuses) ... ok +test_os_error_is_not_absence (test_bootstrap.BootstrapTests.test_os_error_is_not_absence) ... ok +test_present_and_corrupt_always_refuse (test_bootstrap.BootstrapTests.test_present_and_corrupt_always_refuse) ... ok +test_sessions_any_entry_refuses_without_content_read (test_bootstrap.BootstrapTests.test_sessions_any_entry_refuses_without_content_read) ... ok +test_sessions_list_error_refuses (test_bootstrap.BootstrapTests.test_sessions_list_error_refuses) ... ok +test_sessions_unsafe_directory_refuses (test_bootstrap.BootstrapTests.test_sessions_unsafe_directory_refuses) ... ok +test_socket_authority_failure_refuses_absence (test_bootstrap.BootstrapTests.test_socket_authority_failure_refuses_absence) ... ok +test_state_symlink_and_relative_state_refuse (test_bootstrap.BootstrapTests.test_state_symlink_and_relative_state_refuse) ... ok +test_symlinks_and_special_last_refuse_without_open (test_bootstrap.BootstrapTests.test_symlinks_and_special_last_refuse_without_open) ... ok +test_unreadable_and_nonprivate_directory_refuse (test_bootstrap.BootstrapTests.test_unreadable_and_nonprivate_directory_refuse) ... ok +test_valid_store_checkpoint_and_unreadable_file_refuse (test_bootstrap.BootstrapTests.test_valid_store_checkpoint_and_unreadable_file_refuse) ... ok +test_equivalent_unary_paths_are_not_identity_changes (test_focus_recovery.FocusRecoveryTests.test_equivalent_unary_paths_are_not_identity_changes) ... ok +test_firefox_command_proven_then_kitty_late_conflict_is_preserved (test_focus_recovery.FocusRecoveryTests.test_firefox_command_proven_then_kitty_late_conflict_is_preserved) ... ok +test_interrupted_intention_preserves_all_evidence (test_focus_recovery.FocusRecoveryTests.test_interrupted_intention_preserves_all_evidence) ... ok +test_layout_change_with_identical_raw_paths_still_refuses (test_focus_recovery.FocusRecoveryTests.test_layout_change_with_identical_raw_paths_still_refuses) ... ok +test_path_evidence_limit_refuses_without_overwriting_history (test_focus_recovery.FocusRecoveryTests.test_path_evidence_limit_refuses_without_overwriting_history) ... ok +test_real_identity_order_workspace_and_branch_changes_still_refuse (test_focus_recovery.FocusRecoveryTests.test_real_identity_order_workspace_and_branch_changes_still_refuse) ... ok +test_prepare_quits_before_resume_and_finish_has_no_delayed_exit (test_guard_protocol.GuardProtocolTests.test_prepare_quits_before_resume_and_finish_has_no_delayed_exit) ... ok +test_resume_without_prepare_refuses_and_still_cleans_owned_helper (test_guard_protocol.GuardProtocolTests.test_resume_without_prepare_refuses_and_still_cleans_owned_helper) ... ok +test_actual_dbus_states (test_keyring.KeyringTests.test_actual_dbus_states) ... /usr/lib/python3.14/site-packages/gi/events.py:803: DeprecationWarning: 'asyncio.AbstractEventLoopPolicy' is deprecated and slated for removal in Python 3.16 + AbstractEventLoopPolicy = getattr(asyncio, "AbstractEventLoopPolicy", object) +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +ok +test_apply_is_excluded_during_unlock (test_keyring.KeyringTests.test_apply_is_excluded_during_unlock) ... ok +test_apply_last_cannot_bypass_gate (test_keyring.KeyringTests.test_apply_last_cannot_bypass_gate) ... /usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +ok +test_ready_preserves_executor_result_and_recovery_required (test_keyring.KeyringTests.test_ready_preserves_executor_result_and_recovery_required) ... /usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +ok +test_remote_error_text_is_never_logged_or_persisted (test_keyring.KeyringTests.test_remote_error_text_is_never_logged_or_persisted) ... ok +test_transaction_prevents_prompt (test_keyring.KeyringTests.test_transaction_prevents_prompt) ... /usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +ok +test_two_processes_and_restart (test_keyring.KeyringTests.test_two_processes_and_restart) ... ok +test_unlock_never_restores (test_keyring.KeyringTests.test_unlock_never_restores) ... /usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +/usr/lib/python3.14/site-packages/gi/events.py:890: DeprecationWarning: 'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16 + if not isinstance(_get_event_loop_policy(), GLibEventLoopPolicy): +ok +test_complete_refuses_full_identity_placement_and_pending (test_p0_boundaries.BoundaryTests.test_complete_refuses_full_identity_placement_and_pending) ... ok +test_extra_after_first_move_refuses_before_second_staging (test_p0_boundaries.BoundaryTests.test_extra_after_first_move_refuses_before_second_staging) ... ok +test_guard_replacement_and_extra_refuse_before_any_mutation (test_p0_boundaries.BoundaryTests.test_guard_replacement_and_extra_refuse_before_any_mutation) ... ok +test_last_provider_capture_cannot_hide_structure_or_identity_change (test_p0_boundaries.BoundaryTests.test_last_provider_capture_cannot_hide_structure_or_identity_change) ... ok +test_layout_change_in_second_split_focus_observation_refuses (test_p0_boundaries.BoundaryTests.test_layout_change_in_second_split_focus_observation_refuses) ... ok +test_unary_parent_normalization_preserves_canonical_layout (test_p0_boundaries.BoundaryTests.test_unary_parent_normalization_preserves_canonical_layout) ... ok +test_unchanged_final_observation_completes (test_p0_boundaries.BoundaryTests.test_unchanged_final_observation_completes) ... ok +test_changement_apres_capture_canonique_refuse_avant_deplacement (test_path_stability.PathTests.test_changement_apres_capture_canonique_refuse_avant_deplacement) ... ok +test_guard_refuse_les_divergences_avant_tout_ipc (test_path_stability.PathTests.test_guard_refuse_les_divergences_avant_tout_ipc) ... ok +test_ack_requires_verified_current_transaction (test_phase3b.DeploymentTests.test_ack_requires_verified_current_transaction) ... ok +test_limusic_never_launched (test_phase3b.DeploymentTests.test_limusic_never_launched) ... ok +test_async_mapping_completes_before_apply_and_focus_proof (test_prewarm.PrewarmTests.test_async_mapping_completes_before_apply_and_focus_proof) ... ok +test_deferred_marker_and_cli_preserve_cause_for_explicit_retry (test_prewarm.PrewarmTests.test_deferred_marker_and_cli_preserve_cause_for_explicit_retry) ... ok +test_existing_required_journal_refuses_before_launch (test_prewarm.PrewarmTests.test_existing_required_journal_refuses_before_launch) ... ok +test_focus_change_after_proof_refuses_without_publication (test_prewarm.PrewarmTests.test_focus_change_after_proof_refuses_without_publication) ... ok +test_intruder_extra_identity_session_and_owner_refuse_without_publication (test_prewarm.PrewarmTests.test_intruder_extra_identity_session_and_owner_refuse_without_publication) ... ok +test_launch_failure_preserves_clients_and_retry_does_not_duplicate (test_prewarm.PrewarmTests.test_launch_failure_preserves_clients_and_retry_does_not_duplicate) ... ok +test_missing_managed_autostart_refuses_before_launch (test_prewarm.PrewarmTests.test_missing_managed_autostart_refuses_before_launch) ... ok +test_missing_collision_and_live_publisher (test_provider.ProviderTests.test_missing_collision_and_live_publisher) ... ok +test_capture_is_deterministic_for_a_stable_tree (test_scratchpad.ScratchpadTests.test_capture_is_deterministic_for_a_stable_tree) ... ok +test_capture_store_reload_and_no_internal_workspace (test_scratchpad.ScratchpadTests.test_capture_store_reload_and_no_internal_workspace) ... ok +test_change_between_reads_and_ambiguous_focus_refuse (test_scratchpad.ScratchpadTests.test_change_between_reads_and_ambiguous_focus_refuse) ... ok +test_empty_focus_workspace_is_persisted (test_scratchpad.ScratchpadTests.test_empty_focus_workspace_is_persisted) ... ok +test_group_ancestor_is_not_admitted_by_leaf_identity (test_scratchpad.ScratchpadTests.test_group_ancestor_is_not_admitted_by_leaf_identity) ... ok +test_hidden_focus_is_rejected_before_command (test_scratchpad.ScratchpadTests.test_hidden_focus_is_rejected_before_command) ... ok +test_initial_scratchpad_add_predicts_source_workspace_focus (test_scratchpad.ScratchpadTests.test_initial_scratchpad_add_predicts_source_workspace_focus) ... ok +test_journal_detects_identity_output_scratchpad_and_interruption (test_scratchpad.ScratchpadTests.test_journal_detects_identity_output_scratchpad_and_interruption) ... ok +test_layer_shell_can_leave_no_sway_focus (test_scratchpad.ScratchpadTests.test_layer_shell_can_leave_no_sway_focus) ... ok +test_legacy_journal_not_reinterpreted (test_scratchpad.ScratchpadTests.test_legacy_journal_not_reinterpreted) ... ok +test_multiple_focused_nodes_are_still_refused (test_scratchpad.ScratchpadTests.test_multiple_focused_nodes_are_still_refused) ... ok +test_runtime_visibility_assignment_never_exposes_hidden_peer (test_scratchpad.ScratchpadTests.test_runtime_visibility_assignment_never_exposes_hidden_peer) ... ok +test_shown_and_multiple_hidden (test_scratchpad.ScratchpadTests.test_shown_and_multiple_hidden) ... ok +test_strict_versions_and_scratchpad_references (test_scratchpad.ScratchpadTests.test_strict_versions_and_scratchpad_references) ... ok +test_checkpoint_failed_validation_preserves_old (test_unit.BackendTests.test_checkpoint_failed_validation_preserves_old) ... ok +test_checkpoint_permissions (test_unit.BackendTests.test_checkpoint_permissions) ... ok +test_cli_execute_required (test_unit.BackendTests.test_cli_execute_required) ... ok +test_cli_storage_checkpoint_and_startup_mock (test_unit.BackendTests.test_cli_storage_checkpoint_and_startup_mock) ... ok +test_coexistence_and_migration (test_unit.BackendTests.test_coexistence_and_migration) ... ok +test_command_injection (test_unit.BackendTests.test_command_injection) ... ok +test_counts (test_unit.BackendTests.test_counts) ... ok +test_exact_inverted (test_unit.BackendTests.test_exact_inverted) ... ok +test_interchangeable_best_effort (test_unit.BackendTests.test_interchangeable_best_effort) ... ok +test_intermediate_directory_permissions (test_unit.BackendTests.test_intermediate_directory_permissions) ... ok +test_json_schema_matches_fixture (test_unit.BackendTests.test_json_schema_matches_fixture) ... ok +test_json_strict (test_unit.BackendTests.test_json_strict) ... ok +test_launch_policy (test_unit.BackendTests.test_launch_policy) ... ok +test_lock (test_unit.BackendTests.test_lock) ... ok +test_multi_output_preflight_synthetic (test_unit.BackendTests.test_multi_output_preflight_synthetic) ... ok +test_native_strict (test_unit.BackendTests.test_native_strict) ... ok +test_paths_links (test_unit.BackendTests.test_paths_links) ... ok +test_plan_pure (test_unit.BackendTests.test_plan_pure) ... ok +test_references (test_unit.BackendTests.test_references) ... ok +test_report_rejects_private_fields_and_bool_version (test_unit.BackendTests.test_report_rejects_private_fields_and_bool_version) ... ok +test_resume_attempts_all_owned_helpers (test_unit.BackendTests.test_resume_attempts_all_owned_helpers) ... ok +test_schema_exact (test_unit.BackendTests.test_schema_exact) ... ok +test_types_version_and_identity (test_unit.BackendTests.test_types_version_and_identity) ... ok +test_unsupported_states (test_unit.BackendTests.test_unsupported_states) ... ok + +---------------------------------------------------------------------- +Ran 93 tests in 8.405s + +OK diff --git a/docs/validation/quickshell-dock-tela-polish-v2/shell.log b/docs/validation/quickshell-dock-tela-polish-v2/shell.log new file mode 100644 index 000000000..bd1ea7002 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/shell.log @@ -0,0 +1 @@ +Full shell private-compositor load: PASS /tmp/labfy-session-v2-TEST_ONLY-vx5tlv5i diff --git a/docs/validation/quickshell-dock-tela-polish-v2/unit.log b/docs/validation/quickshell-dock-tela-polish-v2/unit.log new file mode 100644 index 000000000..d935bbb78 --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/unit.log @@ -0,0 +1,11 @@ +test_inheritance_from_a_private_test_theme (test_shared.Icons.test_inheritance_from_a_private_test_theme) ... ok +test_tela_desktop_icon_and_absolute (test_shared.Icons.test_tela_desktop_icon_and_absolute) ... ok +test_nine_move_missing_anchor_and_empty (test_shared.Persistence.test_nine_move_missing_anchor_and_empty) ... ok +test_real_concurrent_processes_keep_all_additions_during_moves (test_shared.Persistence.test_real_concurrent_processes_keep_all_additions_during_moves) ... ok +test_toggle_is_atomic_and_does_not_depend_on_a_stale_ui_list (test_shared.Persistence.test_toggle_is_atomic_and_does_not_depend_on_a_stale_ui_list) ... ok +test_wayland_xwayland_scratchpad_and_explicit_focus (test_shared.Sway.test_wayland_xwayland_scratchpad_and_explicit_focus) ... ok + +---------------------------------------------------------------------- +Ran 6 tests in 0.735s + +OK diff --git a/docs/validation/quickshell-dock-tela-polish-v2/validation.json b/docs/validation/quickshell-dock-tela-polish-v2/validation.json new file mode 100644 index 000000000..7085b4b2c --- /dev/null +++ b/docs/validation/quickshell-dock-tela-polish-v2/validation.json @@ -0,0 +1,39 @@ +{ + "status": "PASS", + "base": "d4e2a0013e7a9452add80dddc110e036ebe4ee96", + "backendTests": { + "applications": 7, + "dock": 6, + "sessionV2": 93 + }, + "javascript": [ + "ApplicationsModel: PASS", + "Dock state and window models: PASS" + ], + "graphical": [ + "private Sway dock scenario", + "complete shell load", + "Session V2 and Keyring with dock" + ], + "keyring": { + "backend": 0, + "focus": 0, + "qml-unit": 0, + "qml-qt": 0, + "keyring-ui": 0, + "keyring-runtime": 0, + "scratchpad-runtime": 0, + "phase3b-ui": 0, + "p0-runtime": 0, + "path-runtime": 0, + "diff-check": 0 + }, + "finalChecks": [ + "git diff --check: PASS", + "git apply --check against unchanged main checkout: PASS", + "no Binding loop, assignment, ReferenceError or TypeError in final dock lab logs", + "main checkout git status --short: empty" + ], + "finalShellLab": "/tmp/labfy-session-v2-TEST_ONLY-ywdppzn5", + "activeSessionModified": false +} diff --git a/docs/validation/quickshell-dock-tela-polish-v2/zoom-light.png b/docs/validation/quickshell-dock-tela-polish-v2/zoom-light.png new file mode 100644 index 0000000000000000000000000000000000000000..2d4fafb986c0ed337ed6c0e3b0e08435eba6cb62 GIT binary patch literal 31109 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 literal 0 HcmV?d00001 diff --git a/docs/validation/quickshell-dock-tela-polish-v2/zoom.png b/docs/validation/quickshell-dock-tela-polish-v2/zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..15e17fb52440f81a06dcd575ea60af3a85138938 GIT binary patch literal 29374 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 0 - readonly property real center: viewport.x + x + width / 2 - viewport.contentX - // WHY: measuring against the animated x/width feeds - // scale back into its own binding. Stable resting slots - // keep magnification deterministic and free of loops. - readonly property real baseCenter: viewport.x + index * 57 + 27 + readonly property real center: viewport.x + items.x + x + width / 2 - viewport.contentX + // INVARIANT: pointer influence uses fixed layout slots. + // Only the visual transform changes: Row, hit targets, + // window width and SVG raster size never follow hover. + readonly property real baseCenter: viewport.x + items.x + index * 57 + 27 + (index >= dock.pinnedCount && dock.pinnedCount > 0 ? 13 : 0) - viewport.contentX readonly property real growth: dock.revealed && bodyHover.hovered ? AutoHide.influence(baseCenter - dock.pointerX) : 0 - width: 54 + growth * 19 + (separator ? 13 : 0) + width: 54 + (separator ? 13 : 0) height: 105 - Behavior on width { NumberAnimation { duration: 95; easing.type: Easing.OutCubic } } Rectangle { visible: tile.separator x: 2; y: 45; width: 1; height: 32; color: Theme.strongBorder } ApplicationIcon { id: icon - width: 46 + tile.growth * 21; height: width + // WHY: ApplicationIcon derives sourceSize from width. + // Fixed dimensions avoid async SVG reload/fallback flashes. + width: 46; height: 46 x: (parent.width - width + (tile.separator ? 12 : 0)) / 2 - y: 83 - height + y: 37 + transformOrigin: Item.Bottom + scale: 1 + tile.growth * 0.39 + Behavior on scale { NumberAnimation { duration: 80; easing.type: Easing.OutCubic } } iconSource: tile.modelData.iconSource || "" opacity: dock.draggingId === tile.modelData.id ? 0.5 : 1 - Behavior on width { NumberAnimation { duration: 95; easing.type: Easing.OutCubic } } } Rectangle { anchors.horizontalCenter: icon.horizontalCenter diff --git a/sway/.config/sway/swayfx b/sway/.config/sway/swayfx index 033e54f25..99504c2f1 100644 --- a/sway/.config/sway/swayfx +++ b/sway/.config/sway/swayfx @@ -27,10 +27,11 @@ layer_effects "labfy-sway-bar" { corner_radius 4 } -# CONTRACT: only the dock's layer surface receives blur; no window rule or -# focus/restore policy is changed. Its transparent input strip stays clear. +# CONTRACT: dock glass uses a light tint and analytic QML shadow. Disabling +# backdrop blur avoids compositor blur work on every magnification frame. +# No window rule or focus/restore policy is changed. layer_effects "labfy-sway-dock" { - blur $bar_blur + blur disable blur_xray disable blur_ignore_transparent enable shadows disable diff --git a/tests/dock/headless.py b/tests/dock/headless.py index fb4833580..1414de75f 100644 --- a/tests/dock/headless.py +++ b/tests/dock/headless.py @@ -13,7 +13,7 @@ from headless import Lab from ipc_proxy import IpcProxy SOURCE = REPO / 'quickshell/.config/quickshell/labfy-sway' -ARTIFACTS = REPO / 'docs/validation/quickshell-dock-tela' +ARTIFACTS = REPO / 'docs/validation/quickshell-dock-tela-polish-v2' NINE = ['firefox.desktop', 'kitty.desktop', 'yazi.desktop', 'nvim.desktop', 'org.darktable.darktable.desktop', 'orca-slicer.desktop', 'org.freecad.FreeCAD.desktop', 'org.kde.digikam.desktop', 'AppFlowy.desktop'] @@ -23,8 +23,8 @@ class DockLab(Lab): super().__init__() self.config=self.directory/'dock-sway.conf' base=(REPO/'tests/session_v2/fixtures/headless.conf').read_text() - effects=(REPO/'sway/.config/sway/swayfx').read_text().split('# CONTRACT: only the dock')[1] - effects=effects[effects.index('layer_effects'):] + effects=(REPO/'sway/.config/sway/swayfx').read_text().split('layer_effects "labfy-sway-dock"')[1] + effects='layer_effects "labfy-sway-dock"'+effects self.config.write_text(base+'\noutput HEADLESS-1 bg #11111b solid_color\nset $bar_blur enable\n'+effects) def start(self, argv): if argv[0]==os.environ.get('LABFY_TEST_SWAY','sway'): @@ -49,6 +49,31 @@ ShellRoot { D.Dock { id: dock; modelData: Quickshell.screens[0] } PanelWindow { id: bar; implicitWidth: 100; implicitHeight: 30; anchors.top: true; color: "transparent" } LazyLoader { id: menu; active: false; A.ApplicationsMenu { barWindow: bar } } + // TEST_ONLY: one pointer move per animation frame avoids measuring IPC + // process startup instead of continuous production hover. These are Qt + // animation intervals, not hardware presentation timestamps. + FrameAnimation { + id: sweepFrames + property var intervals: [] + property real origin: 0 + property bool geometryChanged: false + property bool imageChanged: false + property var baseline: [] + running: false + onTriggered: { + if (currentFrame > 1) intervals.push(frameTime * 1000); + const cycle = (elapsedTime * 0.7) % 2; + input.mouseMove(dock.surfaceBody, 51 + 420 * (cycle <= 1 ? cycle : 2 - cycle), 70); + const tiles=Array.from(dock.contentItemRow.children).filter(t => t.modelData); + for (let i=0; i= 4.5) running=false; + } + } TestCase { id: input; name: "DockInput"; when: false } IpcHandler { target: "dockTest" @@ -64,10 +89,30 @@ ShellRoot { bodyY:dock.surfaceBody.y, width:dock.width, pointerX:dock.pointerX, tileWidth:dock.contentItemRow.children[0] ? dock.contentItemRow.children[0].width : 0, + tiles:Array.from(dock.contentItemRow.children).filter(t => t.modelData).map(t => ({ + x:t.x, width:t.width, growth:t.growth, scale:t.children[1].scale, + visualLeft:t.children[1].mapToItem(dock.contentItemRow.parent.parent,0,0).x, + visualRight:t.children[1].mapToItem(dock.contentItemRow.parent.parent,46,0).x, + iconWidth:t.children[1].width, imageStatus:t.children[1].children[0].status})), context:!!dock.contextEntry}); } + function startFrames(): void { + sweepFrames.intervals=[]; sweepFrames.origin=dock.width; + sweepFrames.baseline=Array.from(dock.contentItemRow.children).filter(t => t.modelData) + .map(t => ({x:t.x,width:t.width,status:t.children[1].children[0].status})); + sweepFrames.start(); + } + function frames(): string { + return JSON.stringify({running:sweepFrames.running, intervals:sweepFrames.intervals, + geometryChanged:sweepFrames.geometryChanged,imageChanged:sweepFrames.imageChanged}); + } function edge(): void { input.mouseMove(dock.edgeArea, dock.edgeArea.width/2, 2); } function body(): void { input.mouseMove(dock.surfaceBody, 35, 70); } + function sweep(x:real): void { input.mouseMove(dock.surfaceBody, x, 70); } + function scrollEnd(): void { + const v=dock.contentItemRow.parent.parent; v.contentX=Math.max(0,v.contentWidth-v.width); + } + function scrollStart(): void { dock.contentItemRow.parent.parent.contentX=0; } function leave(): void { input.mouseMove(dock.contentItem, 1, 1); } function menuToggle(id:string): void { if (!menu.active) menu.active=true; menu.item.toggleFavorite(id); } function dockToggle(id:string): void { A.FavoritesService.toggle(id); } @@ -120,8 +165,33 @@ ShellRoot { capture('closed') call('edge'); wait(lambda s:s['revealed']); time.sleep(.35) capture('open') + resting=call('state') call('body'); time.sleep(.3); zoom=call('state'); capture('zoom') - assert zoom['tileWidth']>54, zoom + lab.command('output HEADLESS-1 bg #aab4c8 solid_color') + time.sleep(.2); capture('zoom-light') + lab.command('output HEADLESS-1 bg #11111b solid_color') + assert zoom['tileWidth']==54 and zoom['tiles'][0]['scale']>1, zoom + assert zoom['tiles'][0]['visualLeft']>=0,zoom + # Exercise production hover across slot boundaries. Layout and image + # readiness must remain stable while visual transforms change. + samples=[] + for x in range(45, 480, 6): + call('sweep',x) + state=call('state') + assert state['phase']=='shown',state + assert state['width']==resting['width'],state + assert [(t['x'],t['width'],t['iconWidth']) for t in state['tiles']]==[(t['x'],t['width'],t['iconWidth']) for t in resting['tiles']],state + assert sum(t['growth']>0 for t in state['tiles'])<=3,state + assert [t['imageStatus'] for t in state['tiles']]==[t['imageStatus'] for t in resting['tiles']],state + samples.append({'pointerX':state['pointerX'],'scales':[t['scale'] for t in state['tiles']]}) + call('startFrames') + time.sleep(4.8) + frames=call('frames') + assert not frames['running'] and len(frames['intervals'])>30,frames + assert not frames['geometryChanged'] and not frames['imageChanged'],frames + intervals=sorted(frames['intervals']) + timing={'frames':len(intervals),'meanMs':sum(intervals)/len(intervals), + 'p95Ms':intervals[int((len(intervals)-1)*.95)],'maxMs':max(intervals)} call('leave'); wait(lambda s:s['phase']=='hidden') call('edge'); wait(lambda s:s['revealed']); time.sleep(.3) call('rightClick'); wait(lambda s:s['phase']=='held'); time.sleep(.7) @@ -199,6 +269,16 @@ ShellRoot { lab.command('output HEADLESS-1 mode 800x600') resized=wait(lambda s:s['screenWidth']==800) assert resized['width']<=776,resized + # Magnified end icons keep their visual margin at both scroll limits. + lab.command('output HEADLESS-1 mode 400x600') + wait(lambda s:s['screenWidth']==400) + call('edge'); wait(lambda s:s['revealed']); time.sleep(.3) + call('scrollEnd'); call('sweep',325); time.sleep(.15) + end=call('state') + assert end['tiles'][-1]['scale']>1 and end['tiles'][-1]['visualRight']<=end['width']-24,end + call('scrollStart'); call('sweep',51); time.sleep(.15) + start=call('state') + assert start['tiles'][0]['scale']>1 and start['tiles'][0]['visualLeft']>=0,start lab.command('output HEADLESS-1 mode 1280x720') wait(lambda s:s['screenWidth']==1280) # Existing empty state must stay empty, including a bridge restart. @@ -208,9 +288,9 @@ ShellRoot { process=lab.start(['quickshell','-p',str(qml)]) time.sleep(1) assert wait(lambda s:s['ready'])['ids']==[] - (ARTIFACTS/'result.json').write_text(json.dumps(dict(status='PASS',initial=initial, + (ARTIFACTS/'result.json').write_text(json.dumps(dict(status='PASS',initial=initial,hoverSamples=samples,animationTiming=timing,frameSweep=frames, reordered=reordered['ids'],checks=['shared favorites','menu and dock mutations','durable reorder', 'empty restart','autohide','context hold','kitty multi-window','floating scratchpad explicit focus', - 'window close','no hover focus','real pointer drag','zoom growth','IPC reconnect','Firefox private profile','desktop install/remove monitoring','external writer','keyboard menu navigation','resolution change','SwayFX dock blur rule']),indent=2)+'\n') + 'window close','no hover focus','real pointer drag','fixed layout transform hover', 'stable SVG readiness', 'lateral sweep 73 samples','IPC reconnect','Firefox private profile','desktop install/remove monitoring','external writer','keyboard menu navigation','resolution change','SwayFX dock blur disabled']),indent=2)+'\n') proxy.close() print('Dock headless: PASS',lab.directory) diff --git a/tests/dock/test_models.js b/tests/dock/test_models.js index 903ed765f..19f36fbe1 100644 --- a/tests/dock/test_models.js +++ b/tests/dock/test_models.js @@ -24,8 +24,15 @@ input.held=false; assert.equal(event(),'waiting'); assert.equal(event('deadline'),'hidden'); input.held=true; event(); input.suppressed=true; assert.equal(event(),'hidden'); assert.equal(hide.influence(0),1); -assert.ok(hide.influence(55)>hide.influence(100)); -assert.equal(hide.influence(115),0); +assert.ok(hide.influence(25)>hide.influence(55)); +assert.equal(hide.influence(76),0); +assert.equal(hide.influence(-76),0); +assert.equal(hide.influence(-35),hide.influence(35)); +for (let cursor=0; cursor<570; ++cursor) { + const affected=Array.from({length:10},(_,i)=>i).filter(i=>hide.influence(i*57-cursor)>0); + assert.ok(affected.length<=3); + assert.ok(affected.length===0 || affected.at(-1)-affected[0]<=2); +} const model=load('applications/WindowModel.js'); const apps=[{id:'kitty.desktop',aliases:['kitty'],iconSource:'file:///tela/kitty.svg'}, {id:'org.app.desktop',aliases:['startup-class','executable']},