Atlas - SDL_x11dyn.c

Home / ext / SDL2 / src / video / x11 Lines: 3 | Size: 6228 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)]
[FILE BEGIN]
1/* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2018 Sam Lantinga <[email protected]> 4 5 This software is provided 'as-is', without any express or implied 6 warranty. In no event will the authors be held liable for any damages 7 arising from the use of this software. 8 9 Permission is granted to anyone to use this software for any purpose, 10 including commercial applications, and to alter it and redistribute it 11 freely, subject to the following restrictions: 12 13 1. The origin of this software must not be misrepresented; you must not 14 claim that you wrote the original software. If you use this software 15 in a product, an acknowledgment in the product documentation would be 16 appreciated but is not required. 17 2. Altered source versions must be plainly marked as such, and must not be 18 misrepresented as being the original software. 19 3. This notice may not be removed or altered from any source distribution. 20*/ 21#include "../../SDL_internal.h" 22 23#if SDL_VIDEO_DRIVER_X11 24 25#define DEBUG_DYNAMIC_X11 0 26 27#include "SDL_x11dyn.h" 28 29#if DEBUG_DYNAMIC_X11 30#include <stdio.h> 31#endif 32 33#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC 34 35#include "SDL_name.h" 36#include "SDL_loadso.h" 37 38typedef struct 39{ 40 void *lib; 41 const char *libname; 42} x11dynlib; 43 44#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC 45#define SDL_VIDEO_DRIVER_X11_DYNAMIC NULL 46#endif 47#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT 48#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT NULL 49#endif 50#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR 51#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR NULL 52#endif 53#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA 54#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA NULL 55#endif 56#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 57#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 NULL 58#endif 59#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR 60#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR NULL 61#endif 62#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS 63#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS NULL 64#endif 65#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE 66#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE NULL 67#endif 68 69static x11dynlib x11libs[] = { 70 {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC}, 71 {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT}, 72 {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR}, 73 {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA}, 74 {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2}, 75 {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR}, 76 {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS}, 77 {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE} 78}; 79 80static void * 81X11_GetSym(const char *fnname, int *pHasModule) 82{ 83 int i; 84 void *fn = NULL; 85 for (i = 0; i < SDL_TABLESIZE(x11libs); i++) { 86 if (x11libs[i].lib != NULL) { 87 fn = SDL_LoadFunction(x11libs[i].lib, fnname); 88 if (fn != NULL) 89 break; 90 } 91 } 92 93#if DEBUG_DYNAMIC_X11 94 if (fn != NULL) 95 printf("X11: Found '%s' in %s (%p)\n", fnname, x11libs[i].libname, fn); 96 else 97 printf("X11: Symbol '%s' NOT FOUND!\n", fnname); 98#endif 99 100 if (fn == NULL) 101 *pHasModule = 0; /* kill this module. */ 102 103 return fn; 104} 105 106#endif /* SDL_VIDEO_DRIVER_X11_DYNAMIC */ 107 108/* Define all the function pointers and wrappers... */ 109#define SDL_X11_SYM(rc,fn,params,args,ret) SDL_DYNX11FN_##fn X11_##fn = NULL; 110#include "SDL_x11sym.h" 111 112/* Annoying varargs entry point... */ 113#ifdef X_HAVE_UTF8_STRING 114SDL_DYNX11FN_XCreateIC X11_XCreateIC = NULL; 115SDL_DYNX11FN_XGetICValues X11_XGetICValues = NULL; 116#endif 117 118/* These SDL_X11_HAVE_* flags are here whether you have dynamic X11 or not. */ 119#define SDL_X11_MODULE(modname) int SDL_X11_HAVE_##modname = 0; 120#include "SDL_x11sym.h" 121 122static int x11_load_refcount = 0; 123 124void 125SDL_X11_UnloadSymbols(void) 126{ 127 /* Don't actually unload if more than one module is using the libs... */ 128 if (x11_load_refcount > 0) { 129 if (--x11_load_refcount == 0) { 130 int i; 131 132 /* set all the function pointers to NULL. */ 133#define SDL_X11_MODULE(modname) SDL_X11_HAVE_##modname = 0; 134#define SDL_X11_SYM(rc,fn,params,args,ret) X11_##fn = NULL; 135#include "SDL_x11sym.h" 136 137#ifdef X_HAVE_UTF8_STRING 138 X11_XCreateIC = NULL; 139 X11_XGetICValues = NULL; 140#endif 141 142#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC 143 for (i = 0; i < SDL_TABLESIZE(x11libs); i++) { 144 if (x11libs[i].lib != NULL) { 145 SDL_UnloadObject(x11libs[i].lib); 146 x11libs[i].lib = NULL; 147 } 148 } 149#endif 150 } 151 } 152} 153 154/* returns non-zero if all needed symbols were loaded. */ 155int 156SDL_X11_LoadSymbols(void) 157{ 158 int rc = 1; /* always succeed if not using Dynamic X11 stuff. */ 159 160 /* deal with multiple modules (dga, x11, etc) needing these symbols... */ 161 if (x11_load_refcount++ == 0) { 162#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC 163 int i; 164 int *thismod = NULL; 165 for (i = 0; i < SDL_TABLESIZE(x11libs); i++) { 166 if (x11libs[i].libname != NULL) { 167 x11libs[i].lib = SDL_LoadObject(x11libs[i].libname); 168 } 169 } 170 171#define SDL_X11_MODULE(modname) SDL_X11_HAVE_##modname = 1; /* default yes */ 172#include "SDL_x11sym.h" 173 174#define SDL_X11_MODULE(modname) thismod = &SDL_X11_HAVE_##modname; 175#define SDL_X11_SYM(a,fn,x,y,z) X11_##fn = (SDL_DYNX11FN_##fn) X11_GetSym(#fn,thismod); 176#include "SDL_x11sym.h" 177 178#ifdef X_HAVE_UTF8_STRING 179 X11_XCreateIC = (SDL_DYNX11FN_XCreateIC) 180 X11_GetSym("XCreateIC", &SDL_X11_HAVE_UTF8); 181 X11_XGetICValues = (SDL_DYNX11FN_XGetICValues) 182 X11_GetSym("XGetICValues", &SDL_X11_HAVE_UTF8); 183#endif 184 185 if (SDL_X11_HAVE_BASEXLIB) { 186 /* all required symbols loaded. */ 187 SDL_ClearError(); 188 } else { 189 /* in case something got loaded... */ 190 SDL_X11_UnloadSymbols(); 191 rc = 0; 192 } 193 194#else /* no dynamic X11 */ 195 196#define SDL_X11_MODULE(modname) SDL_X11_HAVE_##modname = 1; /* default yes */ 197#define SDL_X11_SYM(a,fn,x,y,z) X11_##fn = (SDL_DYNX11FN_##fn) fn; 198#include "SDL_x11sym.h" 199 200#ifdef X_HAVE_UTF8_STRING 201 X11_XCreateIC = XCreateIC; 202 X11_XGetICValues = XGetICValues; 203#endif 204#endif 205 } 206 207 return rc; 208} 209 210#endif /* SDL_VIDEO_DRIVER_X11 */ 211 212/* vi: set ts=4 sw=4 expandtab: */ 213
[FILE END]
(C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.