Raw mód se od klasického liší zásadním způsobem, nepracujeme zde totiž se znaky, které reprezentují jednotlivé klávesy, ale přímo s kódy kláves. To se hodí hlavně ve hrách a v multimediálních programech.
Všechny funkce pracující s klávesnicí v raw módu jsou definovány v hlavičkovém souboru vgakeyboard.h.
Toť vše pro začátek a vrhněme se nyní na ony slíbené funkce.
int keyboard_init(void); int keyboard_init_retrun_fd(void); void keyboard_close(void);
Tyto funkce mají stejný význam jako u myší, mají za úkol inicializovat klávesnici v raw módu. Funkce s return_fd vrací deskriptor souboru klávesnice, funkce bez této přípony pak vrací 0, pokud uspěla. Obě pak vrací –1 v případě neúspěchu.
Klávesnici vrátíte do normálního módu voláním funkce keyboard_close.
int keyboard_update(void); void keyboard_waitforupdate(void);
unkce zjišťují, zda se udály některé změny v interních bufferech a změní potřebné proměnné. Funkce keyboard_waitforupdate navíc zablokuje program, dokud potřebná událost nenastane. keyboard_update vrací 0, pokud nejsou v bufferu žádné změny, jinak vrací nenulovou hodnotu.
Dále existuje ještě funkce vga_waitevent, která čeká na jakýkoliv podnět, ať už se jedná o klávesnici, myš, joystick atd.
void keyboard_translatekeys(int mask);
Tato funkce nastaví různé příznaky, které kontrolují, jak mají být mapovány různé kódy kláves. V podstatě funkce říká knihovně např. něco ve smyslu: „Ať se kurzorové klávesy na číselné klávesnici hlásí jako klasické ‚šipky‘!“ atp.
mask musí být logický součet těchto integerů:
- TRANSLATE_CURSOKREYS
- Překládá kódy kurzorových kláves na číselné klávesnici na klasické kurzorové klávesy.
- TRANSLATE_DIAGONAL
- Překládá kódy uhlopříčkových kurzorových kláves(7, 9, 1, 3) na stisk dvou běžných kurzorových kláves. Například, místo vrácení stisku SCANCODE_CURSORUPRIGHT bude vrácena simulace stisku SCANCODE_CURSORUP a SCANCODE_CURSORRIGHT.
- TRANSLATE_KEYPADENTER
- Kód klávesy enter na numerické klávesnici je mapován na obvyklý enter. Bude tedy vracena hodnota SCANCODE_ENTER(kl. enter) pokud byl stisknut enter na numerické klávesnici nebo na znakové klávesnici.
- DONT_CATCH_CTRLC
- Stisknutí Ctrl-C nemá žádný vliv na běh procesu (není vyslán signál SIGINT).
int keyboard_keypressed(int scancode);
Zjišťuje, zda byla stisknuta klávesa s kódem scancode a vrací KEY_PRESSED(1) a KEY_NOTPRESSED(0).
Nesmíte však zapomenout pravidelně volat funkci keyboard_update (nebo keyboard_waitforupdate), aby byly v proměnných knihovny aktuální informace.
Názvy jednotlivých kódů kláves jsou uvedeny v vgakeyboard.h. Jsou použity názvy běžné u amerických klávesnic. Všechna jména konstant začínají SCANCODE_ a jméno je uvedeno potom. Např. klávesa Backslash bude mít konstantu SCANCODE_BACKSLASH.
Zde je přechled některých jmen kláves (myslím, že jsou dosti výstižné a že nebudou potřebovat další komentář).
- SCANCODE0 – SCANCODE9
- SCANCODE_KEYPAD0 – SCANCODE_KEYPAD9
- SCANCODE_A – SCANCODE_Z
- SCANCODE_F1 – SCANCODE_F12
Některé z následujících nejsou zase tak samovýstižné, ale věřím, že si poradíte :o): ESCAPE, MINUS, EQUAL, BACKSPACE, TAB, BRACKET_LEFT, BRACKET_RIGHT, ENTER, LEFTCONTROL, SEMICOLON, APOSTROPHE, GRAVE, LEFTSHIFT, BACKSLASH, COMMA, PERIOD, SLASH, RIGHTSHIFT, KEYPADMULTIPLY, LEFTALT, SPACE, CAPSLOCK, NUMLOCK, SCROLLLOCK, CURSORUPLEFT, CURSORUP, CURSORUPRIGHT, KEYPADMINUS, CURSORLEFT, CURSORRIGHT, KEY-PADPLUS, CURSORDOWNLEFT, CURSORDOWN, CURSORDOWNRIGHT, KEY-PADPERIOD, LESS, KEYPADENTER, RIGHTCONTROL, CONTROL, KEY-PADDIVIDE, PRINTSCREEN, RIGHTALT, BREAK, BREAK_ALTERNA-TIVE, HOME, CURSORBLOCKUP, PAGEUP, CURSORBLOCKLEFT, CUR-SORBLOCKRIGHT, END, CURSORBLOCKDOWN, PAGEDOWN, INSERT a REMOVE.
char *keyboard_getstate(void);
Vrací ukazatel na jednorozměrné pole, do kterého se uloží stav všech kláves. Tyto stavy mohou nabývat pouze dvou hodnot, a to 1)KEY_PRESSED, 2)KEY_NOPRESSED.
Jako indexy pole používejte jména kódů jednotlivých kláves. A jako výše uvedená funkce musíte volat keyboard_update a keyboard_waitforupdate.
To je pro dnešek vše, v příštím dílu si doděláme raw mód.