2 #include "SDL_framerate.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
;
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
);
53 || process_event(&screen
, &event
, &mode
, &menu_data
,
54 &game_data
, &options_data
, smode
, font
, theme
);
55 } while(SDL_PollEvent(&event
));
61 set_loop_caption(mode
, &menu_data
, &game_data
, &options_data
);
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
);
92 if(repaint
) repaint
= 0;
94 SDL_framerateDelay(&fpsm
);
97 /*nextframe = SDL_GetTicks();
98 if(lastframe > nextframe + 100) {
99 SDL_Delay(lastframe - nextframe - 100);
103 if((int)SDL_GetTicks() >= ltime + 1000) {
104 ltime = (int)SDL_GetTicks();
105 printf("%d\r", frames);
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
) {
121 start_menu(menu_data
);
124 start_game(game_data
);
127 start_options(options_data
);
130 set_caption("ERROR"); /* !!! */
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;*/
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
,
158 game_event(mode
, event
, game_data
, smode
, font
, theme
);
159 options_event(*screen
, mode
, event
, options_data
, smode
,
165 case SDL_VIDEOEXPOSE
:
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
);
186 switch(event
->key
.keysym
.sym
) {
188 if(event
->key
.keysym
.mod
& KMOD_ALT
) {
189 if(!toggle_fullscreen(screen
, smode
)) repaint
= 1;
194 if(event
->key
.keysym
.mod
& KMOD_ALT
) {
195 if(!SDL_WM_IconifyWindow()) {
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;
219 /*else if(smode->focus) {
220 if(event->active.gain) {
234 if(*mode
== MODE_MENU
) {
235 repaint
= menu_event(*screen
, mode
, event
, menu_data
, smode
,
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
,