Extension Xevie : Intercepción y redireccionamiento de eventos
1. Introducción
La extensión Xevie
permite la intercepcion y redireccionamiento de los eventos
del teclado
y mouse del servidor Xorg, lo cual permite tener un control total
sobre
estos dispositivos.
2.- Funciones
Cabecera necesaria X11/extensions/Xevie.h
2.1 XevieQueryVersion: Retorna las versiones del protocolo soportado por el servidor X.
True si soporta el protocolo Xevie o False si no lo soporta.
Status XevieQueryVersion(Display *display,
int
*major_version_return,
int
*minor_version_return)
Argumentos
display Indica la coneccion al servidor X.
major_version_return Retorna la version mayor
minor_version_return Retorna la version menor
2.2 XevieStart : Habilita la extensión Xevie y permite la intercepcion de los eventos de los dispositivos teclado y mouse entre el cliente y el servidor X.
Retorna True si se realizo con éxito la función o False si no fue posible.
Status XevieStart(Display *display)
Argumentos
display Indica la coneccion al servidor X.
2.3 XevieEnd: Inhabilita la extension Xevie.
Retorna True si se realizo con exito la funcion o False si no fue posible.
Status XevieEnd(Display *display)
Argumentos
display Indica la coneccion al servidor X.
2.4 XevieSend: Envia los eventos al servidor y los redistribuye a los clientes.
Retorna True si se realizo con éxito la funcion o False si no fue posible.
Status XevieSendEvent(Display *display,
XEvent
*event,
int
event_type)
Argumentos
display Indica la coneccion al servidor X.
event Indica el evento a hacer enviado.
event_type Especifica el tipo de evento: XEVIE_MODIFIED or XEVIE_MODIFIED
2.5 XevieSelectInput: Selecciona el tipo de evento que el servidor X reportara asociados al tipo de la mascara utilizadas, por defecto los tipos de eventos reportados son KeyPress, KeyRelease,ButtonPress, ButtonRelease y MotionNotify.
Retorna True si se realizo con éxito la funcion o False si no fue posible.
Status XevieSelectInput(Display *display, long event_mask)
Argumentos
display Indica la coneccion al servidor X.
event_mask Indica el tipo de mascara utilizada.
3.- Usando la extensión Xevie
3.1 Dependencias
*Xorg-devel
*El
programa xcalc, es una calculadora que trae por defecto todas las
distribuciones de linux es parte de su instalación básica
de los paquetes Xorg.
3.2 Obtención del código
http://chileforge.cl/frs/download.php/303/Tutorial_2_Vtn3d.tar.gz
3.3 Ejecución
./configure
make
make install
xcalc &
xcalc &
tutorial2vtn3d
3.4 Uso de las teclas
Escape --- > Salida del programa
F1 --- > Modo 1
F2 --- > Modo 2
3.5 Uso de los botones del dispositivo mouse(ratón)
Boton izquierdo --> Permite el envio de los eventos presionar, levantar
Boton derecho o central --> Salida del programa.
3.6 Desarrollo
NOTA: Durante la ejecucion del programa todos los enventos del mouse son interceptados por lo tanto no se podra seleccionar ningun programa y otra accion que se realiza con el mouse, solo funcionara el programa xcalc.
Los dos programas(xcalc) deben estar visibles (no minimizados) no deben estar ocultos o detras de otros programas , preferible que solo esten en funcionamiento estos 2 programas.
El programa " tutorial2vtn3d " hace uso de la extension Xevir, captura los eventos del mouse que son redireccionados entre las dos aplicaciones xcalc que es una calculadora.
Tiene 2 modos de funcionamiento el prograna.
Modo 1: Se redirecciona los eventos solo a una aplicacion, que es seleccionada con el puntero del mouse.
Modo 2: Se redireccionan los eventos del mouse de una aplicacion a otra.
Al ejecutar el programa " tutorial2vtn3d " se relizan los siguientes pasos:
dpy = XOpenDisplay (NULL) ;
depth_X= DefaultDepth(dpy,scrnnum);
xsize=DisplayWidth(dpy,scrnnum);
ysize=DisplayHeight(dpy,scrnnum);
root = RootWindow (dpy,scrnnum);
Se abre una conexion con el servidor X, ademas se obtiene la geometria de la pantalla, el numero de colores y la ventana padre "root".
XQueryTree (dpy, root, &root_return, &parent_return, &children, &nchildren);
Es necesario saber el numero de hijos(ventanas) que derivan del padre(root) "root", la funcion XQueryTree proporciona esa informacion.
for (i = 0; i < nchildren; i++)
{/*A*/
ventanaTmp=XmuClientWindow (dpy,children[i]);/*Necesario
para tener el correcto ID de la ventana*/
if(!XGetWMName(dpy,ventanaTmp, &tp))
{
............................
............................
if(Num_Calculadoras>2)
{
printf("Error:demasiadas calculadoras (debe existir 2 xcalc en el escritorio)\n");
exit(0);
}
Se
realiza una comprobacion de los procesos xcalc, en el caso que no se
esten ejecutando muestra un error , solo deben existir 2 procesos xcalc.
Buscando_ventana();
Esta funcion permite encontrar la correcta geometria (posicion x,y,alto y ancho)de las aplicaciones xcalc.
VentanaA=CreateWindowIcon(0,0,Ancho_Ventana,Alto_Ventana);
Se crea una ventana que estara ubicada en la posicion 0,0 que ademas mostrara el estado de la redireccion de los eventos.
XevieQueryVersion(dpy, &xevie_major, &xevie_minor);
if(XevieStart(dpy))
.............................
XevieSelectInput(dpy,ButtonPressMask|ButtonReleaseMask|PointerMotionMask);
Funciones necesarias para habilitar el redireccionamiento de los eventos del mouse.
while(1)
{
Verificar_Eventos();
N_e=XPending(dpy);
while(N_e)
{
XNextEvent(dpy,&ev);
switch (ev.type)
{
case MotionNotify:
..........................
Se obtienen los diferentes eventos que provienen del servidor a las aplicaciones y viceversa.
void Verificar_Eventos()
{
Leyendo_map_key();
if(Que_Key_Es(Key_Esc)==1)
{
interruccion();
}
if(Que_Key_Es(Key_F1)==1)
{
Escribiendo_En_Ventana(Modos_1_Vtn);
ModoXevie=0;
}
if(Que_Key_Es(Key_F2)==1)
{
Escribiendo_En_Ventana(Modos_2_Vtn);
ModoXevie=1;
}
if(Raton_Press==RatonPress)
{
Buscando_Eventos_en_Ventanas(Raton_Press);
}
if(Raton_Press==RatonRelease)
{
Buscando_Eventos_en_Ventanas(Raton_Press);
Raton_Press=RatonNeutro;
}
if(Raton_Motion==RatonMotion)
{
Buscando_Eventos_en_Ventanas(Raton_Motion);
Raton_Motion=RatonNeutro;
}
}
Se verifica el tipo de evento, si es procedente del teclaco como del mouse, al presionar la tecla Escape se sale del programa, mientras tanto las teclas F1 y F2 permite cambiar el modo de redireccionamiento.
void Enviando_Eventos(Window id,int posX,int posY)
{
switch (XEvent_XeviePress.type)
{
case ButtonPress:
XEvent_XeviePress.xbutton.display=dpy;
........................
XevieSendEvent(dpy, &XEvent_XeviePress,XEVIE_UNMODIFIED);
break;
}
switch (XEvent_XevieRelease.type)
{
case ButtonRelease:
XEvent_XevieRelease.xbutton.display=dpy;
--------------------------------
XevieSendEvent(dpy, &XEvent_XevieRelease,XEVIE_UNMODIFIED);
break;
}
switch (XEvent_XevieMotion.type)
{
case MotionNotify:
XEvent_XevieMotion.xmotion.display=dpy;
------------------------------
XevieSendEvent(dpy, &XEvent_XevieMotion, XEVIE_UNMODIFIED);
break;
}
XFlush(dpy);
}
El envio de los eventos del mouse a las diferentes aplicaciones se realiza en esta funcion Enviando_Eventos(), se determina la ventana a la que va dirigido y en que coordenadas se enviaran los eventos como el de movimiento(motion), presionar y soltar el boton.
Las capturas que se muestran a continuacion permite tener una idea de como se realiza el redireccionamiento de los eventos usando la extension Xevie.

Figura 1. Programa xcalc

Figura 2. Botones del mouse(eventos, salida)

Figura 3. Teclas que se usan Esc (salida del programa) F1(Modo 1) F2(modo 2)
Figura 4.
La figura 4 permite observar la disposicion que debe de tener los 2 programas
xcalc y la ventana creada , que indica el modo de funcionamiento (Modo 1 , 2).
Nota: Primero se ejecute los dos programas xcalc, debe de posicionarlos en
la pantalla de tal forma que no esten solapados, ocultos y luego ejecute el programa tutorial2vtn3d.

Figura 5.
El
Modo 1: Indica el funcionamiento tipico donde el usuario escoge
la
aplicacion que desea usar, en este caso alguna de
las calculadoras, se
hace crick en algun boton de la calculadora y
mostara algun resultado.
Los eventos interceptados se dirigen ala
aplicacion seleccionada por el puntero.

Figura 6.
El Modo 2: Al interceptar los eventos estos son enviados a la otra aplicacion
xcalc , como indica la figura 6 los eventos del puntero son pasados de la
calculadora A a la calculadora B.
Si realiza una operacion matematica en la calculadora A, esa operacion se
realizara en la calculadora B.

Figura 7.
El
Modo 2: Al igual que en la figura 6 , en la figura 7 se muestra como
los
eventos de la calculadora B son enviados ala calculadora A.
4.- Referencias
http://ventana3d.chileforge.cl
http://keithp.com/
http://freedesktop.org/wiki/Software/XEvIE
xcalc : Esta disponible es todas las distribuciones de linux , esta presente en la instalacion basica del Xorg.