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 )