SVGAlib: klávesnice, myš a grafická pamět

24. 9. 2004
Doba čtení: 3 minuty

Sdílet

V dnešním dílu si řekneme něco o vstupu z klávesnice, myši a o přístupu do grafické paměti.

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_upda­te(void);

void keyboard_wait­forupdate(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_wait­forupdate 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_setwritepa­ge(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.

ict ve školství 24

unsigned char graph_mem */Tato deklarace je už v vga.h/

unsigned char *vga_getgraphmem(vo­id);

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_setlinearad­dressing 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.