blob: 120613cd4f770c6bef1d747597e847efe28af78b [file] [log] [blame]
/*
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
*/
#if 0
#define DEBUG_DYNAMIC_X11 1
#endif
#include "SDL_config.h"
#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 ... */