* becomes visible.
*/
void
ForceUpdate(w)
Widget w; /* This widget must be visible before the function returns */
{
Widget diashell, topshell;
Window diawindow, topwindow;
XtAppContext cxt = XtWidgetToApplicationContext (w);
Display *dpy;
XWindowAttributes xwa;
XEvent event;
/* Locate the shell we are interested in */
for (diashell = w; !XtIsShell (diashell); diashell = XtParent (diashell))
;
/* Locate its primary window's shell (which may be the same) */
for (topshell = diashell; !XtIsTopLevelShell (topshell);
topshell = XtParent (topshell))
;
/* If the dialog shell (or its primary shell window) is not realized,
* don't bother ... nothing can possibly happen.
*/
if (XtIsRealized (diashell) && XtIsRealized (topshell)) {
dpy = XtDisplay (topshell);
diawindow = XtWindow (diashell);
topwindow = XtWindow (topshell);
/* Wait for the dialog to be mapped. It's guaranteed to become so */
while (XGetWindowAttributes (dpy, diawindow, &xwa) &&
xwa.map_state != IsViewable) {
/* ...if the primary is (or becomes) unviewable or unmapped,
* it's probably iconic, and nothing will happen.
*/
if (XGetWindowAttributes (dpy, topwindow, &xwa) &&
xwa.map_state != IsViewable)
break;
/* we are guaranteed there will be an event of some kind. */
XtAppNextEvent (cxt, &event);
XtDispatchEvent (&event);
}
}
/* The next XSync() will get an expose event. */
XmUpdateDisplay (topshell);
}
This routine makes sure that a dialog is visible by waiting for the window of the dialog to be mapped to the screen.
22.2.5 ...