This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL.c
387 lines (343 loc) · 8.69 KB
1
2
/*
SDL - Simple DirectMedia Layer
3
Copyright (C) 1997-2009 Sam Lantinga
4
5
This library is free software; you can redistribute it and/or
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
8
version 2.1 of the License, or (at your option) any later version.
9
10
11
12
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
13
Lesser General Public License for more details.
14
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19
Sam Lantinga
20
slouken@libsdl.org
21
*/
22
#include "SDL_config.h"
23
24
25
26
27
/* Initialization code for SDL */
#include "SDL.h"
#include "SDL_fatal.h"
28
29
#include "SDL_assert.h"
30
31
32
33
34
35
#if !SDL_VIDEO_DISABLED
#include "video/SDL_leaks.h"
#endif
#if SDL_THREAD_PTH
#include <pth.h>
36
37
38
#endif
/* Initialization/Cleanup routines */
39
#if !SDL_JOYSTICK_DISABLED
40
extern int SDL_JoystickInit(void);
41
42
extern void SDL_JoystickQuit(void);
#endif
43
44
45
46
#if !SDL_HAPTIC_DISABLED
extern int SDL_HapticInit(void);
extern int SDL_HapticQuit(void);
#endif
47
#if !SDL_TIMERS_DISABLED
48
extern void SDL_StartTicks(void);
49
extern int SDL_TimerInit(void);
50
51
extern void SDL_TimerQuit(void);
#endif
52
53
54
55
#if defined(__WIN32__)
extern int SDL_HelperWindowCreate(void);
extern int SDL_HelperWindowDestroy(void);
#endif
56
57
58
59
extern int SDL_AssertionsInit(void);
extern void SDL_AssertionsQuit(void);
60
61
62
63
64
65
66
67
/* The initialized subsystems */
static Uint32 SDL_initialized = 0;
static Uint32 ticks_started = 0;
#ifdef CHECK_LEAKS
int surfaces_allocated = 0;
#endif
68
69
int
SDL_InitSubSystem(Uint32 flags)
70
{
71
#if !SDL_VIDEO_DISABLED
72
73
/* Initialize the video/event subsystem */
if ((flags & SDL_INIT_VIDEO) && !(SDL_initialized & SDL_INIT_VIDEO)) {
74
if (SDL_VideoInit(NULL, (flags & SDL_INIT_EVENTTHREAD)) < 0) {
75
76
77
78
return (-1);
}
SDL_initialized |= SDL_INIT_VIDEO;
}
79
#else
80
81
82
83
if (flags & SDL_INIT_VIDEO) {
SDL_SetError("SDL not built with video support");
return (-1);
}
84
85
#endif
86
#if !SDL_AUDIO_DISABLED
87
88
/* Initialize the audio subsystem */
if ((flags & SDL_INIT_AUDIO) && !(SDL_initialized & SDL_INIT_AUDIO)) {
89
if (SDL_AudioInit(NULL) < 0) {
90
91
92
93
return (-1);
}
SDL_initialized |= SDL_INIT_AUDIO;
}
94
#else
95
96
97
98
if (flags & SDL_INIT_AUDIO) {
SDL_SetError("SDL not built with audio support");
return (-1);
}
99
100
#endif
101
#if !SDL_TIMERS_DISABLED
102
103
104
105
106
107
108
109
110
111
112
/* Initialize the timer subsystem */
if (!ticks_started) {
SDL_StartTicks();
ticks_started = 1;
}
if ((flags & SDL_INIT_TIMER) && !(SDL_initialized & SDL_INIT_TIMER)) {
if (SDL_TimerInit() < 0) {
return (-1);
}
SDL_initialized |= SDL_INIT_TIMER;
}
113
#else
114
115
116
117
if (flags & SDL_INIT_TIMER) {
SDL_SetError("SDL not built with timer support");
return (-1);
}
118
119
#endif
120
#if !SDL_JOYSTICK_DISABLED
121
122
123
124
125
126
127
/* Initialize the joystick subsystem */
if ((flags & SDL_INIT_JOYSTICK) && !(SDL_initialized & SDL_INIT_JOYSTICK)) {
if (SDL_JoystickInit() < 0) {
return (-1);
}
SDL_initialized |= SDL_INIT_JOYSTICK;
}
128
#else
129
130
131
132
if (flags & SDL_INIT_JOYSTICK) {
SDL_SetError("SDL not built with joystick support");
return (-1);
}
133
134
#endif
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#if !SDL_HAPTIC_DISABLED
/* Initialize the haptic subsystem */
if ((flags & SDL_INIT_HAPTIC) && !(SDL_initialized & SDL_INIT_HAPTIC)) {
if (SDL_HapticInit() < 0) {
return (-1);
}
SDL_initialized |= SDL_INIT_HAPTIC;
}
#else
if (flags & SDL_INIT_HAPTIC) {
SDL_SetError("SDL not built with haptic (force feedback) support");
return (-1);
}
#endif
149
return (0);
150
151
}
152
153
int
SDL_Init(Uint32 flags)
154
{
155
#if !SDL_THREADS_DISABLED && SDL_THREAD_PTH
156
157
158
if (!pth_init()) {
return -1;
}
159
160
#endif
161
162
163
164
if (SDL_AssertionsInit() < 0) {
return -1;
}
165
166
/* Clear the error message */
SDL_ClearError();
167
168
169
170
171
172
173
#if defined(__WIN32__)
if (SDL_HelperWindowCreate() < 0) {
return -1;
}
#endif
174
175
176
177
/* Initialize the desired subsystems */
if (SDL_InitSubSystem(flags) < 0) {
return (-1);
}
178
179
180
181
182
/* Everything is initialized */
if (!(flags & SDL_INIT_NOPARACHUTE)) {
SDL_InstallParachute();
}
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/* brief sanity checks for the sanity checks. :) */
SDL_assert(1);
SDL_assert_release(1);
SDL_assert_paranoid(1);
SDL_assert(0 || 1);
SDL_assert_release(0 || 1);
SDL_assert_paranoid(0 || 1);
#if 0 /* enable this to test assertion failures. */
SDL_assert_release(1 == 2);
SDL_assert_release(5 < 4);
SDL_assert_release(0 && "This is a test");
#endif
198
return (0);
199
200
}
201
202
void
SDL_QuitSubSystem(Uint32 flags)
203
{
204
/* Shut down requested initialized subsystems */
205
#if !SDL_JOYSTICK_DISABLED
206
207
208
209
if ((flags & SDL_initialized & SDL_INIT_JOYSTICK)) {
SDL_JoystickQuit();
SDL_initialized &= ~SDL_INIT_JOYSTICK;
}
210
#endif
211
212
213
214
215
216
#if !SDL_HAPTIC_DISABLED
if ((flags & SDL_initialized & SDL_INIT_HAPTIC)) {
SDL_HapticQuit();
SDL_initialized &= ~SDL_INIT_HAPTIC;
}
#endif
217
#if !SDL_TIMERS_DISABLED
218
219
220
221
if ((flags & SDL_initialized & SDL_INIT_TIMER)) {
SDL_TimerQuit();
SDL_initialized &= ~SDL_INIT_TIMER;
}
222
#endif
223
#if !SDL_AUDIO_DISABLED
224
225
226
227
if ((flags & SDL_initialized & SDL_INIT_AUDIO)) {
SDL_AudioQuit();
SDL_initialized &= ~SDL_INIT_AUDIO;
}
228
#endif
229
#if !SDL_VIDEO_DISABLED
230
231
232
233
if ((flags & SDL_initialized & SDL_INIT_VIDEO)) {
SDL_VideoQuit();
SDL_initialized &= ~SDL_INIT_VIDEO;
}
234
235
236
#endif
}
237
238
Uint32
SDL_WasInit(Uint32 flags)
239
{
240
241
242
243
if (!flags) {
flags = SDL_INIT_EVERYTHING;
}
return (SDL_initialized & flags);
244
245
}
246
247
void
SDL_Quit(void)
248
{
249
/* Quit all subsystems */
250
#ifdef DEBUG_BUILD
251
252
printf("[SDL_Quit] : Enter! Calling QuitSubSystem()\n");
fflush(stdout);
253
#endif
254
255
256
257
#if defined(__WIN32__)
SDL_HelperWindowDestroy();
#endif
258
SDL_QuitSubSystem(SDL_INIT_EVERYTHING);
259
260
#ifdef CHECK_LEAKS
261
#ifdef DEBUG_BUILD
262
263
printf("[SDL_Quit] : CHECK_LEAKS\n");
fflush(stdout);
264
265
#endif
266
/* !!! FIXME: make this an assertion. */
267
268
269
270
271
/* Print the number of surfaces not freed */
if (surfaces_allocated != 0) {
fprintf(stderr, "SDL Warning: %d SDL surfaces extant\n",
surfaces_allocated);
}
272
#endif
273
#ifdef DEBUG_BUILD
274
275
printf("[SDL_Quit] : SDL_UninstallParachute()\n");
fflush(stdout);
276
#endif
277
278
279
/* Uninstall any parachute signal handlers */
SDL_UninstallParachute();
280
281
282
SDL_AssertionsQuit();
283
#if !SDL_THREADS_DISABLED && SDL_THREAD_PTH
284
pth_kill();
285
#endif
286
#ifdef DEBUG_BUILD
287
288
printf("[SDL_Quit] : Returning!\n");
fflush(stdout);
289
290
#endif
291
292
}
293
294
295
/* Get the library version number */
void
SDL_GetVersion(SDL_version * ver)
296
{
297
SDL_VERSION(ver);
298
299
}
300
301
/* Get the library source revision */
int
302
SDL_GetRevision(void)
303
{
304
return SDL_REVISION;
305
306
}
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
/* Get the name of the platform */
const char *
SDL_GetPlatform()
{
#if __AIX__
return "AIX";
#elif __HAIKU__
/* Haiku must appear here before BeOS, since it also defines __BEOS__ */
return "Haiku";
#elif __BEOS__
return "BeOS";
#elif __BSDI__
return "BSDI";
#elif __DREAMCAST__
return "Dreamcast";
#elif __FREEBSD__
return "FreeBSD";
#elif __HPUX__
return "HP-UX";
#elif __IRIX__
return "Irix";
#elif __LINUX__
return "Linux";
#elif __MINT__
return "Atari MiNT";
#elif __MACOS__
return "MacOS Classic";
#elif __MACOSX__
return "Mac OS X";
#elif __NETBSD__
return "NetBSD";
#elif __OPENBSD__
return "OpenBSD";
#elif __OS2__
return "OS/2";
#elif __OSF__
return "OSF/1";
#elif __QNXNTO__
return "QNX Neutrino";
#elif __RISCOS__
return "RISC OS";
#elif __SOLARIS__
return "Solaris";
#elif __WIN32__
#ifdef _WIN32_WCE
return "Windows CE";
#else
return "Windows";
#endif
#elif __IPHONEOS__
return "iPhone OS";
#else
return "Unknown (see SDL_platform.h)";
#endif
}
363
#if defined(__WIN32__)
364
365
366
#if !defined(HAVE_LIBC) || (defined(__WATCOMC__) && defined(BUILD_DLL))
/* Need to include DllMain() on Watcom C for some reason.. */
367
368
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
369
370
371
372
BOOL APIENTRY
_DllMainCRTStartup(HANDLE hModule,
DWORD ul_reason_for_call, LPVOID lpReserved)
373
{
374
375
376
377
378
379
380
381
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
382
}
383
#endif /* building DLL with Watcom C */
384
385
#endif /* __WIN32__ */
386
387
/* vi: set ts=4 sw=4 expandtab: */