7242a3fb9987a3515c8ba199a6f1cc9a459b7fbc
[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         return 0;
34 }
35
36 void cleanup_screens(void)
37 {
38         int i;
39
40         for(i=0; i<num_screens; i++) {
41                 screens[i]->cleanup();
42         }
43 }
44
45 void reshape_screens(int x, int y)
46 {
47         struct game_screen *s = screen;
48         while(s) {
49                 s->reshape(x, y);
50                 s = s->next;
51         }
52 }
53
54 int push_screen(struct game_screen *s)
55 {
56         struct game_screen *it = screen;
57         while(it && it != s) {
58                 it = it->next;
59         }
60         if(it == s) {
61                 error_log("attempting to push screen %s more than once!\n", s->name);
62                 return -1;
63         }
64
65         s->next = screen;
66         screen = s;
67         s->start();
68         return 0;
69 }
70
71 int pop_screen(void)
72 {
73         struct game_screen *s;
74
75         if(!screen->next) return -1;
76         s = screen;
77         screen = screen->next;
78         s->stop();
79         return 0;
80 }