static void ChildPrintToFile(String display_name, XPContext pcontext, FILE *file, char *file_name, int pipe, String application_name, String application_class) { FileDescRec *file_desc; XtAppContext app_context; int argc = 0; String argv[] = { NULL }; Display *display; file_desc = (FileDescRec *) XtMalloc(sizeof(FileDescRec)); file_desc->file_name = XtNewString(file_name); file_desc->file = file; file_desc->pipe = pipe; app_context = XtCreateApplicationContext(); if ((display = XtOpenDisplay(app_context, display_name, application_name, application_class, NULL, 0, &argc, argv)) == NULL) { _exit(1); } XpGetDocumentData(display, pcontext, PrintToFileProc, FinishProc, (XPointer) file_desc); XtAppMainLoop(app_context); _exit(0); }
void *PrintToFile_Consumer( void *handle ) #endif { MyPrintFileData *mpfd = (MyPrintFileData *)handle; XEvent dummy; struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 100000; /* 1/10 s */ XPU_DEBUG_ONLY(printf("### child running, getting data from '%s'.\n", mpfd->displayname)); /* we cannot reuse fork()'ed display handles - our child needs his own one */ if( (mpfd->pdpy = XPU_TRACE_CHILD(XOpenDisplay(mpfd->displayname))) == NULL ) { perror("child cannot open display"); #ifdef XPU_USE_NSPR return; #else return(NULL); #endif } mpfd->done = False; /* register "consumer" callbacks */ if( XPU_TRACE_CHILD(XpGetDocumentData(mpfd->pdpy, mpfd->pcontext, MyPrintToFileProc, MyFinishProc, (XPointer)mpfd)) == 0 ) { XPU_DEBUG_ONLY(printf("XpGetDocumentData cannot register callbacks\n")); #ifdef XPU_USE_NSPR return; #else return(NULL); #endif } /* loop forever - libXp has registered hidden event callbacks for the consumer * callbacks - the finishCB will call set the "done" boolean after all... */ while( mpfd->done != True ) { XNextEventTimeout(mpfd->pdpy, &dummy, &timeout); } XCloseDisplay(mpfd->pdpy); #ifdef XPU_USE_THREADS #ifdef XPU_USE_NSPR return; #else return(NULL); #endif #else /* write the status to the parent */ if( XPU_TRACE_CHILD(write(mpfd->pipe[1], &mpfd->status, sizeof(XPGetDocStatus))) != sizeof(XPGetDocStatus) ) { perror("PrintToFile_Consumer: can't write XPGetDocStatus"); } /* we don't do any free's or close's, as we are just * going to exit, in fact, get out without calling any C++ * destructors, etc., as we don't want anything funny to happen * to the parent */ XPU_TRACE_CHILD(_exit(EXIT_SUCCESS)); #endif /* XPU_USE_THREADS */ }