components/desktop/xdg-utils/patches/0006-gnome-screensaver.patch
author Niveditha Rau <Niveditha.Rau@Oracle.COM>
Fri, 28 Oct 2016 17:56:16 -0700
changeset 7206 23066e5fef27
permissions -rw-r--r--
23245637 Deliver gnome-shell 3.18.3 in Solaris PSARC/2016/396 GNOME 3 Window Manager Bundle

Backport of changes from upstream git repo to support GNOME 3 screensaver.

Should be removable when we upgrade to xdg-utils 1.1.0 or later.

--- a/scripts/xdg-screensaver
+++ b/scripts/xdg-screensaver
@@ -417,8 +417,8 @@ perform_action()
       screensaver_kde "$1"
       ;;
 
-    gnome)
-      screensaver_gnome "$1"
+    gnome_screensaver)
+      screensaver_gnome_screensaver "$1"
       ;;
 
     xscreensaver)
@@ -611,17 +611,59 @@ screensaver_suspend_loop()
   (while [ -f "$screensaver_file" ]; do $*; sleep 59; done) > /dev/null 2> /dev/null &
 }
 
-screensaver_gnome()
+screensaver_gnome_screensaver()
 {
-# TODO
-# There seems to be a DBUS interface for gnome-screensaver
-# See http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2006-April/042579.html and
-# http://cvs.gnome.org/viewcvs/gnome-screensaver/src/gs-listener-dbus.c?rev=1.36&view=log
-# A problem seems to be that Inhibit is tied to the lifetime of the DBUS appname and
-# this can not be used from a script
+# DBUS interface for gnome-screensaver
+# http://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html
     case "$1" in
-        suspend) 
-        screensaver_suspend_loop gnome-screensaver-command --poke
+        suspend)
+        perl -e '
+use strict;
+use warnings;
+use IO::File;
+use Net::DBus;
+use X11::Protocol;
+
+my ($window_id, $screensaver_file) = @ARGV;
+
+# Find window name to pass to session manager.
+my $x = X11::Protocol->new();
+my $named_window_id = hex($window_id);
+my $window_name;
+while (1) {
+  ($window_name) = $x->GetProperty($named_window_id, $x->atom("WM_NAME"),
+				   $x->atom("STRING"), 0, 1000, 0);
+  last if defined($window_name) && $window_name ne "";
+  (undef, $named_window_id) = $x->QueryTree($named_window_id);
+  if (!defined($named_window_id)) {
+    $window_name = "?";
+    last;
+  }
+}
+
+# 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");
+$sm->Inhibit($window_name, hex($window_id), $window_name, 8);
+
+# Wait until removed from the status file.
+while (1) {
+  sleep(10);
+  my $status = new IO::File($screensaver_file, "r")
+    or exit 0;
+  my $found;
+  while (<$status>) {
+    if (/^$window_id:/) {
+      $found = 1;
+      last;
+    }
+  }
+  exit 0 unless $found;
+}
+' $window_id $screensaver_file &
         result=0
         ;;
 
@@ -631,27 +673,52 @@ screensaver_gnome()
         ;;
         
         activate)
-        gnome-screensaver-command --activate > /dev/null 2> /dev/null
+        dbus-send --session \
+                  --dest=org.gnome.ScreenSaver \
+                  --type=method_call \
+                  /org/gnome/ScreenSaver \
+                  org.gnome.ScreenSaver.SetActive \
+                  boolean:true \
+                  2> /dev/null
         result=$?
         ;;
         
         lock)
-        gnome-screensaver-command --lock > /dev/null 2> /dev/null
+        dbus-send --session \
+                  --dest=org.gnome.ScreenSaver \
+                  --type=method_call \
+                  /org/gnome/ScreenSaver \
+                  org.gnome.ScreenSaver.Lock \
+                  2> /dev/null
         result=$?
         ;;
         
         reset)
         # Turns the screensaver off right now
-        gnome-screensaver-command --deactivate > /dev/null 2> /dev/null
+        dbus-send --session \
+                  --dest=org.gnome.ScreenSaver \
+                  --type=method_call \
+                  /org/gnome/ScreenSaver \
+                  org.gnome.ScreenSaver.SimulateUserActivity \
+                 2> /dev/null
         result=$?
         ;;
 
         status)
-        result=0
-        if [ -f "$screensaver_file" ] ; then
-            echo "disabled"
-        elif gnome-screensaver-command --query > /dev/null 2> /dev/null; then
+        status=`dbus-send --session \
+                          --dest=org.gnome.ScreenSaver \
+                          --type=method_call \
+                          --print-reply \
+                          --reply-timeout=2000 \
+                          /org/gnome/ScreenSaver \
+                          org.gnome.ScreenSaver.GetActive \
+                          | grep boolean | cut -d ' ' -f 5`
+        result=$?
+        if [ x"$status" = "xtrue" -o x"$status" = "xfalse" ]; then
             echo "enabled"
+        elif [ x"$result" != "x0" ]; then
+            echo "ERROR: dbus org.gnome.ScreenSaver.GetActive returned '$status'" >&2
+            return 1
         else
             # Something is wrong
             echo "disabled"
@@ -659,7 +726,7 @@ screensaver_gnome()
         ;;
 
         *)
-        echo "ERROR:  Unknown command '$1" >&2
+        echo "ERROR: Unknown command '$1" >&2
         return 1
         ;;
     esac
@@ -766,6 +833,8 @@ esac
 detectDE
 # Consider "xscreensaver" a separate DE
 xscreensaver-command -version 2> /dev/null | grep XScreenSaver > /dev/null && DE="xscreensaver"
+# Consider "gnome-screensaver" a separate DE
+dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.ScreenSaver > /dev/null 2>&1 && DE="gnome_screensaver"
 
 if [ "$action" = "resume" ] ; then
     do_resume