X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=vrtris;a=blobdiff_plain;f=src%2Fscreen.c;h=7242a3fb9987a3515c8ba199a6f1cc9a459b7fbc;hp=9b80cf590e5f77067ffbc746adaf84504cd3e65d;hb=06a83976694c970fcf42bfdfc91832e780ca4747;hpb=1b62e1cf0e1cf019b42ee232ba838d06c55b8cda diff --git a/src/screen.c b/src/screen.c index 9b80cf5..7242a3f 100644 --- a/src/screen.c +++ b/src/screen.c @@ -1,6 +1,7 @@ #include #include "screen.h" #include "opt.h" +#include "logger.h" /* defined in their respective screen source files */ struct game_screen main_menu_screen; @@ -9,8 +10,6 @@ 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 = 0; @@ -20,14 +19,15 @@ int init_screens(void) screens[i++] = &game_screen; num_screens = i; - stack = screens[0]; + 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) { - stack = screens[i]; + screen = screens[i]; } } return 0; @@ -44,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; }