• C > ncurses

      Lors de la compilation avec gcc, il faut spécifier la bibliothèque Ncurses et pour cela il vous faut rajouter l’option lncurses.

      gcc -lncurses -o toto toto.c

       

      Si problème d’affichage apres un script : Créer un fichier nommé sos, lequel vous restaurera les paramètres d’origine de la console. Il suffit d’y mettre :

      #!/bin/sh
      stty -raw <># Réutilise le mode RAW pour l'interception des signaux et autres
      stty echo <># Remise en place de l'echo
      stty onlcr <># Remise en place du retour chariot

       

      chmod +x sos

      Ainsi vous n’aurez plus qu’a taper sos dans votre console pour effacer les effets dûs à de mauvaises manipulations.

      Hello world

      HelloWorld.c

      #include <ncurses.h>
      
      int main(void)
      {
          initscr();              // Initialise la structure WINDOW et autres paramètres
          printw("Hello World");  // Écrit Hello World à l'endroit où le curseur logique est positionné
          refresh();              // Rafraîchit la fenêtre courante afin de voir le message apparaître
          getch();                // On attend que l'utilisateur appui sur une touche pour quitter
          endwin();               // Restaure les paramètres par défaut du terminal
      
          return 0;
      }

      Avec ncurses.h, il n’y a plus besoin d’inclure stdio.h car incluse dans ncurses.h

      Se positionner dans la fenêtre

      La fonction move déplace le curseur à l’endroit voulu

      #include <ncurses.h>
      
      int main(void) {
          initscr();
          move(LINES - 1, COLS - 1);  // Déplace le curseur tout en bas à droite de l'écran
          addch('.');                 // Écrit le caractère . au nouvel emplacement
      
          mvaddch(LINES - 1, COLS - 1, '.');  // équivalent aux deux lignes ci-dessus
          mvprintw(LINES - 1, COLS - 1, "."); // idem
      
          getch();
          endwin();
      
          return 0;
      }

      LINES et COLS représentent le nombre de lignes et colonnes du terminal actuel. Après redimensionnement, ces deux variables sont mises à jour.

      La fonction mvFonction a plusieurs fonctions, comme par exemple, mvaddstr, etc. Voir le man correspondantes.

      mises en forme

      Normal (A_NORMAL)

      Surlignement (A_STANDOUT)

      Inversion vidéo (A_REVERSE)

      Atténué (A_DIM)

      Brillant ou gras (A_BOLD)

      Souligné (A_UNDERLINE)

      Mode invisible ou blanc (A_INVIS)

      attron/attroff applique/annule les mises en forme. A_NORMAL permet d’annuler toutes les mises en forme appliquées.

      #include <ncurses.h>
      
      int main(void)
      {
          initscr();
      
          attron(A_NORMAL);
          printw("Texte sans mise en forme\n");
      
          attron(A_STANDOUT);
          printw("Texte en meilleur surlignement\n");
          attroff(A_STANDOUT);
      
          attron(A_REVERSE);
          printw("Texte en inversion video\n");
          attroff(A_REVERSE);
      
          attron(A_DIM);
          printw("Texte a moitie brillant\n");
          attroff(A_DIM);
      
          attron(A_BOLD);
          printw("Texte en gras\n");
          attroff(A_BOLD);
      
          attron(A_UNDERLINE);
          printw("Texte en souligne\n");
          attroff(A_UNDERLINE);
      
          attron(A_INVIS);
          printw("Texte invisible\n");
          attroff(A_INVIS);
      
          attron(A_UNDERLINE | A_BOLD); // Pour plusieurs type de mises en forme, on utilise |
          printw("Texte en gras souligne\n");
      
          attron(A_NORMAL);
          refresh();
          getch();
          endwin();
      
          return 0;
      }

      Pour une mise en forme commune pour chaque fenêtre, plutôt que d’utiliser attron à chaque fois, on peut utiliser attrset. Ainsi, n’importe qu’elle fenêtre créée héritera de cet attribut et donc chaque fois que vous écrirez dedans, ça sera automatiquement mis en gras.

      Lire une chaîne de caractères à partir du clavier

      il existe des fonctions vous permettant de lire des chaînes de caractères d’une seule traite sans avoir à passer par la méthode getch utilisée jusqu’à présent.

      Cette méthode se nomme getstr et permet donc de lire une chaîne entière de caractères. Voyons maintenant comment s’en servir.

      Créer plusieurs fenêtres

      subwin . Il suffit juste de dire quelle est la fenêtre à diviser ainsi que les dimensions voulues. Une fois fait, une nouvelle sous-fenêtre sera retournée (de type WINDOW *).

      #include <ncurses.h>
      
      int main(void) {
          WINDOW *haut, *bas;
      
          initscr();
          haut= subwin(stdscr, LINES / 2, COLS, 0, 0);        // Créé une fenêtre de 'LINES / 2' lignes et de COLS colonnes en 0, 0
          bas= subwin(stdscr, LINES / 2, COLS, LINES / 2, 0); // Créé la même fenêtre que ci-dessus sauf que les coordonnées changent
      
          box(haut, ACS_VLINE, ACS_HLINE);
          box(bas, ACS_VLINE, ACS_HLINE);
      
          mvwprintw(haut, 1, 1, "Ceci est la fenetre du haut");
          mvwprintw(bas, 1, 1, "Ceci est la fenetre du bas");
      
          wrefresh(haut);
          wrefresh(bas);
      
          getch();
          endwin();
      
          free(haut);
          free(bas);
      
          return 0;
      }

      Ne vous attardez pas sur la fonction box, elle sera détaillée juste après. Je l’ai juste utilisée pour vous montrer la taille des fenêtres que j’ai créées.

      Créer une bordure autour de la fenêtre

      Pour créer une bordure autour d’une zone définie, utiliser la fonction box sur une fenêtre (de type WINDOW *). Deux méthodes sont possibles :

      La première consiste à créer une "boîte" avec les bordures par défaut (que l’on peut choisir parmi plusieurs types de bordures prédéfinies).

      La seconde consiste à définir soit même quel caractère sera sur la ligne du haut, du bas, dans les coins, etc.

      Méthode box

      #include <ncurses.h>
      
      int main(void) {
          WINDOW *boite;
      
          initscr();
          boite= subwin(stdscr, 10, 10, LINES / 2, COLS /2);
      
          box(boite, ACS_VLINE, ACS_HLINE); // ACS_VLINE et ACS_HLINE sont des constantes qui génèrent des bordures par défaut
          refresh();
      
          getch();
          endwin();
      
          free(boite);
      
          return 0;
      }

      Reportez vous aux pages man pour voir les différentes bordures disponibles (comme ACS_VLINE et ACS_HLINE par exemple).

      Méthode wborder

      #include <ncurses.h>
      
      int main(void) {
          WINDOW *boite;
      
          initscr();
          boite= subwin(stdscr, 10, 10, LINES / 2, COLS /2);
          wborder(boite, '|', '|', '-', '-', '+', '+', '+', '+');
          wrefresh(boite);
      
          getch();
          endwin();
      
          free(boite);
      
          return 0;
      }

      Avec wborder, les deux premiers arguments après le pointeur de WINDOW que l’on passe en paramètre représentent respectivement les côtés gauche et droite, les deux suivants les côtés haut et bas et enfin les quatre derniers représentent les quatre coins de la bordure (haut gauche, haut droit, bas gauche, bas droit).

      Centrer le texte

      Avec les variables LINES et COLS générées par Ncurses. Ainsi, même si nous redimensionnons une fenêtre, le texte sera toujours centré. Attention cependant, lorsque vous redimensionner le terminal, c’est comme si une touche du clavier était appuyé.

      #include <ncurses.h>
      
      int main(void) {
          WINDOW *boite;
      
          initscr();
          printw("Le terminal actuel comporte %d lignes et %d colonnes\n", LINES, COLS);
          refresh();
          getch();
          endwin(); 
      
          free(boite);
      
          return 0;
      }

      Lorsque vous exécutez ce code et que vous tentez de redimensionner votre terminal, l’application s’arrête instantanément. Pour pallier à ce problème, nous utiliserons une boucle. Le code devient donc :

      #include <ncurses.h>
      
      int main(void) {
          WINDOW *boite;
      
          initscr();
          while(1) {
              printw("Le terminal actuel comporte %d lignes et %d colonnes\n", LINES, COLS);
              refresh();  // Rafraîchit la fenêtre par défaut (stdscr) afin d'afficher le message
              if(getch() != 410)  // 410 est le code de la touche générée lorsqu'on redimensionne le terminal
                  break;
          }
      
          endwin();
      
          free(boite);
      
          return 0;
      }

      les variables LINES et COLS sont mises à jour lors de chaque évènement.

      Maintenant venons au fait, pour centrer un texte, il suffit de partir du centre de la fenêtre, auquel on enlève la moitié de la longueur de notre texte :

      #include <ncurses.h>
      #include <string.h>
      
      int main(void) {
          WINDOW *boite;
          char *msg= "Texte au centre";
          int taille= strlen(msg);
      
          initscr();
          while(1) {
              clear();    // Efface la fenêtre (donc l'ancien message)
              mvprintw(LINES/2, (COLS / 2) - (taille / 2), msg);
              refresh();
              if(getch() != 410)
                  break;
          }
      
          endwin();
      
          free(boite);
      
          return 0;
      }

      il en va de même pour centrer une fenêtre ou tout autre composant.

 

Aucun commentaire

 

Laissez un commentaire