// gcc -o xgrabserver-wrapper.so -shared -lX11 -Wall -g xgrabserver-wrapper.c
#define _GNU_SOURCE
#include <X11/Xlib.h>
#include <X11/Xlibint.h>
#include <dlfcn.h>
#include <assert.h>
#include <stdio.h>

Display *(*real_XOpenDisplay)(_Xconst char *display_name) = NULL;

int (*real_XMapWindow)(Display *display, Window w) = NULL;

Display *XOpenDisplay(_Xconst char *display_name) {
    Display *dpy;
    int ret;

    printf("XOpenDisplay\n");
    if (real_XOpenDisplay == NULL) {
        real_XOpenDisplay = dlsym(RTLD_NEXT, "XOpenDisplay");
    }
    dpy = real_XOpenDisplay(display_name);
    if (dpy == NULL) {
        return NULL;
    }
    ret = XGrabServer(dpy);
    if (ret <= 0) {
        XCloseDisplay(dpy);
        return NULL;
    }
    
    printf("XOpenDisplay ok\n");
    return dpy;
}

int XMapWindow(Display *display, Window w) {
    int ret, map_ret;
    XSetWindowAttributes attr;
    
    printf("XMapWindow\n");
    attr.override_redirect = True;
    ret = XChangeWindowAttributes(display,
                                  w,
                                  CWOverrideRedirect,
                                  &attr);
    assert(ret);

    if (real_XMapWindow == NULL) {
        real_XMapWindow = dlsym(RTLD_NEXT, "XMapWindow");
    }
    map_ret = real_XMapWindow(display, w);
    if (map_ret <= 0) {
        return map_ret;
    }

    ret = XRaiseWindow(display,
                       w);
    assert(ret);

    ret = XMoveResizeWindow(display,
                            w,
                            152,
                            81,
                            702,
                            411);
    assert(ret);

    ret = XSetInputFocus(display,
                         w,
                         RevertToParent,
                         CurrentTime);
    assert(ret);
    printf("XMapWindow ok\n");
    return map_ret;
}
