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_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
,
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
;
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
);
53 repaint
= process_event(&event
, &mode
, &menu_data
, &game_data
,
54 &options_data
, smode
, font
, theme
, gui
) || repaint
;
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(&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
);
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_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
,
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;*/
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
);
165 case SDL_VIDEOEXPOSE
:
170 if(gui
->active
.widget
) {
171 repaint
= widget_process_character(gui
->active
.widget
,
172 &event
->key
.keysym
, smode
, font
, theme
, gui
);
181 switch(event
->key
.keysym
.sym
) {
183 if(event
->key
.keysym
.mod
& KMOD_ALT
) {
184 if(!toggle_fullscreen(smode
)) repaint
= 1;
189 if(event
->key
.keysym
.mod
& KMOD_ALT
) {
190 if(!SDL_WM_IconifyWindow()) {
199 case SDL_ACTIVEEVENT
:
203 if(SDL_GetAppState() & SDL_APPACTIVE
204 && SDL_GetAppState() & SDL_APPINPUTFOCUS
) {
211 else smode
->focus
= 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;
233 if(*mode
== MODE_MENU
) {
234 repaint
= menu_event(mode
, event
, menu_data
, smode
, font
, theme
,
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
,