package App::XScreenSaver::DBus::InhibitSleep;
use v5.20;
use Moo;
use experimental qw(signatures postderef);
use curry;
use Net::DBus;
use Log::Any;
has bus => ( is => 'lazy', builder => sub { Net::DBus->system() } );
has logind_srv => (
is => 'lazy',
builder => sub { shift->bus->get_service('org.freedesktop.login1') },
);
has logind_obj => (
is => 'lazy',
builder => sub { shift->logind_srv->get_object('/org/freedesktop/login1') },
);
has inhibit_fd => ( is => 'rwp' );
has log => ( is => 'lazy', builder => sub { Log::Any->get_logger } );
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');
system(qw(xscreensaver-command -suspend));
$self->log->debug('locked');
$self->_set_inhibit_fd(undef);
}
else {
$self->log->debug('woken up');
system(qw(xscreensaver-command -deactivate));
$self->_inhibit();
}
return;
}
1;