Hlavní navigace

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.

root_podpora

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.

Byl pro vás článek přínosný?