int vga_getch(void);
Čeká na stisk klávesy stejně jako getchar. Pro neblokující čtení z klávesnice požijte vga_getkey nebo vga_waitevent.
int vga_getkey(void);
Přečte znak z klávesnice, aniž by čekal na stisk klávesy. Vrací nulu, pokud nebyl znak zadán, jinak vrací ASCII kód. Tato funkce nesmí být použita v raw módu.
int vga_waitevent(int which, fd_set *input, fd_set *output, struct timeval *timeout);
Pro tuto funkci je nutné vložit do vašeho kódu tyto hlavičkové soubory: sys/time.h, sys/tipes.h, unistd.h a vga.h. Tato funkce se používá na odchytávání událostí klávesnice nebo myši. Je postavena na knihovní funkci select(2) – doporučuji si přečíst dokumentaci pro hlubší porozumění vga_waitevent.
which může být 0 nebo kombinace (bitový součin) hodnot VGA_MOUSEEVENT a VGA_KEYEVENT. Pokud se zajímáte o čekání na deskriptory souborů určených pro vstup nebo pro nový výstup dat (+např. sokety), nastavte odpovídající bity do struktury fd_set(viz select). Pokud chctete používat časový limit pro návrat z vga_waitevent, nastavte strukturu struct timeval na požadovanou hodnotu. Jestliže se nezajímáte o žádné události, nastavte všechny ukazatele na NULL.
Pokud je timeout nastaven na NULL, funkce nebude používat časový limit, ale zablokuje se, dokud nenarazí na nějakou událost.
Pokud je vrácený integer < 0, byla vrácena chyba. Zpřístupněte globální proměnnou errno pro více informací. Pokud je hodnota >= 0, je možno zachytávat události z klávesnice či myši. Pokud nastane jedna z těchto dvou situací, jsou uvedeny do „provozu“ příslušné obnovovací funkce.
Co se týče výkonu není v podstatě rozdíl mezi raw a non-raw módem. Nesmíte také zapomenout používat pro čtení z klávesnice vga_getch místo vga_getkey.
Příklad: Jestliže chcete čekat v blokujícím módu na stisk klávesy nebo podnět myši, použijte:
vga_waitevent(VGA_MOUSEEVENT | VGA_KEYEVENT, NULL, NULL, NULL, NULL);
Pokud chcete čekat, ale v neblokujícím módu:
#include <sys/time.h>
#include <sys/type.h>
#include <unistd.h>
#include <vga.h>
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
vga_waitevent(VGA_MOUSEEVENT | VGA_KEYEVENT, NULL, NULL, NULL, &timeout);
Další kouzla jdou provádět také pomocí následujících funkcí.
int mouse_update(void);
Pro použití této funkce musíte includovat soubor vgamouse.h. Funkce čte události myši ze vstupního bufferu a aktualizuje interní proměnné knihovny, které shromažďují informace jako pozice myši, stav tlačítek… Funkce vračí 0, pokud nejsou žádné události, jinak vrací nenulovou hodnotu.
int keyboard_update(void);
void keyboard_waitforupdate(void);
Také pro tyto funkce musíte připojit na začáte vašeho kódu hlavičkový soubor, a to vgakeyboard.h.
Tyto rutiny kontrolují buffer klávesnice, o klávesnici si více povíme v příštím dílu. Pokude nejsou události, keyboard_update vrací 0 (jinak nenulovou hodnotu) a naproti tomu keyboard_waitforupdate blokuje volající funkci, dokud nezjistí požadovanou událost.
To by bylo ke vstupům a nyní se podíváme na operace s grafickou pamětí.
void vga_setpage(int page);
Většina SVGA karet má více než 64 KB paměti, která je však dostačující pro použití běžného VGA. Velikost paměti mapované funkcí vga_getgraphmem je pouze oněch 64 KB. vga_setpage vybere page-tý pamětový chunk (64 KB), který je posléze viditelný funkcí vga_getgraphmem.
void vga_setreadpage(int page);
void vga_setwritepage(int page);
Umožňuje různým paměťovým chunkům být modifikovaný čtením/zápisem do tohoto paměťového prostoru. To je velmi užitečná vlastnost pro kopírování obrazovky bod po bodu. Avšak pozor! Tato možnost není přístupná ve všech módech.
unsigned char graph_mem */Tato deklarace je už v vga.h/
unsigned char *vga_getgraphmem(void);
Vrací pointer na 64KB frame buffer. vga_setpage, vga_setreadpage a vga_setwritepage umožnují nastavit, která stránka paměti bude ukazovat tuto pozici. vga_setlinearaddressing mapuje celou VGA pamět v prostoru (musí být podporováno HW). V tomto módu vrací funkce lokaci tohoto prostoru. Můžete také přistupovat k globální proměnnégraph_mem.
To by bylo pro dnešek vše, v příštím dílu doděláme obsluhu grafické paměti a probereme si barevné palety.