2010-08-27 2 views

Répondre

13

Je ne suis pas un programmeur C, mais j'ai regardé quelques tutoriels en ligne et je pense que c'est comme ça que vous devez lire la position actuelle de la souris. C'est mon propre code et je n'avais rien fait avec Xlib auparavant, donc ça pourrait être complètement cassé (par exemple, le gestionnaire d'erreurs ne devrait pas faire n'importe quoi pour chaque erreur) mais ça marche. Donc, voici une autre solution:

#include <X11/Xlib.h> 
#include <assert.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <malloc.h> 

static int _XlibErrorHandler(Display *display, XErrorEvent *event) { 
    fprintf(stderr, "An error occured detecting the mouse position\n"); 
    return True; 
} 

int main(void) { 
    int number_of_screens; 
    int i; 
    Bool result; 
    Window *root_windows; 
    Window window_returned; 
    int root_x, root_y; 
    int win_x, win_y; 
    unsigned int mask_return; 

    Display *display = XOpenDisplay(NULL); 
    assert(display); 
    XSetErrorHandler(_XlibErrorHandler); 
    number_of_screens = XScreenCount(display); 
    fprintf(stderr, "There are %d screens available in this X session\n", number_of_screens); 
    root_windows = malloc(sizeof(Window) * number_of_screens); 
    for (i = 0; i < number_of_screens; i++) { 
     root_windows[i] = XRootWindow(display, i); 
    } 
    for (i = 0; i < number_of_screens; i++) { 
     result = XQueryPointer(display, root_windows[i], &window_returned, 
       &window_returned, &root_x, &root_y, &win_x, &win_y, 
       &mask_return); 
     if (result == True) { 
      break; 
     } 
    } 
    if (result != True) { 
     fprintf(stderr, "No mouse found.\n"); 
     return -1; 
    } 
    printf("Mouse is at (%d,%d)\n", root_x, root_y); 

    free(root_windows); 
    XCloseDisplay(display); 
    return 0; 
} 
+2

Peut-être quelqu'un qui sauvera un certain temps: Pour le compiler, enregistrer sous pointerposition.c et exécuter: 'gcc pointerposition.c -o pointerposition -lX11' – exic

+0

Certains peuvent trouver cela utile de savoir: pour obtenir la fenêtre active, vous pouvez utiliser' Windows focus; \t int revert_to; \t XGetInputFocus (affichage, & focus, & revert_to); 'J'ai remplacé les boucles for par cet unique appel afin d'obtenir la fenêtre active, plutôt que la fenêtre que l'exemple essaie de trouver – user2255242

1

En fait, xev est très utile si vous le fournissez avec l'identifiant de fenêtre saisi avec xwininfo, alors il peut facilement effectuer cette tâche pour vous. Il n'y a aucun doute des solutions beaucoup plus élégantes mais cela fonctionne.

9

xdotool peut être le meilleur outil pour cela. Pour 0, vous pouvez utiliser libxdo.

0

Il y a une erreur sur cette ligne

root_windows = malloc(sizeof(Window) * number_of_screens); 

Un changement qui à ceci:

root_windows = (Window *)malloc(sizeof(Window) * number_of_screens); 
+1

Les deux lignes vont bien avec ANSI-C le casting est implicite. Mais pour GCC, vous pouvez faire la première ligne à renflouer avec '-WC++ - compat -Werror'. Une autre histoire est que vous pouvez vous débarrasser complètement de 'root_windows' en remplaçant' root_windows [i] 'par' XRootWindow (display, i) 'dans la boucle. ;) – Tino

Questions connexes