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

static char *getatom(Atom atom);
static void setatom(Atom atom, char *value);

static Display *dpy;
static Window win;

int
main(int argc, char *argv[])
{
	Atom atom;
	char *value = NULL;

	dpy = XOpenDisplay(NULL);

	switch(argc) {
	case 4:
		value = argv[3];
	case 3:
		if((atom = XInternAtom(dpy, argv[2], True)) == None) {
			fprintf(stderr, "sprop: no such atom\n");
			return 1;
		}
		win = atoi(argv[1]);
		break;
	default:
		fprintf(stderr, "usage: sprop <xid> <atom> [<value>]\n");
		return 1;
	}
	if(value)
		setatom(atom, value);
	else {
		value = getatom(atom);
		printf("%s\n", value);
		XFree(value);
	}
	XCloseDisplay(dpy);
	return 0;
}

char *
getatom(Atom atom)
{
	Atom adummy;
	int idummy;
	unsigned long ldummy;
	unsigned char *p = NULL;

	XGetWindowProperty(dpy, win, atom, 0, BUFSIZ, False, XA_STRING,
			&adummy, &idummy, &ldummy, &ldummy, &p);
	return p;
}

void
setatom(Atom atom, char *value)
{
	XChangeProperty(dpy, win, atom, XA_STRING, 8, PropModeReplace,
			(unsigned char *)value, strlen(value) + 1);
}
