5 # Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
7 # ------------------------------------------------------------------------------
9 # This library is free software; you can redistribute it and/or
10 # modify it under the terms of the GNU Lesser General Public
11 # License as published by the Free Software Foundation; either
12 # version 2.1 of the License, or (at your option) any later version.
14 # This library is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 # Lesser General Public License for more details.
19 # You should have received a copy of the GNU Lesser General Public
20 # License along with this library; if not, write to the Free Software
21 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 # ------------------------------------------------------------------------------
25 # Please feel free to send questions, suggestions or improvements to:
41 our @ISA = qw(SDL::Surface);
48 my $class = ref($proto) || $proto;
51 verify (%options, qw/ -opengl -gl -fullscreen -full -resizeable
52 -title -t -icon_title -it -icon -i
53 -width -w -height -h -depth -d -flags -f
54 -red_size -r -blue_size -b -green_size -g -alpha_size -a
55 -red_accum_size -ras -blue_accum_size -bas
56 -green_accum_sizee -gas -alpha_accum_size -aas
57 -double_buffer -db -buffer_size -bs -stencil_size -st
61 SDL::Init(SDL::SDL_INIT_EVERYTHING());
63 my $t = $options{-title} || $options{-t} || $0;
64 my $it = $options{-icon_title} || $options{-it} || $t;
65 my $ic = $options{-icon} || $options{-i} || "";
66 my $w = $options{-width} || $options{-w} || 800;
67 my $h = $options{-height} || $options{-h} || 600;
68 my $d = $options{-depth} || $options{-d} || 16;
69 my $f = $options{-flags} || $options{-f} || SDL::SDL_ANYFORMAT();
70 my $r = $options{-red_size} || $options{-r} || 5;
71 my $g = $options{-green_size} || $options{-g} || 5;
72 my $b = $options{-blue_size} || $options{-b} || 5;
73 my $a = $options{-alpha_size} || $options{-a} || 0;
74 my $ras = $options{-red_accum_size} || $options{-ras} || 0;
75 my $gas = $options{-green_accum_size} || $options{-gas} || 0;
76 my $bas = $options{-blue_accum_size} || $options{-bas} || 0;
77 my $aas = $options{-alpha_accum_size} || $options{-aas} || 0;
78 my $db = $options{-double_buffer} || $options{-db} || 0;
80 my $bs = $options{-buffer_size} || $options{-bs} || 0;
81 my $st = $options{-stencil_size} || $options{-st} || 0;
82 my $async = $options{-asyncblit} || 0;
84 $f |= SDL::SDL_OPENGL() if ($options{-gl} || $options{-opengl});
85 $f |= SDL::SDL_FULLSCREEN() if ($options{-fullscreen} || $options{-full});
86 $f |= SDL::SDL_RESIZABLE() if ($options{-resizeable});
87 $f |= SDL::SDL_DOUBLEBUF() if ($db);
88 $f |= SDL::SDL_ASYNCBLIT() if ($async);
90 if ($f & SDL::SDL_OPENGL()) {
91 $SDL::App::USING_OPENGL = 1;
92 SDL::GLSetAttribute(SDL::SDL_GL_RED_SIZE(),$r) if ($r);
93 SDL::GLSetAttribute(SDL::SDL_GL_GREEN_SIZE(),$g) if ($g);
94 SDL::GLSetAttribute(SDL::SDL_GL_BLUE_SIZE(),$b) if ($b);
95 SDL::GLSetAttribute(SDL::SDL_GL_ALPHA_SIZE(),$a) if ($a);
97 SDL::GLSetAttribute(SDL::SDL_GL_RED_ACCUM_SIZE(),$ras) if ($ras);
98 SDL::GLSetAttribute(SDL::SDL_GL_GREEN_ACCUM_SIZE(),$gas) if ($gas);
99 SDL::GLSetAttribute(SDL::SDL_GL_BLUE_ACCUM_SIZE(),$bas) if ($bas);
100 SDL::GLSetAttribute(SDL::SDL_GL_ALPHA_ACCUM_SIZE(),$aas) if ($aas);
102 SDL::GLSetAttribute(SDL::SDL_GL_DOUBLEBUFFER(),$db) if ($db);
103 SDL::GLSetAttribute(SDL::SDL_GL_BUFFER_SIZE(),$bs) if ($bs);
104 SDL::GLSetAttribute(SDL::SDL_GL_DEPTH_SIZE(),$d);
106 $SDL::App::USING_OPENGL = 0;
109 my $self = \SDL::SetVideoMode($w,$h,$d,$f)
110 or croak SDL::GetError();
112 if ($ic and -e $ic) {
113 my $icon = new SDL::Surface -name => $ic;
114 SDL::WMSetIcon($$icon);
117 SDL::WMSetCaption($t,$it);
124 my ($self,$w,$h) = @_;
125 my $flags = SDL::SurfaceFlags($$self);
126 if ( $flags & SDL::SDL_RESIZABLE()) {
127 my $bpp = SDL::SurfaceBitsPerPixel($$self);
128 $self = \SDL::SetVideoMode($w,$h,$bpp,$flags);
137 $icon = shift || $title;
138 SDL::WMSetCaption($title,$icon);
140 return SDL::WMGetCaption();
150 return SDL::GetTicks();
154 return SDL::GetError();
164 SDL::WMToggleFullScreen($$self);
169 SDL::WMIconifyWindow();
172 sub grab_input ($$) {
173 my ($self,$mode) = @_;
174 SDL::WMGrabInput($mode);
178 my ($self,$href) = @_;
179 my $event = new SDL::Event;
180 while ( $event->wait() ) {
181 if ( ref($$href{$event->type()}) eq "CODE" ) {
182 &{$$href{$event->type()}}($event);
190 if ($SDL::App::USING_OPENGL) {
197 sub attribute ($$;$) {
198 my ($self,$mode,$value) = @_;
199 return undef unless ($SDL::App::USING_OPENGL);
200 if (defined $value) {
201 SDL::GLSetAttribute($mode,$value);
203 my $returns = SDL::GLGetAttribute($mode);
204 croak "SDL::App::attribute failed to get GL attribute" if ($$returns[0] < 0);
216 SDL::App - a SDL perl extension
220 my $app = new SDL::App (
221 -title => 'Application Title',
228 L<SDL::App> controls the root window of the of your SDL based application.
229 It extends the L<SDL_Surface> class, and provides an interface to the window
230 manager oriented functions.
236 C<SDL::App::new> initializes the SDL, creates a new screen,
237 and initializes some of the window manager properties.
238 C<SDL::App::new> takes a series of named parameters:
278 C<SDL::App::title> takes 0, 1, or 2 arguments. It returns the current
279 application window title. If one parameter is passed, both the window
280 title and icon title will be set to its value. If two parameters are
281 passed the window title will be set to the first, and the icon title
286 C<SDL::App::delay> takes 1 argument, and will sleep the application for
291 C<SDL::App::ticks> returns the number of ms since the application began.
295 C<SDL::App::error> returns the last error message set by the SDL.
299 C<SDL::App::resize> takes a new height and width of the application
300 if the application was originally created with the -resizable option.
304 C<SDL::App::fullscreen> toggles the application in and out of fullscreen mode.
308 C<SDL::App::iconify> iconifies the applicaiton window.
312 C<SDL::App::grab_input> can be used to change the input focus behavior of
313 the application. It takes one argument, which should be one of the following:
330 C<SDL::App::loop> is a simple event loop method which takes a reference to a hash
331 of event handler subroutines. The keys of the hash must be SDL event types such
332 as SDL_QUIT(), SDL_KEYDOWN(), and the like. The event method recieves as its parameter
333 the event object used in the loop.
337 my $app = new SDL::App -title => "test.app",
343 SDL_QUIT() => sub { exit(0); },
344 SDL_KEYDOWN() => sub { print "Key Pressed" },
347 $app->loop(\%actions);
351 C<SDL::App::sync> encapsulates the various methods of syncronizing the screen with the
352 current video buffer. C<SDL::App::sync> will do a fullscreen update, using the double buffer
353 or OpenGL buffer if applicable. This is prefered to calling flip on the application window.
355 =head2 attribute ( attr, [value] )
357 C<SDL::App::attribute> allows one to set and get GL attributes. By passing a value
358 in addition to the attribute selector, the value will be set. C<SDL:::App::attribute>
359 always returns the current value of the given attribute, or croaks on failure.
368 L<perl> L<SDL::Surface> L<SDL::Event> L<SDL::OpenGL>