1 |
package AnyEvent::Impl::Glib; |
2 |
|
3 |
use Glib (); |
4 |
|
5 |
my $maincontext = Glib::MainContext->default; |
6 |
|
7 |
sub new_from_fh { |
8 |
my ($class, $fh) = @_; |
9 |
bless { fh => $fh }, $class; |
10 |
} |
11 |
|
12 |
sub cb { |
13 |
my ($self, $cb) = @_; |
14 |
$self->{cb} = $cb; |
15 |
$self; |
16 |
} |
17 |
|
18 |
sub poll { |
19 |
my ($self, $r, $w, $e) = @_; |
20 |
|
21 |
remove Glib::Source delete $self->{source} if $self->{source}; |
22 |
|
23 |
my @cond; |
24 |
push @cond, "in" if $r; |
25 |
push @cond, "out" if $w; |
26 |
push @cond, "err" if $e; |
27 |
|
28 |
my $cb = \$self->{cb}; # avoid $self-reference |
29 |
|
30 |
$self->{source} = add_watch Glib::IO fileno $self->{fh}, \@cond, sub { |
31 |
$$cb->(); 1; |
32 |
}; |
33 |
|
34 |
$self; |
35 |
} |
36 |
|
37 |
sub DESTROY { |
38 |
my ($self) = @_; |
39 |
|
40 |
remove Glib::Source delete $self->{source} if $self->{source}; |
41 |
} |
42 |
|
43 |
############# |
44 |
|
45 |
sub new_signal { |
46 |
my $class = shift; |
47 |
|
48 |
bless \my $x, $class; |
49 |
} |
50 |
|
51 |
sub send { |
52 |
${$_[0]}++; |
53 |
} |
54 |
|
55 |
sub wait { |
56 |
$maincontext->iteration (1) while !${$_[0]}; |
57 |
} |
58 |
|
59 |
1; |
60 |
|