summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReuben Thomas <rrt@sc3d.org>2022-11-24 22:51:11 +0100
committerSimon Lees <simon@simotek.net>2023-08-09 01:58:41 +0000
commit501a427b3468b9f3639ae11c78df1934698695ce (patch)
treeff5dc8bd7c981a0fdcd9e420e37bed78e9ceea34
parent5bad49c0e69f2c9cdb33a55dc485b1f2b63097ad (diff)
xdg-screensaver: fix the freedesktop screensaver
This was not correctly implemented, and perhaps no-one noticed because until now it was only used for KDE 3. But now GNOME 3 needs it! The main problem is that, like the gnome-screensaver method, inhibiting the screensaver requires a long-held DBus connection. So, reuse the embedded Perl script from screensaver_gnome_screensaver, parametrized suitably, and implement the ‘suspend’ and ‘resume’ commands for freedesktop in the same way as for gnome-screensaver. Also rewrite the code for ‘reset’, which was incorrectly calling ‘UnInhibit’, which does not necessarily disable the screensaver (quite the reverse, possibly!). Instead, call ‘SimulateUserActivity’, as for the gnome-screensaver case. Note that on a current GNOME system (e.g. GNOME 42) some of the DBus freedesktop endpoints are advertised but unimplemented; xdg-screensaver will give an error for these cases.
-rw-r--r--scripts/xdg-screensaver.in71
1 files changed, 25 insertions, 46 deletions
diff --git a/scripts/xdg-screensaver.in b/scripts/xdg-screensaver.in
index 6949146..3ef039b 100644
--- a/scripts/xdg-screensaver.in
+++ b/scripts/xdg-screensaver.in
@@ -241,33 +241,13 @@ screensaver_freedesktop()
{
case "$1" in
suspend)
- dbus-send --session \
- --dest=org.freedesktop.ScreenSaver \
- --type=method_call \
- --print-reply \
- --reply-timeout=2000 \
- /ScreenSaver \
- org.freedesktop.ScreenSaver.Inhibit \
- string:$window_id \
- string:xdg-screensaver \
- | grep uint32 | cut -d ' ' -f 5 >| "$screensaver_file.cookie" \
- 2> /dev/null
- result=$?
+ screensaver_dbus_process $window_id $screensaver_file "org.freedesktop.ScreenSaver" "/ScreenSaver"
+ result=0
;;
resume)
- if [ -f "$screensaver_file.cookie" ] ; then
- value=`cat "$screensaver_file.cookie"`
- dbus-send --session \
- --dest=org.freedesktop.ScreenSaver \
- --type=method_call \
- /ScreenSaver \
- org.freedesktop.ScreenSaver.UnInhibit \
- uint32:$value \
- 2> /dev/null
- rm -f "$screensaver_file.cookie"
- fi
- result=$?
+ # Automatic resume when $screensaver_file disappears
+ result=0
;;
activate)
@@ -291,17 +271,12 @@ screensaver_freedesktop()
;;
reset)
- if [ -f "$screensaver_file.cookie" ] ; then
- value=`cat "$screensaver_file.cookie"`
- dbus-send --session \
- --dest=org.freedesktop.ScreenSaver \
- --type=method_call \
- /ScreenSaver \
- org.freedesktop.ScreenSaver.UnInhibit \
- uint32:$value \
- 2> /dev/null
- rm -f "$screensaver_file.cookie"
- fi
+ dbus-send --session \
+ --dest=org.freedesktop.ScreenSaver \
+ --type=method_call \
+ /ScreenSaver \
+ org.freedesktop.ScreenSaver.SimulateUserActivity \
+ 2> /dev/null
result=$?
;;
@@ -468,13 +443,9 @@ screensaver_suspend_loop()
(while [ -f "$screensaver_file" ]; do $*; sleep 50; done) > /dev/null 2> /dev/null &
}
-screensaver_gnome_screensaver()
+screensaver_dbus_process ()
{
-# DBUS interface for gnome-screensaver
-# http://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html
- case "$1" in
- suspend)
- perl -e '
+ perl -e '
use strict;
use warnings;
use Encode qw(decode);
@@ -482,7 +453,7 @@ use IO::File;
use Net::DBus;
use X11::Protocol;
-my ($window_id, $screensaver_file) = @ARGV;
+my ($window_id, $screensaver_file, $dbus_service, $dbus_path) = @ARGV;
# Find window name to pass to session manager.
my $x = X11::Protocol->new();
@@ -506,9 +477,8 @@ $window_name = decode("utf8", $window_name, Encode::FB_DEFAULT);
# Inhibit idle detection (flags = 8) with window name and ID.
# We have no reason so just send the window name again.
my $bus = Net::DBus->session();
-my $sm_svc = $bus->get_service("org.gnome.SessionManager");
-my $sm = $sm_svc->get_object("/org/gnome/SessionManager",
- "org.gnome.SessionManager");
+my $sm_svc = $bus->get_service($dbus_service);
+my $sm = $sm_svc->get_object($dbus_path, $dbus_service);
$sm->Inhibit($window_name, hex($window_id), $window_name, 8);
# Wait until removed from the status file.
@@ -525,7 +495,16 @@ while (1) {
}
exit 0 unless $found;
}
-' $window_id $screensaver_file &
+' "$1" "$2" "$3" "$4" &
+ }
+
+screensaver_gnome_screensaver()
+{
+# DBUS interface for gnome-screensaver
+# http://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html
+ case "$1" in
+ suspend)
+ screensaver_dbus_process $window_id $screensaver_file "org.gnome.SessionManager" "/org/gnome/SessionManager"
result=0
;;