Eventos
Last updated
Last updated
Los eventos son la base para escribir aplicaciones interactivas en MiniLibX. Todos los hooks en MiniLibX no son mΓ‘s que una funciΓ³n que se llama cada vez que se dispara un evento. Dominar todos estos eventos no serΓ‘ necesario, sin embargo, repasaremos rΓ‘pidamente cada uno de los eventos de X11.
Tanto X-Window como MacOSX son sistemas grΓ‘ficos bidireccionales. Por un lado, el programa envΓa Γ³rdenes a la pantalla para mostrar pΓxeles, imΓ‘genes, etc. Por otro lado, puede obtener informaciΓ³n del teclado y del ratΓ³n asociada a la pantalla. Para ello, el programa recibe "eventos" del teclado o del ratΓ³n.
X11 es la biblioteca que se utiliza junto a MiniLibX. Por lo tanto, no es un secreto que esta cabecera es muy ΓΊtil para encontrar todos los eventos correspondientes de MiniLibX. Para poder utilizar estos eventos y mascaras es necesaria la siguiente libreria:
En MacOS - Cocoa (AppKit) y OpenGL - versiΓ³n, minilibx tiene soporte parcial de eventos X11 y no soporta la mΓ‘scara X11 (el argumento x_mask de mlx_hook es inΓΊtil, mantΓ©ngalo en 0).
Hay una serie de eventos que se pueden describir.
Cada evento X11, tambiΓ©n tiene una mΓ‘scara correspondiente. De este modo, puedes registrar sΓ³lo una tecla cuando se dispara, o todas las teclas si dejas tu mΓ‘scara por defecto. Las mΓ‘scaras de teclas, por lo tanto, le permiten poner en una lista blanca o negra los eventos de sus suscripciones a eventos. Se permiten las siguientes mΓ‘scaras:
Todo accion realizada a traves del teclado o el mouse tiene un numero de referencia, de esta manera mediante los eventos que nos facilita MiniLibX podremos saber en todo momento que informacion no esta enviando el usuario de nuestro programa. Para asi si lo deseasmos estabelcerle a ciertas acciones una funcion o accion corespondiente.
La key codes del teclado de mac son las siguientes:
Para que podamos registrar eventos, el minilibx nos proporciona un conjunto de funciones llamadas hooks que podremos utilizar para registrar eventos antes de que se llame a mlx_loop
. Esta funcion deja el programa en un bucle infinito, para asi poder recibir los datos de entrada a traves del teclado y asi ejecutar las funciones correspodientes.
El estar a la escucha de eventos es una de las herramientas mΓ‘s potentes que proporciona MiniLibX. Permite registrarse a cualquiera de los eventos mencionados con la llamada de una simple funciΓ³n de registro de eventos.
Para ello, llamamos a la funciΓ³n mlx_hook.
Alguna versiΓ³n de mlbx no implementa x_mask y sea cual sea el valor no habrΓ‘ mΓ‘scara.
Las funciones de evento tienen un prototipo diferente dependiendo del evento de enganche.
El prototipo hacer referencia al prototipo de la funcion que le pasamos como parametro ( int *f() ) a mlx_hook o a cualquiera de sus alias.
Para facilitar el trabajo Minilibx tiene algunas funciones que realizan el mismo trabajo que mlx_hook
con ciertos parametros:
mlx_expose_hook
Una parte de la ventana debe ser redibujada (esto se llama un evento de "exposiciΓ³n", y es su programa manejarlo). Evento (12
).
mlx_key_hook
Una tecla es presionada. Evento (3
).
mlx_mouse_hook
Se pulsa el botΓ³n del ratΓ³n. Evento (4
)
mlx_key_hook
registra cada tecla que pulsemos y enviara como parametros a la funcion que le hayamos especifciado *funct_ptr)()
el numero correspondiente de cada tecla. Para poder acceder a este valor lo haremos mediante el argumento keycode
de la fucnion *fuct_ptr()
.
mlx_key_hook se acciona al soltar la tecla pulsada, mientras este pulsada no se activara el evento.
Este es uno entre los dos argumentos que tendremos que declarar a la funcion que utilicemos para pasar como parametro a mlx_key_hook
. El otro es void *param
que sirve para pasar como parametro la estrcutura que hayameos creado para guardar las vairables de mlx. Este parametro luego habra que castearlo.
Con respecto a los eventos de raton cada accion qque podenmos ralizar con el raton tambien tiene un numero asginado:
Keycode del ratΓ³n para MacOS:
Left click: 1
Right click: 2
Middle click: 3
Scroll up: 4
Scroll down : 5
Esta funcion escribira en pantalla el keycode de cada teclas pulsada por el usuario en el a traves del teclado.
Key | Event | Key | Event | Key | Event | ||
---|---|---|---|---|---|---|---|
Mask | Description | Mask | Description | |
---|---|---|---|---|
Hooking event | code | Prototype |
---|---|---|
02
KeyPress
14
NoExpose
26
CirculateNotify
03
KeyRelease
15
VisibilityNotify
27
CirculateRequest
04
ButtonPress
16
CreateNotify
28
PropertyNotify
05
ButtonRelease
17
DestroyNotify
29
SelectionClear
06
MotionNotify
18
UnmapNotify
30
SelectionRequest
07
EnterNotify
19
MapNotify
31
SelectionNotify
08
LeaveNotify
20
MapRequest
32
ColormapNotify
09
FocusIn
21
ReparentNotify
33
ClientMessage
10
FocusOut
22
ConfigureNotify
34
MappingNotify
11
KeymapNotify
23
ConfigureRequest
35
GenericEvent
12
Expose
24
GravityNotify
36
LASTEvent
13
GraphicsExpose
25
ResizeRequest
0L
NoEventMask
(1L<<12)
Button5MotionMask
(1L<<0)
KeyPressMask
(1L<<13)
ButtonMotionMask
(1L<<1)
KeyReleaseMask
(1L<<14)
KeymapStateMask
(1L<<2)
ButtonPressMask
(1L<<15)
ExposureMask
(1L<<3)
ButtonReleaseMask
(1L<<16)
VisibilityChangeMask
(1L<<4)
EnterWindowMask
(1L<<17)
StructureNotifyMask
(1L<<5)
LeaveWindowMask
(1L<<18)
ResizeRedirectMask
(1L<<6)
PointerMotionMask
(1L<<19)
SubstructureNotifyMask
(1L<<7)
PointerMotionHintMask
(1L<<20)
SubstructureRedirectMask
(1L<<8)
Button1MotionMask
(1L<<21)
FocusChangeMask
(1L<<9)
Button2MotionMask
(1L<<22)
PropertyChangeMask
(1L<<10)
Button3MotionMask
(1L<<23)
ColormapChangeMask
(1L<<11)
Button4MotionMask
(1L<<24)
OwnerGrabButtonMask
ON_KEYDOWN
2
int (*f)(int keycode, void *param)
ON_KEYUP*
3
int (*f)(int keycode, void *param)
ON_MOUSEDOWN*
4
int (*f)(int button, int x, int y, void *param)
ON_MOUSEUP
5
int (*f)(int button, int x, int y, void *param)
ON_MOUSEMOVE
6
int (*f)(int x, int y, void *param)
ON_EXPOSE*
12
int (*f)(void *param)
ON_DESTROY
17
int (*f)(void *param)