sbProcess::~sbProcess() { // Kill the process. Kill(); // Detach the base process. //XXXeps detaching the process causes crashes. #if 0 if (mBaseProcess) PR_DetachProcess(mBaseProcess); #endif mBaseProcess = nsnull; // Close the process pipes. if (mStdinReadFD) PR_Close(mStdinReadFD); if (mStdoutReadFD) PR_Close(mStdoutReadFD); if (mStdoutWriteFD) PR_Close(mStdoutWriteFD); // Dispose of the process lock. if (mProcessLock) nsAutoLock::DestroyLock(mProcessLock); mProcessLock = nsnull; }
PR_IMPLEMENT(PRStatus) PR_CreateProcessDetached( const char *path, char *const *argv, char *const *envp, const PRProcessAttr *attr) { PRProcess *process; PRStatus rv; process = PR_CreateProcess(path, argv, envp, attr); if (NULL == process) { return PR_FAILURE; } rv = PR_DetachProcess(process); PR_ASSERT(PR_SUCCESS == rv); if (rv == PR_FAILURE) { PR_DELETE(process); return PR_FAILURE; } return PR_SUCCESS; }
NPError NPP_SetWindow(NPP instance, NPWindow* window) { PluginInstance* This; NPSetWindowCallbackStruct *ws_info; const SDL_VideoInfo* info = NULL; char windowEnv[3][500]; if (instance == NULL) return NPERR_INVALID_INSTANCE_ERROR; This = (PluginInstance*) instance->pdata; if (This == NULL) return NPERR_INVALID_INSTANCE_ERROR; ws_info = (NPSetWindowCallbackStruct *)window->ws_info; fprintf(stderr,"Setting up events for viewer\n"); int app_event_mask = !ButtonPressMask; XSelectInput(ws_info->display, (int)(window->window), app_event_mask); fprintf(stderr,"Loading environment for viewer:\n"); sprintf(windowEnv[0],"SDL_WINDOWID=%d",(int)(window->window)); sprintf(windowEnv[1],"FFW_WINX=%d",(int)(window->width)); sprintf(windowEnv[2],"FFW_WINY=%d",(int)(window->height)); int i=0; for(i=0; i<3; i++) putenv(windowEnv[i]); fprintf(stderr, "Window=(%i)\n", (int)(window->window)); fprintf(stderr, "W=(%i) H=(%i)\n",(int)window->width, (int)window->height); /* if(SDL_Init(SDL_INIT_EVERYTHING)==-1) return NPERR_GENERIC_ERROR; info = SDL_GetVideoInfo(); if(!info) { fprintf(stderr,"err1\n"); return NPERR_GENERIC_ERROR; } SDL_GL_SetAttribute(SDL_GL_RED_SIZE,8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,8); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,8); if((SDL_SetVideoMode(window->x,window->y,0,SDL_OPENGL | SDL_RESIZABLE | SDL_DOUBLEBUF | SDL_ASYNCBLIT ))==0) { fprintf(stderr,"err2\n"); return NPERR_GENERIC_ERROR; } glViewport(0,0,(GLsizei) window->x , (GLsizei) window->y ); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D (0.0, (GLdouble) window->x, 0.0, (GLdouble) window->y); /*glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glClearColor(1,0,0,1);*/ /**/ #ifdef MOZ_X11 // if (This->window == (Window) window->window) { /* The page with the plugin is being resized. Save any UI information because the next time around expect a SetWindow with a new window id. */ // return NPERR_NO_ERROR; // } else { This->window = (Window) window->window; This->x = window->x; This->y = window->y; This->width = window->width; This->height = window->height; This->display = ws_info->display; This->visual = ws_info->visual; This->depth = ws_info->depth; This->colormap = ws_info->colormap; makePixmap(This); makeWidget(This); // } #endif /* #ifdef MOZ_X11 */ if (viewer_proc == NULL) { char viewerArgs[2][50]; PRProcessAttr* viewerProcAttr = PR_NewProcessAttr(); PR_ProcessAttrSetCurrentDirectory(viewerProcAttr,"/slbrowser/"); sprintf(viewerArgs[0],"/slbrowser/packaged/secondlife\0"); sprintf(viewerArgs[1],"--autologin\0"); fprintf(stderr,"Starting viewer!\n"); viewer_proc = PR_CreateProcess("/slbrowser/secondlife",NULL,NULL,viewerProcAttr); PR_DetachProcess(viewer_proc); } return NPERR_NO_ERROR; }