1 / 34

ncurses – úvod

ncurses – úvod.

zeki
Télécharger la présentation

ncurses – úvod

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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) */

  3. 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() */

  4. 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().

  5. 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ě.

  6. 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().

  7. 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é!

  8. 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)

  9. 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.

  10. 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á.

  11. 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(?).

  12. 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)

  13. 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

  14. 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);

  15. 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.

  16. 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.

  17. 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.

  18. 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)!!!

  19. 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.

  20. 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).

  21. 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á

  22. 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.

  23. 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).

  24. 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

  25. 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

  26. 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 */

  27. ncurses – příklad 1 (výsledek)

  28. 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();

  29. ncurses – příklad 2 (výsledek)

  30. 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 */...}

  31. ncurses – ukázky aplikací běžící pod ncurses (alsamixer)

  32. ncurses – ukázky aplikací běžící pod ncurses (mc)

  33. ncurses – hořící terminál (aafire, využití knihovny aalib)

  34. 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

More Related