, ,

Les fenêtres avec ncurses

stdscr est la fenêtre par défaut proposée par ncurses. L'utilisateur a la possibilité de créer ses propres fenêtres. Les fenêtres permettent de définir des zones d'affichage indépendantes.

Les fenêtres sont crées via l'appel de la fonction newwin(). Cet appel ne provoque pas d'affichage mais permet d'allouer l'espace mémoire nécessaire à la structure gérant l'abstraction qu'est la fenêtre. La fonction retourne un pointeur sur une structure de type WINDOW qui pourra être passé aux fonctions de la bibliothèque ncurses telle que wprintw(). Pour libérer l'espace mémoire occuper on utilisera la fonction delwin().

Dans l'exemple ci dessous la fonxtion box() permet de délimiter une bordure afin de visualiser la fenetre.

curses-window.c
#include <stdlib.h>
#include <ncurses.h>
 
WINDOW* create_win( int height, int width, int starty, int startx);
void destroy_win(WINDOW* local_win);
 
int main(int argc, char* argv[])
{
        //Déclaration des variables de travail
        WINDOW* my_win;
        int startx, starty, width, height;
        int ch;
 
        //intialisation du contexte ncurses
        initscr();
        cbreak(); //Désactivation du buffer, chaque touche pressée est évaluée immédiatement.
        keypad(stdscr, TRUE); //active les touches fonctions
 
        height = 5;
        width = 15;
 
        starty = (LINES - height) / 2;
        startx = (COLS - width) / 2;
 
        //insère le message pour quitter dans la fenetre par défaut stdscr
        printw("Pressez F1 pour quitter");
        refresh();
 
        my_win = create_win(height, width, starty, startx);
 
        while( (ch = getch()) != KEY_F(1) )
        {
                switch(ch)
                {
                        case KEY_LEFT:
                                destroy_win(my_win);
                                my_win = create_win(height, width, starty, --startx);
                                break;
                        case KEY_RIGHT:
                                destroy_win(my_win);
                                my_win = create_win(height, width, starty, ++startx);
                                break;
                        case KEY_UP:
                                destroy_win(my_win);
                                my_win = create_win(height, width, --starty, startx);
                                break;
                        case KEY_DOWN:
                                destroy_win(my_win);
                                my_win = create_win(height, width, ++starty, startx);
                                break;
                }
        }
        //quitte le mode ncurses en restaurant l'environnement et libérant la mémoire.
        endwin();
        return EXIT_SUCCESS;
}
 
WINDOW* create_win(int height, int width, int starty, int startx)
{
        WINDOW* local_w;
        local_w = newwin(height, width, starty, startx);
        box(local_w, 0, 0);
        wrefresh(local_w);
        return local_w;
}
 
void destroy_win(WINDOW* wp)
{
        /* la fonction box ne produira pas l'effet désiré car les caractères utiliser pour les angles
        * ne seront pas effacés. On utilise wborder qui permet de spécifier tous les caractères du cadre. */
        wborder(wp, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
        /* arg 2 : caractère coté gauche
        *  arg 3 : caractère coté droit
        *  arg 4 : caractère haut
        *  arg 5 : caractère bas
        *  arg 6 : caractère coin haut gauche
        *  arg 7 : caractère coin haut droit
        *  arg 8 : caractère coin bas gauche
        *  arg 9 : caractère coin bas droit
        */
 
        wrefresh(wp);
        delwin(wp);
}

Références