Menu Content/Inhalt
Google
 
Start arrow Tutorial
Tutorial
TUTORIALES Print E-mail
tutoriales Los diferentes  tutoriales que se publican muestran las diferentes tecnicas utilizadas en ventana3d.

 
Tutorial 2 Print E-mail
tutorial2
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.

 
More...