2012-07-17 22 views
10

Estoy usando este código para leer los eventos del mouse desde el dev/input/event * en Linux.Cómo leer la posición de bajo nivel del clic del mouse en Linux.

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

#include <linux/input.h> 
#include <fcntl.h> 

#define MOUSEFILE "/dev/input/event4" 

int main() 
{ 
    int fd; 
    struct input_event ie; 

    if((fd = open(MOUSEFILE, O_RDONLY)) == -1) { 
     perror("opening device"); 
     exit(EXIT_FAILURE); 
    } 

    while(read(fd, &ie, sizeof(struct input_event))) { 
     printf("time %ld.%06ld\ttype %d\tcode %d\tvalue %d\n", 
       ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value); 

} 
    return 0; 
} 

me da los resultados en el formato:

tiempo 1342517261.840285 tipo 2 0 código valor -1

'tiempo' es la marca de tiempo, devuelve el tiempo en el cual el evento sucedió

'código' es el código del evento, por ejemplo REL_X o KEY_BACKSPACE, completa la lista está en include/linux/input.h.

'valor' es el valor que conlleva el evento. O bien un cambio relativo para EV_REL, nuevo valor absoluto para EV_ABS (joysticks ...), o 0 para EV_KEY para la liberación de , 1 para presionar teclas y 2 para repetir automáticamente.

cuando hago clic en, obtengo el evento pero no obtengo la posición del mouse en la pantalla, cuál es la manera de obtener la posición del mouse en la pantalla.


Edición 1: Así como resulta que tengo que usar las coordenadas relativas para obtener las coordenadas del ratón .I creen que esto es un requisito común por lo que podría ser bibliotecas/preexistente código que puede usar para obtener las coordenadas. Cualquier información sobre este tema será muy útil.


Edit2: SOLUCIÓN

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

#include <linux/input.h> 
#include <fcntl.h> 
#include <X11/Xlib.h> 

#define MOUSEFILE "/dev/input/event4" 

int main() 
{ 
    int fd; 
    struct input_event ie; 
    Display *dpy; 
    Window root, child; 
    int rootX, rootY, winX, winY; 
    unsigned int mask; 

    dpy = XOpenDisplay(NULL); 
    XQueryPointer(dpy,DefaultRootWindow(dpy),&root,&child, 
       &rootX,&rootY,&winX,&winY,&mask); 

    if((fd = open(MOUSEFILE, O_RDONLY)) == -1) { 
    perror("opening device"); 
    exit(EXIT_FAILURE); 
    } 

    while(read(fd, &ie, sizeof(struct input_event))) { 
    if (ie.type == 2) { 
     if (ie.code == 0) { 
      XQueryPointer(dpy,DefaultRootWindow(dpy),&root,&child, 
         &rootX,&rootY,&winX,&winY,&mask); 
      //rootX += ie.value; 
      } 
     else if (ie.code == 1) { 
      XQueryPointer(dpy,DefaultRootWindow(dpy),&root,&child, 
         &rootX,&rootY,&winX,&winY,&mask); 
     // rootY += ie.value; 
      } 
     printf("time%ld.%06ld\tx %d\ty %d\n", 
     ie.time.tv_sec, ie.time.tv_usec, rootX, rootY); 
    } else 
     printf("time %ld.%06ld\ttype %d\tcode %d\tvalue %d\n", 
      ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value); 
    } 
    return 0; 
} 

XQueryPointer parece la solución más conveniente. Gracias, @perreal por la guía.

Respuesta

5

, usted puede obtener la posición inicial de X11, y utilizar coordenadas relativas al seguimiento del puntero:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

#include <linux/input.h> 
#include <fcntl.h> 
#include <X11/Xlib.h> 

#define MOUSEFILE "/dev/input/event6" 

int main() 
{ 
    int fd; 
    struct input_event ie; 
    Display *dpy; 
    Window root, child; 
    int rootX, rootY, winX, winY; 
    unsigned int mask; 

    dpy = XOpenDisplay(NULL); 
    XQueryPointer(dpy,DefaultRootWindow(dpy),&root,&child, 
       &rootX,&rootY,&winX,&winY,&mask); 

    if((fd = open(MOUSEFILE, O_RDONLY)) == -1) { 
    perror("opening device"); 
    exit(EXIT_FAILURE); 
    } 

    while(read(fd, &ie, sizeof(struct input_event))) { 
    if (ie.type == 2) { 
     if (ie.code == 0) { rootX += ie.value; } 
     else if (ie.code == 1) { rootY += ie.value; } 
     printf("time%ld.%06ld\tx %d\ty %d\n", 
     ie.time.tv_sec, ie.time.tv_usec, rootX, rootY); 
    } else if (ie.type == 1) { 
     if (ie.code == 272) { 
     printf("Mouse button "); 
     if (ie.value == 0) 
      printf("released!!\n"); 
     if (ie.value == 1) 
      printf("pressed!!\n"); 
    } else { 
     printf("time %ld.%06ld\ttype %d\tcode %d\tvalue %d\n", 
      ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value); 
    } 
    } 
    return 0; 
} 
+0

Hola, El código parece .¡AGRADECE muy elegantes. Pero me está dando los siguientes errores: 1. 'referencia indefinida a XOpenDisplay', 2.' referencia no definida a XQueryPointer'. – rajat

+0

necesita compilar con X11 lib: 'gcc main.c -lX11'. – perreal

+0

Sí, funcionó :). Pero las coordenadas están en mal estado, el punto 0,0 está en algún punto intermedio de la pantalla. – rajat

0

Un mouse solo envía movimiento relativo, no posición absoluta. Tienes que hacer un seguimiento de ello tú mismo, y cuando recibes un evento con el botón del mouse tienes que verificar tus propias coordenadas para la posición.

Cuestiones relacionadas