Quickshell / qualité : extraire l’orchestration du collage de shell.qml #23

Closed
opened 2026-10-24 13:10:06 +00:00 by mathieu · 2 comments
Owner

Problème de maintenance

mathieu/shell.qml cumule IPC, focus, sondes, moniteurs, dictée et collage. Le collage est réparti entre l’état pendingPaste*, les résultats de desktopBridge, pasteDelay, pasteProcess et requestPaste(), avec des retours d’erreur qui rouvrent le panneau.

Cette orchestration sensible est difficile à tester et à relire isolément. Le ticket vise une extraction mécanique limitée, pas une nouvelle architecture générale.

Résultat attendu

Extraire un petit contrôleur de collage à interface explicite (demande, résultat, annulation, erreur), en gardant les responsabilités de visibilité/navigation dans le shell. Conserver les vérifications de fenêtre, commandes en tableaux d’arguments, absence de frappe globale et interdiction des retries incertains.

Éviter la duplication d’état et les callbacks circulaires ; nommer les étapes et expliquer leurs invariants plutôt que multiplier les abstractions.

Validation

  • Tests QML du contrôleur : succès, copie refusée, changement de cible, timeout, réponse tardive et demandes concurrentes.
  • Vérifier fermeture/changement d’onglet/reload et réouverture avec le bon message, sans collage ancien réarmé.
  • Tests de panel-paste.py et focus conservés ; aucune frappe vers une vraie application.
  • Aucun changement comportemental ajouté implicitement au refactoring.

Dépendance

Stabiliser auparavant le comportement de sélection décrit dans #19, ou garder ce travail dans un changement distinct clairement validé. Les autres corrections urgentes ne doivent pas attendre cette extraction.

Référence

Revue du code au commit 5e350a8, avec Quickshell 0.3.2. Les 18 suites existantes passent ; les cas ci-dessous complètent cette couverture. Chantier : #11.

  • with pi 🥧
## Problème de maintenance `mathieu/shell.qml` cumule IPC, focus, sondes, moniteurs, dictée et collage. Le collage est réparti entre l’état `pendingPaste*`, les résultats de `desktopBridge`, `pasteDelay`, `pasteProcess` et `requestPaste()`, avec des retours d’erreur qui rouvrent le panneau. Cette orchestration sensible est difficile à tester et à relire isolément. Le ticket vise une extraction mécanique limitée, pas une nouvelle architecture générale. ## Résultat attendu Extraire un petit contrôleur de collage à interface explicite (demande, résultat, annulation, erreur), en gardant les responsabilités de visibilité/navigation dans le shell. Conserver les vérifications de fenêtre, commandes en tableaux d’arguments, absence de frappe globale et interdiction des retries incertains. Éviter la duplication d’état et les callbacks circulaires ; nommer les étapes et expliquer leurs invariants plutôt que multiplier les abstractions. ## Validation - [x] Tests QML du contrôleur : succès, copie refusée, changement de cible, timeout, réponse tardive et demandes concurrentes. - [x] Vérifier fermeture/changement d’onglet/reload et réouverture avec le bon message, sans collage ancien réarmé. - [x] Tests de `panel-paste.py` et focus conservés ; aucune frappe vers une vraie application. - [x] Aucun changement comportemental ajouté implicitement au refactoring. ## Dépendance Stabiliser auparavant le comportement de sélection décrit dans #19, ou garder ce travail dans un changement distinct clairement validé. Les autres corrections urgentes ne doivent pas attendre cette extraction. ## Référence Revue du code [au commit `5e350a8`](https://git.2027a.net/mathieu/dotfiles/src/commit/5e350a8945af99e6e6b1c7f472fb7529a26a1826/quickshell/), avec Quickshell 0.3.2. Les 18 suites existantes passent ; les cas ci-dessous complètent cette couverture. Chantier : #11. - with pi 🥧
Author
Owner

#19 est stabilisé, revu et intégré sur main65fa842 (gate combiné24/24). L’extraction mécanique démarre dans quickshell-paste-controller / pi/quickshell-paste-controller, basée exactement sur ce main : mêmes gardes, délais, ciblage, annulations et limites meilleure-effort. Le shell garde visibilité/navigation/messages ; petit contrôleur QML à entrées/signaux explicites, sans nouvelle machine générique ni changement de comportement. Tests natifs adaptés pour charger le vrai composant, pas recopier ses transitions.

  • with pi 🥧
#19 est stabilisé, revu et intégré sur main65fa842 (gate combiné24/24). L’extraction mécanique démarre dans `quickshell-paste-controller` / `pi/quickshell-paste-controller`, basée exactement sur ce main : mêmes gardes, délais, ciblage, annulations et limites meilleure-effort. Le shell garde visibilité/navigation/messages ; petit contrôleur QML à entrées/signaux explicites, sans nouvelle machine générique ni changement de comportement. Tests natifs adaptés pour charger le vrai composant, pas recopier ses transitions. - with pi 🥧
Author
Owner

Intégré sur main cfa42c0, fichiers distants exacts vérifiés. Commit signé5886639, revue indépendante sans constat. Gate parent combiné25/25 suites passent, dont21 cas natifs du contrôleur (15 gardes conservés +6 cas de câblage/lifecycle),11 tests du helper et suite de focus.

Extraction mécanique de l’état/fonctions/timers/process versPasteController.qml, interface explicitecopyProvider/clients/panelOpened, signaux dismiss/reveal/message,busy readonly. Le shell conserve visibilité/navigation/message et route la demande/réponse ; aucun état de collage miroir ni écriture interne du contrôleur. Délais150ms/7s/2s, ordre de remise à zéro avant callbacks, révisions UI, IDs de copie, cible capturée, deux vérifications helper et PID positif avant TERM/KILL inchangés. Pas de nouvelle garantie de sélection ou de rollback, aucune frappe globale/retry incertain.

La fixture charge le composant réel copié inchangé, le câblage réel du shell et le handler réel du panneau ; le helper est faux sous le shellDir privé, sans remplacer les tableaux d’arguments. Refus/concurrence/busy, changement de cible/onglet, timeout, réponses tardives, fermeture avant message différé, démarrage annulé et reload couverts. Getter interdit contrôlé avec témoin positif ; observation toujours passive et sans contenu. Aucun vrai presse-papiers/compositeur/service/appareil utilisé. Tests parent réalisés avant le nouveau lot de mesures#22, pour ne pas polluer ses essais.

Publication≠activation : checkout actif non avancé.

  • with pi 🥧
Intégré sur main [cfa42c0](https://git.2027a.net/mathieu/dotfiles/commit/cfa42c0ced530bc40d4654d35529f55e0497aec5), fichiers distants exacts vérifiés. Commit signé5886639, revue indépendante sans constat. **Gate parent combiné25/25 suites passent**, dont21 cas natifs du contrôleur (15 gardes conservés +6 cas de câblage/lifecycle),11 tests du helper et suite de focus. Extraction mécanique de l’état/fonctions/timers/process vers`PasteController.qml`, interface explicite`copyProvider/clients/panelOpened`, signaux dismiss/reveal/message,`busy` readonly. Le shell conserve visibilité/navigation/message et route la demande/réponse ; aucun état de collage miroir ni écriture interne du contrôleur. Délais150ms/7s/2s, ordre de remise à zéro avant callbacks, révisions UI, IDs de copie, cible capturée, deux vérifications helper et PID positif avant TERM/KILL inchangés. Pas de nouvelle garantie de sélection ou de rollback, aucune frappe globale/retry incertain. La fixture charge **le composant réel copié inchangé**, le câblage réel du shell et le handler réel du panneau ; le helper est faux sous le shellDir privé, sans remplacer les tableaux d’arguments. Refus/concurrence/busy, changement de cible/onglet, timeout, réponses tardives, fermeture avant message différé, démarrage annulé et reload couverts. Getter interdit contrôlé avec témoin positif ; observation toujours passive et sans contenu. Aucun vrai presse-papiers/compositeur/service/appareil utilisé. Tests parent réalisés avant le nouveau lot de mesures#22, pour ne pas polluer ses essais. Publication≠activation : checkout actif non avancé. - with pi 🥧
mathieu 2026-10-24 18:05:29 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
mathieu/dotfiles#23
No description provided.