// gcc grab.c -o grab -lX11
// ugly hack to catch windows key before application and change i3 workspace if windows+[0-9] is pressed

// usage: grab winid_1 winid_2 ...
// example: 
// grab `xwininfo -root -tree -int |grep " - Oracle VM VirtualBox" | awk '{print $1}'`


#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char **argv) {
     int i, screen, status;
     //XInitThreads();
     Display *display;
     Window root;
     
     display = XOpenDisplay(NULL);
     screen = DefaultScreen(display);
     root = RootWindow(display, screen);

     Window w;
     printf("argc = %d\n", argc);

     XEvent xev;
     XKeyEvent event;
     XKeyEvent *kev;
     int keycode = 133;
     unsigned int modifiers = AnyModifier;
     int pointer_mode = GrabModeAsync;
     int keyboard_mode = GrabModeAsync;
     Bool owner_events = False;
     
     for (i = 1; i < argc; i++) {
	  char *wstr = argv[i];
	  w = atoi(wstr);
	  printf("window = %d\n", w);
	  status = XGrabKey(display, keycode, modifiers, w, owner_events, pointer_mode, keyboard_mode);
	  printf("grabbing status %d\n", status);
     }
     
     while (1) {
	  XNextEvent(display, &xev);
	  kev = (XKeyEvent *)&xev;
	  printf("wind   key: code = %d, state = %d \n", kev->keycode, kev->state);

	  if (kev->state == 64 && kev->keycode >= 10 && kev->keycode <= 19) {
	       int k = kev->keycode - 9;
	       if (k == 10) k = 0;

	       char cmd[100];
	       sprintf(cmd, "i3-msg \"workspace %d\"", k);
	       
	       system(cmd);
	  }
     }

     XFlush(display);
     XCloseDisplay(display);

     return 0;
}