Questo può essere un codice C di esempio o un'utilità che mostrerà gui o sulla console non importa, ma devo essere in grado di "comandarlo" per afferrare le coordinate in un momento esatto che rende xev non molto utile (che potrei capire).Come posso ottenere le coordinate di posizione del mouse corrente (puntatore) in X
risposta
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;
}
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.
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);
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
Forse che farà risparmiare qualcuno un po 'di tempo: per compilarlo, salvarlo con pointerposition.c ed eseguire: 'gcc pointerposition.c -o pointerposition -lX11' – exic
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