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