Comment lire la position de clic de souris de bas niveau dans Linux.
Je suis en utilisant ce code à lire les événements de souris à partir de la dev/input/événement* sous 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;
}
Il me donne les résultats dans le format :
temps 1342517261.840285 de type 2 code valeur 0 -1
"temps" est le timestamp, il renvoie l'heure à laquelle l'événement s'est produit.
code est le code d'événement, par exemple REL_X ou KEY_BACKSPACE, complet
la liste est dans include/linux/entrée.h.
"valeur" est la valeur de l'événement porte. Soit une variation relative de
EV_REL, absolue de la valeur pour EV_ABS (manettes ...), ou 0 pour EV_KEY pour
version, 1 pour keypress et 2 pour autorepeat.
quand je clique , je reçois à l'événement, mais je ne comprends pas la position de la souris sur l'écran , ce qui est le moyen d'obtenir la position de la souris sur l'écran .
Edit 1:il s'avère que je dois utiliser les coordonnées relatives à obtenir de la souris coordonnées .Je crois que c'est une exigence courante, donc il y aura peut être des bibliothèques/pré-code existant que vous pouvez utiliser pour obtenir les coordonnées. Toute info sur ce sujet sera très utile .
Edit2 : SOLUTION
#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 semble plus commode solution . Merci , @perreal pour l'orientation .
source d'informationauteur rajat
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir la position initiale de X11, et utiliser les coordonnées relatives à suivre le pointeur:
Une souris envoie uniquement un mouvement relatif, pas absolu de position. Vous devez garder une trace de vous-même, et lorsque vous recevez un bouton de souris événement que vous devez vérifier avec votre propre coordonnées de la position.