/* Copyright (c) 1994-1996 David Hogan, see README for licence details */
#include <stdio.h>
#include <stdlib.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xproto.h>
#include "dat.h"
#include "fns.h"

int 	ignore_badwindow;

void
fatal(char *s)
{
	fprintf(stderr, "rio: ");
	perror(s);
	fprintf(stderr, "\n");
	exit(1);
}

int
handler(Display *d, XErrorEvent *e)
{
	char msg[80], req[80], number[80];

	if(initting && (e->request_code == X_ChangeWindowAttributes) && (e->error_code == BadAccess)){
		fprintf(stderr, "rio: it looks like there's already a window manager running;  rio not started\n");
		exit(1);
	}

	if(ignore_badwindow && (e->error_code == BadWindow || e->error_code == BadColor))
		return 0;

	XGetErrorText(d, e->error_code, msg, sizeof(msg));
	sprintf(number, "%d", e->request_code);
	XGetErrorDatabaseText(d, "XRequest", number, "", req, sizeof(req));
	if(req[0] == '\0')
		sprintf(req, "<request-code-%d>", (int)e->request_code);

	fprintf(stderr, "rio: %s(0x%x): %s\n", req, (int)e->resourceid, msg);

	if(initting){
		fprintf(stderr, "rio: failure during initialisation; aborting\n");
		exit(1);
	}
	return 0;
}

void
graberror(char *f, int err)
{
#ifdef	DEBUG	/* sick of "bug" reports; grab errors "just happen" */
	char *s;

	switch (err){
	case GrabNotViewable:
		s = "not viewable";
		break;
	case AlreadyGrabbed:
		s = "already grabbed";
		break;
	case GrabFrozen:
		s = "grab frozen";
		break;
	case GrabInvalidTime:
		s = "invalid time";
		break;
	case GrabSuccess:
		return;
	default:
		fprintf(stderr, "rio: %s: grab error: %d\n", f, err);
		return;
	}
	fprintf(stderr, "rio: %s: grab error: %s\n", f, s);
#endif
}

#ifdef	DEBUG_EV
#include "showevent/ShowEvent.c"
#endif

#ifdef	DEBUG

void
dotrace(char *s, Client *c, XEvent *e)
{
	if(debug == 0)
		return;
setbuf(stdout, 0);
	fprintf(stderr, "rio: %s: c=%p", s, (void*)c);
	if(c)
		fprintf(stderr, " x %d y %d dx %d dy %d w 0x%x parent 0x%x", c->x, c->y, c->dx, c->dy, (int)c->window, (int)c->parent);
#ifdef	DEBUG_EV
	if(e){
		fprintf(stderr, "\n\t");
		ShowEvent(e);
	}
#endif
	fprintf(stderr, "\n");
}
#endif
