ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/kgsueme/chat.pl
Revision: 1.3
Committed: Thu May 20 22:59:55 2004 UTC (20 years ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.2: +5 -3 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 package chat;
2
3 use Gtk2;
4
5 use Glib::Object::Subclass
6 Gtk2::VBox,
7 signals => {
8 command => {
9 flags => [qw/run-first/],
10 return_type => undef, # void return
11 param_types => [Glib::Scalar, Glib::Scalar],
12 },
13 };
14
15 my $tagtable = new Gtk2::TextTagTable;
16
17 {
18 my %tags = (
19 default => { foreground => "black" },
20 node => { foreground => "#0000b0", event => 1 },
21 move => { foreground => "#0000b0", event => 1 },
22 user => { foreground => "#0000b0", event => 1 },
23 coord => { foreground => "#0000b0", event => 1 },
24 error => { foreground => "#ff0000", event => 1 },
25 header => { weight => 800, pixels_above_lines => 6 },
26 description => { weight => 800, foreground => "blue" },
27 infoblock => { weight => 700, foreground => "blue" },
28 );
29
30 while (my ($k, $v) = each %tags) {
31 my $tag = new Gtk2::TextTag $k;
32 if (delete $v->{event}) {
33 ###
34 }
35 $tag->set (%$v);
36 $tagtable->add ($tag);
37 }
38 }
39
40 sub INIT_INSTANCE {
41 my $self = shift;
42
43 $self->signal_connect (destroy => sub {
44 remove Glib::Source delete $self->{idle} if $self->{idle};
45 %{$_[0]} = ();
46 });
47
48 $self->{buffer} = new Gtk2::TextBuffer $tagtable;
49
50 $self->{widget} = new Gtk2::ScrolledWindow;
51 $self->{widget}->set_policy("never", "always");
52 $self->pack_start ($self->{widget}, 1, 1, 0);
53
54 $self->{widget}->add ($self->{view} = new_with_buffer Gtk2::TextView $self->{buffer});
55 $self->{view}->set_wrap_mode ("word");
56 $self->{view}->set_cursor_visible (0);
57
58 $self->{view}->set_editable (0);
59
60 $self->{view}->signal_connect (motion_notify_event => sub {
61 my ($widget, $event) = @_;
62
63 my $window = $widget->get_window ("text");
64 if ($event->window == $window) {
65 my ($win, $x, $y, $mask) = $window->get_pointer;
66 # warn "TAG EVENT @_ ($window, $win, $x, $y, $mask)\n";
67 #gtk_text_view_window_to_buffer_coords (text_view,
68 # GTK_TEXT_WINDOW_TEXT,
69 # text_view->drag_start_x,
70 # text_view->drag_start_y,
71 # &buffer_x,
72 # &buffer_y);
73 #
74 # gtk_text_layout_get_iter_at_pixel (text_view->layout,
75 # &iter,
76 # buffer_x, buffer_y);
77 #
78 # gtk_text_view_start_selection_dnd (text_view, &iter, event);
79 # return TRUE;
80 }
81 0;
82 });
83
84 $self->pack_start (($self->{entry} = new Gtk2::Entry), 0, 1, 0);
85
86 $self->{entry}->signal_connect(activate => sub {
87 my ($entry) = @_;
88 my $text = $entry->get_text;
89 $entry->set_text("");
90
91 my ($cmd, $arg);
92
93 if ($text =~ /^\/(\S+)\s*(.*)$/) {
94 ($cmd, $arg) = ($1, $2);
95 } else {
96 ($cmd, $arg) = ("say", $text);
97 }
98
99 $self->signal_emit (command => $cmd, $arg);
100 });
101
102
103 $self->set_end;
104 }
105
106 sub do_command {
107 my ($self, $cmd, $arg, %arg) = @_;
108 }
109
110 sub set_end {
111 my ($self) = @_;
112
113 # this is probably also a hack...
114 $self->{idle} ||= add Glib::Idle sub {
115 $self->{view}->scroll_to_iter ($self->{buffer}->get_end_iter, 0, 0, 0, 0)
116 if $self->{view};
117 delete $self->{idle};
118 };
119 }
120
121 sub at_end {
122 my ($self) = @_;
123
124 # this is, maybe, a bad hack :/
125 my $adj = $self->{widget}->get_vadjustment;
126 $adj->value + $adj->page_size >= $adj->upper - 0.5;
127 }
128
129 sub append_text {
130 my ($self, $text) = @_;
131
132 my $at_end = $self->at_end;
133
134 my @tag;
135 $text = "<default>$text</default>";
136
137 # pseudo-simplistic-xml-parser
138 for (;;) {
139 $text =~ /\G<([^>]+)>/gc or last;
140 my $tag = $1;
141 if ($tag =~ s/^\///) {
142 pop @tag;
143 } else {
144 push @tag, $tag;
145 }
146
147 $text =~ /\G([^<]*)/gc or last;
148 $self->{buffer}->insert_with_tags_by_name ($self->{buffer}->get_end_iter, util::xmlto $1, $tag[-1])
149 if length $1;
150 }
151
152 $self->set_end if $at_end;
153 }
154
155 sub set_text {
156 my ($self, $text) = @_;
157
158 my $at_end = $self->at_end;
159
160 $self->{buffer}->set_text ("");
161 $self->append_text ($text);
162
163 $self->set_end if $at_end;
164 }
165
166 1;
167