2010-08-27 19 views

Respuesta

13

No soy un programador de C de ninguna manera, pero miré un par de tutoriales en línea y creo que así es como debe leer la posición actual del mouse. Este es mi propio código y no había hecho nada con Xlib antes, por lo que podría estar completamente roto (por ejemplo, el controlador de errores no debería simplemente no hacer nada por cada error) pero funciona. Así que aquí hay otra solución:

#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

Tal vez que salvará a alguien algún tiempo: compilarlo, guardarlo con pointerposition.c y ejecute: 'gcc pointerposition.c -o pointerposition -lX11' – exic

+0

Algunos pueden encontrar útil saber esto: para obtener la ventana activa, puede usar' Window focused; \t int revert_to; \t XGetInputFocus (mostrar, & enfocado, y revert_to); 'Reemplacé los bucles for con esta única llamada para obtener la ventana activa, en lugar de la ventana que el ejemplo intenta encontrar – user2255242

1

En realidad, xev es muy útil si lo proporciona con la identificación de la ventana tomada con xwininfo, entonces puede realizar esta tarea fácilmente para usted. Sin duda, hay soluciones mucho más elegantes, pero funciona.

9

xdotool podría ser la mejor herramienta para esto.

Para C, puede usar libxdo.

0

Hay un error en esta línea

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

cambio que a esto:

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

Ambas líneas están bien con ANSI-C como el yeso es implicita Pero para GCC puedes hacer la primera línea para rescatar con '-WC++ - compat -Werror'. Otra historia es que puede deshacerse de 'root_windows' completamente al reemplazar' root_windows [i] 'con' XRootWindow (display, i) 'en el bucle. ;) – Tino

Cuestiones relacionadas