X eventos de KeyPress / Release que capturan independientemente de la ventana en foco

Quiero grabar todos los eventos de teclas entrantes presionadas sin importar qué ventana esté enfocada o dónde esté el puntero.

He escrito un código de muestra que debe capturar los eventos pulsados ​​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 a XGrabKeyboard para capturar el teclado, ya que la aplicación que creó la ventana podría tener los eventos del teclado ya grabados. Con el código mencionado anteriormente, puedo agarrar el teclado pero no puedo recibir eventos de KeyPress o KeyRelease para ninguna tecla del teclado dentro del bucle while. ¿Hay algo que me esté faltando en el código por el cual no puedo recibir los eventos? Cualquier ayuda es muy apreciada.

Mi objetivo final es capturar eventos de pulsación clave en la pantalla, independientemente de la ventana en foco. He dado el código de muestra para la única ventana en foco para que el código sea legible. Haría XQueryTree para obtener todo el Windows y aplicaría la misma lógica que se dio anteriormente para obtener el resultado esperado.

Respuestas a la pregunta(2)

Su respuesta a la pregunta