Cyril Rabat


Utilisation des fenêtres avec ncurses

 18/01/2017     18/01/2017      Programmation C      Programmation de base      ncurses   

Création d'une fenêtre sous ncurses

   Cet article présente comment créer une fenêtre avec ncurses et créer une sous-fenêtre.

Mots-clefs :   ncurses     fenêtre   

L'article suivant contient l'ensemble des fichiers de cet article :

 fenetres.zip

Les fonctions communes ncurses

Le fichier C suivant contient la définition de plusieurs fonctions nécessaires pour l'activation du mode ncurses. Pour la gestion de la souris, la fonction ncurses_souris permet d'activer la souris et la fonction souris_getpos permet de récupérer la position de la souris, ainsi que le type de bouton cliqué.

#include "ncurses.h"
 
#include <ncurses.h>   /* Pour toutes les fonctions/constantes ncurses */
#include <stdlib.h>    /* Pour exit, EXIT_FAILURE */
 
/**
 * Initialisation de ncurses.
 */
void ncurses_initialiser() {
  initscr();	        /* Demarre le mode ncurses */
  cbreak();	        /* Pour les saisies clavier (desac. mise en buffer) */
  noecho();             /* Desactive l'affichage des caracteres saisis */
  keypad(stdscr, TRUE);	/* Active les touches specifiques */
  refresh();            /* Met a jour l'affichage */
  curs_set(FALSE);      /* Masque le curseur */
}
 
/**
 * Fin de ncurses.
 */
void ncurses_stopper() {
  endwin();
}
 
/**
 * Initialisation des couleurs.
 */
void ncurses_couleurs() {
  /* Verification du support de la couleur */
  if(has_colors() == FALSE) {
    ncurses_stopper();
    fprintf(stderr, "Le terminal ne supporte pas les couleurs.\n");
    exit(EXIT_FAILURE);
  }
 
  /* Activation des couleurs */
  start_color();
 
  /* Definition de la palette */
  init_pair(1, COLOR_BLUE, COLOR_BLACK);
  init_pair(2, COLOR_BLACK, COLOR_RED);
}
 
/**
 * Initialisation de la souris.
 */
void ncurses_souris() {
  if(!mousemask(ALL_MOUSE_EVENTS, NULL)) {
    ncurses_stopper();
    fprintf(stderr, "Erreur lors de l'initialisation de la souris.\n");
    exit(EXIT_FAILURE);
  }
 
  if(has_mouse() != TRUE) {
    ncurses_stopper();
    fprintf(stderr, "Aucune souris n'est détectée.\n");
    exit(EXIT_FAILURE);
  }
}
 
/**
 * Recupere la position x et y de la souris.
 * @param[out] x la position en x
 * @param[out] y la position en y
 * @param[out] bouton l'évenement associé au clic (ou NULL)
 * @return OK si reussite
 */
int souris_getpos(int *x, int *y, int *bouton) {
  MEVENT event;
  int resultat = getmouse(&event);
 
  if(resultat == OK) {
    *x = event.x;
    *y = event.y;
    if(bouton != NULL) *bouton = event.bstate;
  }
  return resultat;
}

 Télécharger le fichier

Créer une fenêtre simple

Le programme suivant montre comment créer une fenêtre et lui mettre une couleur de fond. Lorsque l'utilisateur clique dedans, le programme s'arrête.

/**
 * Ce programme illustre le fonctionnement des fenetres ncurses.
 * Le programme cree une fenêtre, la colorie dans une couleur.
 * Pour quitter le programme, l'utilisateur doit cliquer dans la fenetre.
 * @author Cyril Rabat
 * @version 18/01/2017
 **/
 
#include <stdlib.h>     /* Pour EXIT_FAILURE */
#include <ncurses.h>    /* Pour printw, attron, attroff, COLOR_PAIR, getch */
 
#include "ncurses.h"
 
#define LARGEUR 20      /* Largeur de la fenêtre */
#define HAUTEUR 10      /* Hauteur de la fenêtre */
#define POSX    20      /* Position horizontale de la fenêtre */
#define POSY    5       /* Position verticale de la fenêtre */
 
int main() {
  int i;
  WINDOW* fenetre;
  int quitter = FALSE;
  int sourisX, sourisY;
 
  /* Initialisation de ncurses */
  ncurses_initialiser();
  ncurses_souris();
  ncurses_couleurs(); 
 
  /* Vérification des dimensions du terminal */
  if((COLS < POSX + LARGEUR) || (LINES < POSY + HAUTEUR)) {
      ncurses_stopper();
      fprintf(stderr, 
              "Les dimensions du terminal sont insufisantes : l=%d,h=%d au lieu de l=%d,h=%d\n", 
              COLS, LINES, POSX + LARGEUR, POSY + HAUTEUR);
      exit(EXIT_FAILURE);
  }  
 
  /* Création de la fenêtre */
  fenetre = newwin(HAUTEUR, LARGEUR, POSY, POSX);
 
  /* Colore le fond de la fenêtre */
  wbkgd(fenetre, COLOR_PAIR(2));
  wrefresh(fenetre);
 
  /* Attente du clic dans la fenêtre */
  printw("Cliquez dans la fenetre pour terminer...");
  while(quitter == FALSE) {
      i = getch();
      if((i == KEY_MOUSE) && 
         (souris_getpos(&sourisX, &sourisY, NULL) == OK))
            if((sourisX >= POSX) && (sourisX < POSX + LARGEUR) &&
               (sourisY >= POSY) && (sourisY < POSY + HAUTEUR))
                quitter = TRUE;
  }
 
  /* Suppression de la fenêtre */
  delwin(fenetre);
 
  /* Arrêt de ncurses */
  ncurses_stopper();
 
  return EXIT_FAILURE;
}

 Télécharger le fichier

Gérer le cadre d'une fenêtre

Le programme suivant montre comment créer une fenêtre avec un cadre et une sous-fenêtre dans laquelle réaliser l'affichage. L'intérêt est que l'affichage n'efface pas le cadre.

/**
 * Ce programme illustre le fonctionnement des fenetres ncurses.
 * Le programme cree une fenêtre, la colorie dans une couleur.
 * Pour quitter le programme, l'utilisateur doit cliquer dans la fenetre.
 * @author Cyril Rabat
 * @version 18/01/2017
 **/
 
#include <stdlib.h>     /* Pour EXIT_FAILURE */
#include <ncurses.h>    /* Pour printw, attron, attroff, COLOR_PAIR, getch */
 
#include "ncurses.h"
 
#define LARGEUR 20      /* Largeur de la fenêtre */
#define HAUTEUR 10      /* Hauteur de la fenêtre */
#define POSX    20      /* Position horizontale de la fenêtre */
#define POSY    5       /* Position verticale de la fenêtre */
 
int main() {
  int i;
  WINDOW* fenetre;
  WINDOW* sous_fenetre;
  int sourisX, sourisY, cpt = 0;
 
  /* Initialisation de ncurses */
  ncurses_initialiser();
  ncurses_souris();
  ncurses_couleurs(); 
 
  /* Vérification des dimensions du terminal */
  if((COLS < POSX + LARGEUR) || (LINES < POSY + HAUTEUR)) {
      ncurses_stopper();
      fprintf(stderr, 
              "Les dimensions du terminal sont insufisantes : l=%d,h=%d au lieu de l=%d,h=%d\n", 
              COLS, LINES, POSX + LARGEUR, POSY + HAUTEUR);
      exit(EXIT_FAILURE);
  }  
 
  /* Creation de la fenêtre */
  fenetre = newwin(HAUTEUR, LARGEUR, POSY, POSX);
  box(fenetre, 0, 0);
  sous_fenetre = subwin(fenetre, HAUTEUR - 2, LARGEUR - 2, POSY + 1, POSX + 1);
  scrollok(sous_fenetre, TRUE);
 
  /* Création d'un cadre */
  wrefresh(fenetre);
  wrefresh(sous_fenetre);
 
  /* Attente d'un clic dans la fenêtre ou de F2 */
  printw("Cliquez dans la fenetre ; pressez F2 pour quitter...");  
  while((i = getch()) != KEY_F(2)) {
      if((i == KEY_MOUSE) && 
         (souris_getpos(&sourisX, &sourisY, NULL) == OK))
            if((sourisX > POSX) && (sourisX < POSX + LARGEUR - 1) &&
               (sourisY > POSY) && (sourisY < POSY + HAUTEUR - 1)) {
                cpt++;
                if(cpt != 1) wprintw(sous_fenetre, "\n");
                wprintw(sous_fenetre, "Ca chatouille %d", cpt);
                wrefresh(sous_fenetre);
            }
  }
 
  /* Suppression des fenêtres */
  delwin(sous_fenetre);
  delwin(fenetre);
 
  /* Arrêt de ncurses */
  ncurses_stopper();
 
  return EXIT_FAILURE;
}

 Télécharger le fichier

Compilation et exécution

Le Makefile suivant permet de compiler les programmes précédents :

 makefile

Pour compiler les deux programmes, tapez la commande suivante :

    make

Pour exécuter les deux programmes, tapez les commandes suivantes :

    ./exemple1
    ./exemple2

Articles connexes


Version de cette page Mercredi 16 Décembre 2015

© Cyril Rabat 2016

Connexion

Mot de passe perdu

Dernières nouvelles

Aucune pour le moment

Contact

Courriel :
cyril.rabat [at] univ-reims.fr

Téléphone :
+33-326-91-33-81

Fax :
+33-326-91-33-97

Facebook :
lien Facebook direct