Dotfiles_ArchAP/docs/quickshell-dock-window-previews-v1.md

81 lines
4.2 KiB
Markdown

# QuickShell Dock — points de fenêtres et vignettes Wayland (11 novembre 2026)
## Comportement
Chaque application de la rangée du dock affiche autant de points sous son icône
qu'elle possède de fenêtres **réellement détectées par Sway**. Les icônes des
séparateurs n'affichent pas de points. Un survol intentionnel (> 330 ms) sur
une application ouverte affiche des cartes de fenêtres, avec leur **aperçu
visuel ponctuel**, leur titre et leur workspace. Cliquer une carte transmet
l'identifiant exact au mécanisme existant `FavoritesService.focusWindow()`.
Le survol seul ne déplace aucune fenêtre, ne change aucun workspace et ne
modifie jamais le focus clavier.
Au-delà de quatre cartes, le panneau défile horizontalement. L'interface
ne prend jamais le focus clavier. Après éloignement du pointeur (620 ms), le
panneau disparaît. Les menus contextuels et le déplacement des favoris ont
priorité sur les vignettes.
## Capture native, sans surveillance permanente
SwayFX sur ArchASP publie les protocoles `ext-foreign-toplevel-list-v1`,
`ext-image-copy-capture-v1` et
`ext-foreign-toplevel-image-capture-source-manager-v1`. Les fenêtres de son
arbre IPC possèdent un `foreign_toplevel_identifier` permettant une
correspondance stricte entre le clic sur une vignette et la fenêtre Sway.
QuickShell 0.3.2 ne fournit pas un `ScreencopyView` utilisable pour cette
capture individuelle sur Sway (son chemin toplevel dépend de Hyprland).
Le collecteur ponctuel en Go est fondé sur le projet MIT
`mil-ad/wlthumbs`, commit amont
`516603c3144078b4d974108b80f7e9622ee4f3c9`, avec le code et la
licence conservés sous `tools/wlthumbs/`. Le correctif local ajoute
`-ids` : la capture est refusée sans une liste explicite de 1 à 8
identifiants hexadécimaux (32 caractères), et ne capture **que** ces
fenêtres. La capture de sorties complètes est interdite dans ce mode.
Le build reproductible utilisateur, sans sudo :
`tools/build-labfy-wlthumbs.sh`, installe le binaire dans
`~/.local/libexec/labfy-wlthumbs`.
Le wrapper `bin/dock-thumbnails.py` valide une seconde fois tous les
identifiants Sway et étrangers, limite le nombre de captures à 8 et la
taille des PNG, impose un dossier de session `0700` dans
`$XDG_RUNTIME_DIR/labfy-dock-window-thumbnails` et restitue seulement
les URI des images validées. Le nettoyage est déclenché après fermeture
du panneau, ainsi qu'à chaque nouvelle capture. Aucune capture
permanente, périodique, en arrière-plan ou à la déconnexion n'est créée.
En cas d'échec d'un aperçu, la carte affiche l'icône de l'application,
le titre et le workspace ; la sélection reste fonctionnelle.
## Compatibilité et sécurité
- Les favoris partagés, les séparateurs, le modèle d'applications et le menu
QuickShell existant conservent leur format.
- La récupération des fenêtres réutilise le snapshot IPC Sway existant,
sans nouvelle boucle de polling.
- La capture est limitée à la demande de l'utilisateur, et les noms des
fenêtres ne sont pas utilisés pour décider de leur identité.
- La couche du dock conserve `WlrKeyboardFocus.None`,
`exclusionMode.Ignore`, `exclusiveZone: 0` et la bande d'activation
de 4 px sur toute la largeur.
- Les PNG locaux constituent des données sensibles ; ils résident seulement
dans le runtime privé et sont supprimés à la fermeture du panneau.
- Les vignettes ne modifient pas Session Restore V2, l'autostart ni les
raccourcis Sway.
## Validation
- Tests unitaires `tests/dock/test_thumbnails.py` : entrées bornées,
captures sélectives, permissions, nettoyage et refus des chemins suspects.
- `tests/dock/headless.py` : vrai SwayFX et vrai QuickShell isolés,
trois fenêtres Kitty pour trois points et trois cartes sélectionnables,
non-vol de focus, captures réelles de la session de test, nettoyage, et
anciens scénarios de dock.
- Test non destructif sur ArchASP : sélection de trois fenêtres Firefox,
production de trois PNG temporaires puis nettoyage, sans changement
de focus ; ne conserve pas leur contenu.
- `qmllint`, suites applications/dock, chargement du shell complet et
compatibilité Session Restore V2.
Les artefacts de test générés sont dans le cache privé de développement,
pas dans le dépôt. Aucun média de la session de travail n'est publié.