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 }