#include <Xm/RowColumn.h>
#include <Xm/Label.h>
#include <Xm/PushB.h>


Widget counter;
Boolean stop = False;

void startCB(Widget w, XtPointer c, XtPointer s);
void stopCB(Widget w, XtPointer c, XtPointer s);

int
main(int ac, char *av[])
{
    XtAppContext app;
    Widget top, rc, pb[2];
    top = XtAppInitialize(&app, "Sample",
			NULL, 0, &ac, av, NULL, NULL, 0);
    rc = XmCreateRowColumn(top, "rc", NULL, 0);
    pb[0] = XmCreatePushButton(rc, "Start", NULL, 0);
    XtAddCallback(pb[0], XmNactivateCallback,
		  (XtCallbackProc)startCB, NULL);
    pb[1] = XmCreatePushButton(rc, "Stop", NULL, 0);
    XtAddCallback(pb[1], XmNactivateCallback,
		  (XtCallbackProc)stopCB, NULL);
    counter = XmCreatePushButton(rc, "0", NULL, 0);
    XtManageChildren(pb, 2);
    XtManageChild(counter);
    XtManageChild(rc);

    XtRealizeWidget(top);
    XtAppMainLoop(app);
}

void WaitExposeEvent(Widget target);

void
startCB(Widget w, XtPointer c, XtPointer s)
{
    XmString xms;
    char buf[16];
    int i;

    XtSetSensitive(w, False);
    stop = False;
    for (i = 0; i <= 10; i++) {
	sprintf(buf, "%d", i);
	xms = XmStringCreateSimple(buf);
	XtVaSetValues(counter, XmNlabelString, xms, NULL);
	XmStringFree(xms);
	WaitExposeEvent(counter);
	if (stop)
	    break;
	sleep(1);
    }
    XtSetSensitive(w, True);
}

void
stopCB(Widget w, XtPointer c, XtPointer s)
{
    stop = True;
}

void
WaitExposeEvent(Widget target)
{
    /* ウィジェットのウィンドウのIDを取得する */
    Window w = XtWindowOfObject(target);
    XtAppContext app = XtWidgetToApplicationContext(target);
    Boolean cont = True;

    while (cont || XtAppPending(app)) {
	XEvent ev;
	XtAppNextEvent(app, &ev);
	XtDispatchEvent(&ev);
	/* 目的のイベントを処理したか調べる */
	if (ev.type == Expose && ev.xany.window == w)
	    cont = False;
    }
}
