Optional main loop for \s-1xpa\s0
#include <xpa.h> void XPAMainLoop();
Once \s-1XPA\s0 access points have been defined, a program must enter an event loop to watch for requests from external programs. This can be done in a variety of ways, depending on whether the event loop is processing events other than \s-1XPA\s0 events. In cases where there are no non-XPA events to be processed, the program can simply call the XPAMainLoop() event loop. This loop is implemented essentially as follows (error checking is simplified in this example):
FD_ZERO(&readfds); while( XPAAddSelect(NULL, &readfds) ){ if( sgot = select(swidth, &readfds, NULL, NULL, NULL) >0 ) XPAProcessSelect(&readfds, 0); else break; FD_ZERO(&readfds); }
The XPAAddSelect() routine sets up the select() readfds variable so that select() will wait for I/O on all the active \s-1XPA\s0 channels. It returns the number of XPAs that are active; the loop will end when there are no active XPAs. The standard select() routine is called to wait for an external I/O request. Since no timeout struct is passed in argument 5, the select() call hangs until there is an external request. When an external I/O request is made, the XPAProcessSelect() routine is executed to process the pending requests. In this routine, the maxreq value determines how many requests will be processed: if maxreq <=0, then all currently pending requests will be processed. Otherwise, up to maxreq requests will be processed. (The most usual values for maxreq is 0 to process all requests.)
If a program has its own Unix select() loop, then \s-1XPA\s0 access points can be added to it by using a variation of the standard XPAMainLoop:
XPAAddSelect(xpa, &readfds); [app\-specific ...] if( select(width, &readfds, ...) ){ XPAProcessSelect(&readfds, maxreq); [app\-specific ...] FD_ZERO(&readfds); }
XPAAddSelect() is called before select() to add the access points. If the first argument is \s-1NULL\s0, then all active \s-1XPA\s0 access points are added. Otherwise only the specified access point is added. After select() is called, the XPAProcessSelect() routine can be called to process \s-1XPA\s0 requests. Once again, the maxreq value determines how many requests will be processed: if maxreq <=0, then all currently pending requests will be processed. Otherwise, up to maxreq requests will be processed.
\s-1XPA\s0 access points can be added to Xt event loops (using XtAppMainLoop()) and Tcl/Tk event loops (using vwait and the Tk loop). When using \s-1XPA\s0 with these event loops, you only need to call:
int XPAXtAddInput(XtAppContext app, \s-1XPA\s0 xpa)
or
int XPATclAddInput(XPA xpa)
respectively before entering the loop.
See xpa(7) for a list of \s-1XPA\s0 help pages