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

Widget top, dialog;
void PushCB(Widget w, XtPointer action, XtPointer s);
void VisibleEH(Widget w, XtPointer p, XVisibilityEvent *ev, Boolean *cont);

int
main(int ac, char *av[])
{
    XtAppContext app;
    Widget pb, label;
    XmString xms;
    Arg arg[1];

    top = XtAppInitialize(&app, "Sample",
		      NULL, 0, &ac, av, NULL, NULL, 0);
    pb = XmCreatePushButton(top, "Push me !!", NULL, 0);
    XtAddCallback(pb, XmNactivateCallback,
		  (XtCallbackProc)PushCB, NULL);
    XtManageChild(pb);

    xms = XmStringCreateLocalized("AutoRaise !!");
    XtSetArg(arg[0], XmNmessageString, xms);
    dialog = XmCreateMessageDialog(top, "box1", arg, 1);
    XtAddEventHandler(XtParent(dialog), VisibilityChangeMask,
		      False, (XtEventHandler)VisibleEH, NULL);

    XtRealizeWidget(top);
    XtAppMainLoop(app);
}

void
PushCB(Widget w, XtPointer c, XtPointer s)
{
    XtManageChild(dialog);
}

#include	<X11/Xos.h>

void
VisibleEH(Widget w, XtPointer p, XVisibilityEvent *ev, Boolean *cont)
{
    static struct timeval prev;
    struct timeval cur;

    if (ev->state == VisibilityUnobscured)
	return;
    if (gettimeofday(&cur, NULL))
	return;
    if (cur.tv_sec > prev.tv_sec ||
	cur.tv_usec > prev.tv_usec + 500000) {
	XRaiseWindow(XtDisplay(w), XtWindow(w));
    }
    prev = cur;
    return;
}
