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 )