title: X KeyPress/Release events capturing irrespective of Window in focus
body: <p>I want to record all incoming key pressed events no matter what window is in focus or where the pointer is.</p>
  
  <p>I have written a sample code which should capture the key pressed events of the current Window in focus.</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;locale.h&gt;
  #include &lt;stdint.h&gt;
  #include &lt;stdarg.h&gt;
  #include &lt;errno.h&gt;
  #include &lt;pthread.h&gt;
  #include &lt;X11/Xlib.h&gt;
  #include &lt;X11/Xos.h&gt;
  #include &lt;X11/Xfuncs.h&gt;
  #include &lt;X11/Xutil.h&gt;
  
  #include &lt;X11/Xatom.h&gt;
  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, &amp;window, &amp;revert_to);
      XSelectInput(display, window, KeyPressMask | KeyReleaseMask );
      iError = XGrabKeyboard(display, window,
                            KeyPressMask | KeyReleaseMask,
                            GrabModeAsync,
                            GrabModeAsync,
                            CurrentTime); 
      if (iError != GrabSuccess &amp;&amp; iError == AlreadyGrabbed) {
          XUngrabPointer(display, CurrentTime);
          XFlush(display);
          printf("Already Grabbed\n");    
      } else if (iError == GrabSuccess) {
          printf("Grabbed\n");
      }
      while(1) {
            XNextEvent(display,&amp;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;
  }
  </code></pre>
  
  <p>I am calling XGrabKeyboard to capture the keyboard as the application who created the window might have the keyboard events already grabbed. With the above mentioned code I am able to grab the keyboard but am unable to receive either of KeyPress or KeyRelease events for any keys on the keyboard inside the while loop. Is there anything that I am missing in the code due to which I am unable to receive the events ? Any help is highly appreciated.</p>
  
  <p>My final aim is to capture key press events on the screen irrespective of the Window in focus. I have given the sample code for only window in focus for the code to be readable . I would do XQueryTree to get all the Windows and apply the same logic given above to get the expected result.</p>