… | |
… | |
20 | $::self->{status}->push ($context_id{$type} ||= $::self->{status}->get_context_id ($type), $text) if $text; |
20 | $::self->{status}->push ($context_id{$type} ||= $::self->{status}->get_context_id ($type), $text) if $text; |
21 | } |
21 | } |
22 | |
22 | |
23 | sub new { |
23 | sub new { |
24 | my ($self, %arg) = @_; |
24 | my ($self, %arg) = @_; |
|
|
25 | |
25 | $self = $self->Glib::Object::new; |
26 | $self = $self->Glib::Object::new; |
26 | $self->{$_} = delete $arg{$_} for keys %arg; |
27 | $self->{$_} = delete $arg{$_} for keys %arg; |
|
|
28 | gtk::state $self, "main::window", undef, window_size => [700, 580]; |
|
|
29 | |
|
|
30 | # $self->set (allow_shrink => 1); |
27 | |
31 | |
28 | Scalar::Util::weaken ($::self = $self); # singleton... |
32 | Scalar::Util::weaken ($::self = $self); # singleton... |
29 | |
33 | |
30 | $self->{protocol} = new KGS::Protocol::Client; |
34 | $self->{protocol} = new KGS::Protocol::Client; |
31 | |
35 | |
32 | $self->{roomlist} = new roomlist app => $self; |
36 | $self->{roomlist} = new roomlist app => $self; |
33 | |
37 | |
34 | $self->set_title ('kgsueme'); |
38 | $self->set_title ('kgsueme'); |
35 | gtk::state $self, "main::window", undef, window_size => [400, 580]; |
|
|
36 | $self->signal_connect (destroy => sub { %{$_[0]} = () }); |
39 | $self->signal_connect (destroy => sub { %{$_[0]} = () }); |
37 | $self->signal_connect (delete_event => sub { main_quit Gtk2; 1 }); |
40 | $self->signal_connect (delete_event => sub { main_quit Gtk2; 1 }); |
38 | |
41 | |
39 | $self->add (my $vbox = new Gtk2::VBox); |
42 | $self->add (my $vbox = new Gtk2::VBox); |
40 | |
43 | |
… | |
… | |
46 | signal_connect $button clicked => $_[1]; |
49 | signal_connect $button clicked => $_[1]; |
47 | }; |
50 | }; |
48 | |
51 | |
49 | $button->("Login", sub { $self->login; }); |
52 | $button->("Login", sub { $self->login; }); |
50 | $button->("Roomlist", sub { $self->{roomlist}->show; }); |
53 | $button->("Roomlist", sub { $self->{roomlist}->show; }); |
51 | $button->("Save Config & Layout", \&util::save_config); |
54 | $button->("Save Layout", \&util::save_config); |
52 | $button->("Logout", sub { $self->{conn}->send ("quit") if $self->{conn} }); |
55 | $button->("Logout", sub { $self->{conn}->send ("quit") if $self->{conn} }); |
53 | $button->("Quit", sub { main_quit Gtk2 }); |
56 | $button->("Quit", sub { main_quit Gtk2 }); |
54 | |
57 | |
55 | $vbox->pack_start ((my $hbox = new Gtk2::HBox), 0, 1, 0); |
58 | $vbox->pack_start ((my $hbox = new Gtk2::HBox), 0, 1, 0); |
56 | |
59 | |
… | |
… | |
64 | $self->{password}->set (visibility => 0, is_focus => 1); |
67 | $self->{password}->set (visibility => 0, is_focus => 1); |
65 | $self->{password}->signal_connect (activate => sub { $self->login }); |
68 | $self->{password}->signal_connect (activate => sub { $self->login }); |
66 | |
69 | |
67 | $vbox->pack_start ((my $vpane = new Gtk2::VPaned), 1, 1, 0); |
70 | $vbox->pack_start ((my $vpane = new Gtk2::VPaned), 1, 1, 0); |
68 | $vpane->set (position_set => 1); |
71 | $vpane->set (position_set => 1); |
69 | gtk::state $vpane, "main::vpane", undef, position => 400; |
72 | gtk::state $vpane, "main::vpane", undef, position => 300; |
70 | |
73 | |
71 | $vbox->pack_start(($self->{status} = new Gtk2::Statusbar), 0, 1, 0); |
74 | $vbox->pack_start(($self->{status} = new Gtk2::Statusbar), 0, 1, 0); |
72 | |
75 | |
73 | $self->{gamelist} = new gamelist app => $self; |
76 | $self->{gamelist} = new gamelist app => $self; |
74 | $vpane->pack1 ($self->{gamelist}, 1, 1); |
77 | $vpane->pack1 ($self->{gamelist}, 1, 1); |
… | |
… | |
109 | |
112 | |
110 | # now login |
113 | # now login |
111 | $ENV{KGSUEME_CLIENTVER} ||= "1.4.1_01:Swing app:Sun Microsystems Inc."; # he asked for it...#d# |
114 | $ENV{KGSUEME_CLIENTVER} ||= "1.4.1_01:Swing app:Sun Microsystems Inc."; # he asked for it...#d# |
112 | $self->{protocol}->login ($ENV{KGSUEME_CLIENTVER} || "kgsueme $VERSION $^O", # allow users to overwrite |
115 | $self->{protocol}->login ($ENV{KGSUEME_CLIENTVER} || "kgsueme $VERSION $^O", # allow users to overwrite |
113 | $self->{login}->get_text, |
116 | $self->{login}->get_text, |
114 | $self->{password}->get_text); |
117 | $self->{password}->get_text, |
|
|
118 | "en_US"); |
115 | |
119 | |
116 | my $input; $input = add_watch Glib::IO fileno $sock, [G_IO_IN, G_IO_ERR, G_IO_HUP], sub { |
120 | my $input; $input = add_watch Glib::IO fileno $sock, [G_IO_IN, G_IO_ERR, G_IO_HUP], sub { |
117 | # this is dorked |
121 | # this is dorked |
118 | my $buf; |
122 | my $buf; |
119 | my $len = sysread $sock, $buf, 16384; |
123 | my $len = sysread $sock, $buf, 16384; |
… | |
… | |
151 | } |
155 | } |
152 | |
156 | |
153 | sub listen { |
157 | sub listen { |
154 | my $self = shift; |
158 | my $self = shift; |
155 | |
159 | |
156 | $self->SUPER::listen (@_, qw(login userpic idle_warn msg_chat chal_defaults)); |
160 | $self->SUPER::listen (@_, qw(login userpic idle_warn msg_chat chal_defaults upd_rooms)); |
157 | } |
161 | } |
158 | |
162 | |
159 | sub inject_idle_warn { |
163 | sub inject_idle_warn { |
160 | my ($self, $msg) = @_; |
164 | my ($self, $msg) = @_; |
161 | |
165 | |
… | |
… | |
168 | if ((lc $msg->{name2}) eq (lc $self->{name})) { |
172 | if ((lc $msg->{name2}) eq (lc $self->{name})) { |
169 | unless ($self->{user}{lc $msg->{name}}) { |
173 | unless ($self->{user}{lc $msg->{name}}) { |
170 | $self->open_user (name => $msg->{name})->inject ($msg); |
174 | $self->open_user (name => $msg->{name})->inject ($msg); |
171 | sound::play 2, "ring"; |
175 | sound::play 2, "ring"; |
172 | } |
176 | } |
|
|
177 | } |
|
|
178 | } |
|
|
179 | |
|
|
180 | sub inject_upd_rooms { |
|
|
181 | my ($self, $msg) = @_; |
|
|
182 | |
|
|
183 | return if %{$self->{room}}; |
|
|
184 | |
|
|
185 | # join default room |
|
|
186 | for (@{$msg->{rooms}}) { |
|
|
187 | $self->open_room (%$_) if $_->is_default; |
173 | } |
188 | } |
174 | } |
189 | } |
175 | |
190 | |
176 | sub inject_chal_defaults { |
191 | sub inject_chal_defaults { |
177 | my ($self, $msg) = @_; |
192 | my ($self, $msg) = @_; |