… | |
… | |
16 | our $TOOLTIP; |
16 | our $TOOLTIP; |
17 | our $BUTTON_STATE; |
17 | our $BUTTON_STATE; |
18 | |
18 | |
19 | our %WIDGET; # all widgets, weak-referenced |
19 | our %WIDGET; # all widgets, weak-referenced |
20 | |
20 | |
21 | our $TOOLTIP_WATCHER = EV::timer_ns 0, 1/60, sub { |
21 | our $TOOLTIP_WATCHER = EV::timer_ns 0, 0.03, sub { |
22 | $_[0]->stop; |
22 | $_[0]->stop; |
23 | |
23 | |
24 | if (!$GRAB) { |
24 | if (!$GRAB) { |
25 | for (my $widget = $HOVER; $widget; $widget = $widget->{parent}) { |
25 | for (my $widget = $HOVER; $widget; $widget = $widget->{parent}) { |
26 | if (length $widget->{tooltip}) { |
26 | if (length $widget->{tooltip}) { |
… | |
… | |
338 | sub hide { |
338 | sub hide { |
339 | my ($self) = @_; |
339 | my ($self) = @_; |
340 | |
340 | |
341 | $self->set_invisible; |
341 | $self->set_invisible; |
342 | |
342 | |
|
|
343 | # extra $parent copy for 5.8.8+ bug workaround |
|
|
344 | # (otherwise $_[0] in remove gets freed |
|
|
345 | if (my $parent = $self->{parent}) { |
343 | $self->{parent}->remove ($self) |
346 | $parent->remove ($self); |
344 | if $self->{parent}; |
347 | } |
345 | } |
348 | } |
346 | |
349 | |
347 | sub move_abs { |
350 | sub move_abs { |
348 | my ($self, $x, $y, $z) = @_; |
351 | my ($self, $x, $y, $z) = @_; |
349 | |
352 | |
… | |
… | |
3673 | ); |
3676 | ); |
3674 | |
3677 | |
3675 | if ($self->{anim} && $self->{animspeed}) { |
3678 | if ($self->{anim} && $self->{animspeed}) { |
3676 | CFPlus::weaken (my $widget = $self); |
3679 | CFPlus::weaken (my $widget = $self); |
3677 | |
3680 | |
3678 | $widget->{animspeed} = List::Util::max 0.05, $widget->{animspeed}; |
3681 | $self->{animspeed} = List::Util::max 0.05, $self->{animspeed}; |
3679 | $widget->{anim_start} = $self->{animspeed} * int EV::now / $self->{animspeed}; |
3682 | $self->{timer} = EV::periodic_ns 0, $self->{animspeed}, undef, sub { |
3680 | $self->{timer} = EV::timer_ns 0, 0, sub { |
|
|
3681 | return unless $::CONN; |
3683 | return unless $::CONN; |
3682 | |
3684 | |
3683 | my $w = $widget |
3685 | my $w = $widget |
3684 | or return; |
3686 | or return; |
3685 | |
3687 | |
… | |
… | |
3701 | sub update_timer { |
3703 | sub update_timer { |
3702 | my ($self) = @_; |
3704 | my ($self) = @_; |
3703 | |
3705 | |
3704 | return unless $self->{timer}; |
3706 | return unless $self->{timer}; |
3705 | |
3707 | |
3706 | $self->{timer}->stop; |
|
|
3707 | if ($self->{visible}) { |
3708 | if ($self->{visible}) { |
3708 | $self->{timer}->set ( |
|
|
3709 | $self->{anim_start} |
|
|
3710 | + $self->{animspeed} |
|
|
3711 | * int 1.5 + (EV::now - $self->{anim_start}) / $self->{animspeed} |
|
|
3712 | ); |
|
|
3713 | $self->{timer}->start; |
3709 | $self->{timer}->start; |
|
|
3710 | } else { |
|
|
3711 | $self->{timer}->stop; |
3714 | } |
3712 | } |
3715 | } |
3713 | } |
3716 | |
3714 | |
3717 | sub update_face { |
3715 | sub update_face { |
3718 | my ($self) = @_; |
3716 | my ($self) = @_; |
… | |
… | |
4180 | values %{ $self->{item} }; |
4178 | values %{ $self->{item} }; |
4181 | |
4179 | |
4182 | while (my ($k, $v) = each %{ $self->{item} }) { |
4180 | while (my ($k, $v) = each %{ $self->{item} }) { |
4183 | delete $self->{item}{$k} if $v->{timeout} < $NOW; |
4181 | delete $self->{item}{$k} if $v->{timeout} < $NOW; |
4184 | } |
4182 | } |
|
|
4183 | |
|
|
4184 | $self->{timer}->set (1, 1); |
4185 | |
4185 | |
4186 | my @widgets; |
4186 | my @widgets; |
4187 | |
4187 | |
4188 | my @items = sort { |
4188 | my @items = sort { |
4189 | $a->{pri} <=> $b->{pri} |
4189 | $a->{pri} <=> $b->{pri} |
… | |
… | |
4366 | } |
4366 | } |
4367 | |
4367 | |
4368 | sub update { |
4368 | sub update { |
4369 | my ($self) = @_; |
4369 | my ($self) = @_; |
4370 | |
4370 | |
4371 | $::WANT_REFRESH->start; |
4371 | $::WANT_REFRESH = 1; |
4372 | } |
4372 | } |
4373 | |
4373 | |
4374 | sub add { |
4374 | sub add { |
4375 | my ($self, @children) = @_; |
4375 | my ($self, @children) = @_; |
4376 | |
4376 | |