… | |
… | |
9 | use SDL; |
9 | use SDL; |
10 | use SDL::App; |
10 | use SDL::App; |
11 | use SDL::Event; |
11 | use SDL::Event; |
12 | use SDL::Surface; |
12 | use SDL::Surface; |
13 | use SDL::OpenGL; |
13 | use SDL::OpenGL; |
14 | use SDL::OpenGL::Constants; |
|
|
15 | |
14 | |
16 | use Crossfire; |
15 | use Crossfire; |
17 | use Crossfire::Protocol; |
16 | use Crossfire::Protocol; |
18 | |
17 | |
19 | use CFClient; |
18 | use CFClient; |
… | |
… | |
40 | |
39 | |
41 | our $MAPWIDGET; |
40 | our $MAPWIDGET; |
42 | our $FONTSIZE; |
41 | our $FONTSIZE; |
43 | |
42 | |
44 | our $SDL_TIMER; |
43 | our $SDL_TIMER; |
45 | our $SDL_APP; |
44 | our $SDL_ACTIVE; |
46 | our $SDL_EV; |
45 | our $SDL_EV; |
47 | our %SDL_CB; |
46 | our %SDL_CB; |
48 | |
47 | |
49 | our $ALT_ENTER_MESSAGE; |
48 | our $ALT_ENTER_MESSAGE; |
50 | our $STATUS_LINE; |
49 | our $STATUS_LINE; |
… | |
… | |
160 | |
159 | |
161 | sub init_screen { |
160 | sub init_screen { |
162 | ($WIDTH, $HEIGHT) = @{ $SDL_MODES[$CFG->{sdl_mode}] }; |
161 | ($WIDTH, $HEIGHT) = @{ $SDL_MODES[$CFG->{sdl_mode}] }; |
163 | $FULLSCREEN = $CFG->{fullscreen}; |
162 | $FULLSCREEN = $CFG->{fullscreen}; |
164 | |
163 | |
165 | $SDL_APP = new SDL::App |
164 | SDL::Init SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO |
166 | -flags => SDL_ANYFORMAT | SDL_HWSURFACE, |
165 | and die "SDL::Init failed!\n"; |
167 | -title => "Crossfire+ Client", |
166 | |
168 | -width => $WIDTH, |
167 | SDL::GLSetAttribute SDL_GL_RED_SIZE, 5; |
169 | -height => $HEIGHT, |
168 | SDL::GLSetAttribute SDL_GL_GREEN_SIZE, 5; |
170 | -opengl => 1, |
169 | SDL::GLSetAttribute SDL_GL_BLUE_SIZE, 5; |
171 | -red_size => 5, |
170 | SDL::GLSetAttribute SDL_GL_ALPHA_SIZE, 0; |
172 | -green_size => 5, |
171 | |
173 | -blue_size => 5, |
172 | SDL::GLSetAttribute SDL_GL_ACCUM_RED_SIZE, 0; |
174 | -alpha_size => 0, |
173 | SDL::GLSetAttribute SDL_GL_ACCUM_GREEN_SIZE, 0; |
175 | -double_buffer => 1, |
174 | SDL::GLSetAttribute SDL_GL_ACCUM_BLUE_SIZE, 0; |
176 | -fullscreen => $FULLSCREEN, |
175 | SDL::GLSetAttribute SDL_GL_ACCUM_ALPHA_SIZE, 0; |
177 | -resizeable => 0; |
176 | |
|
|
177 | SDL::GLSetAttribute SDL_GL_DOUBLEBUFFER, 1; |
|
|
178 | SDL::GLSetAttribute SDL_GL_BUFFER_SIZE, 15; |
|
|
179 | SDL::GLSetAttribute SDL_GL_DEPTH_SIZE, 0; |
|
|
180 | |
|
|
181 | SDL::SetVideoMode $WIDTH, $HEIGHT, 0, |
|
|
182 | SDL_HWSURFACE | SDL_ANYFORMAT | SDL_OPENGL | SDL_DOUBLEBUF |
|
|
183 | | ($FULLSCREEN ? SDL_FULLSCREEN : 0) |
|
|
184 | or die "SDL::SetVideoMode failed!\n"; |
|
|
185 | |
|
|
186 | SDL::WMSetCaption "Crossfire+ Client", "Crossfire+"; |
178 | |
187 | |
179 | $SDL_EV = new SDL::Event; |
188 | $SDL_EV = new SDL::Event; |
180 | $SDL_EV->set_unicode (1); |
189 | $SDL_EV->set_unicode (1); |
|
|
190 | |
|
|
191 | $SDL_ACTIVE = 1; |
181 | |
192 | |
182 | $SDL_TIMER = add Glib::Timeout 1000 / $MAX_FPS, sub { |
193 | $SDL_TIMER = add Glib::Timeout 1000 / $MAX_FPS, sub { |
183 | ($SDL_CB{$SDL_EV->type} || sub { warn "unhandled event ", $SDL_EV->type })->() |
194 | ($SDL_CB{$SDL_EV->type} || sub { warn "unhandled event ", $SDL_EV->type })->() |
184 | while $SDL_EV->poll; |
195 | while $SDL_EV->poll; |
185 | |
196 | |
… | |
… | |
219 | sub destroy_screen { |
230 | sub destroy_screen { |
220 | $CFClient::UI::TOPLEVEL->{children} = []; |
231 | $CFClient::UI::TOPLEVEL->{children} = []; |
221 | remove Glib::Source $SDL_TIMER; |
232 | remove Glib::Source $SDL_TIMER; |
222 | remove Glib::Source $refresh_handler if $refresh_handler; |
233 | remove Glib::Source $refresh_handler if $refresh_handler; |
223 | undef $refresh_handler; |
234 | undef $refresh_handler; |
224 | undef $SDL_APP; |
235 | undef $SDL_ACTIVE; |
225 | undef $SDL_EV; |
236 | undef $SDL_EV; |
226 | SDL::Quit; |
237 | SDL::Quit; |
227 | } |
238 | } |
228 | |
239 | |
229 | sub force_refresh { |
240 | sub force_refresh { |
… | |
… | |
244 | |
255 | |
245 | my $FPS; |
256 | my $FPS; |
246 | |
257 | |
247 | sub refresh { |
258 | sub refresh { |
248 | $refresh_handler ||= add Glib::Idle sub { |
259 | $refresh_handler ||= add Glib::Idle sub { |
249 | if ($SDL_APP) { |
260 | if ($SDL_ACTIVE) { |
250 | $NOW = SDL::GetTicks; |
261 | $NOW = SDL::GetTicks; |
251 | |
262 | |
252 | if ($NOW - $last_refresh < $TICKS_PER_FRAME) { |
263 | if ($NOW - $last_refresh < $TICKS_PER_FRAME) { |
253 | SDL::Delay $TICKS_PER_FRAME - ($NOW - $last_refresh); |
264 | SDL::Delay $TICKS_PER_FRAME - ($NOW - $last_refresh); |
254 | $NOW = SDL::GetTicks; |
265 | $NOW = SDL::GetTicks; |