int load_sdl_funcs(struct sdlfuncs *sdlf) { dll_handle sdl_dll; const char *libnames[]={"SDL", "SDL-1.2", "SDL-1.1", NULL}; putenv("SDL_VIDEO_ALLOW_SCREENSAVER=1"); sdlf->gotfuncs=0; if((sdl_dll=xp_dlopen(libnames,RTLD_LAZY|RTLD_GLOBAL,SDL_PATCHLEVEL))==NULL) return(-1); #ifdef _WIN32 if((sdlf->SetModuleHandle=xp_dlsym(sdl_dll, SDL_SetModuleHandle))==NULL) { xp_dlclose(sdl_dll); return(-1); } #endif if((sdlf->Init=xp_dlsym(sdl_dll, SDL_Init))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->Quit=xp_dlsym(sdl_dll, SDL_Quit))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->mutexP=xp_dlsym(sdl_dll, SDL_mutexP))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->mutexV=xp_dlsym(sdl_dll, SDL_mutexV))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->PeepEvents=xp_dlsym(sdl_dll, SDL_PeepEvents))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->VideoDriverName=xp_dlsym(sdl_dll, SDL_VideoDriverName))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->SemWait=xp_dlsym(sdl_dll, SDL_SemWait))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->SemWaitTimeout=xp_dlsym(sdl_dll, SDL_SemWaitTimeout))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->SemPost=xp_dlsym(sdl_dll, SDL_SemPost))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->EventState=xp_dlsym(sdl_dll, SDL_EventState))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->CreateRGBSurface=xp_dlsym(sdl_dll, SDL_CreateRGBSurface))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->CreateRGBSurfaceFrom=xp_dlsym(sdl_dll, SDL_CreateRGBSurfaceFrom))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->FillRect=xp_dlsym(sdl_dll, SDL_FillRect))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->SetColors=xp_dlsym(sdl_dll, SDL_SetColors))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->BlitSurface=xp_dlsym(sdl_dll, SDL_UpperBlit))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->UpdateRects=xp_dlsym(sdl_dll, SDL_UpdateRects))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->UpdateRect=xp_dlsym(sdl_dll, SDL_UpdateRect))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->SDL_CreateSemaphore=xp_dlsym(sdl_dll, SDL_CreateSemaphore))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->SDL_DestroySemaphore=xp_dlsym(sdl_dll, SDL_DestroySemaphore))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->SDL_CreateMutex=xp_dlsym(sdl_dll, SDL_CreateMutex))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->CreateThread=xp_dlsym(sdl_dll, SDL_CreateThread))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->KillThread=xp_dlsym(sdl_dll, SDL_KillThread))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->WaitThread=xp_dlsym(sdl_dll, SDL_WaitThread))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->WaitEvent=xp_dlsym(sdl_dll, SDL_WaitEvent))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->SetVideoMode=xp_dlsym(sdl_dll, SDL_SetVideoMode))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->FreeSurface=xp_dlsym(sdl_dll, SDL_FreeSurface))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->WM_SetCaption=xp_dlsym(sdl_dll, SDL_WM_SetCaption))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->WM_SetIcon=xp_dlsym(sdl_dll, SDL_WM_SetIcon))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->ShowCursor=xp_dlsym(sdl_dll, SDL_ShowCursor))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->WasInit=xp_dlsym(sdl_dll, SDL_WasInit))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->EnableUNICODE=xp_dlsym(sdl_dll, SDL_EnableUNICODE))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->EnableKeyRepeat=xp_dlsym(sdl_dll, SDL_EnableKeyRepeat))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->GetWMInfo=xp_dlsym(sdl_dll, SDL_GetWMInfo))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->GetError=xp_dlsym(sdl_dll, SDL_GetError))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->InitSubSystem=xp_dlsym(sdl_dll, SDL_InitSubSystem))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->QuitSubSystem=xp_dlsym(sdl_dll, SDL_QuitSubSystem))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->OpenAudio=xp_dlsym(sdl_dll, SDL_OpenAudio))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->CloseAudio=xp_dlsym(sdl_dll, SDL_CloseAudio))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->PauseAudio=xp_dlsym(sdl_dll, SDL_PauseAudio))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->LockAudio=xp_dlsym(sdl_dll, SDL_LockAudio))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->UnlockAudio=xp_dlsym(sdl_dll, SDL_UnlockAudio))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->GetAudioStatus=xp_dlsym(sdl_dll, SDL_GetAudioStatus))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->MapRGB=xp_dlsym(sdl_dll, SDL_MapRGB))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->LockSurface=xp_dlsym(sdl_dll, SDL_LockSurface))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->UnlockSurface=xp_dlsym(sdl_dll, SDL_UnlockSurface))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->DisplayFormat=xp_dlsym(sdl_dll, SDL_DisplayFormat))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->Flip=xp_dlsym(sdl_dll, SDL_Flip))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->CreateYUVOverlay=xp_dlsym(sdl_dll, SDL_CreateYUVOverlay))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->DisplayYUVOverlay=xp_dlsym(sdl_dll, SDL_DisplayYUVOverlay))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->FreeYUVOverlay=xp_dlsym(sdl_dll, SDL_FreeYUVOverlay))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->LockYUVOverlay=xp_dlsym(sdl_dll, SDL_LockYUVOverlay))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->UnlockYUVOverlay=xp_dlsym(sdl_dll, SDL_UnlockYUVOverlay))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->GetVideoInfo=xp_dlsym(sdl_dll, SDL_GetVideoInfo))==NULL) { xp_dlclose(sdl_dll); return(-1); } if((sdlf->Linked_Version=xp_dlsym(sdl_dll, SDL_Linked_Version))==NULL) { xp_dlclose(sdl_dll); return(-1); } sdlf->gotfuncs=1; sdl_funcs_loaded=1; return(0); }
int x_init(void) { dll_handle dl; const char *libnames[]={"X11",NULL}; Status (*xit)(void); /* Ensure we haven't already initialized */ if(x11_initialized) return(0); /* Set up the pipe for local events */ if(pipe(local_pipe)) return(-1); /* And the keyboard pipe */ if(pipe(key_pipe)) return(-1); /* Load X11 functions */ if((dl=xp_dlopen(libnames,RTLD_LAZY,7))==NULL) return(-1); if((xit=xp_dlsym(dl,XInitThreads))!=NULL) xit(); if((x11.XChangeGC=xp_dlsym(dl,XChangeGC))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XCopyPlane=xp_dlsym(dl,XCopyPlane))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XFillRectangle=xp_dlsym(dl,XFillRectangle))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XDrawPoint=xp_dlsym(dl,XDrawPoint))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XFlush=xp_dlsym(dl,XFlush))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XSync=xp_dlsym(dl,XSync))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XBell=xp_dlsym(dl,XBell))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XLookupString=xp_dlsym(dl,XLookupString))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XNextEvent=xp_dlsym(dl,XNextEvent))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XAllocSizeHints=xp_dlsym(dl,XAllocSizeHints))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XSetWMNormalHints=xp_dlsym(dl,XSetWMNormalHints))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XResizeWindow=xp_dlsym(dl,XResizeWindow))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XMapWindow=xp_dlsym(dl,XMapWindow))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XFree=xp_dlsym(dl,XFree))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XFreePixmap=xp_dlsym(dl,XFreePixmap))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XCreatePixmap=xp_dlsym(dl,XCreatePixmap))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XCopyArea=xp_dlsym(dl,XCopyArea))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XCreateBitmapFromData=xp_dlsym(dl,XCreateBitmapFromData))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XAllocColor=xp_dlsym(dl,XAllocColor))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XOpenDisplay=xp_dlsym(dl,XOpenDisplay))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XCreateSimpleWindow=xp_dlsym(dl,XCreateSimpleWindow))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XCreateGC=xp_dlsym(dl,XCreateGC))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XSelectInput=xp_dlsym(dl,XSelectInput))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XStoreName=xp_dlsym(dl,XStoreName))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XGetSelectionOwner=xp_dlsym(dl,XGetSelectionOwner))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XConvertSelection=xp_dlsym(dl,XConvertSelection))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XGetWindowProperty=xp_dlsym(dl,XGetWindowProperty))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XChangeProperty=xp_dlsym(dl,XChangeProperty))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XSendEvent=xp_dlsym(dl,XSendEvent))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XPutImage=xp_dlsym(dl,XPutImage))==NULL) { xp_dlclose(dl); return(-1); } #ifndef XDestroyImage if((x11.XDestroyImage=xp_dlsym(dl,XDestroyImage))==NULL) { xp_dlclose(dl); return(-1); } #endif #ifndef XPutPixel if((x11.XPutPixel=xp_dlsym(dl,XPutPixel))==NULL) { xp_dlclose(dl); return(-1); } #endif if((x11.XCreateImage=xp_dlsym(dl,XCreateImage))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XSetSelectionOwner=xp_dlsym(dl,XSetSelectionOwner))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XSetIconName=xp_dlsym(dl,XSetIconName))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XSynchronize=xp_dlsym(dl,XSynchronize))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XGetWindowAttributes=xp_dlsym(dl,XGetWindowAttributes))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XAllocWMHints=xp_dlsym(dl,XAllocWMHints))==NULL) { xp_dlclose(dl); return(-1); } if((x11.XSetWMProperties=xp_dlsym(dl,XSetWMProperties))==NULL) { xp_dlclose(dl); return(-1); } if(sem_init(&pastebuf_set, 0, 0)) { xp_dlclose(dl); return(-1); } if(sem_init(&pastebuf_used, 0, 0)) { xp_dlclose(dl); sem_destroy(&pastebuf_set); return(-1); } if(sem_init(&init_complete, 0, 0)) { xp_dlclose(dl); sem_destroy(&pastebuf_set); sem_destroy(&pastebuf_used); return(-1); } if(sem_init(&mode_set, 0, 0)) { xp_dlclose(dl); sem_destroy(&pastebuf_set); sem_destroy(&pastebuf_used); sem_destroy(&init_complete); return(-1); } if(pthread_mutex_init(©buf_mutex, 0)) { xp_dlclose(dl); sem_destroy(&pastebuf_set); sem_destroy(&pastebuf_used); sem_destroy(&init_complete); sem_destroy(&mode_set); return(-1); } _beginthread(x11_event_thread,1<<16,NULL); _beginthread(x11_mouse_thread,1<<16,NULL); sem_wait(&init_complete); if(!x11_initialized) { xp_dlclose(dl); sem_destroy(&pastebuf_set); sem_destroy(&pastebuf_used); sem_destroy(&init_complete); sem_destroy(&mode_set); pthread_mutex_destroy(©buf_mutex); return(-1); } return(0); }
/* Called from main thread only (Passes Event) */ int sdl_init(int mode) { #if !defined(NO_X) && defined(__unix__) dll_handle dl; const char *libnames[2]={"X11", NULL}; #endif if(init_sdl_video()) { fprintf(stderr, "SDL Video Init Failed\n"); return(-1); } bitmap_init(sdl_drawrect, sdl_flush); if(mode==CIOLIB_MODE_SDL_FULLSCREEN) fullscreen=1; if(mode==CIOLIB_MODE_SDL_YUV) yuv.enabled=1; if(mode==CIOLIB_MODE_SDL_YUV_FULLSCREEN) { yuv.enabled=1; fullscreen=1; } #if (SDL_MAJOR_VERSION > 1) || (SDL_MINOR_VERSION > 2) || (SDL_PATCHLEVEL > 9) if(yuv.enabled) { const SDL_version *linked=sdl.Linked_Version(); if(linked->major > 1 || linked->minor > 2 || linked->patch > 9) { yuv.screen_width=sdl.initial_videoinfo.current_w; yuv.screen_height=sdl.initial_videoinfo.current_h; } } #endif sdl_init_mode(3); if(yuv.enabled && yuv.overlay==NULL) { fprintf(stderr, "YUV Enabled, but overlay is NULL\n"); sdl_init_good=0; } sdl_user_func_ret(SDL_USEREVENT_INIT); if(sdl_init_good) { cio_api.mode=fullscreen?CIOLIB_MODE_SDL_FULLSCREEN:CIOLIB_MODE_SDL; #ifdef _WIN32 FreeConsole(); #endif #if !defined(NO_X) && defined(__unix__) dl=xp_dlopen(libnames,RTLD_LAZY|RTLD_GLOBAL,7); if(dl!=NULL) { sdl_x11available=TRUE; if(sdl_x11available && (sdl_x11.XFree=xp_dlsym(dl,XFree))==NULL) { xp_dlclose(dl); sdl_x11available=FALSE; } if(sdl_x11available && (sdl_x11.XGetSelectionOwner=xp_dlsym(dl,XGetSelectionOwner))==NULL) { xp_dlclose(dl); sdl_x11available=FALSE; } if(sdl_x11available && (sdl_x11.XConvertSelection=xp_dlsym(dl,XConvertSelection))==NULL) { xp_dlclose(dl); sdl_x11available=FALSE; } if(sdl_x11available && (sdl_x11.XGetWindowProperty=xp_dlsym(dl,XGetWindowProperty))==NULL) { xp_dlclose(dl); sdl_x11available=FALSE; } if(sdl_x11available && (sdl_x11.XChangeProperty=xp_dlsym(dl,XChangeProperty))==NULL) { xp_dlclose(dl); sdl_x11available=FALSE; } if(sdl_x11available && (sdl_x11.XSendEvent=xp_dlsym(dl,XSendEvent))==NULL) { xp_dlclose(dl); sdl_x11available=FALSE; } if(sdl_x11available && (sdl_x11.XSetSelectionOwner=xp_dlsym(dl,XSetSelectionOwner))==NULL) { xp_dlclose(dl); sdl_x11available=FALSE; } } if(sdl_x11available) sdl.EventState(SDL_SYSWMEVENT, SDL_ENABLE); #endif return(0); } return(-1); }