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