Gestione delle Finestre con la Libreria Ncurses

Grazie alle finestre, lo schermo può essere suddiviso in più porzioni rettangolari che possono essere gestite in modo indipendente. Ad esempio una finestra potrebbe servire per l’input dell’utente, occupando magari due o tre linee in fondo allo schermo, mentre tutto il resto del display potrebbe ospitare i risultati delle elaborazioni. Occorre dire che le finestre in ncurses non sono sovrapponibili o meglio non è definito un ordine a priori tra le finestre per stabilire se una è davanti ad un’altra. Le funzioni principali per la gestione delle finestre sono:

  • WINDOW* newwin(int linee, int colonne, int lineaIniziale, int colonnaIniziale) – Questa funzione crea una nuova finestra con determinate linee e colonne, posizionata inizialmente alle coordinate dello schermo lineaIniziale e colonnaIniziale. Restituisce un puntatore ad una struttura di tipo WINDOW.
  • int mvwin(WINDOW* finestra, int linea, int colonna) – La funzione consente di spostare una finestra in una determinata posizione. Spostare la finestra al di fuori dello schermo fisico non è consentito, in questo caso la funzione ritornerebbe la costante ERR al posto del solito OK.
  • int delwin(WINDOW* finestra) – La funzione serve per cancellare una finestra, ma questo non vuol dire eliminazione dallo schermo.

Le funzioni che intervengono nell’aggiornamento dello schermo sono:

  • int wrefresh(WINDOW* finestra) – La funzione copia sul terminale la finestra passata come parametro ottimizzando come al solito il numero di byte trasmessi.
  • int refresh(void) – La funzione serve per aggiornare lo schermo standard, in pratica equivale a scrivere wrefresh(stdscr).
  • int wnoutrefresh(WINDOW* finestra) – La funzione copia il contenuto su curscr e non aggiorna il terminale come avveniva con wrefresh.
  • int doupdate(void) – La funzione aggiorna il terminale.

Uno degli errori più comuni è credere che refresh aggiorni tutto lo schermo, in realtà questa funzione mostra il contenuto di stdscr che per ncurses è una finestra come le altre. Se ad esempio scriviamo solo sulle finestre create e poi aggiorniamo con refresh, lo schermo apparirà nero, perché è stato copiato il contenuto solo di stdscr che non contiene nulla.

/* File window.c
compilare con: gcc -Wall -o window window.c -lncursesw */

#include “stdio.h”
#include “ncursesw/curses.h”

void InitLib()
{
     initscr();
     cbreak();
     keypad(stdscr, TRUE);
}

WINDOW* CreateWindow(int iWidth, int iHeight, int iStartX, int iStartY)
{
     WINDOW* pWin = newwin(iHeight, iWidth, iStartY, iStartX);
     box(pWin, 0, 0);
     wrefresh(pWin);
     return pWin;
}

void DestroyWindow(WINDOW* pWin)
{
      wborder(pWin, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘);
      wrefresh(pWin);
      delwin(pWin);
}

int main(int argc, char** argv)
{
      WINDOW* pWin;
       int iStartX, iStartY, iWidth, iHeight;
       int cValue;

       InitLib();

       iWidth = 10;
       iHeight = 3;

       iStartX = (COLS – iWidth) / 2;
       iStartY = (LINES – iHeight) / 2;

       printw(“Premere i tasti direzionali per far muovere il rettangolo\n”);
       printw(“Premere Inizio ( Home ) per uscire”);
       refresh();

        pWin = CreateWindow(iWidth, iHeight, iStartX, iStartY);
       while ((cValue = getch()) != KEY_HOME)
       {
             switch(cValue)
             {
                    case KEY_LEFT:
                          DestroyWindow(pWin);
                          pWin = CreateWindow(iWidth, iHeight, –iStartX, iStartY);
                          break;
                    case KEY_RIGHT:
                          DestroyWindow(pWin);
 &nbsp
;                        pWin = CreateWindow(iWidth, iHeight, ++iStartX, iStartY);

                         break;
                    case KEY_UP:
                          DestroyWindow(pWin);
                          pWin = CreateWindow(iWidth, iHeight, iStartX, –iStartY);
                          break;
                    case KEY_DOWN:
                          DestroyWindow(pWin);
                          pWin = CreateWindow(iWidth, iHeight, iStartX, ++iStartY);
                         break;
              }
     }

     endwin();

     return 0;
}

Questo esempio dovrebbe essere semplice da comprendere per chi ha seguito con attenzione tutte le lezioni precedenti sulla programmazione della libreria ncurses. Se così non fosse potete sempre avere dei chiarimenti tramite il forum ( vedi in alto a destra in questo blog ) oppure inserendo un commento a questo o agli altri articoli del corso.

<<  Lezione Precedente

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in Linux e contrassegnata con . Contrassegna il permalink.