--- /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