Description: Collected Debian patches for xdg-utils
Author: Per Olofsson <pelle@debian.org>

The xdg-utils package is maintained in Git rather than maintaining
patches as separate files, and separating the patches doesn't seem to
be worth the effort.  They are therefore all included in this single
Debian patch.

For full commit history and separated commits, see the packaging Git
repository.
--- xdg-utils-1.1.0~rc3+git20150919.orig/ChangeLog
+++ xdg-utils-1.1.0~rc3+git20150919/ChangeLog
@@ -1,4 +1,6 @@
 === xdg-utils 1.1.x ===
+2015-09-20  Per Olofsson <pelle@debian.org>
+   * xdg-open: Try $BROWSER first in generic mode if it is set by the user.
 
 2015-09-18 Rex Dieter <rdieter@fedoraproject.org>
    * xdg-email: Recipients passed to Thunderbird are incorrectly quoted (BR91996)
--- xdg-utils-1.1.0~rc3+git20150919.orig/Makefile.in
+++ xdg-utils-1.1.0~rc3+git20150919/Makefile.in
@@ -1,10 +1,12 @@
-SUBDIRS = scripts tests
+SUBDIRS = scripts tests autotests
 
 all:		$(SUBDIRS)
 install:	$(SUBDIRS:%=%/__install__)
 uninstall:	$(SUBDIRS:%=%/__uninstall__)
 test:		dummy
 	cd tests && $(MAKE) test
+autotest:
+	cd autotests && $(MAKE) test
 clean:		$(SUBDIRS:%=%/__clean__)
 distclean:	clean $(SUBDIRS:%=%/__distclean__)
 	rm -f config.* Makefile
@@ -16,7 +18,7 @@ release:	$(SUBDIRS:%=%/__release__)
 help:	
 	@echo "Usage: make [install|uninstall|release]"
 
-.PHONY: all install uninstall clean distclean dummy
+.PHONY: all install uninstall clean distclean dummy autotest
 dummy:
 
 $(SUBDIRS): dummy
--- /dev/null
+++ xdg-utils-1.1.0~rc3+git20150919/autotests/.gitignore
@@ -0,0 +1 @@
+/lab
--- /dev/null
+++ xdg-utils-1.1.0~rc3+git20150919/autotests/Makefile
@@ -0,0 +1,29 @@
+T := $(sort $(wildcard t-*.sh))
+
+test: $(T)
+	@if [ -e failed-tests ]; then \
+		echo; \
+		echo TEST FAILURES:; \
+		echo; \
+		cat failed-tests; \
+		echo; \
+		exit 1; \
+	fi
+
+remove-failed-tests:
+	-rm failed-tests
+
+$(T): remove-failed-tests
+	@echo "*** $@ ***"; sh $@
+
+clean: remove-failed-tests
+	-rm -r lab
+
+distclean: clean
+
+all:
+install:
+uninstall:
+release:
+
+.PHONY: test remove-failed-tests all install uninstall release distclean $(T)
--- /dev/null
+++ xdg-utils-1.1.0~rc3+git20150919/autotests/t-xdg-mime-query-default.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+. ./test-lib.sh
+
+cat > $XDG_DATA_DIR/applications/mimeapps.list <<EOF
+[Default Applications]
+x-scheme-handler/http=mosaic.desktop
+EOF
+handler=$(run generic xdg-mime query default x-scheme-handler/http)
+assert_equal mosaic.desktop "$handler"
--- /dev/null
+++ xdg-utils-1.1.0~rc3+git20150919/autotests/t-xdg-open-url.sh
@@ -0,0 +1,59 @@
+#!/bin/sh
+. ./test-lib.sh
+
+test_open_url() {
+    local de=$1
+    shift
+    local cmd=$1
+
+    mock $cmd
+    run $de xdg-open http://www.freedesktop.org/
+    assert_run "$@" http://www.freedesktop.org/
+    unmock $cmd
+}
+
+mock_missing gvfs-open
+test_open_url gnome2 gnome-open
+unmock gvfs-open
+
+test_open_url gnome3 gvfs-open
+
+test_open_url kde3 kfmclient exec
+
+test_open_url kde4 kde-open
+
+test_open_url kde5 kde-open5
+
+test_open_url mate gvfs-open
+mock_missing gvfs-open
+test_open_url mate mate-open
+unmock gvfs-open
+
+test_open_url xfce exo-open
+
+test_open_url enlightenment enlightenment_open
+
+cat > $XDG_DATA_DIR/applications/mosaic.desktop <<EOF
+[Desktop Entry]
+Name=Mosaic
+Exec=mosaic %u
+EOF
+
+cat > $XDG_DATA_DIR/applications/mimeapps.list <<EOF
+[Default Applications]
+x-scheme-handler/http=mosaic.desktop
+EOF
+
+test_open_url lxde mosaic
+test_open_url generic mosaic
+
+# $BROWSER should override mimeapps.list
+BROWSER=cyberdog
+mock mosaic
+
+test_open_url generic cyberdog
+
+BROWSER="cyberdog --url %s"
+test_open_url generic cyberdog --url
+
+unmock mosaic
--- /dev/null
+++ xdg-utils-1.1.0~rc3+git20150919/autotests/test-lib.sh
@@ -0,0 +1,172 @@
+set -e
+
+TEST_NAME=$0
+LABDIR=lab
+BINDIR=$LABDIR/bin
+COMMANDS_RUN=$LABDIR/commands-run
+FAILED_TESTS=failed-tests
+XDG_DATA_HOME=$LABDIR/home-share
+XDG_DATA_DIR=$LABDIR/share
+XDG_DATA_DIR_LOCAL=$LABDIR/share-local
+XDG_DATA_DIRS=$XDG_DATA_DIR_LOCAL:$XDG_DATA_DIR
+BROWSER=
+
+fatal() {
+    echo "FATAL: $*" >&2
+    exit 1
+}
+
+setup_lab() {
+    [ -f test-lib.sh ] || fatal "You must run tests from the autotests directory!"
+    [ -e $LABDIR ] && rm -r $LABDIR
+    mkdir $LABDIR $BINDIR $XDG_DATA_HOME $XDG_DATA_DIR $XDG_DATA_DIR_LOCAL
+    mkdir $XDG_DATA_HOME/applications $XDG_DATA_DIR/applications \
+          $XDG_DATA_DIR_LOCAL/applications
+    touch $COMMANDS_RUN
+}
+
+set_de_() {
+    unmock gnome-default-applications-properties
+    unmock kde-config
+    KDE_SESSION_VERSION=
+
+    case "$1" in
+        cinnamon)
+            XDG_CURRENT_DESKTOP=Cinnamon
+            ;;
+        enlightenment)
+            XDG_CURRENT_DESKTOP=ENLIGHTENMENT
+            ;;
+        gnome2)
+            XDG_CURRENT_DESKTOP=GNOME
+            mock gnome-default-applications-properties
+            ;;
+        gnome3)
+            XDG_CURRENT_DESKTOP=GNOME
+            ;;
+        kde3)
+            XDG_CURRENT_DESKTOP=KDE
+            cat > $BINDIR/kde-config <<EOF
+#!/bin/sh
+echo "KDE: 3.5.5"
+EOF
+            chmod +x $BINDIR/kde-config
+            ;;
+        kde4)
+            XDG_CURRENT_DESKTOP=KDE
+            KDE_SESSION_VERSION=4
+            ;;
+        kde5)
+            XDG_CURRENT_DESKTOP=KDE
+            KDE_SESSION_VERSION=5
+            ;;
+        lxde)
+            XDG_CURRENT_DESKTOP=LXDE
+            ;;
+        mate)
+            XDG_CURRENT_DESKTOP=MATE
+            ;;
+        xfce)
+            XDG_CURRENT_DESKTOP=XFCE
+            ;;
+        generic)
+            XDG_CURRENT_DESKTOP=X-Generic
+            ;;
+        *)
+            fatal "unknown desktop environment: $1"
+            ;;
+    esac
+}
+
+mock_ret() {
+    local ret="$1"
+    shift
+    local command="$1"
+    local executable="$BINDIR/$command"
+
+    cat >"$executable" <<EOF
+#!/bin/sh
+set -e
+echo "$command \$*" >> $(pwd)/$COMMANDS_RUN
+exit $ret
+EOF
+    chmod +x "$executable"
+}
+
+mock() {
+    mock_ret 0 "$@"
+}
+
+mock_missing() {
+    mock_ret 127 "$@"
+}
+
+unmock() {
+    if [ -e "$BINDIR/$1" ]; then
+        rm "$BINDIR/$1"
+    fi
+}
+
+is_mocked() {
+    if [ -e "$BINDIR/$1" ]; then
+        return 0
+    else
+        return 1
+    fi
+}
+
+assertion_failed() {
+    echo "ASSERTION FAILED: $*" >&2
+    echo "$TEST_NAME: $*" >>$FAILED_TESTS
+}
+
+assert_run() {
+    if grep -Fxq "$*" $COMMANDS_RUN; then
+        return 0
+    else
+        assertion_failed "assert_run $*"
+    fi
+}
+
+assert_equal() {
+    if [ "$1" = "$2" ]; then
+        return 0
+    else
+        assertion_failed "expected: '$1' got: '$2'"
+    fi
+}
+
+run() {
+    local de="$1"
+    shift
+
+    local cmd="$1"
+    shift
+
+    : > $COMMANDS_RUN
+
+    set_de_ $de
+
+    local trace=
+    if [ "$TRACE" = 1 ]; then
+        trace="sh -x"
+    fi
+
+    echo "RUN [$de] $cmd $*" >&2
+    env -i \
+        PATH="$BINDIR:../scripts:$PATH" \
+        SHELL="$SHELL" \
+        USERNAME="$USERNAME" \
+        HOME="$HOME" \
+        LOGNAME="$LOGNAME" \
+        TERM="$TERM" \
+        XDG_CURRENT_DESKTOP="$XDG_CURRENT_DESKTOP" \
+        KDE_SESSION_VERSION="$KDE_SESSION_VERSION" \
+        XDG_DATA_HOME=$XDG_DATA_HOME \
+        XDG_DATA_DIRS=$XDG_DATA_DIRS \
+        DISPLAY=x \
+        BROWSER="$BROWSER" \
+        $trace ../scripts/$cmd "$@"
+}
+
+setup_lab
--- xdg-utils-1.1.0~rc3+git20150919.orig/scripts/xdg-email.in
+++ xdg-utils-1.1.0~rc3+git20150919/scripts/xdg-email.in
@@ -188,6 +188,23 @@ open_xfce()
     fi
 }
 
+open_envvar()
+{
+    local OLDIFS="$IFS"
+    IFS=:
+    for i in $MAILER; do
+	IFS="$OLDIFS"
+
+	eval "$i" '"$1"'
+
+	if [ $? -eq 0 ]; then
+	    exit_success
+	fi
+    done
+
+    exit_failure_operation_failed
+}
+
 open_generic()
 {
     local client
@@ -401,15 +418,23 @@ if [ x"$DE" = x"" ]; then
     DE=generic
 fi
 
+if [ x"$MAILER" != x"" ]; then
+    DE=envvar
+fi
+
 # if BROWSER variable is not set, check some well known browsers instead
 if [ x"$BROWSER" = x"" ]; then
-    BROWSER=links2:elinks:links:lynx:w3m
+    BROWSER=www-browser:links2:elinks:links:lynx:w3m
     if [ -n "$DISPLAY" ]; then
         BROWSER=x-www-browser:firefox:seamonkey:mozilla:epiphany:konqueror:chromium-browser:google-chrome:$BROWSER
     fi
 fi
 
 case "$DE" in
+    envvar)
+    open_envvar "${mailto}"
+    ;;
+
     kde)
     open_kde "${mailto}"
     ;;
--- xdg-utils-1.1.0~rc3+git20150919.orig/scripts/xdg-open.in
+++ xdg-utils-1.1.0~rc3+git20150919/scripts/xdg-open.in
@@ -270,6 +270,31 @@ open_generic_xdg_x_scheme_handler()
     fi
 }
 
+open_envvar()
+{
+    local oldifs="$IFS"
+    local browser browser_with_arg
+
+    IFS=":"
+    for browser in $BROWSER; do
+        IFS="$oldifs"
+
+        if [ -z "$browser" ]; then
+            continue
+        fi
+
+        if echo "$browser" | grep -q %s; then
+            $(printf "$browser" "$1")
+        else
+            $browser "$1"
+        fi
+
+        if [ $? -eq 0 ]; then
+            exit_success
+        fi
+    done
+}
+
 open_generic()
 {
     # Paths or file:// URLs
@@ -291,8 +316,10 @@ open_generic()
         file_check=${file_check%%\?*}
         check_input_file "$file_check"
 
-        filetype=`xdg-mime query filetype "$file_check" | sed "s/;.*//"`
-        open_generic_xdg_mime "$file" "$filetype"
+        if [ -n "$DISPLAY" ]; then
+            filetype=`xdg-mime query filetype "$file_check" | sed "s/;.*//"`
+            open_generic_xdg_mime "$file" "$filetype"
+        fi
 
         if which run-mailcap 2>/dev/null 1>&2; then
             run-mailcap --action=view "$file"
@@ -301,7 +328,7 @@ open_generic()
             fi
         fi
 
-        if mimeopen -v 2>/dev/null 1>&2; then
+        if [ -n "$DISPLAY" ] && mimeopen -v 2>/dev/null 1>&2; then
             mimeopen -L -n "$file"
             if [ $? -eq 0 ]; then
                 exit_success
@@ -309,29 +336,23 @@ open_generic()
         fi
     fi
 
-    open_generic_xdg_x_scheme_handler "$1"
-
-    local oldifs="$IFS"
-    IFS=":"
-    for browser in $BROWSER; do
-        IFS="$oldifs"
-        if [ x"$browser" != x"" ]; then
-
-            browser_with_arg=`printf "$browser" "$1" 2>/dev/null`
-            if [ $? -ne 0 ]; then
-                browser_with_arg=$browser;
-            fi
+    if [ -n "$BROWSER" ]; then
+        open_envvar "$1"
+    fi
 
-            if [ x"$browser_with_arg" = x"$browser" ]; then
-                eval '$browser "$1"'$xdg_redirect_output;
-            else eval '$browser_with_arg'$xdg_redirect_output;
-            fi
+    if [ -n "$DISPLAY" ]; then
+        open_generic_xdg_x_scheme_handler "$1"
+    fi
 
-            if [ $? -eq 0 ]; then
-                exit_success;
-            fi
+    # if BROWSER variable is not set, check some well known browsers instead
+    if [ x"$BROWSER" = x"" ]; then
+        BROWSER=links2:elinks:links:lynx:w3m
+        if [ -n "$DISPLAY" ]; then
+            BROWSER=x-www-browser:firefox:seamonkey:mozilla:epiphany:konqueror:chromium-browser:google-chrome:$BROWSER
         fi
-    done
+    fi
+
+    open_envvar "$1"
 
     exit_failure_operation_impossible "no method available for opening '$1'"
 }
@@ -405,14 +426,6 @@ case "${BROWSER}" in
         ;;
 esac
 
-# if BROWSER variable is not set, check some well known browsers instead
-if [ x"$BROWSER" = x"" ]; then
-    BROWSER=links2:elinks:links:lynx:w3m
-    if [ -n "$DISPLAY" ]; then
-        BROWSER=x-www-browser:firefox:seamonkey:mozilla:epiphany:konqueror:chromium-browser:google-chrome:$BROWSER
-    fi
-fi
-
 case "$DE" in
     kde)
     open_kde "$url"
--- xdg-utils-1.1.0~rc3+git20150919.orig/scripts/xdg-screensaver.in
+++ xdg-utils-1.1.0~rc3+git20150919/scripts/xdg-screensaver.in
@@ -446,14 +446,54 @@ screensaver_gnome_screensaver()
 # http://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html
     case "$1" in
         suspend)
-        screensaver_suspend_loop \
-        dbus-send --session \
-                  --dest=org.gnome.ScreenSaver \
-                  --type=method_call \
-                  /org/gnome/ScreenSaver \
-                  org.gnome.ScreenSaver.SimulateUserActivity \
-                  2> /dev/null
-        result=$?
+        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
         ;;
 
         resume)
