Programowanie z ncurses (index)


Programowanie z ncurses (3) - procedury wejściowe

ZADANIE 3.1

W katalogu domowym utworzyć podkatalog klawisze. Utworzyć w nim pliki Makefile i klawisze.c postaci:


/*
* klawisze.c
*
* Program z HOWTO zmodyfikowany. 
*/

#include <unistd.h>   /* sleep() */
#include <curses.h>

int main(void) 
{
int ch;

initscr();             /* mozna sprawdzic NULL */
cbreak();            /* zmiana trybu pracy */
keypad(stdscr,TRUE);  /* aby dostać F1, F2,...  */
noecho();
printw("Litery beda wyswietlone z atrybutem A_BOLD\n");
ch= getch();
if (ch == KEY_F(1)) {
	printw("Nacisnieto klawisz F1");
} else if (ch == KEY_LEFT) {
	printw("Nacisnieto klawisz kursora w lewo");
} else if (ch == KEY_RIGHT) {
	printw("Nacisnieto klawisz kursora w prawo");
} else if (ch == KEY_UP) {
	printw("Nacisnieto klawisz kursora w gore");
} else if (ch == KEY_DOWN) {
	printw("Nacisnieto klawisz kursora w dol");
} else {
	printw("Nacisnieto klawisz ");
	attron(A_BOLD);
	printw("%c",ch);
	attroff(A_BOLD);
/* Można to zrobić jedną instrukcją:
addch(ch | A_BOLD);
*/
}
refresh();
sleep(2);
endwin();
return 0;
}

Skompilować i uruchomić program.

ZADANIE 3.2

W katalogu domowym utworzyć podkatalog wpisy. Utworzyć w nim pliki Makefile i wpisy.c postaci:


/*
*  wpisy.c
*/

#include <unistd.h>   /* sleep() */
#include <curses.h>

#define MAXLINE  20

int main(void) 
{
int ch, i;
char napis[MAXLINE];  /* napis podany przez usera */

initscr();        /* mozna sprawdzic */
cbreak();       /* zmiana trybu pracy */
printw("Podaj tajny wpis: ");
refresh();
noecho();
i= 0;
while ((ch= getch()) != '\n' && (i < MAXLINE)) {
	napis[i]= ch;
	++i;
	addch('*');
	refresh();
}
echo();
napis[i]= '\0';
mvprintw(1, 0, "Podano: %s\n", napis);
refresh();
sleep(2);

mvprintw(3,0,"Podaj drugi napis (getnstr): ");
refresh();
getnstr(napis,MAXLINE);
mvprintw(4,0,"Napisales (printw): %s",napis);
mvaddstr(5,0,"Napisales (addstr): ");
addstr(napis);
refresh();
sleep(2);

endwin();
return 0;
}

Skompilować i uruchomić program.

FUNKCJE


echo();
noecho();
cbreak();      // ustawienie trybu cbreak
raw();         // ustawienie trybu raw
getyx(y,x);   // pobieranie aktualnego położenia kursora

// pobiera jeden znak z klawiatury i zwraca ten znak lub ERR
int getch(void);        // deklaracja
int wgetch(WINDOW *win); // deklaracja

// wprowadzanie łańcuchów
// Czy dodawany jest znak \0 ? Wydaje się, że tak
// Nie jest pobierany zna nowej linii.
int getstr(char *str);
int getnstr(char *str, int n);

int scanw(char *str, ...);
int wscanw(WINDOW *win, char *str,...);
int mvscanw(int y, int x, char *str, ...);
int mvwscanw(WINDOW *win, int y, int x, char *str, ...);
// zmienna lista argumentów
vwscanw(WINDOW *win, char *str, ...);

// zinterpretuj wprowadzone klawisze funkcyjne/kursora KEY_*
keypad(stdscr, TRUE);
keypad(stdscr, FALSE);  // na koniec programu

PROCEDURY WEJŚCIOWE

Podstawowe funkcje wejściowe to getch() [pobieranie znaku, komplementarna do addch()], getstr() [pobieranie stringu] i scanw() [formatowane wejście].

Tryby wprowadzania znaków: domyślny, raw [funkcja raw()], cbreak [funkcja cbreak()]. W trybie domyślnym curses przeczyta znaki dopiero po dojściu do znaku nowej linii lub EOF. Zwykle używany jest tryb cbreak, kiedy to znaki są natychmiast dostępne dla programu.

Wyświetlanie znaków wprowadzanych przez użytkownika sterowane jest przez funkcje echo() i noecho().

getstr() wywołuje sekwencyjnie getch(), dopóki nie natrafi na LF lub CR (ale te końcowe znaki nie będą częścią zwróconego łańcucha). Trzeba pamiętać o rozmiarze bufora i o ręcznym dopisaniu znaku końca łańcucha. Bezpieczniej jest używać getnstr(). Jeżeli podamy za dużo znaków do getnstr(), to będzie generowany sygnał dźwiękowy.

scanw() działa podobnie do scanf(). ncurses przekazuje otrzymane znaki jako wejście do sscanf(). Jest jeszcze funkcja vwscanw(), która obsługuje zmienną listę argumentów.


Programowanie z ncurses (index)