La selection n'allait que dans la selection primaire (clic du milieu) ;
pour la coller avec Ctrl+V ailleurs, il fallait Ctrl+Shift+C. Reprise de
copy-on-select = clipboard de Ghostty, le reglage de l'ancienne config
Ghostty de Lionel.
- Config copy_on_select_clipboard (desactive par defaut, comme l'amont) ;
case dans Reglages > Avance.
- terminal_box::on_selection_done : publie a la fin d'un geste de
selection fait dans le panneau (glisser, double/triple clic, Shift+
clic), pas a chaque relachement du bouton gauche. La copie primaire
existante part elle a tout relachement dans la fenetre : la recopier
dans le presse-papiers ecraserait, au simple clic sur un onglet, ce
qu'on vient de copier ailleurs avec une vieille selection.
- Message::SelectionDone : copie la selection de cet onglet ; une
selection vide (simple clic) ne donne pas de texte (range_simple).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 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>
- 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
Implements the first batch of COSMIC_TERMINAL_KONSOLE_PARITY.md:
Save output as text:
- New SaveOutput action in the Edit menu, terminal context menu and
keyboard shortcuts (Ctrl+Shift+S, Konsole parity, rebindable).
- Terminal::scrollback_text() extracts history plus visible screen via
alacritty bounds_to_string, trimming trailing empty lines.
- Save-file dialog through cosmic-files; the file is written in a
spawn_blocking task so large scrollbacks never stall the UI.
Search options:
- Case-sensitive and regex checkboxes in the find bar.
- App::find_pattern() escapes the pattern when regex mode is off and
prefixes (?i) when case-insensitive (same approach as Alacritty).
Per-tab monitors (activity / silence / process finished):
- Toggles in the View menu and terminal context menu, state stored in
Terminal (monitor_* fields).
- Activity alerts on PTY output (Wakeup) for non-active tabs; silence
alerts after 10 s without output (Konsole default); process-finished
compares the shell pgrp with the tty tpgid via /proc/<pid>/stat and
alerts when the foreground job exits.
- Silence and process checks run on a 1 s iced::time subscription that
is only active while at least one tab needs it.
- Tab bar shows an armed icon (view-reveal-symbolic) and per-kind alert
icons; activating the tab acknowledges the alert.
Profile CLI:
- --profile/-p <name-or-id> applies a profile to the first tab only,
unknown profiles exit(1) with the available list on stderr.
- --list-profiles prints "id<TAB>name" and exits.
- Config is now loaded before the daemonize fork so CLI output reaches
the launching terminal.
- --help now documents -e/--command, --no-daemon and the new flags
(-e already worked; audit confirmed everything after it becomes the
command and its arguments).
i18n: new en/fr strings (save-output, monitor-*, find-case-sensitive,
find-regex).
Validated with ./check_cosmic_local.sh terminal, cargo fmt, and a debug
build exercising the CLI flags and a 6 s live run. The shutdown panic
in iced_winit ("async fn resumed after completion") pre-exists and is
reproducible with the installed binary.
Leyoda 2026 – GPLv3
Turns out we can reduce the size of Message even further by also boxing
the Config variant.
The size of the Message enum has now dropped from 900+ bytes to 64
bytes.
Instead, since the size of DialogMessage is allocated in the Message
enum, pass it as a box, so that only the size of a pointer is allocated
on the stack instead.
This patch add a new feature, now tab behavior now inherits the
active tab’s current directory on Linux controlled by a settings
toggle, and default is off
Previously introduced "Copy Link" seems to have missed some changes
added top "Open Link" which results in a lingering "underline" when
copying links.
For some reason the file was not properly formatted acoring to rust-fmt,
so some unrelated formatting changes snuck in.