Moved smode_t::sel and smode_t::active into a new structure, struct gui_t. This struc...
[xuni.git] / loop.c
blobb71529843963f53c3d908550bd8ee52a14497910
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_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,
17 struct gui_t *gui);
19 void main_loop(struct smode_t *smode, struct font_t *font,
20 struct theme_t *theme, struct gui_t *gui) {
22 enum loop_mode_t mode = MODE_MENU, pmode = MODE_NONE;
23 FPSmanager fpsm;
24 SDL_Event event;
25 struct menu_data_t menu_data;
26 struct game_data_t game_data;
27 struct options_data_t options_data;
28 int repaint = 1, gotevent;
29 /*int frames = 0, ltime = SDL_GetTicks();*/
30 /*Uint32 lastframe = SDL_GetTicks(), nextframe = lastframe;*/
32 init_menu(&menu_data, smode, font);
33 init_game(&game_data, smode, font);
34 init_options(&options_data, smode, font, theme);
36 SDL_initFramerate(&fpsm);
37 SDL_setFramerate(&fpsm, 30);
39 while(mode != MODE_QUIT) {
40 /*lastframe = SDL_GetTicks();*/
42 if((!menu_data.frame_based && mode == MODE_MENU)
43 || mode == MODE_OPTIONS) {
45 gotevent = SDL_WaitEvent(&event);
47 else { /* don't check for MODE_QUIT, it's impossible so far */
48 gotevent = SDL_PollEvent(&event);
51 if(gotevent) {
52 do {
53 repaint = process_event(&event, &mode, &menu_data, &game_data,
54 &options_data, smode, font, theme, gui) || repaint;
55 } while(SDL_PollEvent(&event));
58 if(pmode != mode) {
59 pmode = mode;
60 clear_gui(gui);
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(&menu_data, smode, font, theme, gui);
72 else if(mode == MODE_OPTIONS) {
73 paint_options(&options_data, smode, font, theme, gui);
77 if(menu_data.frame_based && mode == MODE_MENU) {
78 paint_menu(&menu_data, smode, font, theme, gui);
81 if(mode == MODE_GAME) {
82 paint_game(&game_data, smode, font, theme, gui);
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_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,
139 struct gui_t *gui) {
141 int repaint = 0, handled = 0;
143 switch(event->type) {
144 case SDL_MOUSEBUTTONUP:
145 case SDL_MOUSEBUTTONDOWN:
146 /*smode->button.button = event->button.button;
147 smode->button.xp = event->button.x;
148 smode->button.yp = event->button.y;*/
150 break;
151 case SDL_VIDEORESIZE:
152 if(!resize_screen(smode, &event->resize)) {
153 reload_fonts(font, smode);
155 resize_theme(theme, smode);
157 menu_event(mode, event, menu_data, smode, font, theme, gui);
158 game_event(mode, event, game_data, smode, font, theme, gui);
159 options_event(mode, event, options_data, smode, font, theme, gui);
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(gui->active.widget) {
171 repaint = widget_process_character(gui->active.widget,
172 &event->key.keysym, smode, font, theme, gui);
173 if(repaint) {
174 handled = 1;
175 break;
179 break;
180 case SDL_KEYUP:
181 switch(event->key.keysym.sym) {
182 case SDLK_RETURN:
183 if(event->key.keysym.mod & KMOD_ALT) {
184 if(!toggle_fullscreen(smode)) repaint = 1;
185 handled = 1;
187 break;
188 case SDLK_F9:
189 if(event->key.keysym.mod & KMOD_ALT) {
190 if(!SDL_WM_IconifyWindow()) {
191 /* error !!! */
194 break;
195 default:
196 break;
198 break;
199 case SDL_ACTIVEEVENT:
200 handled = 1;
202 #if 1
203 if(SDL_GetAppState() & SDL_APPACTIVE
204 && SDL_GetAppState() & SDL_APPINPUTFOCUS) {
206 if(!smode->focus) {
207 smode->focus = 1;
208 repaint = 1;
211 else smode->focus = 0;
212 #elif 0
213 if((event->active.state & SDL_APPACTIVE
214 /*|| event->active.state == SDL_APPINPUTFOCUS*/)
215 /*|| smode->fullscreen || smode->restrictfocus == SDL_GRAB_ON*/) {
217 if(event->active.gain) {
218 if(!smode->focus) smode->focus = 1;
219 repaint = 1;
221 else {
222 smode->focus = 0;
225 #endif
227 break;
228 default:
229 break;
232 if(!handled) {
233 if(*mode == MODE_MENU) {
234 repaint = menu_event(mode, event, menu_data, smode, font, theme,
235 gui);
237 else if(*mode == MODE_GAME) {
238 game_event(mode, event, game_data, smode, font, theme, gui);
240 else if(*mode == MODE_OPTIONS) {
241 repaint = options_event(mode, event, options_data, smode, font,
242 theme, gui);
246 return repaint;