« Curses en C » : différence entre les versions
mAucun résumé des modifications |
|||
| Ligne 59 : | Ligne 59 : | ||
=== Les commandes === | === Les commandes === | ||
==== Commandes de modifications ==== | |||
Capacités terminfo utilisables avec tigetstr() | Capacités terminfo utilisables avec tigetstr() | ||
{| class="wikitable" | {| class="wikitable" | ||
| Ligne 65 : | Ligne 67 : | ||
| clear || Efface l’écran || <code>putp(tigetstr("clear"))</code> | | clear || Efface l’écran || <code>putp(tigetstr("clear"))</code> | ||
|- | |- | ||
| cup || Positionne le curseur || <code>putp(tparm(tigetstr("cup"), y, x))</code> | | cup || Positionne le curseur (commence à 0) || <code>putp(tparm(tigetstr("cup"), y, x))</code> | ||
|- | |- | ||
| civis || Cache le curseur || <code>putp(tigetstr("civis"))</code> | | civis || Cache le curseur || <code>putp(tigetstr("civis"))</code> | ||
|- | |||
| smcup || Sauvegarde écran + curseur || <code>putp(tigetstr("smcup"))</code> | |||
|- | |- | ||
| cnorm || Restaure le curseur visible || <code>putp(tigetstr("cnorm"))</code> | | cnorm || Restaure le curseur visible || <code>putp(tigetstr("cnorm"))</code> | ||
|- | |- | ||
| | |dim* | ||
|passe en mode atténué | |||
|<code>putp(tigetstr("dim"))</code> | |||
|- | |- | ||
| rmcup || Restaure écran + curseur || <code>putp(tigetstr("rmcup"))</code> | | rmcup || Restaure écran + curseur || <code>putp(tigetstr("rmcup"))</code> | ||
| Ligne 79 : | Ligne 85 : | ||
| ed || Efface jusqu’à la fin d’écran || <code>putp(tigetstr("ed"))</code> | | ed || Efface jusqu’à la fin d’écran || <code>putp(tigetstr("ed"))</code> | ||
|- | |- | ||
| bold || Active le texte gras || <code>putp(tigetstr("bold"))</code> | | bold* || Active le texte gras || <code>putp(tigetstr("bold"))</code> | ||
|- | |- | ||
| blink || Active clignotement || <code>putp(tigetstr("blink"))</code> | | blink* || Active clignotement || <code>putp(tigetstr("blink"))</code> | ||
|- | |- | ||
| rev || Inverse les couleurs || <code>putp(tigetstr("rev"))</code> | | rev || Inverse les couleurs || <code>putp(tigetstr("rev"))</code> | ||
|- | |||
|reset | |||
|Réinitialise le terminal | |||
|<code>putp(tigetstr("reset"))</code> | |||
|- | |- | ||
| smso || Mode standout (inversion) || <code>putp(tigetstr("smso"))</code> | | smso || Mode standout (inversion) || <code>putp(tigetstr("smso"))</code> | ||
|- | |||
|smul | |||
|Active le souligné | |||
|<code>putp(tigetstr("smul"))</code> | |||
|- | |||
|srmul | |||
|Desactive le souligné | |||
|<code>putp(tigetstr("srmul"))</code> | |||
|- | |- | ||
| rmso || Fin du mode standout || <code>putp(tigetstr("rmso"))</code> | | rmso || Fin du mode standout || <code>putp(tigetstr("rmso"))</code> | ||
|- | |- | ||
| sgr0 || Réinitialise les attributs || <code>putp(tigetstr("sgr0"))</code> | | sgr0 || Réinitialise les attributs || <code>putp(tigetstr("sgr0"))</code> | ||
|- | |||
|sc | |||
|Sauvegarde le courseur | |||
|<code>putp(tigetstr("sc"))</code> | |||
|- | |||
|rc | |||
|Restore le courseur | |||
|<code>putp(tigetstr("rc"))</code> | |||
|- | |||
|flash | |||
|fait flasher l'écran en entier | |||
|<code>putp(tigetstr("flash"))</code> | |||
|- | |||
|bel | |||
|emet in bip | |||
|<code>putp(tigetstr("flash"))</code> | |||
|- | |||
|setaf | |||
|Couleur du texte | |||
|<code>putp(tparm(tigetstr("setaf"), a))</code> | |||
|- | |||
|setab | |||
|Couleur du fond | |||
|<code>putp(tparm(tigetstr("setab"), a))</code> | |||
|} | |||
<nowiki>*</nowiki> Ne marche pas avec tous les terminaux. | |||
==== Couleurs ==== | |||
{| class="wikitable" | |||
! Nombre !! Couleur | |||
|- | |||
|0 | |||
|Noir | |||
|- | |||
| 1 || Rouge | |||
|- | |||
|2 | |||
|Vert | |||
|- | |||
|3 | |||
|Jaune | |||
|- | |||
|4 | |||
|Bleu | |||
|- | |||
|5 | |||
|Magent | |||
|- | |||
|6 | |||
|Cyan | |||
|- | |||
|7 | |||
|Blanc | |||
|} | |||
Exemple:<syntaxhighlight lang="bash"> | |||
for f in 0 1 2 3 4 5 6 7 | |||
do | |||
for b in 0 1 2 3 4 5 6 7 | |||
do | |||
tput setaf $f | |||
tput setab $b | |||
echo -n "##" | |||
tput sgr0 | |||
done | |||
echo "" | |||
done | |||
</syntaxhighlight>[[Fichier:RGB1BIT.png|sans_cadre|131x131px]] | |||
Soit un entier de 3 bits qui représente une valeur RGB sur un bit. | |||
{| class="wikitable" | |||
|+RGB sur 1 bit! | |||
!Bit | |||
!b2 | |||
!b<sub>1</sub> | |||
!b<sub>0</sub> | |||
!index | |||
|- | |||
|Couleur | |||
|B | |||
|G | |||
|R | |||
|RGB | |||
|- | |||
|Noir | |||
|0 | |||
|0 | |||
|0 | |||
|0 | |||
|- | |||
|Rouge | |||
|0 | |||
|0 | |||
|1 | |||
|1 | |||
|- | |||
|Vert | |||
|0 | |||
|1 | |||
|0 | |||
|2 | |||
|- | |||
|Jaune | |||
|0 | |||
|1 | |||
|1 | |||
|3 | |||
|- | |||
|Bleu | |||
|1 | |||
|0 | |||
|0 | |||
|4 | |||
|- | |||
|Magenta | |||
|1 | |||
|0 | |||
|1 | |||
|5 | |||
|- | |||
|Cyan | |||
|1 | |||
|1 | |||
|0 | |||
|6 | |||
|- | |||
|Blanc | |||
|1 | |||
|1 | |||
|1 | |||
|7 | |||
|} | |||
==== Commendes de lecture ==== | |||
{| class="wikitable" | |||
! Capacité !! Effet !! Utilisation typique | |||
!Réponse | |||
|- | |||
|longname | |||
|imprime le nom du terminal | |||
|tput longname | |||
|xterm with 256 colors | |||
|- | |||
| cols || imprime le nombre de colonnes du terminal || tput cols | |||
|155 (sur mon terminal mobaXterm en plein écran) | |||
|- | |||
|lines | |||
|imprime le nombre de lignes du terminal | |||
|tput lines | |||
|56 | |||
|} | |} | ||
Version du 15 janvier 2026 à 14:30
Vi (vim en tout cas) fait un truc que j'ai toujours trouvé magique. Il prends la possession de l'écran, affiche le texte et les messages, puis le rends comme il l'avait trouvé en entrant.
Je sais faire ça en "frame buffer" si on travaille sur un écran physique mais pas en mode console.
J'ai bien un vague souvenir de la lib curses.h utilisée sur des terminaux VT100 il y a une trentaine d'année mais c'est loin.
Démo en bash
La commande tput est là pour ça. Moi je ne m'en servait que pour tput clear!
tput smcup
echo -e "\033[1;1HHello World!"
sleep 5
tput rmcup
Essayez c'est magique !
En C
Bon, on désire faire un "vrai" programme alors on programme en C.
#include <stdio.h>
#include <stdlib.h>
#include <term.h>
#include <unistd.h>
int main() {
setupterm(NULL, STDOUT_FILENO, NULL);
const char *smcup = tigetstr("smcup");
if (smcup != NULL) {
putp(smcup);
}
putp(tparm(tigetstr("cup"),0, 0)) /* Oui le 1;1 des codes ANSI devient un 0,0 plus "mathématique" en C */
printf ("Hello World!\n");
sleep(5);
const char *rmcup = tigetstr("rmcup");
if (rmcup != NULL) {
putp(rmcup);
}
return 0;
}
On compile par :
gcc -o test test.c -lncurses
Si la lib curses-dev n'est pas là:
sudo apt install libncurses-dev
Le résultat est le même que pour le bash mais c'est quand même mieux!
Fonction putp() en C
- Objectif : envoyer une séquence terminfo au terminal
- Prototype :
int putp(const char *str);
- Usage :
putp(tigetstr("civis")); // cache le curseur
- Équivalent :
tputs(str, 1, putchar);
- Nécessite :
#include <term.h> -lncurses
Les commandes
Commandes de modifications
Capacités terminfo utilisables avec tigetstr()
| Capacité | Effet | Utilisation typique |
|---|---|---|
| clear | Efface l’écran | putp(tigetstr("clear"))
|
| cup | Positionne le curseur (commence à 0) | putp(tparm(tigetstr("cup"), y, x))
|
| civis | Cache le curseur | putp(tigetstr("civis"))
|
| smcup | Sauvegarde écran + curseur | putp(tigetstr("smcup"))
|
| cnorm | Restaure le curseur visible | putp(tigetstr("cnorm"))
|
| dim* | passe en mode atténué | putp(tigetstr("dim"))
|
| rmcup | Restaure écran + curseur | putp(tigetstr("rmcup"))
|
| el | Efface jusqu’à la fin de ligne | putp(tigetstr("el"))
|
| ed | Efface jusqu’à la fin d’écran | putp(tigetstr("ed"))
|
| bold* | Active le texte gras | putp(tigetstr("bold"))
|
| blink* | Active clignotement | putp(tigetstr("blink"))
|
| rev | Inverse les couleurs | putp(tigetstr("rev"))
|
| reset | Réinitialise le terminal | putp(tigetstr("reset"))
|
| smso | Mode standout (inversion) | putp(tigetstr("smso"))
|
| smul | Active le souligné | putp(tigetstr("smul"))
|
| srmul | Desactive le souligné | putp(tigetstr("srmul"))
|
| rmso | Fin du mode standout | putp(tigetstr("rmso"))
|
| sgr0 | Réinitialise les attributs | putp(tigetstr("sgr0"))
|
| sc | Sauvegarde le courseur | putp(tigetstr("sc"))
|
| rc | Restore le courseur | putp(tigetstr("rc"))
|
| flash | fait flasher l'écran en entier | putp(tigetstr("flash"))
|
| bel | emet in bip | putp(tigetstr("flash"))
|
| setaf | Couleur du texte | putp(tparm(tigetstr("setaf"), a))
|
| setab | Couleur du fond | putp(tparm(tigetstr("setab"), a))
|
* Ne marche pas avec tous les terminaux.
Couleurs
| Nombre | Couleur |
|---|---|
| 0 | Noir |
| 1 | Rouge |
| 2 | Vert |
| 3 | Jaune |
| 4 | Bleu |
| 5 | Magent |
| 6 | Cyan |
| 7 | Blanc |
Exemple:
for f in 0 1 2 3 4 5 6 7
do
for b in 0 1 2 3 4 5 6 7
do
tput setaf $f
tput setab $b
echo -n "##"
tput sgr0
done
echo ""
done
Soit un entier de 3 bits qui représente une valeur RGB sur un bit.
| Bit | b2 | b1 | b0 | index |
|---|---|---|---|---|
| Couleur | B | G | R | RGB |
| Noir | 0 | 0 | 0 | 0 |
| Rouge | 0 | 0 | 1 | 1 |
| Vert | 0 | 1 | 0 | 2 |
| Jaune | 0 | 1 | 1 | 3 |
| Bleu | 1 | 0 | 0 | 4 |
| Magenta | 1 | 0 | 1 | 5 |
| Cyan | 1 | 1 | 0 | 6 |
| Blanc | 1 | 1 | 1 | 7 |
Commendes de lecture
| Capacité | Effet | Utilisation typique | Réponse |
|---|---|---|---|
| longname | imprime le nom du terminal | tput longname | xterm with 256 colors |
| cols | imprime le nombre de colonnes du terminal | tput cols | 155 (sur mon terminal mobaXterm en plein écran) |
| lines | imprime le nombre de lignes du terminal | tput lines | 56 |