--- deliantra/Deliantra-Client/DC/Protocol.pm 2007/08/30 07:08:17 1.168 +++ deliantra/Deliantra-Client/DC/Protocol.pm 2007/09/01 07:22:21 1.169 @@ -23,7 +23,7 @@ setup_req => { extmap => 1, excmd => 1, - xwidget1 => 1,#d# + xwidget2 => 1,#d# %{$arg{setup_req} || {}}, }, ); @@ -52,8 +52,14 @@ $self->{json_coder} ->convert_blessed - ->filter_json_single_key_object (__w_ => sub { + ->filter_json_single_key_object ("\fw" => sub { $self->{widget}{$_[0]} + }) + ->filter_json_single_key_object ("\fc" => sub { + my ($id) = @_; + sub { + $self->send_exti_msg (w_e => $id, @_); + } }); # destroy widgets on logout @@ -140,29 +146,23 @@ sub widget_associate { my ($self, $ws, $id, $widget) = @_; - if ($widget) { - $widget->{s_id} = $id; - $self->{widget}{$id} = $widget; - - if ($ws) { - $widget->{s_ws} = $ws; - $self->{widgetset}{$ws}{w}{$id} = $widget; - } + $widget ||= new CFPlus::UI::Bin; - $widget->connect (on_destroy => sub { - my ($widget) = @_; + $widget->{s_id} = $id; + $self->{widget}{$id} = $widget; - delete $self->{widget}{$widget->{s_id}}; - delete $self->{widgetset}{$widget->{s_ws}}{$widget->{s_id}} - if exists $widget->{s_ws}; - }); + if ($ws) { + $widget->{s_ws} = $ws; + $self->{widgetset}{$ws}{w}{$id} = $widget; + } - 1 - } else { - $self->send_exti_msg (w_e => $id, undef); + $widget->connect (on_destroy => sub { + my ($widget) = @_; - 0 - } + delete $self->{widget}{$widget->{s_id}}; + delete $self->{widgetset}{$widget->{s_ws}}{$widget->{s_id}} + if exists $widget->{s_ws}; + }); } # widgetset new @@ -189,22 +189,12 @@ sub ext_ws_c { my ($self, $ws, $id, $class, $args) = @_; - for my $ev (grep /^on_/, keys %$args) { - my $rid = $args->{$ev}; - $args->{$ev} = sub { - my $id = shift->{s_id}; - $self->send_exti_msg (w_e => $id, $rid, @_); - - 1 - }; - } - $self->widget_associate ( $ws, $id => scalar eval { local $SIG{__DIE__}; "CFPlus::UI::$class"->new (%$args) } - ) or warn "server failed creating client-side widget " . (CFPlus::to_json $class) . ": $@\n"; + ); } # widgetset associate @@ -250,20 +240,19 @@ ); while (my ($id, $name) = each %ass) { - $self->widget_associate (undef, $id => $wkw{$name}) - or warn "server failed to associate non-existent well-known widget $name\n"; + $self->widget_associate (undef, $id => $wkw{$name}); } } # widget call sub ext_w_c { - my ($self, $id, $rid, $method, @args) = @_; + my ($self, $id, $rcb, $method, @args) = @_; my $w = $self->{widget}{$id} or return; - if ($rid) { - $self->send_exti_msg (w_r => $rid, $w->$method (@args)); + if ($rcb) { + $rcb->($w->$method (@args)); } else { $w->$method (@args); } @@ -289,12 +278,12 @@ # widget get sub ext_w_g { - my ($self, $id, $rid, $attr) = @_; + my ($self, $id, $rid, @attr) = @_; my $w = $self->{widget}{$id} or return; - $self->send_exti_msg (w_r => $rid, [map $w->{$_}, @$attr]); + $self->send_exti_msg (w_e => $rid, map $w->{$_}, @attr); } # message window