Mercurial > sdl-ios-xcode
view src/video/x11/SDL_x11dyn.c @ 1538:b1f8c14f0df5
*** empty log message ***
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Wed, 15 Mar 2006 03:50:34 +0000 |
parents | d910939febfa |
children | 3ba88cb7eb1b |
line wrap: on
line source
/* SDL - Simple DirectMedia Layer Copyright (C) 1997-2004 Sam Lantinga This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Sam Lantinga slouken@libsdl.org */ #include "SDL_config.h" #if 0 #define DEBUG_DYNAMIC_X11 1 #endif #define __SDL_NO_REDEFINE_X11_HEADER_SYMS 1 #include "SDL_x11dyn.h" #ifdef DEBUG_DYNAMIC_X11 #include <stdio.h> #endif #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC #include <dlfcn.h> #include "SDL_name.h" #include "SDL_loadso.h" static const char *x11_library = SDL_VIDEO_DRIVER_X11_DYNAMIC; static void *x11_handle = NULL; static const char *x11ext_library = SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT; static void *x11ext_handle = NULL; static void *X11_GetSym(int required, const char *fnname, int *rc) { void *fn = NULL; if (*rc) { /* haven't already failed on a previous lookup? */ fn = SDL_LoadFunction(x11_handle, fnname); #if DEBUG_DYNAMIC_X11 if (fn != NULL) printf("X11: Found '%s' in libX11 (%p)\n", fnname, fn); #endif if (fn == NULL) { /* not found? Check libX11ext ... */ fn = SDL_LoadFunction(x11ext_handle, fnname); #if DEBUG_DYNAMIC_X11 if (fn != NULL) printf("X11: Found '%s' in libXext (%p)\n", fnname, fn); else printf("X11: Symbol '%s' NOT FOUND!%s\n", fnname, required ? "" : " (...but not required!)"); #endif } *rc = ((fn != NULL) || (!required)); } return fn; } #endif /* SDL_VIDEO_DRIVER_X11_DYNAMIC */ /* Define all the function pointers... */ #define SDL_X11_SYM(req,ret,fn,params) ret (*p##fn) params = NULL; #include "SDL_x11sym.h" #undef SDL_X11_SYM static int x11_load_refcount = 0; void SDL_X11_UnloadSymbols(void) { /* Don't actually unload if more than one module is using the libs... */ if (x11_load_refcount > 0) { if (--x11_load_refcount == 0) { /* set all the function pointers to NULL. */ #define SDL_X11_SYM(req,ret,fn,params) p##fn = NULL; #include "SDL_x11sym.h" #undef SDL_X11_SYM #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC if (x11_handle != NULL) { SDL_UnloadObject(x11_handle); x11_handle = NULL; } if (x11ext_handle != NULL) { SDL_UnloadObject(x11ext_handle); x11ext_handle = NULL; } #endif } } } /* returns non-zero if all needed symbols were loaded. */ int SDL_X11_LoadSymbols(void) { int rc = 1; /* deal with multiple modules (dga, x11, etc) needing these symbols... */ if (x11_load_refcount++ == 0) { #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC x11_handle = SDL_LoadObject(x11_library); x11ext_handle = SDL_LoadObject(x11ext_library); rc = ((x11_handle != NULL) && (x11ext_handle != NULL)); #define SDL_X11_SYM(req,r,fn,arg) p##fn = X11_GetSym(req,#fn, &rc); #include "SDL_x11sym.h" #undef SDL_X11_SYM if (!rc) SDL_X11_UnloadSymbols(); /* in case one of these loaded... */ #else #define SDL_X11_SYM(req,r,fn,arg) p##fn = fn; #include "SDL_x11sym.h" #undef SDL_X11_SYM #endif } return rc; } /* end of SDL_x11dyn.c ... */