summaryrefslogtreecommitdiff
path: root/lib/App/XScreenSaver/DBus/InhibitSleep.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/App/XScreenSaver/DBus/InhibitSleep.pm')
-rw-r--r--lib/App/XScreenSaver/DBus/InhibitSleep.pm59
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/App/XScreenSaver/DBus/InhibitSleep.pm b/lib/App/XScreenSaver/DBus/InhibitSleep.pm
new file mode 100644
index 0000000..44f84bc
--- /dev/null
+++ b/lib/App/XScreenSaver/DBus/InhibitSleep.pm
@@ -0,0 +1,59 @@
+package App::XScreenSaver::DBus::InhibitSleep;
+use Moo;
+use experimental 'signatures';
+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;