summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRex Dieter <rdieter@fedoraproject.org>2012-03-02 12:37:09 -0600
committerRex Dieter <rdieter@fedoraproject.org>2012-03-02 12:37:09 -0600
commit687127b9cd9c858491fd5e3109a6ad1ab06be396 (patch)
tree76bf54418f385485f945c5545eb9984ef100d4a7
parentb961235b197647d6649ef3d48d7cc2cecafe3d47 (diff)
"unknown DE" improvements (BR45295)
-rw-r--r--ChangeLog3
-rw-r--r--scripts/xdg-mime.in59
-rw-r--r--scripts/xdg-open.in69
3 files changed, 100 insertions, 31 deletions
diff --git a/ChangeLog b/ChangeLog
index 1f35f31..423179a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
=== xdg-utils 1.1.x ===
+2012-03-02 Rex Dieter <rdieter@fedoraproject.org>
+ * "unknown DE" improvements (BR45295)
+
2011-12-09 Rex Dieter <rdieter@fedoraproject.org>
* initial DE=mate support (mostly just xdg-open so far)
diff --git a/scripts/xdg-mime.in b/scripts/xdg-mime.in
index 023a465..2de4657 100644
--- a/scripts/xdg-mime.in
+++ b/scripts/xdg-mime.in
@@ -296,6 +296,49 @@ make_default_generic()
' "$default_file" > "${default_file}.new" && mv "${default_file}.new" "$default_file"
}
+search_desktop_file()
+{
+ local MIME="$1"
+ local dir="$2"
+
+ grep -l "$MIME;" "$dir/"*.desktop 2>/dev/null
+
+ for f in $dir/*/; do
+ [ -d "$f" ] && search_desktop_file "$MIME" "$f"
+ done
+}
+
+defapp_fallback()
+{
+ MIME="$1"
+
+ xdg_user_dir="$XDG_DATA_HOME"
+ [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share"
+
+ xdg_system_dirs="$XDG_DATA_DIRS"
+ [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/
+
+ preference=-1
+ desktop_file=""
+ for d in `echo "$xdg_user_dir:$xdg_system_dirs" | sed 's/:/ /g'`; do
+ for x in `search_desktop_file "$MIME" "$d/applications"`; do
+ pref=0`awk -F"=" '/InitialPreference=/ {print($2)}' "$x"`
+ DEBUG 2 " Checking $x"
+
+ if [ $pref -gt $preference ]; then
+ DEBUG 2 " Select $x [ $preference => $pref ]"
+ preference=$pref
+ desktop_file=$x
+ fi
+ done
+ done
+
+ if [ -n "$desktop_file" ] ; then
+ echo `basename $desktop_file`
+ exit_success
+ fi
+}
+
defapp_generic()
{
MIME="$1"
@@ -334,13 +377,17 @@ defapp_generic()
done
for x in `echo "$xdg_system_dirs" | sed 's/:/ /g'`; do
- DEBUG 2 "Checking $x/applications/defaults.list"
- trader_result=`grep "$MIME=" $x/applications/defaults.list 2> /dev/null | cut -d '=' -f 2 | cut -d ';' -f 1`
- if [ -n "$trader_result" ] ; then
- echo $trader_result
- exit_success
- fi
+ for prefix in "$XDG_MENU_PREFIX" ""; do
+ DEBUG 2 "Checking $x/applications/${prefix}defaults.list"
+ trader_result=`grep "$MIME=" $x/applications/${prefix}defaults.list 2> /dev/null | cut -d '=' -f 2 | cut -d ';' -f 1`
+ if [ -n "$trader_result" ] ; then
+ echo $trader_result
+ exit_success
+ fi
+ done
done
+
+ defapp_fallback $MIME
exit_success
}
diff --git a/scripts/xdg-open.in b/scripts/xdg-open.in
index 1ef2db9..7c1395d 100644
--- a/scripts/xdg-open.in
+++ b/scripts/xdg-open.in
@@ -114,6 +114,49 @@ open_xfce()
fi
}
+#-----------------------------------------
+# Recursively search .desktop file
+
+search_desktop_file()
+{
+ local default="$1"
+ local dir="$2"
+ local arg="$3"
+
+ local file=""
+ # look for both vendor-app.desktop, vendor/app.desktop
+ if [ -r "$dir/$default" ]; then
+ file="$dir/$default"
+ elif [ -r "$dir/`echo $default | sed -e 's|-|/|'`" ]; then
+ file="$dir/`echo $default | sed -e 's|-|/|'`"
+ fi
+
+ if [ -r "$file" ] ; then
+ command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
+ command_exec=`which $command 2>/dev/null`
+ arguments="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | last_word`"
+ arguments_exec="`echo $arguments | sed -e 's*%[fFuU]*"'"$arg"'"*g'`"
+ if [ -x "$command_exec" ] ; then
+ if echo $arguments | grep -iq '%[fFuU]' ; then
+ echo START $command_exec $arguments_exec
+ eval $command_exec $arguments_exec
+ else
+ echo START $command_exec $arguments_exec "$arg"
+ eval $command_exec $arguments_exec "$arg"
+ fi
+
+ if [ $? -eq 0 ]; then
+ exit_success
+ fi
+ fi
+ fi
+
+ for d in $dir/*/; do
+ [ -d "$d" ] && search_desktop_file "$default" "$d" "$arg"
+ done
+}
+
+
open_generic_xdg_mime()
{
filetype="$2"
@@ -127,31 +170,7 @@ open_generic_xdg_mime()
DEBUG 3 "$xdg_user_dir:$xdg_system_dirs"
for x in `echo "$xdg_user_dir:$xdg_system_dirs" | sed 's/:/ /g'`; do
- local file
- # look for both vendor-app.desktop, vendor/app.desktop
- if [ -r "$x/applications/$default" ]; then
- file="$x/applications/$default"
- elif [ -r "$x/applications/`echo $default | sed -e 's|-|/|'`" ]; then
- file="$x/applications/`echo $default | sed -e 's|-|/|'`"
- fi
-
- if [ -r "$file" ] ; then
- command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
- command_exec=`which $command 2>/dev/null`
- arguments="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | last_word`"
- arguments_exec="`echo $arguments | sed -e 's*%[fFuU]*"'"$1"'"*g'`"
- if [ -x "$command_exec" ] ; then
- if echo $arguments | grep -iq '%[fFuU]' ; then
- eval $command_exec $arguments_exec
- else
- eval $command_exec $arguments_exec "$1"
- fi
-
- if [ $? -eq 0 ]; then
- exit_success
- fi
- fi
- fi
+ search_desktop_file "$default" "$x/applications/" "$1"
done
fi
}