Quickshell / notifications : borner et regrouper les rafraîchissements des libellés d’actions #12

Closed
opened 2026-10-24 13:10:03 +00:00 by mathieu · 1 comment
Owner

Problème confirmé

Dans mathieu/NotificationService.qml:57–64,132–137, chaque action, y compris au-delà des huit affichées, possède un observateur textChanged. Chaque signal appelle immédiatement refreshActionLabels(), qui parcourt les notifications actives, filtre leurs listes complètes d’actions et sérialise les snapshots.

Reproduction sur le binaire 0.3.2, avec bus D-Bus et HOME temporaires : remplacer 800 libellés en conservant leurs identifiants déclenche 800 traitements globaux synchrones. Pour M actions, le filtrage répété est quadratique. Un expéditeur de notifications sur le bus de session peut ainsi dégrader fortement la réactivité du shell.

Résultat attendu

  • Borner les actions observées, pas seulement les boutons affichés.
  • Regrouper les changements d’une notification via le mécanisme différé refresh() existant, plutôt que sauver tout l’historique pour chaque libellé.
  • Éviter les balayages globaux lorsqu’une seule notification change.

Validation

  • Un remplacement de nombreux libellés produit un nombre borné de mises à jour/sauvegardes, non proportionnel au nombre de signaux.
  • Les huit actions affichées et les remplacements de leurs identifiants restent corrects.
  • Ajouter un test natif isolé de charge raisonnable et un contrôle du nombre de rafraîchissements ; ne pas se contenter d’un timeout généreux.
  • Rerun des suites notifications natives et UI.

Articulation

Traiter en premier ; le ticket sur la cohérence des remplacements réutilisera ce chemin regroupé. La limitation des données natives fait l’objet d’un ticket distinct.

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 confirmé Dans `mathieu/NotificationService.qml:57–64,132–137`, chaque action, y compris au-delà des huit affichées, possède un observateur `textChanged`. Chaque signal appelle immédiatement `refreshActionLabels()`, qui parcourt les notifications actives, filtre leurs listes complètes d’actions et sérialise les snapshots. Reproduction sur le binaire 0.3.2, avec bus D-Bus et HOME temporaires : remplacer 800 libellés en conservant leurs identifiants déclenche **800 traitements globaux synchrones**. Pour M actions, le filtrage répété est quadratique. Un expéditeur de notifications sur le bus de session peut ainsi dégrader fortement la réactivité du shell. ## Résultat attendu - Borner les actions observées, pas seulement les boutons affichés. - Regrouper les changements d’une notification via le mécanisme différé `refresh()` existant, plutôt que sauver tout l’historique pour chaque libellé. - Éviter les balayages globaux lorsqu’une seule notification change. ## Validation - [x] Un remplacement de nombreux libellés produit un nombre borné de mises à jour/sauvegardes, non proportionnel au nombre de signaux. - [x] Les huit actions affichées et les remplacements de leurs identifiants restent corrects. - [x] Ajouter un test natif isolé de charge raisonnable et un contrôle du nombre de rafraîchissements ; ne pas se contenter d’un timeout généreux. - [x] Rerun des suites notifications natives et UI. ## Articulation Traiter en premier ; le ticket sur la cohérence des remplacements réutilisera ce chemin regroupé. La limitation des données natives fait l’objet d’un ticket distinct. ## 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

Corrigé et intégré sur main, contenu distant vérifié au commit e8ec9ad.

Commits de correction signés : 3783be790802e6fe16762d324c9a222b9ab75af3 / 8a0eea49eb74197b3daad21a7283c4369192280d.

Test natif rouge : 800 sauvegardes avec le code initial ; vert : 1 pour les libellés visibles, 0 pour les libellés cachés. Les fenêtres de mesure traversent volontairement un tick de maintenance. Identifiants changés, reload, actions natives, DND/verrouillage et comptage testés. La revue indépendante a fait corriger une contamination initiale du compteur par le timer ; relecture propre après correction.

Gate parent sur la composition finale : 20/20 suites passent, chacune avec HOME/XDG/bus/audio isolés (run-suites.py parent ; scripts du dépôt inchangés hors tests ajoutés). Signatures vérifiées avec la clé publique configurée et un fichier de confiance temporaire, sans modifier Git global.

Publication du code seulement : le checkout actif de la session reste à 5e350a8, donc aucune activation/reload ni validation sur données personnelles n’est revendiquée.

  • with pi 🥧
Corrigé et intégré sur `main`, contenu distant vérifié au commit [e8ec9ad](https://git.2027a.net/mathieu/dotfiles/commit/e8ec9ad7563960637ef33c13f0a1431f6bfab132). Commits de correction signés : `3783be790802e6fe16762d324c9a222b9ab75af3 / 8a0eea49eb74197b3daad21a7283c4369192280d`. Test natif rouge : 800 sauvegardes avec le code initial ; vert : 1 pour les libellés visibles, 0 pour les libellés cachés. Les fenêtres de mesure traversent volontairement un tick de maintenance. Identifiants changés, reload, actions natives, DND/verrouillage et comptage testés. La revue indépendante a fait corriger une contamination initiale du compteur par le timer ; relecture propre après correction. Gate parent sur la composition finale : **20/20 suites passent**, chacune avec HOME/XDG/bus/audio isolés (`run-suites.py` parent ; scripts du dépôt inchangés hors tests ajoutés). Signatures vérifiées avec la clé publique configurée et un fichier de confiance temporaire, sans modifier Git global. Publication du code seulement : le checkout actif de la session reste à `5e350a8`, donc aucune activation/reload ni validation sur données personnelles n’est revendiquée. - with pi 🥧
mathieu 2026-10-24 13:42:39 +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#12
No description provided.