--- deliantra/Deliantra-Client/DC/UI.pm 2007/07/16 20:22:39 1.378 +++ deliantra/Deliantra-Client/DC/UI.pm 2007/07/17 12:04:18 1.379 @@ -3495,25 +3495,50 @@ if ($self->{anim} && $self->{animspeed}) { CFPlus::weaken (my $widget = $self); + $widget->{animspeed} = List::Util::max 0.05, $widget->{animspeed}; + $widget->{anim_start} = $self->{animspeed} * Event::time / $self->{animspeed}; $self->{timer} = Event->timer ( - at => $self->{animspeed} * int $::NOW / $self->{animspeed}, - hard => 1, - interval => $self->{animspeed}, + parked => 1, cb => sub { return unless $::CONN; + if (!$widget) {#d# + warn "animation widget timer active but widgetd estroyed\n";#d# + warn $_[0]->w->active;#d# + }#d# + ++$widget->{frame}; - $self->update_face; - $self->update; + $widget->update_face; + $widget->update; + + $widget->update_timer; }, ); $self->update_face; + $self->update_timer; } $self } +sub update_timer { + my ($self) = @_; + + return unless $self->{timer}; + + if ($self->{visible}) { + $self->{timer}->at ( + $self->{anim_start} + + $self->{animspeed} + * int 1.5 + (Event::time - $self->{anim_start}) / $self->{animspeed} + ); + $self->{timer}->start; + } else { + $self->{timer}->stop; + } +} + sub update_face { my ($self) = @_; @@ -3553,6 +3578,14 @@ $self->SUPER::update; } +sub invoke_visibility_change { + my ($self) = @_; + + $self->update_timer; + + 0 +} + sub _draw { my ($self) = @_; @@ -3577,7 +3610,7 @@ sub destroy { my ($self) = @_; - $self->{timer}->cancel + (delete $self->{timer})->cancel if $self->{timer}; $self->SUPER::destroy;