Surveiller une session Claude Code ou Modjo sans risquer de lui taper
dedans, ni de lui coller quoi que ce soit.
- Terminal::read_only : input_no_scroll, input_scroll (donc paste) et
la molette en mode souris n'ecrivent plus rien, et une frappe ne ramene
plus la vue en bas. Couvre touches legacy et kitty, collage, clic
milieu, Ctrl+C, gestionnaire de mots de passe, IME, glisser-deposer.
- Terminal::respond : ecriture non bloquee pour ce que le terminal repond
lui-meme (PtyWrite, couleurs, taille, rapports de focus), sinon une
application attendrait une reponse qui ne vient pas (CSI ? u de Claude
Code, DA, DSR...).
- terminal_box : en lecture seule la souris revient au terminal
(selection, copie et defilement locaux, meme dans une application qui
la capture).
- Case « Lecture seule » dans Affichage et dans le menu contextuel ;
action ToggleReadOnly dans les raccourcis (groupe Autre, sans
raccourci par defaut, comme Ghostty et Konsole) ; cadenas
changes-prevent-symbolic sur l'onglet, apres les alertes.
Test de bout en bout dans un vrai PTY (cat) : saisie et collage bloques,
reponse transmise, saisie retablie ; il echoue si le verrou est retire.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Avec Claude Code et Modjo cote a cote, rien ne distinguait le panneau ou
l'on tape, hors le curseur creux. L'amont assombrissait le fond de 8 %
(aussi quand la fenetre perdait le focus) et l'a retire en juillet
(a43b5ae).
Reprise de unfocused-split-opacity de Ghostty : un voile de la couleur du
fond, texte compris, sur chaque panneau non focalise, seulement quand il y
en a plusieurs ; la perte de focus de la fenetre ne change rien.
- Config unfocused_pane_dim (pourcentage, defaut 30 = opacite 0,7 de
Ghostty, 0 desactive, plafond 85 = opacite minimale 0,15 de Ghostty).
- Reglages > Panneaux : curseur « Attenuation des panneaux inactifs ».
- terminal_box : voile trace dans un calque a part en fin de rendu (dans
le meme calque, la primitive de texte passerait par-dessus), aux coins
du fond du panneau.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude Code (>= 2.1.269) n'active Shift+Entree que si le terminal repond
a CSI ? u. alacritty_terminal sait tenir la pile des modes et repondre,
mais seulement avec kitty_keyboard, et n'encode aucune touche : Shift+
Entree partait en \r, identique a Entree.
- term::Config : kitty_keyboard active.
- kitty_keyboard : encodeur du frontal (spec kitty, decoupe de l'encodeur
d'Alacritty), utilise seulement quand l'application au premier plan a
pousse le drapeau 1 ou 8 ; sinon l'encodage legacy reste seul. Gere
desambiguisation, types d'evenements (repetition, relachement),
touches alternatives, toutes les touches, texte associe, pave
numerique, F1-F24, touches de modification. Shift+Entree -> CSI 13;2u.
- terminal_box : raccourcis de l'appli toujours prioritaires ;
Shift+PageUp/PageDown/Home/End et Echap sur selection gardent leur
comportement local ; relachements envoyes si le drapeau 2 est pose.
- Legacy : Shift+Entree envoie LF (comme Ctrl+J) au lieu de CR. rustyline
le lit comme Ctrl+J, la touche de saut de ligne de Modjo/Goose ; pour
un shell c'est toujours Entree.
Connu, non corrige ici : alacritty_terminal 0.25.1 push_keyboard_mode vide
title_stack au lieu de la pile des modes au-dela de 4096 empilements
(panique du fil PTY de l'onglet seulement, panic=unwind).
10 tests, dont la reponse a CSI ? u et l'application de CSI > 5 u.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vte 0.15 jette les OSC 9 et 777 : Claude Code (canal « ghostty ») ou tout
programme qui veut signaler « j'attends » ne pouvait rien faire remonter,
et la cloche etait un TODO. Avec plusieurs sessions en onglets, rien ne
disait laquelle attendait une reponse.
- osc_tap : le Pty est enveloppe, son lecteur passe chaque lecture a un
petit automate qui repere OSC 777;notify;titre;corps et OSC 9;texte
(les commandes ConEmu 9;N, dont la progression 9;4, sont ecartees comme
dans Ghostty). Ni alacritty_terminal ni vte ne sont forkes.
- desktop_notify : org.freedesktop.Notifications en direct (zbus), pour
recuperer le jeton ActivationToken au clic : la notification ramene la
fenetre au premier plan, sur le bon panneau et le bon onglet. Une
notification par onglet au plus (replaces_id), anti-rafale de Ghostty
(1/s, identique toutes les 5 s), titre suivi du nom de l'onglet.
- Rien n'est envoye pour l'onglet qu'on a sous les yeux. Sinon l'onglet
porte une icone d'attention (cloche ou notification), eteinte quand il
reprend le focus.
- Cloche : indicateur d'onglet seulement. Pas de demande d'attention
xdg-activation : cosmic-comp donne un jeton valide a toute application
non sandboxee, la fenetre volerait le focus.
- Focus 1004 : l'onglet quitte recoit enfin son focus-out (seul l'onglet
actif de chaque panneau etait mis a jour) ; un agent en arriere-plan ne
croit plus qu'on le regarde.
- Chevrons du corps remplaces par ‹ › : cosmic-notifications lit le corps
en HTML sans decoder les entites.
7 tests, dont un de bout en bout dans un vrai PTY.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le glyphe de police d'un bloc ne couvre que ~1 em alors que la cellule
fait line_height (~1.4 em) : rangées de blocs trouees par l'interligne,
bords creneles, rendu flou aux echelles fractionnees.
Desormais le caractere est remplace par une espace (aucun glyphe) et le
remplissage voyage dans Metadata jusqu'au tracé, ou terminal_box le
peint en quad GPU couvrant exactement la fraction de cellule (huitiemes,
quadrants, trames alpha). Consecutive cells de meme metadata fusionnent
en un seul quad : jointif par construction, aligne sur la grille, net a
toute echelle. C'est l'approche de kitty/WezTerm. Tout TUI a blocs
profite (bannieres, jauges htop/btop, barres de progression).
Couverture totale de la plage + geometrie bornee, 2 tests.
Resolution obtenue avec les patchs de chemin du workspace (libcosmic-yoda,
cosmic-protocols, window_clipboard, cosmic-text). Pas de changement de code,
uniquement le verrou remis en coherence avec l'arbre local.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Selection changes, scrolling and hyperlink highlights all just flag the
terminal as dirty. Without asking for a redraw they would not show up
until something else happens to repaint the window. This becomes a
problem after iced PR below gets merged.
Depends on
- [x] https://github.com/pop-os/iced/pull/377
- [x] https://github.com/pop-os/libcosmic/pull/1382
- [x] https://github.com/pop-os/libcosmic/pull/1388
- [x] https://github.com/pop-os/cosmic-files/pull/1815
____
- [x] I have disclosed use of any AI generated code in my commit
messages.
- If you are using an LLM, and do not fully understand the changes it is
making to the code base, do not create a PR.
- In our experience, AI generated code often results in overly complex
code that lacks enough context for a proper fix or feature inclusion.
This results in considerably longer code reviews. Due to this, AI
authored or partially authored PRs may be closed without comment.
- [x] I understand these changes in full and will be able to respond to
review comments.
- [x] My change is accurately described in the commit message.
- [x] My contribution is tested and working as described.
- [x] I have read the [Developer Certificate of
Origin](https://developercertificate.org/) and certify my contribution
under its conditions.
Le renommage d'onglet visait le panneau actif au moment de la validation
et non celui ou le renommage avait ete ouvert. L'ouverture appelle
unfocus_all_terminals(), si bien que `pane_model.active()` pouvait
designer un autre panneau au moment du commit : en configuration
scindee, le nouveau titre atterrissait sur l'onglet d'un panneau voisin.
`rename_tab` memorise desormais le panneau : (Pane, Entity, String) au
lieu de (Entity, String). L'ouverture le capture via focused(), et
commit, annulation et remise a zero le retrouvent par
panes.get(pane) au lieu de active_mut(). Le focus est rendu au panneau
d'origine via set_focus(pane) plutot que par update_terminal_focus(),
qui le laissait au petit bonheur.
Reprend le stash de 2026-06-13, fait sur 39d3d01. Le seul conflit
portait sur dialog(), ou la branche a gagne depuis le dialogue de
chargement de disposition : les deux sont conserves.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`cosmic-term` currently has an issue where borders appear to separate
some cells columnwise. This was caused due to the accumulation of
floating point error when using font sizes that can't be fully
represented in an f32. For example, a font size of 8.4x20 and a unique
color per cell is enough to reproduce this. Essentially, the glyph
background rectangles are being drawn slightly too narrow, causing the
terminal background to leak through. This patch rounds the rectangles in
such a way that we guarantee the drawing of that "border" pixel using
floor() and ceil().
- Serialize pane grid splits and per-tab state to RON
- Save/load layout via cosmic-files dialogs with confirmation
- SSH submenu from ~/.ssh/config Host entries (no wildcards)
- i18n en/fr for layout and SSH menu entries