04 Rutinas de teclado



Si quiere detectar múltiples presiones de teclas a la vez, las rutinas de teclado de la BIOS son inútiles. Allegro puede reemplazarlas con su propio controlador de teclado, que incluye un sistema de entrada con buffer y un conjunto de biestables que almacenan el estado de cada tecla. Tenga en cuenta que no es posible detectar correctamente cualquier combinación de teclas debido al diseño del teclado del PC. Hasta dos o tres teclas a la vez funcionarán bien, pero si pulsa más de esas, las extras probablemente serán ignoradas (la combinación exacta de teclas pulsadas varía de un teclado a otro).

int install_keyboard();
Instala el controlador de interrupciones del teclado de Allegro. Debe llamar esto antes de cualquier otra función de teclado. Una vez instalado el controlador de Allegro, no podrá usar las llamadas del DOS/BIOS o de la biblioteca C para acceder al teclado.

void remove_keyboard();
Desinstala el controlador de teclado devolviendo el control a la BIOS. Normalmente no necesita llamar esta función, porque allegro_exit() lo hará por usted.

void install_keyboard_hooks(int (*keypressed)(), int (*readkey)());
Sólo debería usar esta función si *no* va a usar el resto del controlador de teclado. Debe ser llamada en vez de install_keyboard(), y le deja usar rutinas callback para detectar y leer pulsaciones de teclado, que pueden ser usadas por las funciones principales keypressed() y readkey(). Esto puede ser útil si quiere usar el código GUI de Allegro junto con un controlador de teclado propio, ya que permite al GUI acceder a la entrada de teclado desde su código. Si quiere usar las rutinas de teclado de la BIOS, la función _bios_keybrd(_KEYBRD_READ) devuelve pulsaciones de teclado en el formato correcto.

extern volatile char key[128];
Array de biestables indicando el estado de cada tecla, ordenadas por scancodes. Los scancodes están definidos en allegro.h como una serie de constantes KEY_*. Por ejemplo podrías escribir:

      if (key[KEY_SPACE])
         printf("La barra espaciadora está siendo pulsada\n");

Cada uno de estos valores es realmente un campo de bits conteniendo uno o ambos biestables KB_NORMAL y KB_EXTENDED, permitiéndole determinar qué tecla está siento pulsada incluso cuando hay dos con el mismo scancode. Por ejemplo podría escribir:

      if (key[KEY_ENTER] & KB_NORMAL)
         printf("Enter (al lado del shift) está siendo pulsado\n");

if (key[KEY_ENTER] & KB_EXTENDED) printf("Enter (del teclado numérico) está siendo pulsado\n");

extern volatile int key_shifts;
Campo de bits conteniendo el estado actual de shift/ctrl/alt, las teclas especiales de Windows, y los caracteres de escape de los acentos. Puede contener cualquiera de los siguientes biestables:

KB_SHIFT_FLAG
KB_CTRL_FLAG
KB_ALT_FLAG
KB_LWIN_FLAG
KB_RWIN_FLAG
KB_MENU_FLAG
KB_SCROLOCK_FLAG
KB_NUMLOCK_FLAG
KB_CAPSLOCK_FLAG
KB_INALTSEQ_FLAG
KB_ACCENT1_FLAG
KB_ACCENT1_S_FLAG
KB_ACCENT2_FLAG
KB_ACCENT2_S_FLAG

int keypressed();
Devuelve TRUE si hay teclas esperando en el buffer de entrada. Esto es equivalente a la función kbhit() de la biblioteca libc.

int readkey();
Devuelve el siguiente caracter del buffer del teclado. Si el buffer está vacío, espera hasta que una tecla sea pulsada. El byte bajo del valor devuelto contiene el código ASCII de la tecla, y el byte alto el scancode. El scancode sigue siendo el mismo a pesar del estado de las teclas shift, ctrl y alt. El código ASCII es afectado por shift y ctrl de la forma usual (shift hace mayúsculas, ctrl+letra da la posición de la letra en el alfabeto, ej: ctrl+A = 1, ctrl+B = 2, etc). Pulsando alt+tecla devuelve sólo el scancode, con el código ASCII cero en el byte bajo. Ejemplo:

      if ((readkey() & 0xff) == 'd')         // por código ASCII
         printf("Has pulsado 'd'\n");

if ((readkey() >> 8) == KEY_SPACE) // por código scancode printf("Has pulsado Espacio\n");

if ((readkey() & 0xff) == 3) // ctrl+letter printf("Has pulsado Control+C\n");

if (readkey() == (KEY_X << 8)) // alt+letter printf("Has pulsado Alt+X\n");

void simulate_keypress(int key);
Introduce una tecla en el buffer del teclado, como si el usuario la hubiese pulsado. El parámetro va en el mismo formato que el devuelto por readkey().

extern int (*keyboard_callback)(int key);
Si se activa, esta función es será llamada por el controlador del teclado en respuesta a cualquier tecla. Se le pasará una copia del valor que se va a añadir al buffer de entrada, y la función puede devolver este valor sin modificar, devolver cero, lo que hace que la tecla sea ignorada, o devolver un valor modificado que cambiará lo que readkey() va a devolver después. Esta rutina se ejecuta en contexto de interrupción, por lo que debe ser fijada (locked) en memoria.

extern void (*keyboard_lowlevel_callback)(int key);
Si se activa, esta función es será llamada por el controlador del teclado en respuesta a cualquier evento del teclado, tanto al pulsar como al soltar una tecla. Se le pasará un byte de scancode puro, con el bit alto activado si la tecla ha sido pulsada o desactivado si ha sido soltada. Esta rutina se ejecuta en contexto de interrupción, por lo que debe ser fijada (locked) en memoria.

void set_leds(int leds);
Modifica el estado de los indicadores LED del teclado. El parámetro es una máscara de bits conteniendo cualquiera de los valores KB_SCROLOCK_FLAG, KB_NUMLOCK_FLAG, y KB_CAPSLOCK_FLAG, o -1 para recuperar el comportamiento normal.

void clear_keybuf();
Vacía el buffer del teclado.

extern int three_finger_flag;
El controlador de teclado de Allegro tiene una secuencia de 'salida de emergencia' que puede usar para salir de su programa. Si está corriendo bajo DOS, será la combinación de tres dedos ctr+alt+del. La mayoría de sistemas operativos multitarea capturarán esta combinación antes de que llegue al controlador de teclado, en cuyo caso puede usar la combinación alternativa ctrl+alt+fin. Si quiere desactivar este comportamiento en su programa, ajuste este biestable a FALSE.

extern int key_led_flag;
Por defecto las teclas BloqMayús, BloqNum, BloqDesp activan los LEDS del teclado cuando son presionadas. Si las quiere usar con su juego (ej. BloqMayús para disparar) este comportamiento no es deseable, por lo que puede limpiar este biestable para evitar que los LEDS sean actualizados.

extern int switch_standard_kb_key;
extern int switch_standard_kb_flags;
extern int switch_custom_kb_key;
extern int switch_custom_kb_flags;
Combinación de scancode y biestable shift usado para cambiar el mapa de teclado personalizado por el estándar. Por defecto, pulsando ctrl+alt+F1 seleccionará el mapa de teclado americano, mientras que ctrl+alt+F2 selecciona el mapa de teclado personalizado. Estos valores permiten alterar la combinación de teclas para realizar el cambio, o puede ajustarlos a cero para evitarlo.

void set_standard_keyboard();
Fuerza a Allegro a usar el mapa de teclado estándar americano, ignorando el mapa de teclado personalizado que está actualmente en uso.

void set_custom_keyboard();
Fuerza a Allegro a usar el mapa de teclado personalizado, invirtiéndo el efecto de las llamadas previas a set_standard_keyboard().




Volver al Indice