Quiero registrar todos los eventos presionados de tecla entrante sin importar qué ventana esté enfocada o dónde esté el puntero.X Captura de eventos KeyPress/Release independientemente de Window in focus
He escrito un código de muestra que debe capturar los eventos de tecla presionada de la ventana actual en foco.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <locale.h>
#include <stdint.h>
#include <stdarg.h>
#include <errno.h>
#include <pthread.h>
#include <X11/Xlib.h>
#include <X11/Xos.h>
#include <X11/Xfuncs.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
int _invalid_window_handler(Display *dsp, XErrorEvent *err) {
return 0;
}
int main()
{
Display *display = XOpenDisplay(NULL);
int iError;
KeySym k;
int revert_to;
Window window;
XEvent event;
Time time;
XSetErrorHandler(_invalid_window_handler);
XGetInputFocus(display, &window, &revert_to);
XSelectInput(display, window, KeyPressMask | KeyReleaseMask);
iError = XGrabKeyboard(display, window,
KeyPressMask | KeyReleaseMask,
GrabModeAsync,
GrabModeAsync,
CurrentTime);
if (iError != GrabSuccess && iError == AlreadyGrabbed) {
XUngrabPointer(display, CurrentTime);
XFlush(display);
printf("Already Grabbed\n");
} else if (iError == GrabSuccess) {
printf("Grabbed\n");
}
while(1) {
XNextEvent(display,&event);
switch (event.type) {
case KeyPress : printf("Key Pressed\n"); break;
case KeyRelease : printf("Key Released\n"); break;
case EnterNotify : printf("Enter\n"); break;
}
}
XCloseDisplay(display);
return 0;
}
Estoy llamando XGrabKeyboard para capturar el teclado como la aplicación que creó la ventana pudieran tener los eventos de teclado ya agarrado. Con el código mencionado anteriormente, puedo agarrar el teclado pero no puedo recibir eventos KeyPress o KeyRelease para ninguna tecla del teclado dentro del ciclo while. ¿Hay algo que me falta en el código debido a que no puedo recibir los eventos? Cualquier ayuda es muy apreciada.
Mi objetivo final es capturar eventos de pulsación de tecla en la pantalla, independientemente de la ventana en foco. He dado el código de muestra para solo ventana en foco para que el código sea legible. Haría XQueryTree para obtener todas las ventanas y aplicar la misma lógica dada anteriormente para obtener el resultado esperado.
por qué no utilizar el subsistema de evento, entonces? –
¿Podría explicar el subsistema de eventos? He dado KeyPressMask, KeyReleaseMask como los eventos para capturar en la llamada a XSelectInput. Gracias –
Ignacio Vazquez-Abrams se refiere al subsistema de entrada del kernel de Linux, que es accesible a través de los dispositivos de caracteres en '/ dev/input /'. Omite por completo X y obtiene los eventos HID directamente del kernel, pero también requiere privilegios de root. –