KGS

 view release on metacpan or  search on metacpan

kgsueme/app.pl  view on Meta::CPAN

   $::self->{status}->push ($context_id{$type} ||= $::self->{status}->get_context_id ($type), $text) if $text;
}

sub new {
   my ($self, %arg) = @_;

   $self = $self->Glib::Object::new;
   $self->{$_} = delete $arg{$_} for keys %arg;
   gtk::state $self, "main::window", undef, window_size => [700, 580];

   $self->set (allow_shrink => 1);

   Scalar::Util::weaken ($::self = $self); # singleton...

   $self->{protocol} = new KGS::Protocol::Client;

   $self->{roomlist} = new roomlist app => $self;

   $self->set_title ('kgsueme');
   $self->signal_connect (destroy => sub { %{$_[0]} = () });
   $self->signal_connect (delete_event => sub { main_quit Gtk2; 1 });

   $self->add (my $vbox = new Gtk2::VBox);

   $vbox->pack_start (($buttonbox = new Gtk2::HButtonBox), 0, 1, 0);
   $buttonbox->set_spacing (0);

   my $button = sub {
      $buttonbox->add (my $button = new Gtk2::Button $_[0]);
      signal_connect $button clicked => $_[1];
   };

   $button->("Login", sub { $self->login; });
   $button->("Roomlist", sub { $self->{roomlist}->show; });
   $button->("Save Layout", \&util::save_config);
   $button->("Logout", sub { $self->{conn}->send ("quit") if $self->{conn} });
   $button->("Quit", sub { main_quit Gtk2 });

   $vbox->pack_start ((my $hbox = new Gtk2::HBox), 0, 1, 0);

   $hbox->add (new Gtk2::Label "Login");

   $hbox->add ($self->{login} = new_with_max_length Gtk2::Entry 12);
   $self->{login}->set_text ($::config->{login});

   $hbox->add (new Gtk2::Label "Password");
   $hbox->add ($self->{password} = new Gtk2::Entry);
   $self->{password}->set (visibility => 0, is_focus => 1);
   $self->{password}->signal_connect (activate => sub { $self->login });

   $vbox->pack_start ((my $vpane = new Gtk2::VPaned), 1, 1, 0);
   $vpane->set (position_set => 1);
   gtk::state $vpane, "main::vpane", undef, position => 300;

   $vbox->pack_start(($self->{status} = new Gtk2::Statusbar), 0, 1, 0);

   $self->{gamelist} = new gamelist app => $self;
   $vpane->pack1 ($self->{gamelist}, 1, 1);

   $self->{rooms} = new Gtk2::Notebook;
   $self->{rooms}->set (enable_popup => 1, scrollable => 1);

   $vpane->pack2 ($self->{rooms}, 1, 1);

   $self->show_all;

   $self;
}

sub login {
   my ($self) = @_;

   $self->{protocol}->disconnect;

   # initialize new socket and connection
   my $sock = new IO::Socket::INET PeerHost => KGS::Protocol::KGSHOST, PeerPort => KGS::Protocol::KGSPORT
      or do {
         app::status ("connect", "connect: $!");
         $self->event_quit;
         return;
      };

   $self->{login}->set (sensitive => 0);
   $self->{password}->set (sensitive => 0);

   $sock->blocking (1);
   $self->{protocol}->handshake ($sock);
   $sock->blocking (0);

   $self->listen ($self->{protocol});
   $self->{roomlist}->listen ($self->{protocol});
   #$self->{gamelist}->listen ($conn);

   # now login
   $ENV{KGSUEME_CLIENTVER} ||= "1.4.2_03:Swing app:Sun Microsystems Inc."; # he asked for it...#d#
   $self->{protocol}->login ($ENV{KGSUEME_CLIENTVER} || "kgsueme $VERSION $^O", # allow users to overwrite
                             $self->{login}->get_text,
                             $self->{password}->get_text,
                             "en_US");

   my $input; $input = add_watch Glib::IO fileno $sock, [G_IO_IN, G_IO_ERR, G_IO_HUP], sub {
      # this is dorked
      my $buf;
      my $len = sysread $sock, $buf, 16384;
      if ($len) {
         $self->{protocol}->feed_data ($buf);
      } elsif (defined $len || (!$!{EINTR} and !$!{EAGAIN})) {
         remove Glib::Source $input;
         $self->{protocol}->disconnect;
         warn "disconnect: $!";#TODO#
         app::status ("disconnect", "$!");#TODO# not visible
      }
      1;
   }, G_PRIORITY_HIGH;
}

sub inject_login {
   my ($self, $msg) = @_;

   $self->{name} = $self->{conn}{name};



( run in 0.846 second using v1.01-cache-2.11-cpan-364913b4093 )