App-XScreenSaver-DBus

 view release on metacpan or  search on metacpan

lib/App/XScreenSaver/DBus/Saver.pm  view on Meta::CPAN

package App::XScreenSaver::DBus::Saver;
use v5.20;
use Moo;
use experimental qw(signatures postderef);
use curry;
use Log::Any;
use Try::Tiny;
use IPC::Run;
use App::XScreenSaver::DBus::SaverProxy;
our $VERSION = '1.0.6'; # VERSION
# ABSTRACT: implements the "idle inhibition" protocol


has reactor => ( is => 'ro', required => 1 );


has bus => ( is => 'lazy', builder => sub { Net::DBus->session() } );


has dbus_srv => (
    is => 'lazy',
    builder => sub { shift->bus->get_service('org.freedesktop.DBus') },
);


has dbus_obj => (
    is => 'lazy',
    builder => sub { shift->dbus_srv->get_object('/org/freedesktop/DBus') },
);


has service => (
    is => 'lazy',
    builder => sub {
        # this is the service name
        shift->bus->export_service('org.freedesktop.ScreenSaver');
    },
);


has paths => (
    is => 'ro',
    default => sub { [qw(/ScreenSaver /org/freedesktop/ScreenSaver)] },
);


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(
        $self->reactor->add_timeout(
            60_000,
            Net::DBus::Callback->new(
                method => $self->curry::weak::_prod_screensaver
            ),
            0, # this means "don't call my yet"
        ),
    );

    $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;



( run in 3.262 seconds using v1.01-cache-2.11-cpan-f56aa216473 )