foo
[vrtris] / src / screen.c
1 #include <string.h>
2 #include "screen.h"
3 #include "opt.h"
4 #include "logger.h"
5
6 /* defined in their respective screen source files */
7 struct game_screen main_menu_screen;
8 struct game_screen game_screen;
9
10 static struct game_screen *screens[16];
11 static int num_screens;
12
13 int init_screens(void)
14 {
15         int i = 0;
16
17         /* populate the screens */
18         screens[i++] = &main_menu_screen;
19         screens[i++] = &game_screen;
20         num_screens = i;
21
22         screen = screens[0];
23         screen->next = 0;
24
25         for(i=0; i<num_screens; i++) {
26                 if(screens[i]->init() == -1) {
27                         return -1;
28                 }
29                 if(opt.start_scr && strcmp(screens[i]->name, opt.start_scr) == 0) {
30                         screen = screens[i];
31                 }
32         }
33
34         screen->start();
35         return 0;
36 }
37
38 void cleanup_screens(void)
39 {
40         int i;
41
42         for(i=0; i<num_screens; i++) {
43                 screens[i]->cleanup();
44         }
45 }
46
47 void reshape_screens(int x, int y)
48 {
49         struct game_screen *s = screen;
50         while(s) {
51                 s->reshape(x, y);
52                 s = s->next;
53         }
54 }
55
56 int push_screen(struct game_screen *s)
57 {
58         struct game_screen *it = screen;
59         while(it && it != s) {
60                 it = it->next;
61         }
62         if(it == s) {
63                 error_log("attempting to push screen %s more than once!\n", s->name);
64                 return -1;
65         }
66
67         s->next = screen;
68         screen = s;
69         s->start();
70         return 0;
71 }
72
73 int pop_screen(void)
74 {
75         struct game_screen *s;
76
77         if(!screen->next) return -1;
78         s = screen;
79         screen = screen->next;
80         s->stop();
81         return 0;
82 }