#include	<Xm/PushB.h>
#include	<signal.h>
#include	<Xos.h>

XtAppContext app;
Widget top, pb;

void do_process(Widget w, XtPointer c, XtPointer p);
void done_process(XtPointer c, XtIntervalId *id);
void sigchld();

int
main(int ac, char *av[])
{
    top = XtAppInitialize(&app, "Sample",
		    NULL, 0, &ac, av, NULL, NULL, 0);
    signal(SIGCHLD, sigchld);

    pb = XmCreatePushButton(top, "Push me !!", NULL, 0);
    XtAddCallback(pb, XmNactivateCallback, do_process, NULL);
    XtManageChild(pb);

    XtRealizeWidget(top);
    XtAppMainLoop(app);
    return 0;
}

void
sigchld()
{
    XtIntervalId id;

    wait(NULL);
    id = XtAppAddTimeOut(app, 0,
	     (XtTimerCallbackProc)done_process, NULL);
    ((struct timeval *)id)->tv_sec = 0;
}

void ChildProcess();

void
do_process(Widget w, XtPointer c, XtPointer s)
{
    int pid;
    
    pid = fork();
    if (pid == -1) exit(1);
    else if (!pid) {
    	ChildProcess();
    }
    /* $B;R%W%m%;%93+;O;~$K9T$&=hM}(B */
    XtSetSensitive(pb, False);
}

void
done_process(XtPointer c, XtIntervalId *id)
{
    /* $B;R%W%m%;%9=*N;;~$K<B9T$9$k=hM}(B
       $B$3$3$G$O(BXt$B$N4X?t$r8F$s$G$b0BA4(B */
    XtSetSensitive(pb, True);
}

void
ChildProcess()
{
    puts("start");
    sleep(10); /* $B$3$3$K<B:]$K9T$&=hM}$rF~$l$F$M(B */
    puts("done");
    exit(0);
}
