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.
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
necesita compilar con X11 lib: 'gcc main.c -lX11'. – perreal
Sí, funcionó :). Pero las coordenadas están en mal estado, el punto 0,0 está en algún punto intermedio de la pantalla. – rajat