X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fscreen.c;h=7242a3fb9987a3515c8ba199a6f1cc9a459b7fbc;hb=fb9a8d7e99aa7429f114644971b1ca20f196a3bf;hp=6638b4e45ab14eb58fabd303034a9b60e545bd7a;hpb=49fdb2457dbb7705501264d519e840dd3ca60919;p=vrtris diff --git a/src/screen.c b/src/screen.c index 6638b4e..7242a3f 100644 --- a/src/screen.c +++ b/src/screen.c @@ -1,18 +1,34 @@ +#include #include "screen.h" +#include "opt.h" +#include "logger.h" + +/* defined in their respective screen source files */ +struct game_screen main_menu_screen; +struct game_screen game_screen; static struct game_screen *screens[16]; static int num_screens; -static struct game_screen *stack; - int init_screens(void) { - int i; + int i = 0; + + /* populate the screens */ + screens[i++] = &main_menu_screen; + screens[i++] = &game_screen; + num_screens = i; + + screen = screens[0]; + screen->next = 0; for(i=0; iinit() == -1) { return -1; } + if(opt.start_scr && strcmp(screens[i]->name, opt.start_scr) == 0) { + screen = screens[i]; + } } return 0; } @@ -28,27 +44,37 @@ void cleanup_screens(void) void reshape_screens(int x, int y) { - struct game_screen *s = stack; + struct game_screen *s = screen; while(s) { s->reshape(x, y); s = s->next; } } -void push_screen(struct game_screen *s) +int push_screen(struct game_screen *s) { - s->next = stack; - stack = s; + struct game_screen *it = screen; + while(it && it != s) { + it = it->next; + } + if(it == s) { + error_log("attempting to push screen %s more than once!\n", s->name); + return -1; + } + + s->next = screen; + screen = s; s->start(); + return 0; } int pop_screen(void) { struct game_screen *s; - if(!stack->next) return -1; - s = stack; - stack = stack->next; + if(!screen->next) return -1; + s = screen; + screen = screen->next; s->stop(); return 0; }