#!/bin/sh #--------------------------------------------- # xdg-open # # Utility script to open a URL in the registered default application. # # Refer to the usage() function below for usage. # # Copyright 2009-2010, Fathi Boudra # Copyright 2009-2010, Rex Dieter # Copyright 2006, Kevin Krammer # Copyright 2006, Jeremy White # # LICENSE: # #--------------------------------------------- manualpage() { cat << _MANUALPAGE _MANUALPAGE } usage() { cat << _USAGE _USAGE } #@xdg-utils-common@ # This handles backslashes but not quote marks. first_word() { read first rest echo "$first" } last_word() { read first rest echo "$rest" } open_darwin() { open "$1" if [ $? -eq 0 ]; then exit_success else exit_failure_operation_failed fi } open_kde() { if kde-open -v 2>/dev/null 1>&2; then kde-open "$1" else if [ x"$KDE_SESSION_VERSION" = x"4" ]; then kfmclient openURL "$1" else kfmclient exec "$1" kfmclient_fix_exit_code $? fi fi if [ $? -eq 0 ]; then exit_success else exit_failure_operation_failed fi } open_gnome() { if gvfs-open --help 2>/dev/null 1>&2; then gvfs-open "$1" else gnome-open "$1" fi if [ $? -eq 0 ]; then exit_success else exit_failure_operation_failed fi } open_xfce() { exo-open "$1" if [ $? -eq 0 ]; then exit_success else exit_failure_operation_failed fi } open_generic_xdg_mime() { filetype=`xdg-mime query filetype "$1" | sed "s/;.*//"` default=`xdg-mime query default "$filetype"` if [ -n "$default" ] ; then 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/ 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 done fi } open_generic() { # Paths or file:// URLs if (echo "$1" | grep -q '^file://' || ! echo "$1" | egrep -q '^[a-zA-Z+\.\-]+:'); then local file="$1" # Decode URLs if echo "$file" | grep -q '^file:///'; then file=${file#file://} file="$(printf "$(echo "$file" | sed -e 's@%\([a-f0-9A-F]\{2\}\)@\\x\1@g')")" fi check_input_file "$file" open_generic_xdg_mime "$file" if [ -f /etc/debian_version ] && which run-mailcap 2>/dev/null 1>&2; then run-mailcap --action=view "$file" if [ $? -eq 0 ]; then exit_success fi fi if mimeopen -v 2>/dev/null 1>&2; then mimeopen -L -n "$file" if [ $? -eq 0 ]; then exit_success fi fi fi IFS=":" for browser in $BROWSER; do if [ x"$browser" != x"" ]; then browser_with_arg=`printf "$browser" "$1" 2>/dev/null` if [ $? -ne 0 ]; then browser_with_arg=$browser; fi if [ x"$browser_with_arg" = x"$browser" ]; then "$browser" "$1"; else eval '$browser_with_arg'$xdg_redirect_output; fi if [ $? -eq 0 ]; then exit_success; fi fi done exit_failure_operation_impossible "no method available for opening '$1'" } open_lxde() { # pcmanfm only knows how to handle file:// urls and filepaths, it seems. if (echo "$1" | grep -q '^file://' || ! echo "$1" | egrep -q '^[a-zA-Z+\.\-]+:') then local file="$(echo "$1" | sed 's%^file://%%')" # handle relative paths if ! echo "$file" | grep -q '^/'; then file="$(pwd)/$file" fi pcmanfm "$file" else open_generic "$1" fi if [ $? -eq 0 ]; then exit_success else exit_failure_operation_failed fi } [ x"$1" != x"" ] || exit_failure_syntax url= while [ $# -gt 0 ] ; do parm="$1" shift case "$parm" in -*) exit_failure_syntax "unexpected option '$parm'" ;; *) if [ -n "$url" ] ; then exit_failure_syntax "unexpected argument '$parm'" fi url="$parm" ;; esac done if [ -z "${url}" ] ; then exit_failure_syntax "file or URL argument missing" fi detectDE if [ x"$DE" = x"" ]; then DE=generic 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 fi case "$DE" in kde) open_kde "$url" ;; gnome*) open_gnome "$url" ;; xfce) open_xfce "$url" ;; lxde) open_lxde "$url" ;; generic) open_generic "$url" ;; *) exit_failure_operation_impossible "no method available for opening '$url'" ;; esac