package App::XScreenSaver::DBus::InhibitSleep; use Moo; use experimental 'signatures'; use curry; use Net::DBus; 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 the DBus system bus =cut has bus => ( is => 'lazy', builder => sub { Net::DBus->system() } ); =attr C the (e)logind DBus service =cut has logind_srv => ( is => 'lazy', builder => sub { shift->bus->get_service('org.freedesktop.login1') }, ); =attr C the (e)logind DBus object =cut has logind_obj => ( is => 'lazy', builder => sub { shift->logind_srv->get_object('/org/freedesktop/login1') }, ); =attr C 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 a logger =cut has log => ( is => 'lazy', builder => sub { Log::Any->get_logger } ); =method C starts listening to the C 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'); 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;