--- deliantra/Deliantra-Client/DC/UI.pm 2006/04/08 13:34:19 1.17 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/04/08 13:36:26 1.18 @@ -1,6 +1,9 @@ package Crossfire::Client::Widget; use strict; + +use Scalar::Util; + use SDL::OpenGL; use SDL::OpenGL::Constants; @@ -21,15 +24,23 @@ sub activate { push @ACTIVE_WIDGETS, $_[0]; + Scalar::Util::weaken $ACTIVE_WIDGETS[-1]; } sub deactivate { @ACTIVE_WIDGETS = sort { $a->{z} <=> $b->{z} } - grep { $_ != $_[0] } + grep { $_ && $_ != $_[0] } @ACTIVE_WIDGETS; } +sub move { + my ($self, $x, $y, $z) = @_; + $self->{x} = $x; + $self->{y} = $y; + $self->{z} = $z if defined $z; +} + sub size_request { die "size_request is abtract"; } @@ -82,6 +93,12 @@ my ($widget) = @_; } +sub DESTROY { + my ($self) = @_; + + $self->deactivate; +} + package Crossfire::Client::Widget::Container; our @ISA = Crossfire::Client::Widget::; @@ -288,8 +305,6 @@ my $tex = $self->{texture}; - $self->{x}--; - glEnable GL_BLEND; glEnable GL_TEXTURE_2D; glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE; @@ -381,13 +396,18 @@ my %DIR = ( SDLK_KP8, [1, "north"], - SDLK_KP9, [2, "northest"], + SDLK_KP9, [2, "northeast"], SDLK_KP6, [3, "east"], SDLK_KP3, [4, "southeast"], SDLK_KP2, [5, "south"], SDLK_KP1, [6, "southwest"], SDLK_KP4, [7, "west"], SDLK_KP7, [8, "northwest"], + + SDLK_UP, [1, "north"], + SDLK_RIGHT, [3, "east"], + SDLK_DOWN, [5, "south"], + SDLK_LEFT, [7, "west"], ); sub key_down { @@ -400,10 +420,13 @@ $::CONN->send ("command stay fire"); } elsif (exists $DIR{$sym}) { if ($mod & KMOD_SHIFT) { + $self->{shft}++; $::CONN->send ("command fire $DIR{$sym}[0]"); } elsif ($mod & KMOD_CTRL) { + $self->{ctrl}++; $::CONN->send ("command run $DIR{$sym}[0]"); } else { + $::CONN->send ("command $DIR{$sym}[1]"); } } } @@ -414,12 +437,11 @@ my $mod = $ev->key_mod; my $sym = $ev->key_sym; - if (exists $DIR{$sym}) { - if ($mod & KMOD_SHIFT) { - $::CONN->send ("command fire_stop"); - } else { - $::CONN->send ("command run_stop"); - } + if (!($mod & KMOD_SHIFT) && delete $self->{shft}) { + $::CONN->send ("command fire_stop"); + } + if (!($mod & KMOD_CTRL ) && delete $self->{ctrl}) { + $::CONN->send ("command run_stop"); } }