summaryrefslogtreecommitdiff
path: root/lib/App/XScreenSaver/DBus/InhibitSleep.pm
blob: 226facfd9fe45a57f136f58b4eb86260e6b3f888 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package App::XScreenSaver::DBus::InhibitSleep; 
use v5.20;
use Moo;
use experimental qw(signatures postderef);
use curry;
use Net::DBus;
use IPC::Run;
use Log::Any;
# VERSION 
# ABSTRACT: implements the logind "inhibitor locks" protocol 
 
=head1 SYNOPSIS
 
    use Net::DBus::Reactor;
    use App::XScreenSaver::DBus::InhibitSleep;
    my $is = App::XScreenSaver::DBus::InhibitSleep->new;
    $is->start;
 
    Net::DBus::Reactor->new->run;
 
=attr C<bus>
 
the DBus system bus
 
=cut
 
has bus => ( is => 'lazy'builder => sub { Net::DBus->system() } );
 
=attr C<logind_srv>
 
the (e)logind DBus service
 
=cut
 
has logind_srv => (
    is => 'lazy',
    builder => sub { shift->bus->get_service('org.freedesktop.login1') },
);
 
=attr C<logind_obj>
 
the (e)logind DBus object
 
=cut
 
has logind_obj => (
    is => 'lazy',
    builder => sub { shift->logind_srv->get_object('/org/freedesktop/login1') },
);
 
=attr C<inhibit_fd>
 
the file descriptor that logind gives us when we ask for a lock; we
close it to release the lock
 
=cut
 
has inhibit_fd => ( is => 'rwp' );
 
=attr C<log>
 
a logger
 
=cut
 
has log => ( is => 'lazy'builder => sub { Log::Any->get_logger } );
 
=method C<start>
 
starts listening to the C<PrepareForSleep> signal from (e)logind, and
takes the lock
 
=cut
 
sub start($self) {
    $self->logind_obj->connect_to_signal(
        'PrepareForSleep',
        $self->curry::weak::_going_to_sleep,
    );
    $self->_inhibit();
    return;
}
 
sub _inhibit($self) {
    return if $self->inhibit_fd;
    $self->_set_inhibit_fd(
        $self->logind_obj->Inhibit(
            'sleep',
            'xscreensaver','locking before sleep',
            'delay',
        )
    );
    $self->log->debugf('got logind inhibit fd %d',$self->inhibit_fd);
    return;
}
 
sub _going_to_sleep($self,$before) {
    if ($before) {
        $self->log->debug('locking');
        $self->_xscreensaver_command('-suspend');
        $self->log->debug('locked');
        $self->_set_inhibit_fd(undef);
    }
    else {
        $self->log->debug('woken up');
        $self->_xscreensaver_command('-deactivate');
        $self->_inhibit();
    }
    return;
}
 
sub _xscreensaver_command($self,$command) {
    my ($out$err);
    IPC::Run::run(
        ['xscreensaver-command',$command],
        \undef, \$out, \$err,
    );
    $self->log->tracef('xscreensaver-command %s said <%s>',$command,$out);
    $self->log->warnf('xscreensaver-command %s errored <%s>',$command,$err)
        if $err;
}
 
1;