2010-08-27 18 views

risposta

13

Non sono un programmatore C in alcun modo ma ho esaminato un paio di tutorial online e penso che questo è il modo in cui si suppone di leggere la posizione corrente del mouse. Questo è il mio codice e non avevo fatto nulla con Xlib prima, quindi potrebbe essere completamente infranto (ad esempio, il gestore degli errori non dovrebbe fare solo nulla per ogni errore) ma funziona. Quindi ecco un'altra soluzione:

#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

Forse che farà risparmiare qualcuno un po 'di tempo: per compilarlo, salvarlo con pointerposition.c ed eseguire: 'gcc pointerposition.c -o pointerposition -lX11' – exic

+0

Alcuni potrebbero trovare utile sapere: per ottenere la finestra attiva, è possibile utilizzare la finestra di dialogo 'Focus'; \t int revert_to; \t XGetInputFocus (display, & focused, & revert_to); 'Ho sostituito i cicli for con questa unica chiamata per ottenere la finestra attiva, piuttosto che qualsiasi finestra l'esempio sta cercando di trovare – user2255242

1

In realtà, xev è molto utile se lo si fornisce con l'ID della finestra acquisito usando xwininfo, quindi può facilmente svolgere questa attività per te. Non ci sono dubbi, soluzioni molto più eleganti ma funziona.

9

xdotool potrebbe essere lo strumento migliore per questo.

Per C, è possibile utilizzare libxdo.

0

C'è un errore su questa linea

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

Change che a questo:

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

Entrambe le linee vanno bene con ANSI-C come il cast è implicito. Ma per GCC è possibile eseguire il salvataggio della prima riga con '-WC++ - compat -Werror'. Un'altra storia è che puoi eliminare completamente 'root_windows' sostituendo' root_windows [i] 'con' XRootWindow (display, i) 'nel loop. ;) – Tino

Problemi correlati