E N D
ncurses – úvod • ncurses je knihovna, která umožňuje barevný výstup na terminál, tvoří takovou nádstavbu klasického terminálu. Pomocí ncurses si můžeme nadefinovat barvy, které budeme používat, styl písma (tučné, kurzíva, podtržené a jejich kombinace) a pozadí. Abychom uplatnily styl písma, musí terminál běžet v grafickém režimu (v okně nebo přes framebuffer). ncurses dále umožňuje vytvožit více podoken, zjistit velikost terminálu a hlavně echovat výstup z klávesnice (nečeká na ukončení řádku '\n' – enter). • Abychom úspěšně zkompilovali aplikaci pod ncurses, potřebujeme její hlavičkové soubory a knihovny, nám bude stačit#include <curses.h>poznámka: ncurses je náhrada za curses, v dokumentaci je všude curses.h, takže ho budeme používat i my, v linuxu je ncurses.h jen symbolický odkaz na curses.h, takže je jedno co si zvolíme.Při linkování aplikace potřebujeme knihovnu ncurses. • Příklad kompilace aplikace 'test' v linuxu (výsledný soubor je spustitelný):gcc -lncurses test.c -o test
ncurses – vzorová aplikace • V manuálových stránkách ncurses najdeme tuto vzorovou aplikaci a my si krok za krokem popíšeme co dělá.#include <curses.h>/* hlavičkový soubor pro ncurses */#include <signal.h>/* ncurses aplikace potřebuje signály *//* tato funkce bude zavolána při ukončení aplikace */static voidfinish(int sig) {endwin();/* tady vlož non-curses ukončovací kód */exit(0);}/* konec funkce finish() */intmain(int argc, char *argv[]) {int num = 0;/* tady nainicializuj tvoje non-curses data a struktury */signal(SIGINT, finish); /* signal handler pro ukončení apl. */initscr(); /* inicializuj knihovnu (n)curses */keypad(stdscr, TRUE); /* povol mapování kláves */nonl(); /* nedělej z '\n' -> '\r\n' */cbreak(); /* nečekej na konec řádku při vstupu z klávesnice */echo(); /* barevný výstup (echo input in color) */
ncurses – vzorová aplikace • /* funkce has_colors() zjistí, zda je terminál barevný */ if (has_colors()) {/* terminál je barevný a funkce start_color() řekne curses * aby používal barvy. */start_color();/* Jednoduché přenastavení barev, barva číslo 0 nemůže být * přenastavena. Při volání funkce init_pair zadáváme první * index barvy, barvu textu a barvu pozadí jako poslední */init_pair(1, COLOR_RED, COLOR_BLACK);init_pair(2, COLOR_GREEN, COLOR_BLACK);init_pair(3, COLOR_YELLOW, COLOR_BLACK);init_pair(4, COLOR_BLUE, COLOR_BLACK);init_pair(5, COLOR_CYAN, COLOR_BLACK);init_pair(6, COLOR_MAGENTA, COLOR_BLACK);init_pair(7, COLOR_WHITE, COLOR_BLACK);}/* hlavní cyklus programu */ for (;;) {int c = getch(); /* zachytává jednotlivé znaky při psaní */attrset(COLOR_PAIR(num % 8)); /* přenastaví barvu */ num++; /* toto do své aplikace nedávejte, jen to přičítá */}/* barvy */finish(0); /* na tento řádek se aplikace nikdy nedostane */}/* konec funkce main() */
ncurses – vzorová aplikace Takto vypadá vzorová apolikace po nalinkování, můžeme si všimnout, že každé písmeno má jinou barvu, to způsopbuje právě to n++ a volání funkce attrset().
ncurses – vlastní typy • Ještě než probereme funkce je třeba si ujasnit definice a typy použité v knihovně ncurses: • typedef unsigned char bool; – ncurses definuje bool jako char!(hodnoty TRUE a FALSE). • typedef unsigned long chtype; - jeden znak včetně attributy • typedef struct screen SCREEN; • typedef struct _win_st WINDOW;/* ...must be at least as wide as chtype */ • typedef chtype attr_t; • #define ERR (-1) - funkce proběhla s chybou (-1). • #define OK (0) - funkce proběhla v pořádku. • V dokumentaci a hlavičkovém souboru jsem se dočetl, že některé funkce nemusí vrátit OK jako indikaci, že proběhli úspěšně, měli bychom testovat pouze, jestli proběhli neúspěšně (ERR) => Pokud se návratová hodnota funkce nerovná ERR, funkce proběhla úspěšně.
ncurses – inicializace a deinicializace • inicializace a deinicializace: • WINDOW* initscr(void);První funkce, která musí být zavolána, nastaví vše potřebné, zjistí charakteristiku terminálu a alokuje prostor pro první okno (stdscr). Tato funkce smí být zavolána pouze jednou a jako první. • intendwin(void);Funkce, která se postará o vyčištění ncurses z paměti a posune kurzor do spodního levého rohu. Tato funkce by měla být zavolána jako poslední funkce z knihovny ncurses. • SCREEN* newterm(const char *type, FILE *ofp, FILE *ifp);Aplikace, která potřebuje více než jeden terminál by měla zavolat tuto funkci pro vytvoření dalšího, takto vytvořený terminál může být odstraňen funkcí delscreen(). Parametr ofp je výstup a parametr ifp je vstup. Type je typ, v případě že je NULL, bude použita systémová proměnná $TERM. • SCREEN* set_term(SCREEN *to);Nastaví aktuální terminál na to a vrátí předchozí. • voiddelscreen(SCREEN *sp);Zničí terminál sp vytvořený funkcí newterm().
ncurses – okna (WINDOW*) • Okno je pole, které má 2 dimenze znaků, reprezentující celou nebo část CRT obrazu. Výstup a vstup znaků by měl být směřován do specifického okna. • Defaulní okno je stdwin, které reprezenjute plnou velikost terminálu x, y. Ale funkcí newwin() můžeme vytvořit například určitý výřez okna, viz obrázek. • Vytvoření okna: • WINDOW *newwin(intnlines, intncols, inty0, intx0);WINDOW *subwin(WINDOW *parent, intnl, intnc, inty0, intx0); • LINES a COLUMNS jsou globální proměnné!
ncurses – okna (WINDOW*) • Zníčení okna:intdelwin(WINDOW *win); • Výška a šířka okna:Velikost terminálu je dána proměnou COLUMNS a LINES. Jsou to globální proměnné nastavené při initsrc(). Co když se ale velikost změní...? Změnit velikost může například uživatel když roztáhne okno terminálu.#definegetmaxx(win) ((win)?((win)->_maxx + 1):ERR)#definegetmaxy(win) ((win)?((win)->_maxy + 1):ERR)#definegetmaxyx(win,y,x) (y = getmaxy(win), x = getmaxx(win))struktura WINDOW sama uchováná svoje rozměry a tyto makra slouží jenom pro jejich extrakci. • Obnovení obsahu okna (aktualizace):intwrefresh(WINDOW *win);#definerefresh() wrefresh(stdscr)Funkce wrefresh() obnoví obsah okna win, makro refresh() obnoví obsah okna stdscr. Můžeme si všimnout, že u všech funkcí, které mají prefix w je první parametr WINDOW*. • Vyčištění obsahu okna:intwclear(WINDOW *win);#defineclear() wclear(stdscr)
ncurses – okna (WINDOW*) • Změnění velikosti okna: • intwresize(WINDOW *win, inty, intx);Změní velikost oknawin na x, y. Funkce vrátí ERR při neúspěchu, jinak OK. • Posun okna: • intmvwin(WINDOW *win, inty, intx);Posune okno win na pozici x, y. Funkce vrátí ERR při neúspěchu, jinak OK.
ncurses – kurzor • Kurzor nám ukazuje, kam je směřován vstup, a proto je jeho pozice velmi důležitá. • Pro změnu kurzoru je funkce wmove() a makro move(), ale máme tu i kombinované funkce, které udělají víc věcí současně (jednoduchost a rychlost). Funkce, které změní pozici kurzoru mají prefix mv a funkce které změní pozici kurzoru do okna mají prefix mvw.Malý příklad pro funkci wgetch():intmvgetch(int y, int x);intmvwgetch(WINDOW *win, int y, int x); • Změna pozice kurzoru:intwmove(WINDOW *win, inty, intx);#definemove(x, y) wmove(stdscr, y, x)Opět se jedná o dvojici funkcí, pozor u všech funkcí začíná první parametr y a pak x, je to tak trochu nezvyk, ale knihovna ncurses je taková.
ncurses – vstup • Funkce pro nastavení vstupu: • intcbreak(void);Tato funkce ohlásí terminálu, že chceme zachytit každý znak (nečekat na '\n' – konec řádku). • intkeypad(WINDOW *window, boolvalue);Tuto funkci zavoláme, když chceme zachytit speciální klávesy, jako jsou např. Backspace, Delete, … (jestli jsme vytvořili pouze jedno okno funkcíinitsrc(), voláme tuto funkci takto:keypad(stdscr, TRUE); ) • intecho(void);Touto funkcí zapneme echování vstupu z klávesnice (každá klávesa, která bude poslána na vstup bude vypsána na obrazovku) • intnoecho(void);Touto funkcí vypneme echování vstupu z klávesnice, stisknuté klávesy se nebudou vypisovat. • intnodelay(WINDOW *win, boolvalue);Tato funkce vypne (nebo zapne) zpoždění kláves po první stisknuté klávese. To je dobré například pro ňákou hru(?).
ncurses – vstup • Funkce pro zachycení vstupu: • intwgetch(WINDOW *win) • intmvwgetch(WINDOW *win, inty, intx); • #definegetch() wgetch(stdscr) • #definemvgetch(y, x) mvwgetch(stdscr, y, x)všechny tyto funkce a makra zachytí jeden znak ze vstupu. V případě, že jsme nastavili funkcí nodelay() na TRUE, funkce vrátí hodnotu ERR, v případě, že nebyla stisknuta žádná klávesa.Funkce getch čeká pouze, když je nastaveno: nodelay(win, FALSE); • intscanw(const char *fmt, ...); • intwscanw(WINDOW *win, const char *fmt, ...); • intmvscanw(inty, intx, const char *fmt, ...); • intmvwscanw(WINDOW *win, inty, intx, const char *fmt, ...);Zachycení formátovaného vstupu (jako scanf)
ncurses – vstup • Funkce pro zachycení vstupu (pokr.):intwgetstr(WINDOW *win, char *str);intwgetnstr(WINDOW *win, char *str, intlen);intmvwgetnstr(WINDOW *win, inty, intx, char *str, intlen);intmvwgetstr(WINDOW *win, inty, intx, char *str);#definegetstr(str) wgetstr(stdscr, str)#definemvwgetnstr(win,y,x,str,n)(wmove(win,y,x) == ERR ? ERR : wgetnstr(win,str,n))#definemvwgetstr(win,y,x,str) (wmove(win,y,x) == ERR ? ERR : wgetstr(win,str))Funkce a makra, které čtou řetězec ukončený '\n' • Tady je seznam některých kódů kláves (Kompletní seznam je v man stránkách funkce getch()):key codepopisKEY_DOWN The four arrow keys ...KEY_UPKEY_LEFTKEY_RIGHTKEY_HOME Home key KEY_BACKSPACE BackspaceKEY_F(n) Function keys, for 0 <= n >= 63KEY_DC Delete characterKEY_IC Insert char or enter insert modeKEY_ENTER Enter or send
ncurses – výstup • výstup je vždy tam, kde se nachází kurzor. • pro výstup máme i funkce s prefixem mv a mvw. • pro aktualizaci (obnovení) je třeba volat funkci refresh() nebo wrefresh(). • Výstup po jendom znaku: • intaddch(const chtypech); • intwaddch(WINDOW *win, const chtypech); • intmvaddch(inty, intx, const chtypech); • intmvwaddch(WINDOW *win, inty, intx, constchtypech) • intechochar(const chtypech); • intwechochar(WINDOW *win, const chtypech); • Máme tu šestici funkcí, které vypíší jeden znak do okna win (nebo do stdscr), rozdíl je v tom, že funkce echochar() a wechochar() zavolají wrefresh() pro aktualizaci výstupu. • Výstup řetězce: • intaddstr(const char *str) • intwaddstr(WINDOW *win, const char *str) • intmvaddstr(inty, intx, const char *str); • intmvwaddstr(WINDOW *win, inty, intx, const char *str); • intaddnstr(const char *str, intlen); • intwaddnstr(WINDOW *win, const char *str, intlen); • intmvaddnstr(inty, intx, const char *str, intlen); • intmvwaddnstr(WINDOW *win, inty, intx, const char *str, intlen);
ncurses – výstup • Výstup formátovaného textu: • int printw(const char *fmt...); • int wprintw(WINDOW *win, const char *fmt, ...); • int mvprintw(inty, intx, const char *fmt, ...); • int mvwprintw(WINDOW *win, inty, intx, const char *fmt, ...); • Poznámka:Pokud chceme aktualizovat výstup, je nutné zavolat funkci wrefresh() nebo refresh(). Pokud chcete opravdu pokročilou aktualizaci, mrkněte na funkce:intwnoutrefresh(WINDOW *win);intdoupdate(void);intredrawwin(WINDOW *win);intwredrawln(WINDOW *win, intbeg_line, intnum_lines);Smysl těchto funkcí spočívá v tom, že okna si uchovávají dvojí obsah (takový textový double-buffer), jeden obsah je roven tomu, co je na obrazovce, a druhý tomu, co by tam mělo být. Funkcí doupdate() se překreslí jen to, co se opravdu změnilo.
ncurses – grafický výstup • NCurses nabízí víc než jen výstup znaků a řetězců. Umožňuje do okna přímo kreslit. V následující části si popíšeme jak vykreslit horizontální nebo vertikální čáru, okraj nebo rámeček a kopírování obsahu z jednoho okna do druhého. • Kreslení horizontální čáry: • inthline(chtypech, intlength); • intwhline(WINDOW *win, chtypech, intlength); • intmvhline(inty, intx, chtypech, intlength); • intmvwhline(WINDOW *win, inty, intx, chtypech, intlength);Tyto funkce nakreslí horizontální čáru typu ch o velikosti length. • Kreslení vertikální čáry: • intvline(chtypech, intlength); • intwvline(WINDOW *win, chtypech, intlength); • intmvvline(inty, intx, chtypech, intlength); • intmvwvline(WINDOW *win, inty, intx, chtypech, intlength);Tyto funkce nakreslí vertikální čáru typu ch o velikosti length.
ncurses – grafický výstup • Kreslení okraje (border): • intborder(chtypels, chtypers, chtypets, chtypebs,chtypetl, chtypetr, chtypebl, chtypebr); • intwborder(WINDOW *win,chtypels, chtypers, chtypets, chtypebs,chtypetl, chtypetr, chtypebl, chtypebr);Tyto funkce nakreslí okraj (border) okolo okna win. Dalo by se říct že okraj je nakreslen v okně. • Kreslení rámečku (box): • intbox(WINDOW *win,chtypels, chtypers, chtypets, chtypebs,chtypetl, chtypetr, chtypebl, chtypebr);Funkce nakreslí rámeček (box) v okně win na pozici x, y. • Umístění atribut pro funkce border(), vborder() a box():ls – levá strana,rs – pravá strana,ts – vrchní strana,bs – spodní strana,tl – roh vlevo-nahoře,tr – roh vpravo nahoře,bl – roh vlevo-dole abr – roh vpravo-dole.
ncurses – grafický výstup • Kopírování obsahu z jednoho okna do druhého:intoverlay(const WINDOW *srcwin, WINDOW *dstwin); • intoverwrite(const WINDOW *srcwin, WINDOW *dstwin);Obě 2 funkce zkopírují obsah srcwin do dstwin. Okna nemusí mít stejné rozměry. Rozdíl je v tom, že funkce overlay() nepřepisuje prázdné znaky (blank characters) a funkce overwrite() ano. • intcopywin(const WINDOW *srcwin, WINDOW *dstwin,intsminrow, intsmincol,intdminrow, intdmincol,intdmaxrow, intdmaxcol, intoverlay);Tato funkce zkopíruje jen určitou část okna srcwin na určitou pozici okna dstwin. Parametr overlay určuje, zda kopírovat i prázdné znaky (blank characters). • U NCurses si musíme opět zvyknout, že první parametr u kopírování je zdroj (source) a druhý je cíl (destination)!!!
ncurses – atributy (attributes) • Atributy: • Když se znaky vykreslí na obrazovku, můžeme vidět některé z efektů jako barva písma, barva pozadí, styl písma, blikání, atd..., souhrn těchto efektů nazýváme právě atributy.Každý bit atributy koresponduje jako jeden grafický efekt. • Máme dva způsoby použití atribut, jeden způsob je volání funkcí jako např waddch(win, ch), kde znak ch je včetně atribut, druhý způsor umožňuje nastavit předvolené globální atributy do okna. • Než se pustíme k popisu funkcí, popíšeme si předdefinované atributy:A_NORMAL Normání display (bez zvíraznění).A_STANDOUT Nejlepší zvýrazňvací mód terminálu.A_UNDERLINE Podtržení.A_REVERSE PřevrátitA_BLINK Blikání.A_DIM Poloviční světlost.A_BOLD Extra světlost nebo tučné.A_PROTECT Protected mode.A_INVIS Neviditelný nebo blikací mód.A_ALTCHARSET Alternativní character set.A_CHARTEXT Bitová maska k extrakci znaku.COLOR_PAIR(n) Color-pair číslo n.
ncurses – atributy (attributes) • Funkce pro změnu atribut: • intattroff(intattrs); • intwattroff(WINDOW *win, intattrs);Funkce které odeberou globální atributy attrs z okna win (nebo stdscr). • intattron(intattrs); • intwattron(WINDOW *win, intattrs);Funkce které přidají globální atributy attrs do okna win (nebo stdscr). • intattrset(intattrs); • intwattrset(WINDOW *win, intattrs);Funkce které nastaví globální atributy attrs okna win (nebo stdscr).
ncurses – atributy (attributes) • Používání barev:Do atributy můžeme také přidat kombinaci barvy textu a pozadí(jestli chceme používat barvy, musíme to dát najevo, hned na začátku je popis k funkcím has_colors() a start_color() ).Poté, co jsme zavolali funkci start_color(), je vytvořena množina barev a barevných párů (color pairs), kterou můžem použít a změnit. Počet barev a párů barev k dispozici je uložen v globálních proměnných COLORS a COLOR_PAIRS. K využití předdefinovaných párů můžeme využít makro COLOR_PAIR(n), kde n musí být menší než COLOR_PAIRS. • Po vykonání funkce start_color() je nastavených 8 barev:COLOR_BLACK černáCOLOR_RED červenáCOLOR_GREEN zelenáCOLOR_YELLOW žlutáCOLOR_BLUE modráCOLOR_MAGENTA purpurováCOLOR_CYAN tyrkysováCOLOR_WHITE bílá
ncurses – atributy (attributes) • Barevné funkce: • boolhas_colors(void);Zeptá se terminálu, jestli je barevný...? Funkce vrací nenulovou hodnotu, jestli ano. • intstart_color(void);Oznámí používání barev. Tato funkce sama o sobě inicializuje barvy COLOR_xxx. • boolcan_change_color(void);Zeptá se terminálu, zda můžem změnit základní barvy? Vrací nenulovou hodnotu, jestli ano. • intinit_pair(shortpair, shortf, shortb);Nastavý barevný pár pair na barvu popředí f a pozadí b. • intinit_color(shortcolor, shortr, shortg, shortb);Nastaví barevné složky r,g,b barvy color. • intcolor_content(shortcolor, short *r, short *g, short *b);Vrátí barevné složky barvy color. • intpair_content(shortpair, short *f, short *b);Vrátí popředí (f) a pozadí (b) barevného páru pair.
ncurses – atributy (attributes) • Jak na to...?Ukázali jsme si funkce a typy pro změnu barev a atribut, ale jak docílit, že se znak zobrazí tak jak chceme...? Jednoduše, při zadávání textu nebo znaku můžeme ORovat styly a barvy, malý příklad:addch(win, 'X' | A_UNDERLINE | COLOR_PAIR(3)); • NCurses nabízí funkce, které umožňují psát text (řetězec) v atributách: • intaddchstr(const chtype *chstr); • intwaddchstr(WINDOW *win, const chtype *chstr); • intmvaddchstr(inty, intx, const chtype *chstr); • intmvwaddchstr(WINDOW *win, inty, intx, const chtype *chstr);Funkce, které vypíší řetězec chstr typu chtype* ukončený (chtype)0 do okna win (nebo stdscr). • intaddchnstr(const chtype *chstr, intn); • intwaddchnstr(WINDOW *win, const chtype *chstr, intn); • intmvaddchnstr(inty, intx, const chtype *chstr, intn); • intmvwaddchnstr(WINDOW *win, inty, intx, const chtype *chstr,intn); • Funkce, které vypíší n znaků řetězce chstr typu chtype* do okna win (nebo stdscr).
ncurses – tabulka grafických znaků • Knihovna NCurses definuje některé grafické znaky:Už jsme se setkali s funkcí box(), border() nebo hline(), když chceme nakreslit například rámeček nebo čáru. Abychom to měli co nejsnadnější, tak nám knihovna NCurses nabízí předdefinované konstanty různých grafických symbolů (čáry a různé ASCII znaky) • ACS_BLOCK solid square block • ACS_BOARD board of squares • ACS_BTEE bottom tee • ACS_BULLET bullet • ACS_CKBOARD checker board (stipple) • ACS_DARROW arrow pointing down • ACS_DEGREE degree symbol • ACS_DIAMOND diamond • ACS_GEQUAL greater-than-or-equal-to • ACS_HLINE horizontal line • ACS_LANTERN lantern symbol • ACS_LARROW arrow pointing left • ACS_LEQUAL less-than-or-equal-to • ACS_LLCORNER lower left-hand corner • ACS_LRCORNER lower right-hand corner • ACS_LTEE left tee
ncurses – tabulka grafických znaků • Knihovna NCurses definuje některé grafické znaky:Už jsme se setkali s funkcí box(), border() nebo hline(), když chceme nakreslit například rámeček nebo čáru. Abychom to měli co nejsnadnější, tak nám knihovna NCurses nabízí předdefinované konstanty různých grafických symbolů (čáry a různé ASCII znaky) • ACS_NEQUAL not-equal • ACS_PI greek pi • ACS_PLMINUS plus/minus • ACS_PLUS plus • ACS_RARROW arrow pointing right • ACS_RTEE right tee • ACS_S1 scan line 1 • ACS_S3 scan line 3 • ACS_S7 scan line 7 • ACS_S9 scan line 9 • ACS_STERLING pound-sterling symbol • ACS_TTEE top tee • ACS_UARROW arrow pointing up • ACS_ULCORNER upper left-hand corner • ACS_URCORNER upper right-hand corner • ACS_VLINE vertical line
ncurses – příklad 1 • Pojďme si shrnout vše co jsme se naučili do krátkých příkladů, zavádějící a ukončovací kód programu vynechávám, zůstávají akorát vnitřekí:/* nakresli rámeček v hlavním okně /wattrset(stdscr, COLOR_PAIR(2)); wborder(stdscr, ACS_VLINE, ACS_VLINE,ACS_HLINE, ACS_HLINE,ACS_ULCORNER, ACS_URCORNER,ACS_LLCORNER, ACS_LRCORNER);/* vytvoř podokno okna stdwin (pozice 1, 1) */WINDOW *win = subwin(stdscr, getmaxy(stdscr)-2,getmaxx(stdscr)-2, 1, 1);/* nastav atributu nově vytvořeného okna na barevný pár 0 */wattrset(win, COLOR_PAIR(0));wprintw(win, "maxx=%d\n", getmaxx(stdscr)); /* něco */wprintw(win, "maxy=%d\n", getmaxy(stdscr)); /* vypiš */wprintw(win, "COLORS=%d\n", COLORS);wprintw(win, "COLOR_PAIRS=%d\n", COLOR_PAIRS);/* všimněme si že se kurzor neposune při volání whline() */whline(win, ACS_HLINE | COLOR_PAIR(3), getmaxx(win));wrefresh(stdscr); /* aktualizuj hlavní okno */wrefresh(win); /* aktualizuj podokno win */
ncurses – příklad 2 • chtypechstr[] = {'J' | A_NORMAL | COLOR_PAIR(1),'E' | A_STANDOUT,'D' | A_UNDERLINE,'N' | A_REVERSE,'O' | A_BLINK,'D' | A_DIM,'U' | A_BOLD,'C' | A_PROTECT,'H' | A_INVIS,'Y',' ', 'T', 'e', 'x', 't', ' ', ACS_PI, 0};/* vykresli řetězec typu chtype* */addchstr(chstr);/* aktualizuj screen */refresh();
ncurses – vychytávka pro X Window System • Protože terminál může běžet v okně a uživatel ho může kdykoliv roztáhnout nebo smrštit, je nutné aplikaci umožnit zachytávat událostí o změně velikosti terminálu. Jde o signál SIGWINCH. Jediné co je třeba je nastavit handler a to je vše. • Příklad:#include <signal.h>void* resizeHandler(int sig);intmain(intargc, char *argv[]){...signal(SIGWINCH, resizeHandler);...}void* resizeHandler(intsig){intnh, nw;getmaxyx(stdscr, nh, nw); /* get the new screen size */...}
ncurses – ukázky aplikací běžící pod ncurses (alsamixer)
ncurses – závěr • ncurses toho umí daleko víc, ale to by se sem asi všechno nevešlo.Krátký souhrn toho, co zde chybí: • Tvorba gui (menu, panels, forms, ...)#include <panel.h>#include <menu.h>#include <form.h> • Obsluha myši (je řešena pomocí zvláštní pseudoklávesy, která se získá funkcí getch(); ) • Nejsou zde popsány úplně všechny funkce, které umožňuje knihovna ncurses. • Vypracoval:Petr Kobalíček (e666e@users.sf.net)14.3.2005 Zlín