components/desktop/xdg-utils/patches/0006-gnome-screensaver.patch
changeset 7206 23066e5fef27
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/desktop/xdg-utils/patches/0006-gnome-screensaver.patch	Fri Oct 28 17:56:16 2016 -0700
@@ -0,0 +1,164 @@
+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