Curses

bibliothèque logicielle libre d'interface utilisateur en mode texte

Curses est le nom d'une bibliothèque logicielle permettant le développement sous Unix d'environnements plein écran en mode texte, indépendamment du terminal informatique utilisé, et pour tout type d'applications.

Structure

Elle est issue de la distribution BSD d'Unix, dans laquelle elle était employée pour l'éditeur de texte vi et le jeu Rogue.

En utilisant curses, les programmeurs peuvent concevoir des applications basées sur le mode texte, sans tenir compte des particularités de chaque terminal. La bibliothèque curses s'occupe d'envoyer les caractères de contrôle appropriés vers le moniteur lors de l'exécution du programme, en essayant d'optimiser ce qu'elle peut quand elle le peut.

Rester en mode texte, mais en y utilisant ainsi l'adressage direct de tout endroit de l'écran, permet aussi de ne pas avoir à s'occuper du gestionnaire graphique utilisé parmi les nombreux que peut utiliser Linux ou Unix.

Plusieurs installeurs de Linux dans les années 1990 utilisaient le mode texte en plein écran, à commencer par celui de la célèbre Slackware.

Avantages

Avec curses, il est possible d'écrire à tout moment en toute position de l'écran, ce qui permet de suivre facilement le déroulement d'un programme dans des conditions moins fatigantes que le mode de déroulement du genre machine à écrire. On peut également effectuer des entrées par ce moyen, et créer par exemple des formulaires simples en mode texte, voire simuler complètement un terminal plein écran comme un 3270[1]. Des variantes existent même permettant de simuler un Minitel[2].

Fonctionnement

Les fonctions principales sont très simples :initscr() initialise le mode plein écran.

move(ligne, colonne) déplace virtuellement le curseur

addstr(chaîne) écrit une chaîne de caractères là où est le curseur

refresh() met en conformité l'écran réel et l'affichage virtuel

endwin() met fin au mode plein écran et restaure l'état où était l'écran avant que l'on ne s'y place.

Curses/ncurses est installé en standard dans quelques distributions. Sur d'autres comme Ubuntu Studio ou Mint, on doit l'installer par exemple comme ceci pour le gcc5 depuis une console : sudo apt install libncurses5-dev[3].

Exemple simple

Le très simple programme suivant[4] compte en les répartissant par longueur les mots du dictionnaire français /usr/share/dict/french de GNU/Linux.

// Se compile par exemple avec gcc cursef.c -lcurses && ./a.out#include <curses.h> #include <string.h>int c;                 // colonne ((0,0) en haut à gauche)int count[128], total; // à 0; comptage des mots de chaque longueurint main(){   WINDOW* win;  FILE* infile;  char d, ...<ref>''in'' ?</ref>[128], out[128];  infile = fopen("/usr/share/dict/french", "r"); // Dictionnaire    win = initscr(); // Initialisation  cbreak();        // Ne pas exiger ENTER  noecho();        // Pas d'écho demandé  clear();         // Fenêtre à blanc  refresh();       // Exécution de ce qui a été préparé dans la fenêtre  int octets, glyphes; // En unicode, quelques glyphes sont multi-octets  while (!feof(infile))  {     fgets(..., 100,infile);       // Bidouillage pour unicode (car glyphes multioctets)       octets=0; glyphes=0;        while (...[octets])       {         if ((...[octets] & 0xC0) != 0x80 ) ++glyphes;        ++octets;       }       --glyphes; ++count[glyphes]; // négliger retour ligne       // Fin du bidouillage    sprintf(out, "%7d %s", count[glyphes], ...);    move(glyphes-1,0);    addstr(out); // préparer la ligne dans la fenêtre    refresh();   // afficher la fenêtre    ++total;  }  sprintf(out, "%7d mots au total", total);  move (26,0); addstr(out); refresh();  d=getch();   // Attente d'un caractère pour effacer fenêtre et sortir  endwin();    // curses call to restore the original window and leave}
Exemple de curses : comptage des mots du dictionnaire /usr/share/dict/french en les répartissant par longueur

Portabilité

L'utilisation sur Windows des fonctionnalités de la librairie curses est rendu possible via l'emploi de la librairie PDcurses qui se base sur ncurses. Celle ci n'est pas identique mais permet d'utiliser la plupart des fonctions. Par exemple avec le langage Python et depuis sa version 3.7, cela peut se faire simplement en installant le package windows-curses[5].

Alternative

L'envoi direct de commandes de déplacement du curseur au terminal (ainsi que de changement de teinte de caractère et de fond) est également possible sur la plupart des écrans caractère, ceux-ci honorant en général les séquences ANSI dites CSI (Control Sequence Introducer), en compatibilité avec le VT100. Dans la pratique, l'emploi de curses rend plus aisée la maintenance des programmes (l'usage de CSI reste inévitable dans des scripts). Par ailleurs, le fait qu'un nouvel affichage n'ait lieu avec curses qu'à chaque refresh() et non à chaque nouvelle écriture sur le terminal peut procurer une meilleure expérience visuelle à l'utilisateur par l'affichage de tout l'écran une fois complet plutôt qu'à chaque modification partielle de celui-ci.

Notes et références

Voir aussi

Articles connexes

  • ncurses, successeur de curses.
  • PDcurses, version curses dans le domaine public.

Bibliographie

Liens externes

🔥 Top keywords: Cookie (informatique)Wikipédia:Accueil principalShannen DohertyLamine YamalRobin Le NormandChampionnat d'Europe de footballSpécial:RechercheFête nationale françaiseNico WilliamsCarlos Alcaraz (tennis)Huguette BelloAymeric LaporteDonald TrumpLuke PerryCarlos AlcarazÉquipe d'Espagne de footballAR-15Équipe d'Angleterre de footballNovak DjokovicChampionnat d'Europe de football 2024Álvaro MorataFluctuat nec mergiturTentative d'assassinat de Donald Trump en 2024Tadej PogačarLe Comte de Monte-CristoHarry KaneDani OlmoPrise de la BastilleLa Baule-les-Pins (film)Melanie GriffithLuis de la Fuente (football, 1961)Working GirlDani CarvajalJude BellinghamFrançois LetexierIñaki WilliamsRenaud CapuçonCole PalmerChampionnat d'Europe de football 2020