ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/kgsueme/appwin.pl
Revision: 1.3
Committed: Sat May 31 13:58:30 2003 UTC (21 years ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.2: +13 -2 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 package appwin;
2
3 use Scalar::Util;
4
5 use base KGS::Listener;
6 use base gtk::widget;
7
8 my %context_id;
9
10 sub status {
11 my ($type, $text) = @_;
12
13 $self->{status}->pop($context_id{$type}) if $context_id{$type};
14 $self->{status}->push($context_id{$type} ||= $self->{status}->get_context_id($type), $text) if $text;
15 }
16
17 sub new {
18 my $self = shift;
19 $self = $self->SUPER::new(@_);
20
21 $appwin::self = $self; # singleton
22 Scalar::Util::weaken $appwin::self;
23
24 $self->{conn} = new KGS::Protocol;
25
26 KGS::Listener::Debug->new->listen($self->{conn}, "any"); #d# debug only :)
27
28 $self->listen($self->{conn}, "login");
29
30 $self->{roomlist} = new roomlist conn => $self->{conn};
31
32 $self->{window} = new Gtk2::Window 'toplevel';
33 $self->{window}->set_title('kgsueme');
34 gtk::state $self->{window}, "main::window", undef, window_size => [400, 400];
35 $self->{window}->signal_connect(delete_event => sub { main_quit Gtk2; 1 });
36
37 $self->{window}->add(my $vbox = new Gtk2::VBox);
38
39 $vbox->pack_start(($buttonbox = new Gtk2::HButtonBox), 0, 1, 0);
40 $buttonbox->set_spacing(0);
41
42 my $button = sub {
43 $buttonbox->add(my $button = new Gtk2::Button $_[0]);
44 signal_connect $button clicked => $_[1];
45 };
46
47 $button->("Login", sub { $self->login; });
48 $button->("Roomlist", sub { $self->{roomlist}->show; });
49 $button->("Save Config & Layout", \&util::save_config);
50 $button->("Quit", sub { main_quit Gtk2 });
51
52 $vbox->pack_start((my $hbox = new Gtk2::HBox), 0, 1, 0);
53
54 $hbox->add(new Gtk2::Label "Login");
55
56 $hbox->add($self->{login} = new_with_max_length Gtk2::Entry 12);
57 $self->{login}->set_text($::config->{login});
58
59 if ($::HACK) {
60 $self->{login}->signal_connect(activate => sub {
61 $self->{conn}{name} = $self->{login}->get_text;
62 });
63 }
64
65 $hbox->add(new Gtk2::Label "Password");
66 $hbox->add($self->{password} = new Gtk2::Entry);
67 $self->{password}->set_visibility(0);
68
69 $self->{gamelist} = new gamelist conn => $self->{conn};
70 $vbox->pack_start ($self->{gamelist}->widget, 1, 1, 0);
71
72 $appwin::gamelist = $self->{gamelist};
73 Scalar::Util::weaken $appwin::gamelist;
74
75 $vbox->pack_start(($self->{status} = new Gtk2::Statusbar), 0, 1, 0);
76
77 $self->{window}->show_all;
78
79 $self;
80 }
81
82 sub login {
83 my ($self) = @_;
84
85 $self->{conn}->disconnect;
86
87 # initialize new socket and connection
88 my $sock = new IO::Socket::INET PeerHost => "kgs.kiseido.com", PeerPort => "2379"
89 or die;
90
91 $sock->blocking(1);
92 $self->{conn}->handshake($sock);
93 $sock->blocking(0);
94
95 my $input; $input = add_watch Glib::IO fileno $sock, [G_IO_IN, G_IO_ERR, G_IO_HUP], sub {
96 # this is dorked
97 my $buf;
98 if (0 >= sysread $sock, $buf, 16384
99 and !$!{EINTR} and !$!{EAGAIN}) {
100 remove Glib::Source $input;
101 $self->event_disconnect;
102 }
103 $self->{conn}->feed_data($buf);
104 1;
105 }, G_PRIORITY_HIGH;
106
107 # now login
108 $self->{conn}->login("kgsueme $VERSION $^O", $self->{login}->get_text, $self->{password}->get_text);
109 }
110
111 sub inject_login {
112 my ($self, $msg) = @_;
113
114 appwin::status("login", "logged in as '$self->{conn}{name}' with status '$msg->{result}'");
115 $::config->{login} = $self->{conn}{name};
116
117 if ($msg->{success}) {
118 # auto-join
119 for (values %{$::config->{rooms}}) {
120 $self->{roomlist}->join_room($_);
121 }
122 sound::play 3, "connect";
123 } elsif ($msg->{result} eq "user unknown") {
124 sound::play 2, "user_unknown";
125 } else {
126 sound::play 2, "warning";
127 }
128 }
129
130 sub event_disconnect { }
131
132 1;
133