Hlavní navigace

SVGAlib: práce s klávesnicí v raw módu

Jakub Matys

V dnešním dílu se podíváme na práci s klávesnicí v raw módu.

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_wait­forupdate 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_CUR­SOKREYS
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_CURSO­RUPRIGHT bude vrácena simulace stisku SCANCODE_CURSORUP a SCANCODE_CURSOR­RIGHT.
TRANSLATE_KEY­PADENTER
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_wait­forupdate), 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_wait­forupdate.

To je pro dnešek vše, v příštím dílu si doděláme raw mód.

Našli jste v článku chybu?