1 | package AnyEvent::Impl::Glib; |
1 | package AnyEvent::Impl::Glib; |
|
|
2 | |
|
|
3 | no warnings; |
|
|
4 | use strict; |
2 | |
5 | |
3 | use Glib (); |
6 | use Glib (); |
4 | |
7 | |
5 | my $maincontext = Glib::MainContext->default; |
8 | my $maincontext = Glib::MainContext->default; |
6 | |
9 | |
7 | sub new_from_fh { |
10 | sub io { |
8 | my ($class, $fh) = @_; |
11 | my ($class, %arg) = @_; |
9 | bless { fh => $fh }, $class; |
12 | |
|
|
13 | my $self = bless \%arg, $class; |
|
|
14 | my $rcb = \$self->{cb}; |
|
|
15 | |
|
|
16 | my @cond; |
|
|
17 | # some glibs need hup, others error with it, YMMV |
|
|
18 | push @cond, "in", "hup" if $self->{poll} eq "r"; |
|
|
19 | push @cond, "out", "hup" if $self->{poll} eq "w"; |
|
|
20 | |
|
|
21 | $self->{source} = add_watch Glib::IO fileno $self->{fh}, \@cond, sub { |
|
|
22 | $$rcb->(); |
|
|
23 | ! ! $$rcb |
|
|
24 | }; |
|
|
25 | |
|
|
26 | $self |
10 | } |
27 | } |
11 | |
28 | |
12 | sub cb { |
29 | sub timer { |
13 | my ($self, $cb) = @_; |
30 | my ($class, %arg) = @_; |
14 | $self->{cb} = $cb; |
31 | |
15 | $self; |
32 | my $self = bless \%arg, $class; |
16 | } |
33 | my $cb = $self->{cb}; |
17 | |
34 | |
18 | sub poll { |
35 | $self->{source} = add Glib::Timeout $self->{after} * 1000, sub { |
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; |
36 | $cb->(); |
|
|
37 | 0 |
32 | }; |
38 | }; |
33 | |
39 | |
34 | $self; |
40 | $self |
35 | } |
41 | } |
36 | |
42 | |
37 | sub DESTROY { |
43 | sub DESTROY { |
38 | my ($self) = @_; |
44 | my ($self) = @_; |
39 | |
45 | |
40 | remove Glib::Source delete $self->{source} if $self->{source}; |
46 | remove Glib::Source delete $self->{source} if $self->{source}; |
|
|
47 | # need to undef $cb because we hold references to it |
|
|
48 | $self->{cb} = undef; |
|
|
49 | %$self = (); |
41 | } |
50 | } |
42 | |
51 | |
43 | ############# |
52 | sub one_event { |
44 | |
53 | $maincontext->iteration (1); |
45 | sub new_signal { |
|
|
46 | my $class = shift; |
|
|
47 | |
|
|
48 | bless \my $x, $class; |
|
|
49 | } |
54 | } |
50 | |
55 | |
51 | sub send { |
56 | 1 |
52 | ${$_[0]}++; |
|
|
53 | } |
|
|
54 | |
57 | |
55 | sub wait { |
|
|
56 | $maincontext->iteration (1) while !${$_[0]}; |
|
|
57 | } |
|
|
58 | |
|
|
59 | 1; |
|
|
60 | |
|
|