XmRedisplayWidget(library call) XmRedisplayWidget(library call)
NAME
XmRedisplayWidget -- Synchronously activates the
expose method of a
widget to draw its content
SYNOPSIS
#include <Xm/Xm.h>
voidXmRedisplayWidget(
Widgetwidget);
DESCRIPTION
This function is a convenience routine that hides the details of the
Xt internals to the application programmer by calling the
expose method of the given widget with a well formed
Expose event and
Region corresponding to the total area of the widget. If the widget doesn't
have an
Expose method, the function does nothing.
This is primarily used in the context of X Printing if the
programming model chosen by the application is
synchronous; that is,
it doesn't rely of X Print events for the driving of page layout but
wants to completely control the sequence of rendering requests.
XmRedisplayWidget doesn't clear the widget window prior to calling
the
expose method, since this is handled by calls to
XpStartPage .
widget The widget to redisplay.
RETURN VALUE
None.
ERRORS/WARNINGS Not applicable
EXAMPLES
In the following, a simple application wants to print the content of
a multi-page text widget (similar to
dtpad).
PrintOKCallback(print_dialog...)
/*-------------*/
{
pshell = XmPrintSetup (print_dialog, pbs->print_screen,
"Print", NULL, 0);
XpStartJob(XtDisplay(pshell), XPSpool);
/**** here I realize the shell, get its size, create my widget
hierarchy: a bulletin board, and then a text widget,
that I stuff with the video text widget buffer */
/* get the total number of pages to print */
XtVaGetValues(ptext, XmNrows, &prows,
XmNtotalLines, n_lines, NULL);
n_pages = n_lines / prows;
/***** now print the pages in a loop */
for (cur_page=0; cur_page != n_pages; cur_page++) {
XpStartPage(XtDisplay(pshell), XtWindow(pshell), False);
XmRedisplayWidget(ptext); /* do the drawing */
XpEndPage(XtDisplay(pshell));
XmTextScroll(ptext, prows); /* get ready for next page */
}
/***** I'm done */
XpEndJob(XtDisplay(pshell));
}
Of course, one could change the above code to include it in a
fork() branch so that the main program is not blocked while printing is
going on. Another way to achieve a "print-in-the-background" effect
is to use an Xt workproc. Using the same sample application, that
gives us:
Boolean
PrintOnePageWP(XtPointer npages) /* workproc */
/*-------------*/
{
static int cur_page = 0;
cur_page++;
XpStartPage(XtDisplay(pshell), XtWindow(pshell), False);
XmRedisplayWidget(ptext); /* do the drawing */
XpEndPage(XtDisplay(pshell));
XmTextScroll(ptext, prows); /* get ready for next page */
if (cur_page == n_pages) { /***** I'm done */
XpEndJob(XtDisplay(pshell));
XtDestroyWidget(pshell);
XtCloseDisplay(XtDisplay(pshell));
}
return (cur_page == n_pages);
}
PrintOKCallback(...)
/*-------------*/
{
pshell = XmPrintSetup (widget, pbs->print_screen,
"Print", NULL, 0);
XpStartJob(XtDisplay(pshell), XPSpool);
/**** here I get the size of the shell, create my widget
hierarchy: a bulletin board, and then a text widget,
that I stuff with the video text widget buffer */
/* get the total number of pages to print */
/* ... same code as above example */
/***** print the pages in the background */
XtAppAddWorkProc(app_context, PrintOnePageWP, n_pages);
}
SEE ALSO
XmPrintSetup(3),
XmPrintShell(3) XmRedisplayWidget(library call)