Obtenir les coordonnées de souris avec Xlib

J’aimerais savoir comment obtenir les coordonnées x et y d’un clic de souris avec Xlib n’importe où sur l’écran. J’ai trouvé ce post qui obtient la position actuelle du pointeur

Comment puis-je obtenir les coordonnées actuelles de la souris (pointeur) dans X ,

mais je ne sais pas comment le modifier pour qu’il obtienne les coordonnées xy lorsque la souris est cliquée. J’ai essayé d’écrire ce code mais il ne fait rien.

#include  #include  #include  #include  int main (){ int x=-1,y=-1; XEvent event; int button; Display *display = XOpenDisplay(NULL); if (display == NULL) { fprintf(stderr, "Cannot connect to X server!\n"); exit (EXIT_FAILURE); } Window root= XDefaultRootWindow(display); XSelectInput(display, root, ButtonReleaseMask) ; while(1){ XNextEvent(display,&event); switch(event.type){ case ButtonRelease: switch(event.xbutton.button){ case Button1: x=event.xbutton.x; y=event.xbutton.y; button=Button1; break; case Button3: x=event.xbutton.x; y=event.xbutton.y; button=Button3; break; default: break; } break; default: break; } if(x>=0 && y>=0)break; } if(button==Button1)printf("leftclick at %d %d \n",x,y); else printf("rightclick at %d %d \n",x,y); XCloseDisplay(display); return 0; } 

Les événements sont probablement envoyés à d’autres fenêtres et c’est la raison pour laquelle cela ne fonctionne pas. Un autre problème est que lorsque j’ajoute ButtonPressMask à la fonction XSelectInput, l’erreur suivante apparaît:

 X Error of failed request: BadAccess (attempt to access private resource denied) Major opcode of failed request: 2 (X_ChangeWindowAtsortingbutes) Serial number of failed request: 7 Current serial number in output stream: 7 

S’il existe un moyen plus simple de faire cela en C, je suis heureux de l’entendre.

Vous aurez probablement besoin de saisir le pointeur.

Je ne sais pas si vous voulez juste appuyer sur les boutons des communiqués. Je l’ai changé en presses, mais vous pouvez choisir les deux avec:

 XSelectInput(display, root, ButtonPressMask|ButtonReleaseMask) ; 

et ajoutez le cas ButtonRelease dans.

 #include  #include  #include  #include  int main (){ int x=-1,y=-1; XEvent event; int button; Display *display = XOpenDisplay(NULL); if (display == NULL) { fprintf(stderr, "Cannot connect to X server!\n"); exit (EXIT_FAILURE); } Window root= XDefaultRootWindow(display); XGrabPointer(display, root, False, ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime); XSelectInput(display, root, ButtonPressMask) ; while(1){ XNextEvent(display,&event); switch(event.type){ case ButtonPress: switch(event.xbutton.button){ case Button1: x=event.xbutton.x; y=event.xbutton.y; button=Button1; break; case Button3: x=event.xbutton.x; y=event.xbutton.y; button=Button3; break; default: break; } break; default: break; } if(x>=0 && y>=0)break; } if(button==Button1)printf("leftclick at %d %d \n",x,y); else printf("rightclick at %d %d \n",x,y); XCloseDisplay(display); return 0; } 

S’il existe un moyen plus simple de faire cela en C, je suis heureux de l’entendre.

Parfait! Ensuite, utilisez la bibliothèque libxdo que certains utilisateurs ont déjà créée pour vous.

 int x, y, scrn; xdo_t *hndl = xdo_new(NULL); xdo_mouselocation(hndl, &x, &y, &scrn); xdo_free(hndl); printf("Mouse coordinates: x = %4d, y = %4d\n", x, y); 

Je sais qu’il s’agit de quelques années, c’est donc une information pour les autres. Premièrement, utiliser encore une autre bibliothèque ne correspond pas à ma définition de facile. Je travaillais sur quelque chose qui nécessitait cela moi-même en n’utilisant que xlib et C et je voulais voir à quel point le code pouvait être simple.

En gros, vous n’avez besoin que de quatre lignes de code pour faire cela dans xlib dans un programme existant, le rest est dans la façon dont vous voulez le gérer, printf / sprintf, grab_pixel_color (Display * display, XColor * color), etc.

 /** gcc position.c -o position -lX11 **/ #include  #include  int main (int argc, char **argv) { Window root_window; //<--one int root_x, root_y; //<--two unsigned int mask; //<--three Display *display = XOpenDisplay(NULL); /* Bool XQueryPointer(display, w, root_return, child_return, root_x_return, root_y_return, win_x_return, win_y_return, mask_return) Display *display; Window w; Window *root_return, *child_return; int *root_x_return, *root_y_return; int *win_x_return, *win_y_return; unsigned int *mask_return; */ XQueryPointer(display, DefaultRootWindow(display), &root_window, &root_window, &root_x, &root_y, &root_x, &root_y, &mask); //<--four printf("Mouse coordinates (X: %d, Y: %d)\n", root_x, root_y); XCloseDisplay(display); return 0; } 

J'espère que cela est utile à quelqu'un d'autre.