summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2021-04-10 13:12:22 +0100
committerdakkar <dakkar@thenautilus.net>2021-04-10 13:12:22 +0100
commit8712090b23f31ed9719a928e67612bb9e478e8a2 (patch)
treee08018ee674d5e511b0bbc09aa0e048d95fee485
parentcope with inhibitor dying (diff)
downloadxscreensaver-dbus-8712090b23f31ed9719a928e67612bb9e478e8a2.tar.gz
xscreensaver-dbus-8712090b23f31ed9719a928e67612bb9e478e8a2.tar.bz2
xscreensaver-dbus-8712090b23f31ed9719a928e67612bb9e478e8a2.zip
better: cope with inhibitor *disconnecting*
DBus can tell us when someone disconnects from the bus, so we react to that
-rwxr-xr-xxscreensaver-dbus50
1 files changed, 28 insertions, 22 deletions
diff --git a/xscreensaver-dbus b/xscreensaver-dbus
index 002c0d9..b7e8a30 100755
--- a/xscreensaver-dbus
+++ b/xscreensaver-dbus
@@ -156,29 +156,26 @@ package Saver {
),
);
+ $self->dbus_obj->connect_to_signal(
+ 'NameOwnerChanged',
+ $self->curry::weak::name_owner_changed,
+ );
+
return;
}
sub inhibit($self,$name,$reason,$message) {
- my $sender_pid = try {
- return $self->dbus_obj->GetConnectionUnixProcessID(
- $message->get_sender,
- );
- } catch {
- $log->warning('problems getting PID of inhibitor',{error=>$_});
- return undef;
- };
-
my $cookie;
do {
$cookie = int(rand(2**31))
} until !exists $self->_inhibits->{$cookie};
- $self->_inhibits->{$cookie} = [ $name, $reason, $sender_pid ];
+ my $sender = $message->get_sender;
+ $self->_inhibits->{$cookie} = [ $name, $reason, $sender ];
$log->debugf(
- '<%s> stops screensaver for <%s> (cookie %d) - %d active',
- $name, $reason, $cookie, scalar(keys $self->_inhibits->%*),
+ '<%s> (%s) stops screensaver for <%s> (cookie %d) - %d active',
+ $name, $sender, $reason, $cookie, scalar(keys $self->_inhibits->%*),
);
$self->reactor->toggle_timeout($self->_prod_id, 1);
@@ -188,11 +185,12 @@ package Saver {
sub uninhibit($self,$cookie,$message) {
my $inhibit = delete $self->_inhibits->{$cookie}
or return;
- my ($name, $reason, $sender_pid) = @$inhibit;
+ my ($name, $reason, $sender) = @$inhibit;
+ my $this_sender = $message->get_sender;
$log->debugf(
- '<%s> resumed screensaver for <%s> (cookie %d) - %d left',
- $name, $reason, $cookie, scalar(keys $self->_inhibits->%*),
+ '<%s> (was %s, is %s) resumed screensaver for <%s> (cookie %d) - %d left',
+ $name, $sender, $this_sender, $reason, $cookie, scalar(keys $self->_inhibits->%*),
);
$self->reactor->toggle_timeout($self->_prod_id, 0)
@@ -201,24 +199,32 @@ package Saver {
return;
}
- sub prod_screensaver($self) {
+ sub name_owner_changed($self,$bus_name,$old,$new) {
+ $log->tracef('<%s> changed from <%s> to <%s>',
+ $bus_name, $old, $new);
+
for my $cookie (sort keys $self->_inhibits->%*) {
- my ($name, $reason, $sender_pid) = @{$self->_inhibits->{$cookie}};
- next if kill 0, $sender_pid;
- # uh oh, caller is dead
+ my ($name, $reason, $sender) = @{$self->_inhibits->{$cookie}};
+ # is this inhibit from that bus name?
+ next unless $sender && $sender eq $bus_name;
+ # did the bus owner just disconnect?
+ next unless $old && !$new;
+
+ # if so, remove the inhibit
my $inhibit = delete $self->_inhibits->{$cookie};
$log->debugf(
- '<%s> is dead (it stopped screensaver for <%s>, cookie %d) - %d left',
- $name, $reason, $cookie, scalar(keys $self->_inhibits->%*),
+ '<%s> (%s) disconnected from the bus (it stopped screensaver for <%s>, cookie %d) - %d left',
+ $name, $bus_name, $reason, $cookie, scalar(keys $self->_inhibits->%*),
);
}
unless ($self->_inhibits->%*) {
$self->reactor->toggle_timeout($self->_prod_id, 0);
- return;
}
+ }
+ sub prod_screensaver($self) {
$log->debug('prodding xscreensaver');
system(qw(xscreensaver-command -deactivate));
}