« Curses en C » : différence entre les versions

De knowledge
Aller à la navigation Aller à la recherche
 
(2 versions intermédiaires par le même utilisateur non affichées)
Ligne 163 : Ligne 163 :
|}
|}
Exemple:<syntaxhighlight lang="bash">
Exemple:<syntaxhighlight lang="bash">
echo " "
for f in 0 1 2 3 4 5 6 7
for f in 0 1 2 3 4 5 6 7
do
do
  echo -n " "
   for b in  0 1 2 3 4 5 6 7
   for b in  0 1 2 3 4 5 6 7
   do
   do  
     tput setaf $f
     tput setaf $f
     tput setab $b
     tput setab $b
Ligne 172 : Ligne 174 :
     tput sgr0
     tput sgr0
   done
   done
  echo ""
echo ""
done
done  
 
echo ""
</syntaxhighlight>[[Fichier:RGB1BIT.png|sans_cadre|131x131px]]
</syntaxhighlight>[[Fichier:RGB1BIT.png|sans_cadre|131x131px]]


Ligne 240 : Ligne 242 :
|7
|7
|}
|}
<syntaxhighlight lang="bash">
#!/bin/bash
echo "N  :  B G R"
echo "----------------------"
for b in 0 4
do
        for g in 0 2
        do
                for r in 0 1
                do
                        echo -n $((b + g + r))
                        echo -n "  :  $((b/4)) $((g/2)) $r >"
                        tput setab $((b + g + r))
                        echo -n " "
                        tput sgr0
                        echo "<"
                done
        done
done
</syntaxhighlight>Qui nous donne:
[[Fichier:RGB.png|sans_cadre|175x175px]]
Les copies d'écrans sont réalisées avec [[Web-ssh|webssh]].


==== Commendes de lecture ====
==== Commendes de lecture ====

Dernière version du 15 janvier 2026 à 15:08

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:

echo " "
for f in 0 1 2 3 4 5 6 7
do
  echo -n " "
  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 
echo ""

Soit un entier de 3 bits qui représente une valeur RGB sur un bit.

RGB sur 1 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
#!/bin/bash
echo "N   :  B G R"
echo "----------------------"
for b in 0 4
do
        for g in 0 2
        do
                for r in 0 1
                do
                        echo -n $((b + g + r))
                        echo -n "   :  $((b/4)) $((g/2)) $r >"
                        tput setab $((b + g + r))
                        echo -n " "
                        tput sgr0
                        echo "<"
                done
        done
done

Qui nous donne:

Les copies d'écrans sont réalisées avec webssh.

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