XtWorkProc()XtWorkProc()NameXtWorkProc - interface definition for procedure called when the event
loop is idle.
Synopsis
typedef Boolean (*XtWorkProc)(XtPointer);
XtPointer client_data;
Inputs
client_data
Specifies data registered with this procedure.
Returns
True if the procedure should not be called again; False otherwise.
Description
An XtWorkProc is registered with XtAppAddWorkProc() and is called by
XtAppMainLoop() and XtAppProcessEvent() if there are no events pending
and the application would otherwise block.
The client_data argument is data of any type registered in the call to
XtAppAddWorkProc(). It is generally cast to an XtPointer when regis‐
tered and cast back to the appropriate type within the XtWorkProc. An
XtWorkProc must get all of its context from this argument or from
global variables.
An XtWorkProc should perform a single short task and return. If it
does not return quickly then events that arrive while it is running
will not be handled immediately, and the response time seen by the user
will suffer. If a work procedure has a lot of processing to do, it
should perform a piece of it, save its state in static variables, and
return False. When an XtWorkProc returns False, the Intrinsics will
call it again the next time the event loop is idle, and it can resume
its processing where it left off. When it completes all of its pro‐
cessing, it should return True, and the Intrinsics will automatically
un-register it, so that it will not be called again.
Usage
One possible use of work procedures is to create the widgets in dialog
boxes which are not needed immediately when an application starts up.
This will save start up time for the main application window, and will
probably also mean that the dialog boxes will be fully created by the
time the user requests that one is popped up.
You can register multiple work procedures, and they will be performed
one at a time. The most recent work procedure added has the highest
priority. Therefore, for example, if you want to create ten popup wid‐
gets during idle time, you might add ten work procedures. The pop up
that you expect to need first should be created by the last work proce‐
dure registered. See the example below for an alternate approach, how‐
ever.
You can explicitly remove a work procedure with XtRemoveWorkProc().
Example
The first procedure below is an XtWorkProc that creates several dialog
widgets. Note that it returns after creating each dialog. If the
dialogs are needed before they are created by this procedure, they will
have to be created explicitly as shown in the second procedure below.
The only standard client in X11R5 that uses work procedures is xfontsel
which performs sophisticated scheduling of all the background work of
parsing the names of all the fonts available from the server.
Widget file_dialog = NULL;
Widget print_dialog = NULL;
Widget confirm_dialog = NULL;
Boolean CreateDialogsInBackground(client_data)
XtPointer client_data;
{
Widget toplevel = (Widget) client_data;
static int num = 0;
num++;
switch(num) {
case 1:
if (file_dialog == NULL)
file_dialog = CreateFileDialog(toplevel);
return False;
case 2:
if (print_dialog == NULL)
print_dialog = CreatePrintDialog(toplevel);
return False;
case 3:
if (confirm_dialog == NULL)
confirm_dialog = CreateConfirmDialog(toplevel);
return True;
}
return True;
}
void DoFileDialog(toplevel)
Widget toplevel;
{
if (file_dialog == NULL)
file_dialog = CreateFileDialog(toplevel);
XtPopup(file_dialog, XtGrabExclusive);
}
This work procedure could be registered with a call like the following:
toplevel = XtAppInitialize(...);
BuildInterface(toplevel);
XtRealizeWidget(toplevel);
XtAppAddWorkProcedure(app_context, CreateDialogsInBackground,
(XtPointer) toplevel);
XtAppMainLoop(app_context);
See AlsoXtAppAddWorkProc(1), XtRemoveWorkProc(1).
Xt - Event Handling XtWorkProc()