From 8712090b23f31ed9719a928e67612bb9e478e8a2 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sat, 10 Apr 2021 13:12:22 +0100 Subject: better: cope with inhibitor *disconnecting* DBus can tell us when someone disconnects from the bus, so we react to that --- xscreensaver-dbus | 50 ++++++++++++++++++++++++++++---------------------- 1 file 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)); } -- cgit v1.2.3