1 #include "base/switchCallbacks.h"
2 #include <string.h>
3 #include <stdlib.h>
4
5 Callbacks *last_callback = NULL;
6 Callbacks *current_callback = NULL;
7
exitCallback(Callbacks * cb)8 void exitCallback(Callbacks *cb) {
9 if(cb != NULL)
10 if(cb->exit != NULL)
11 (cb->exit)(); /* give them the chance to quit */
12 }
13
initCallback(Callbacks * cb)14 void initCallback(Callbacks *cb) {
15 if(cb->init != NULL)
16 (cb->init)();
17 if(cb->initGL != NULL)
18 (cb->initGL)();
19 }
20
21
switchCallbacks(Callbacks * new)22 void switchCallbacks(Callbacks *new) {
23 // if(current_callback)
24 // fprintf(stderr, "callbacks: exiting %s\n", current_callback->name);
25 exitCallback(current_callback);
26 SystemRegisterCallbacks(new);
27 // fprintf(stderr, "callbacks: initializing %s\n", new->name);
28 initCallback(new);
29
30 last_callback = current_callback;
31 current_callback = new;
32 }
33
updateCallbacks(void)34 void updateCallbacks(void) {
35 /* called when the window is recreated */
36 exitCallback(current_callback);
37 SystemRegisterCallbacks(current_callback);
38 initCallback(current_callback);
39 }
40
restoreCallbacks(void)41 void restoreCallbacks(void) {
42 if(last_callback == NULL) {
43 fprintf(stderr, "fatal: no last callback present, exiting\n");
44 exit(1); // OK: programmer error, critical
45 }
46
47 exitCallback(last_callback);
48 current_callback = last_callback;
49 SystemRegisterCallbacks(current_callback);
50 initCallback(current_callback);
51 }
52
53 #define N_CALLBACKS 7
54 Callbacks *callbackList[N_CALLBACKS] = {
55 &gameCallbacks, &guiCallbacks, &pauseCallbacks, &configureCallbacks,
56 &promptCallbacks, &creditsCallbacks, &timedemoCallbacks
57 };
58
setCallback(const char * name)59 void setCallback(const char *name) {
60 int i;
61
62 for(i = 0; i < N_CALLBACKS; i++) {
63 if(strcmp( callbackList[i]->name, name ) == 0)
64 break;
65 }
66 if(i == N_CALLBACKS) {
67 fprintf(stderr, "fatal: no callback named '%s' found\n", name);
68 exit(1); // OK: programmer error, critical
69 }
70 switchCallbacks(callbackList[i]);
71 }
72
73
74