App-XScreenSaver-DBus
view release on metacpan or search on metacpan
lib/App/XScreenSaver/DBus.pm view on Meta::CPAN
is => 'lazy',
builder => sub($self) {
App::XScreenSaver::DBus::Saver->new(reactor => $self->reactor);
},
);
has log => ( is => 'lazy', builder => sub { Log::Any->get_logger } );
sub run($self) {
$self->logind->start();
$self->saver->start();
$self->reactor->run;
}
1;
__END__
=pod
lib/App/XScreenSaver/DBus/Logind.pm view on Meta::CPAN
},
);
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->session_obj->connect_to_signal(
'Lock',
$self->curry::weak::_lock,
);
$self->session_obj->connect_to_signal(
'Unlock',
$self->curry::weak::_unlock,
);
$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 _lock($self) {
$self->log->debugf('locking the screen');
$self->_xscreensaver_command('-lock');
}
sub _unlock($self) {
$self->log->debugf('unlocking the screen');
$self->_xscreensaver_command('-deactivate');
}
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;
}
lib/App/XScreenSaver/DBus/Saver.pm view on Meta::CPAN
);
has log => ( is => 'lazy', builder => sub { Log::Any->get_logger } );
has _proxies => ( is => 'rw' );
has _prod_id => ( is => 'rw' );
has _inhibits => ( is => 'rw', default => sub { +{} } );
sub start($self) {
# export to dbus
$self->_proxies([ map {
App::XScreenSaver::DBus::SaverProxy->new(
$self->service,
$_,
$self,
)
} $self->paths->@* ]);
$self->_prod_id(
lib/App/XScreenSaver/DBus/Saver.pm view on Meta::CPAN
);
$self->dbus_obj->connect_to_signal(
'NameOwnerChanged',
$self->curry::weak::_name_owner_changed,
);
return;
}
sub Inhibit($self,$name,$reason,$sender) {
my $cookie;
do {
$cookie = int(rand(2**31))
} until !exists $self->_inhibits->{$cookie};
$self->_inhibits->{$cookie} = [ $name, $reason, $sender ];
$self->log->debugf(
'<%s> (%s) stops screensaver for <%s> (cookie %d) - %d active',
$name, $sender, $reason, $cookie, scalar(keys $self->_inhibits->%*),
);
# that 1 means "start calling me"
$self->reactor->toggle_timeout($self->_prod_id, 1);
return $cookie;
}
sub UnInhibit($self,$cookie,$this_sender) {
my $inhibit = delete $self->_inhibits->{$cookie}
or return;
my ($name, $reason, $sender) = @$inhibit;
$self->log->debugf(
'<%s> (was %s, is %s) resumed screensaver for <%s> (cookie %d) - %d left',
$name, $sender, $this_sender, $reason, $cookie, scalar(keys $self->_inhibits->%*),
);
# if there's no more inhibitions, stop prodding the screen saver
$self->reactor->toggle_timeout($self->_prod_id, 0)
unless $self->_inhibits->%*;
return;
}
sub _name_owner_changed($self,$bus_name,$old,$new) {
$self->log->tracef('<%s> changed from <%s> to <%s>',
$bus_name, $old, $new);
for my $cookie (sort keys $self->_inhibits->%*) {
my ($name, $reason, $sender) = @{$self->_inhibits->{$cookie}};
# is this inhibit from that bus name?
next unless $sender && $sender eq $bus_name;
# did the bus client just disconnect?
next unless $old && !$new;
lib/App/XScreenSaver/DBus/Saver.pm view on Meta::CPAN
'<%s> (%s) disconnected from the bus (it stopped screensaver for <%s>, cookie %d) - %d left',
$name, $bus_name, $reason, $cookie, scalar(keys $self->_inhibits->%*),
);
}
# if there's no more inhibitions, stop prodding the screen saver
$self->reactor->toggle_timeout($self->_prod_id, 0)
unless $self->_inhibits->%*;
}
sub _prod_screensaver($self) {
$self->log->debug('prodding xscreensaver');
my ($out, $err);
IPC::Run::run(
[qw(xscreensaver-command -deactivate)],
\undef, \$out, \$err,
);
$self->log->tracef('xscreensaver-command -deactivate said <%s>',$out);
$self->log->warnf('xscreensaver-command -deactivate errored <%s>',$err)
if $err;
}
( run in 0.818 second using v1.01-cache-2.11-cpan-65fba6d93b7 )