mesh loading
[vrtris] / src / screen.c
index 9b80cf5..7242a3f 100644 (file)
@@ -1,6 +1,7 @@
 #include <string.h>
 #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; i<num_screens; i++) {
                if(screens[i]->init() == -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;
 }