Began creating the listbox widget. It's still just a structure.
[xuni.git] / loop.c
blob9697fa6b7ea2c9f780663b9678f828466ff534b2
1 #include <ctype.h>
2 #include "SDL_framerate.h"
3 #include "game.h"
4 #include "graphics.h"
5 #include "loop.h"
6 #include "menu.h"
7 #include "options.h"
8 #include "xuni.h"
10 static void set_loop_caption(enum loop_mode_t mode,
11 struct menu_data_t *menu_data, struct game_data_t *game_data,
12 struct options_data_t *options_data);
13 static int process_event(SDL_Surface **screen, SDL_Event *event,
14 enum loop_mode_t *mode, struct menu_data_t *menu_data,
15 struct game_data_t *game_data, struct options_data_t *options_data,
16 struct smode_t *smode, struct font_t *font, struct theme_t *theme);
18 void main_loop(SDL_Surface *screen, struct smode_t *smode,
19 struct font_t *font, struct theme_t *theme) {
21 enum loop_mode_t mode = MODE_MENU, pmode = MODE_NONE;
22 FPSmanager fpsm;
23 SDL_Event event;
24 struct menu_data_t menu_data;
25 struct game_data_t game_data;
26 struct options_data_t options_data;
27 int repaint = 1, gotevent;
28 /*int frames = 0, ltime = SDL_GetTicks();*/
29 /*Uint32 lastframe = SDL_GetTicks(), nextframe = lastframe;*/
31 init_menu(&menu_data, smode, font);
32 init_game(&game_data, smode, font);
33 init_options(&options_data, smode, font, theme);
35 SDL_initFramerate(&fpsm);
36 SDL_setFramerate(&fpsm, 30);
38 while(mode != MODE_QUIT) {
39 /*lastframe = SDL_GetTicks();*/
41 if((!menu_data.frame_based && mode == MODE_MENU)
42 || mode == MODE_OPTIONS) {
44 gotevent = SDL_WaitEvent(&event);
46 else { /* don't check for MODE_QUIT, it's impossible so far */
47 gotevent = SDL_PollEvent(&event);
50 if(gotevent) {
51 do {
52 repaint = repaint
53 || process_event(&screen, &event, &mode, &menu_data,
54 &game_data, &options_data, smode, font, theme);
55 } while(SDL_PollEvent(&event));
58 if(pmode != mode) {
59 pmode = mode;
60 clear_smode(smode);
61 set_loop_caption(mode, &menu_data, &game_data, &options_data);
62 repaint = 1;
65 if(smode->focus) {
66 if(repaint) {
67 repaint = 0;
69 if(!menu_data.frame_based && mode == MODE_MENU) {
70 paint_menu(screen, &menu_data, smode, font, theme);
72 else if(mode == MODE_OPTIONS) {
73 paint_options(screen, &options_data, smode, font, theme);
77 if(menu_data.frame_based && mode == MODE_MENU) {
78 paint_menu(screen, &menu_data, smode, font, theme);
81 if(mode == MODE_GAME) {
82 paint_game(screen, &game_data, smode, font, theme);
85 if((menu_data.frame_based && mode == MODE_MENU)
86 || mode == MODE_GAME) {
88 SDL_framerateDelay(&fpsm);
91 else {
92 if(repaint) repaint = 0;
94 SDL_framerateDelay(&fpsm);
97 /*nextframe = SDL_GetTicks();
98 if(lastframe > nextframe + 100) {
99 SDL_Delay(lastframe - nextframe - 100);
102 /*++frames;
103 if((int)SDL_GetTicks() >= ltime + 1000) {
104 ltime = (int)SDL_GetTicks();
105 printf("%d\r", frames);
106 frames = 0;
110 free_menu(&menu_data);
111 free_game(&game_data);
112 free_options(&options_data);
115 static void set_loop_caption(enum loop_mode_t mode,
116 struct menu_data_t *menu_data, struct game_data_t *game_data,
117 struct options_data_t *options_data) {
119 switch(mode) {
120 case MODE_MENU:
121 start_menu(menu_data);
122 break;
123 case MODE_GAME:
124 start_game(game_data);
125 break;
126 case MODE_OPTIONS:
127 start_options(options_data);
128 break;
129 default:
130 set_caption("ERROR"); /* !!! */
131 break;
135 static int process_event(SDL_Surface **screen, SDL_Event *event,
136 enum loop_mode_t *mode, struct menu_data_t *menu_data,
137 struct game_data_t *game_data, struct options_data_t *options_data,
138 struct smode_t *smode, struct font_t *font, struct theme_t *theme) {
140 int repaint = 0, handled = 0;
142 switch(event->type) {
143 case SDL_MOUSEBUTTONDOWN:
144 /*smode->button.button = event->button.button;
145 smode->button.xp = event->button.x;
146 smode->button.yp = event->button.y;*/
148 break;
149 case SDL_VIDEORESIZE:
150 *screen = resize_screen(smode, &event->resize);
152 reload_fonts(font, smode);
154 resize_theme(theme, smode);
156 menu_event(*screen, mode, event, menu_data, smode,
157 font, theme);
158 game_event(mode, event, game_data, smode, font, theme);
159 options_event(*screen, mode, event, options_data, smode,
160 font, theme);
162 handled = 1;
163 repaint = 1;
164 break;
165 case SDL_VIDEOEXPOSE:
166 repaint = 1;
167 handled = 1;
168 break;
169 case SDL_KEYDOWN:
170 /*if(!(event->key.keysym.unicode >> 7)) {
171 printf("'%c' [%i]\n", event->key.keysym.unicode, event->key.keysym.unicode);
173 else printf("... [%i]\n", event->key.keysym.unicode);*/
175 if(smode->active.widget) {
176 repaint = widget_process_character(smode->active.widget,
177 &event->key.keysym, font, theme);
178 if(repaint) {
179 handled = 1;
180 break;
184 break;
185 case SDL_KEYUP:
186 switch(event->key.keysym.sym) {
187 case SDLK_RETURN:
188 if(event->key.keysym.mod & KMOD_ALT) {
189 if(!toggle_fullscreen(screen, smode)) repaint = 1;
190 handled = 1;
192 break;
193 case SDLK_F9:
194 if(event->key.keysym.mod & KMOD_ALT) {
195 if(!SDL_WM_IconifyWindow()) {
196 /* error */
199 break;
200 default:
201 break;
203 break;
204 case SDL_ACTIVEEVENT:
205 /*printf("%i %i\n", event->active.state, event->active.gain);*/
207 if((event->active.state == SDL_APPACTIVE
208 || event->active.state == SDL_APPINPUTFOCUS)
209 || smode->fullscreen || smode->restrictfocus == SDL_GRAB_ON) {
211 if(event->active.gain) {
212 if(!smode->focus) smode->focus = 1;
213 repaint = 1;
215 else {
216 smode->focus = 0;
219 /*else if(smode->focus) {
220 if(event->active.gain) {
221 smode->focus = 2;
223 else {
224 smode->focus = 1;
228 break;
229 default:
230 break;
233 if(!handled) {
234 if(*mode == MODE_MENU) {
235 repaint = menu_event(*screen, mode, event, menu_data, smode,
236 font, theme);
238 else if(*mode == MODE_GAME) {
239 game_event(mode, event, game_data, smode, font, theme);
241 else if(*mode == MODE_OPTIONS) {
242 repaint = options_event(*screen, mode, event, options_data, smode,
243 font, theme);
247 return repaint;