--- M6502/Screen.pm 2007/08/02 14:07:52 97 +++ M6502/Screen.pm 2007/08/02 16:01:16 98 @@ -14,7 +14,7 @@ use Data::Dump qw/dump/; use base qw(Class::Accessor Prefs); -__PACKAGE__->mk_accessors(qw(app)); +__PACKAGE__->mk_accessors(qw(app event)); =head1 NAME @@ -46,8 +46,12 @@ #$app->grab_input( SDL_GRAB_QUERY ); $app->grab_input( SDL_GRAB_OFF ); - warn "# created SDL::App\n"; $self->app( $app ); + + my $event = SDL::Event->new(); + $self->event( $event ); + + warn "# created SDL::App\n"; } my $white = SDL::Color->new( -r => 0xff, -g => 0xff, -b => 0xff ); @@ -235,6 +239,61 @@ $app->sync; } +=head2 key_pressed + +Check SDL event loop if there are any pending keys + + my $key = $self->key_pressed; + + if ( $self->key_pressed( 1 ) ) { + # just to check other events, don't process + # key + } + +=cut + +my $pending_key; +my $run_for = 2000; + +sub key_pressed { + my $self = shift; + + # don't take key, just pull event + my $just_checking = shift; + + if ( defined($pending_key) ) { + my $k = $pending_key; + undef $pending_key unless $just_checking; + return $k; + } + + my $event = $self->event || confess "no event?"; + + $event->poll || return; + + my $type = $event->type(); + + exit if ($type == SDL_QUIT); + + my $k; + + if ($type == SDL_KEYDOWN) { + $k = $event->key_name(); + if ( $k eq 'escape' ) { + $run_for = $self->cli; + warn "will check event loop every $run_for cycles\n"; + } else { + warn "SDL_KEYDOWN ($type) = '$k'\n"; + $pending_key = $k if $just_checking; + } + } elsif ( $type == SDL_KEYUP ) { + my $up = $event->key_name(); + warn "SDL_KEYUP ($type) = '$up'\n"; + } + + return $k; +} + =head2 loop Implement SDL event loop @@ -245,20 +304,10 @@ my $self = shift; my $event = SDL::Event->new(); - my $run_for = 2000; MAIN_LOOP: while ( 1 ) { - while ($event->poll) { - my $type = $event->type(); - - last MAIN_LOOP if ($type == SDL_QUIT); - last MAIN_LOOP if ($type == SDL_KEYDOWN && $event->key_name() eq 'escape'); - - if ($type == SDL_KEYDOWN) { - $run_for = $self->cli; - } - } + $self->key_pressed( 1 ); M6502::exec($run_for); } }