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

#define WINDOW_W  400  /* ウィンドウの幅   */
#define WINDOW_H  300  /* ウィンドウの高さ */
#define BORDER    2    /* ボーダの幅      */


/* 独自のエラーハンドラ */
int 
xerr_handler( Display* dpy, XErrorEvent* event )
{
	printf( "Now I have to go...\n" );
	exit( 1 );
}


int 
main( void )
{
	Display*       dpy;         /* ディスプレイ */
	Window         root;        /* ルートウィンドウ */
	Window         win;         /* 表示するウィンドウ */
	int            screen;      /* スクリーン */
	unsigned long  black,white; /* 黒と白のピクセル値 */
	GC             gc;          /* グラフィックスコンテキスト */
	XEvent         event;       /* イベント構造体 */


	dpy = XOpenDisplay( "" );

	root   = DefaultRootWindow( dpy );
	screen = DefaultScreen( dpy );
	white  = WhitePixel( dpy, screen );
	black  = BlackPixel( dpy, screen );


	/* エラーハンドラを設定する */
	XSetErrorHandler( xerr_handler );


	win = XCreateSimpleWindow( dpy, root,
		   100, 100, WINDOW_W, WINDOW_H, BORDER, black, white);

	gc = XCreateGC( dpy, win, 0, NULL );
	XSetBackground( dpy, gc, white );
	XSetForeground( dpy, gc, black );

	XSelectInput( dpy, win, ExposureMask );
	XMapWindow( dpy, win );

	while( 1 ) {
		XNextEvent( dpy, &event );

		switch( event.type ) {
			case Expose:
				if ( event.xexpose.count == 0 ) {
					XFillRectangle( dpy, (Window)gc, gc, 100, 100, 100, 100);
				}
				break;
		}
	}

	return 0;
}

/* End of xerr.c */
