Mercurial > sdl-ios-xcode
comparison src/video/x11/SDL_x11dyn.c @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | 9e85b267f8f3 |
children |
comparison
equal
deleted
inserted
replaced
1894:c69cee13dd76 | 1895:c121d94672cb |
---|---|
51 #endif | 51 #endif |
52 #ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR | 52 #ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR |
53 #define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR NULL | 53 #define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR NULL |
54 #endif | 54 #endif |
55 | 55 |
56 static x11dynlib x11libs[] = | 56 static x11dynlib x11libs[] = { |
57 { | 57 {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC}, |
58 { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC }, | 58 {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT}, |
59 { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT }, | 59 {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER}, |
60 { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER }, | 60 {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR}, |
61 { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR }, | |
62 }; | 61 }; |
63 | 62 |
64 static void X11_GetSym(const char *fnname, int *rc, void **fn) | 63 static void |
64 X11_GetSym(const char *fnname, int *rc, void **fn) | |
65 { | 65 { |
66 int i; | 66 int i; |
67 for (i = 0; i < SDL_TABLESIZE(x11libs); i++) { | 67 for (i = 0; i < SDL_TABLESIZE(x11libs); i++) { |
68 if (x11libs[i].lib != NULL) | 68 if (x11libs[i].lib != NULL) { |
69 { | 69 *fn = SDL_LoadFunction(x11libs[i].lib, fnname); |
70 *fn = SDL_LoadFunction(x11libs[i].lib, fnname); | 70 if (*fn != NULL) |
71 if (*fn != NULL) | 71 break; |
72 break; | 72 } |
73 } | 73 } |
74 } | |
75 | 74 |
76 #if DEBUG_DYNAMIC_X11 | 75 #if DEBUG_DYNAMIC_X11 |
77 if (*fn != NULL) | 76 if (*fn != NULL) |
78 printf("X11: Found '%s' in %s (%p)\n", fnname, x11libs[i].libname, *fn); | 77 printf("X11: Found '%s' in %s (%p)\n", fnname, x11libs[i].libname, |
79 else | 78 *fn); |
80 printf("X11: Symbol '%s' NOT FOUND!\n", fnname); | 79 else |
81 #endif | 80 printf("X11: Symbol '%s' NOT FOUND!\n", fnname); |
81 #endif | |
82 | 82 |
83 if (*fn == NULL) | 83 if (*fn == NULL) |
84 *rc = 0; /* kill this module. */ | 84 *rc = 0; /* kill this module. */ |
85 } | 85 } |
86 | 86 |
87 | 87 |
88 /* Define all the function pointers and wrappers... */ | 88 /* Define all the function pointers and wrappers... */ |
89 #define SDL_X11_MODULE(modname) | 89 #define SDL_X11_MODULE(modname) |
91 static rc (*p##fn) params = NULL; \ | 91 static rc (*p##fn) params = NULL; \ |
92 rc fn params { ret p##fn args ; } | 92 rc fn params { ret p##fn args ; } |
93 #include "SDL_x11sym.h" | 93 #include "SDL_x11sym.h" |
94 #undef SDL_X11_MODULE | 94 #undef SDL_X11_MODULE |
95 #undef SDL_X11_SYM | 95 #undef SDL_X11_SYM |
96 #endif /* SDL_VIDEO_DRIVER_X11_DYNAMIC */ | 96 #endif /* SDL_VIDEO_DRIVER_X11_DYNAMIC */ |
97 | 97 |
98 /* Annoying varargs entry point... */ | 98 /* Annoying varargs entry point... */ |
99 #ifdef X_HAVE_UTF8_STRING | 99 #ifdef X_HAVE_UTF8_STRING |
100 XIC (*pXCreateIC)(XIM,...) = NULL; | 100 XIC(*pXCreateIC) (XIM,...) = NULL; |
101 #endif | 101 #endif |
102 | 102 |
103 /* These SDL_X11_HAVE_* flags are here whether you have dynamic X11 or not. */ | 103 /* These SDL_X11_HAVE_* flags are here whether you have dynamic X11 or not. */ |
104 #define SDL_X11_MODULE(modname) int SDL_X11_HAVE_##modname = 1; | 104 #define SDL_X11_MODULE(modname) int SDL_X11_HAVE_##modname = 1; |
105 #define SDL_X11_SYM(rc,fn,params,args,ret) | 105 #define SDL_X11_SYM(rc,fn,params,args,ret) |
108 #undef SDL_X11_SYM | 108 #undef SDL_X11_SYM |
109 | 109 |
110 | 110 |
111 static int x11_load_refcount = 0; | 111 static int x11_load_refcount = 0; |
112 | 112 |
113 void SDL_X11_UnloadSymbols(void) | 113 void |
114 SDL_X11_UnloadSymbols(void) | |
114 { | 115 { |
115 #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC | 116 #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC |
116 /* Don't actually unload if more than one module is using the libs... */ | 117 /* Don't actually unload if more than one module is using the libs... */ |
117 if (x11_load_refcount > 0) { | 118 if (x11_load_refcount > 0) { |
118 if (--x11_load_refcount == 0) { | 119 if (--x11_load_refcount == 0) { |
119 int i; | 120 int i; |
120 | 121 |
121 /* set all the function pointers to NULL. */ | 122 /* set all the function pointers to NULL. */ |
122 #define SDL_X11_MODULE(modname) SDL_X11_HAVE_##modname = 1; | 123 #define SDL_X11_MODULE(modname) SDL_X11_HAVE_##modname = 1; |
123 #define SDL_X11_SYM(rc,fn,params,args,ret) p##fn = NULL; | 124 #define SDL_X11_SYM(rc,fn,params,args,ret) p##fn = NULL; |
124 #include "SDL_x11sym.h" | 125 #include "SDL_x11sym.h" |
125 #undef SDL_X11_MODULE | 126 #undef SDL_X11_MODULE |
126 #undef SDL_X11_SYM | 127 #undef SDL_X11_SYM |
127 | 128 |
128 #ifdef X_HAVE_UTF8_STRING | 129 #ifdef X_HAVE_UTF8_STRING |
129 pXCreateIC = NULL; | 130 pXCreateIC = NULL; |
130 #endif | 131 #endif |
131 | 132 |
132 for (i = 0; i < SDL_TABLESIZE(x11libs); i++) { | 133 for (i = 0; i < SDL_TABLESIZE(x11libs); i++) { |
133 if (x11libs[i].lib != NULL) { | 134 if (x11libs[i].lib != NULL) { |
134 SDL_UnloadObject(x11libs[i].lib); | 135 SDL_UnloadObject(x11libs[i].lib); |
135 x11libs[i].lib = NULL; | 136 x11libs[i].lib = NULL; |
136 } | 137 } |
137 } | 138 } |
138 } | 139 } |
139 } | 140 } |
140 #endif | 141 #endif |
141 } | 142 } |
142 | 143 |
143 /* returns non-zero if all needed symbols were loaded. */ | 144 /* returns non-zero if all needed symbols were loaded. */ |
144 int SDL_X11_LoadSymbols(void) | 145 int |
146 SDL_X11_LoadSymbols(void) | |
145 { | 147 { |
146 int rc = 1; /* always succeed if not using Dynamic X11 stuff. */ | 148 int rc = 1; /* always succeed if not using Dynamic X11 stuff. */ |
147 | 149 |
148 #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC | 150 #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC |
149 /* deal with multiple modules (dga, x11, etc) needing these symbols... */ | 151 /* deal with multiple modules (dga, x11, etc) needing these symbols... */ |
150 if (x11_load_refcount++ == 0) { | 152 if (x11_load_refcount++ == 0) { |
151 int i; | 153 int i; |
152 int *thismod = NULL; | 154 int *thismod = NULL; |
153 for (i = 0; i < SDL_TABLESIZE(x11libs); i++) { | 155 for (i = 0; i < SDL_TABLESIZE(x11libs); i++) { |
154 if (x11libs[i].libname != NULL) { | 156 if (x11libs[i].libname != NULL) { |
155 x11libs[i].lib = SDL_LoadObject(x11libs[i].libname); | 157 x11libs[i].lib = SDL_LoadObject(x11libs[i].libname); |
156 } | 158 } |
157 } | 159 } |
158 #define SDL_X11_MODULE(modname) thismod = &SDL_X11_HAVE_##modname; | 160 #define SDL_X11_MODULE(modname) thismod = &SDL_X11_HAVE_##modname; |
159 #define SDL_X11_SYM(a,fn,x,y,z) X11_GetSym(#fn,thismod,(void**)&p##fn); | 161 #define SDL_X11_SYM(a,fn,x,y,z) X11_GetSym(#fn,thismod,(void**)&p##fn); |
160 #include "SDL_x11sym.h" | 162 #include "SDL_x11sym.h" |
161 #undef SDL_X11_MODULE | 163 #undef SDL_X11_MODULE |
162 #undef SDL_X11_SYM | 164 #undef SDL_X11_SYM |
163 | 165 |
164 #ifdef X_HAVE_UTF8_STRING | 166 #ifdef X_HAVE_UTF8_STRING |
165 X11_GetSym("XCreateIC",&SDL_X11_HAVE_UTF8,(void **)&pXCreateIC); | 167 X11_GetSym("XCreateIC", &SDL_X11_HAVE_UTF8, (void **) &pXCreateIC); |
166 #endif | 168 #endif |
167 | 169 |
168 if (!SDL_X11_HAVE_BASEXLIB) { /* some required symbol didn't load. */ | 170 if (!SDL_X11_HAVE_BASEXLIB) { /* some required symbol didn't load. */ |
169 SDL_X11_UnloadSymbols(); /* in case something got loaded... */ | 171 SDL_X11_UnloadSymbols(); /* in case something got loaded... */ |
170 rc = 0; | 172 rc = 0; |
171 } | 173 } |
172 } | 174 } |
173 #else | 175 #else |
174 #if DEBUG_DYNAMIC_X11 | 176 #ifdef X_HAVE_UTF8_STRING |
175 printf("X11: No dynamic X11 support in this build of SDL.\n"); | 177 pXCreateIC = XCreateIC; |
176 #endif | 178 #endif |
177 #ifdef X_HAVE_UTF8_STRING | 179 #endif |
178 pXCreateIC = XCreateIC; | |
179 #endif | |
180 #endif | |
181 | 180 |
182 return rc; | 181 return rc; |
183 } | 182 } |
184 | 183 |
185 /* end of SDL_x11dyn.c ... */ | 184 /* end of SDL_x11dyn.c ... */ |
186 | 185 /* vi: set ts=4 sw=4 expandtab: */ |