// 2002 co
// compile with 'gcc -o wctd wctd.c -lX11 [-L/usr/X11R6/lib]'

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>

int errorhandler(Display *dpy, XErrorEvent *ev) {
	const int msglen = 79;
	char msg[msglen];
	XGetErrorText(dpy, ev->error_code, (char *)&msg, msglen);
	printf("X11 Error: %s\n"
	       "Type: %x, display %x, resourceid %x, serial %x\n"
	       "Error code: %x, request code: %x, minor code: %x\n",
	       msg, ev->type, ev->display, ev->resourceid, ev->serial,
	       ev->error_code, ev->request_code, ev->minor_code);
	return 0;
}

int main(int argc, char *argv[]) {
	char *dpyname;
	Display *dpy;
	int scr;
	Window rootwin, win;
	
	XSetErrorHandler(errorhandler);
	if (!strncmp(argv[1], "--help", 6) || !strncmp(argv[1], "-h", 2)) {
		printf("%s: Move X pointer to display\n"
		       "Usage: %s :x.y\n"
		       "  where :x.y is a valid X display\n",
		       argv[0], argv[0]);
		return 0;
	}
	if (argc == 1)
		dpyname = NULL;
	else {
		dpyname = (char*) malloc(strlen(argv[1]));
		strcpy(dpyname, argv[1]);
	}
	printf("Attempting to open display %s...", XDisplayName(dpyname));
	dpy = XOpenDisplay(dpyname);
	if (dpy)
		printf(" done.\n");
	else {
		printf(" failed.\n");
		return 1;
	}
	scr = DefaultScreen(dpy);
	rootwin = RootWindow(dpy, scr);
	win = XCreateSimpleWindow(dpy, rootwin, 1, 1, 10, 10, 1, 0, 0);
	XMapWindow(dpy, win);
	XSync(dpy, False);
	XGrabPointer(dpy, win, 0, 0, GrabModeAsync, GrabModeAsync, win, None, CurrentTime);
	XCloseDisplay(dpy);
	return 0;
}
