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

De knowledge
Aller à la navigation Aller à la recherche
mAucun résumé des modifications
mAucun résumé des modifications
 
Ligne 1 : Ligne 1 :
Vi (vi 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.  
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|frame buffer]]" si on travaille sur un écran physique mais pas en mode console.
Je sais faire ça en "[[Frame-buffer|frame buffer]]" si on travaille sur un écran physique mais pas en mode console.

Version actuelle datée du 29 novembre 2025 à 21:46

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

Capacités terminfo utilisables avec tigetstr()

Capacité Effet Utilisation typique
clear Efface l’écran putp(tigetstr("clear"))
cup Positionne le curseur putp(tparm(tigetstr("cup"), y, x))
civis Cache le curseur putp(tigetstr("civis"))
cnorm Restaure le curseur visible putp(tigetstr("cnorm"))
smcup Sauvegarde écran + curseur putp(tigetstr("smcup"))
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"))
smso Mode standout (inversion) putp(tigetstr("smso"))
rmso Fin du mode standout putp(tigetstr("rmso"))
sgr0 Réinitialise les attributs putp(tigetstr("sgr0"))