text: #include <X11/Xlib.h>
  #include <stdio.h>
  
  char *key_name[] = {
      "first", "second (or middle)", "third",
      "fourth",  // :D
      "fivth"    // :|
  };
  
  int main(int argc, char **argv) {
    Display *display;
    XEvent xevent;
    Window window;
  
    if ((display = XOpenDisplay(NULL)) == NULL) return -1;
  
    window = DefaultRootWindow(display);
    XAllowEvents(display, AsyncBoth, CurrentTime);
  
    XGrabPointer(display, window, 1,
                 PointerMotionMask | ButtonPressMask | ButtonReleaseMask,
                 GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
  
    while (1) {
      XNextEvent(display, &xevent);
  
      switch (xevent.type) {
        case MotionNotify:
          printf("Mouse move      : [%d, %d]\n", xevent.xmotion.x_root,
                 xevent.xmotion.y_root);
          break;
        case ButtonPress:
          printf("Button pressed  : %s\n", key_name[xevent.xbutton.button - 1]);
          break;
        case ButtonRelease:
          printf("Button released : %s\n", key_name[xevent.xbutton.button - 1]);
          break;
      }
    }
  
    return 0;
  }
  