1 |
root |
1.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 |
|
|
|