key_event.lib
#ifndef __KEY_EVENT_LIB
#define __KEY_EVENT_LIB
import "mod_key";
import "mod_proc";
global
_key_use = 0;
_key_state[127][1];
end
#define _key_pressed 0
#define _key_down 1
#define _key_up 2
global
int _key_event_exit = 0;
end
process _key_init()
private
i;
pid;
begin
signal_action( s_kill, s_ign );
signal( type _key_init, s_kill );
signal_action( s_kill, s_dfl );
priority = 999999;
loop
_key_use ^= 1;
for ( i = 0; i < 127; i++ )
_key_state[ i ][ _key_use ] = key( i );
end
frame;
end
onexit:
if ( !_key_event_exit ) _key_init(); end
end
function _key_exit()
begin
_key_event_exit = 1;
signal( type _key_init, s_kill );
end
#define _key(k,ev) ((ev==_key_down)?( _key_state[ k ][ _key_use ] && !_key_state[ k ][ _key_use ^ 1 ] ): \
(ev==_key_up )?( !_key_state[ k ][ _key_use ] && _key_state[ k ][ _key_use ^ 1 ] ): \
( _key_state[ k ][ _key_use ]))
#endif
key_event_test.prg
import "mod_video";
import "mod_text";
#include "key_event.lib";
private
a,b,c;
begin
_key_init();
write_int(0,0,0,0,&a);
write_int(0,0,10,0,&b);
write_int(0,0,20,0,&c);
while( !_key( _ESC, _key_pressed ) )
a = _key( _5, _key_down );
b = _key( _5, _key_up );
c = _key( _5, _key_pressed );
frame;
end
_key_exit();
end
Solo necesita usarlo, como se usa en el ejemplo "key_event_test.prg".
el ejemplo detecta los eventos de la tecla _5 y de _ESC para salir.
es importante hacer _key_init(); para iniciar el modulo, y _key_exit(); para finalizarlo.
nota adicional: el controlador funciona en prioridad 1000 999999, si alguien usara _key en alguna funcion con prioridad superior, debe modificar la prioridad del controlador en el fuente key_event.lib y ponerle un valor mas alto.
se cambia a prioridad a 999999, se toma la sugerencia de windgate de usar onexit para evitar tener que cargarla cada vez que se hace un let_me_alone, y para eso se modifican algunas cosas internamente.