diff --git a/indra/newview/linux_tools/handle_secondlifeprotocol.sh b/indra/newview/linux_tools/handle_secondlifeprotocol.sh index 0bc966f6e53deaf709a825ebed86d41e805a75db..719873b97d632fe5978c275342061f6b69edbd68 100755 --- a/indra/newview/linux_tools/handle_secondlifeprotocol.sh +++ b/indra/newview/linux_tools/handle_secondlifeprotocol.sh @@ -3,28 +3,24 @@ # Send a URL of the form secondlife://... to any running viewer, if not, launch Alchemy viewer. # -URL="$1" +sl_url="$*" -if [ -z "$URL" ]; then +echo "Got SLURL: ${sl_url}" +if [ -z "${sl_url}" ]; then echo "Usage: $0 secondlife:// ..." exit fi -RUN_PATH=$(dirname "$0" || echo .) -#ch "${RUN_PATH}" +run_path=$(dirname "$0" || echo .) #Poll DBus to get a list of registered services, then look through the list for the Second Life API Service - if present, this means a viewer is running, if not, then no viewer is running and a new instance should be launched -LIST=$(dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames -) -SERVICE="com.secondlife.ViewerAppAPIService" #Name of Second Life DBus service. This should be the same across all viewers. -if echo "$LIST" | grep -q "$SERVICE"; then +service_name="com.secondlife.ViewerAppAPIService" #Name of Second Life DBus service. This should be the same across all viewers. +if dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames | grep -q "${service_name}"; then echo "Second Life running, sending to DBus..."; - exec dbus-send --type=method_call --dest=$SERVICE /com/secondlife/ViewerAppAPI com.secondlife.ViewerAppAPI.GoSLURL string:"$1" + exec dbus-send --type=method_call --dest="${service_name}" /com/secondlife/ViewerAppAPI com.secondlife.ViewerAppAPI.GoSLURL string:"${sl_url}" else echo "Second Life not running, launching new instance..."; - cd "${RUN_PATH}"/.. + cd "${run_path}"/.. || exit #Go to .sh location (/etc), then up a directory to the viewer location - #exec ./alchemy -url \'"${URL}"\' - exec ./alchemy -url ${URL} - #Remove some of the wrapping around the URL, as this was breaking the handover upon startup + exec ./alchemy -url "${sl_url}" fi diff --git a/indra/newview/linux_tools/register_secondlifeprotocol.sh b/indra/newview/linux_tools/register_secondlifeprotocol.sh index f6cbd97de6cc7542fd0dae6704e4d24bfd5e0e74..c79db822b8040653f636549b29434e03aeea6d1d 100755 --- a/indra/newview/linux_tools/register_secondlifeprotocol.sh +++ b/indra/newview/linux_tools/register_secondlifeprotocol.sh @@ -4,33 +4,46 @@ # URLs of the form secondlife://... # -HANDLER="$1" +desired_handler="$1" -RUN_PATH=$(dirname "$0" || echo .) -cd "${RUN_PATH}/.." +print() { + log_prefix="RegisterSLProtocol:" + echo -e "${log_prefix} $*" +} +run_path=$(dirname "$0" || echo .) +cd "${run_path}/.." || exit -if [ -z "$HANDLER" ]; then - #HANDLER="$RUN_PATH/etc/handle_secondlifeprotocol.sh" - HANDLER="$(pwd)/etc/handle_secondlifeprotocol.sh" +if [ -z "${desired_handler}" ]; then + #desired_handler="$run_path/etc/handle_secondlifeprotocol.sh" + desired_handler="$(pwd)/etc/handle_secondlifeprotocol.sh" fi -# Register handler for GNOME-aware apps -LLGCONFTOOL=gconftool-2 -if which ${LLGCONFTOOL} >/dev/null; then - (${LLGCONFTOOL} -s -t string /desktop/gnome/url-handlers/secondlife/command "${HANDLER} \"%s\"" && ${LLGCONFTOOL} -s -t bool /desktop/gnome/url-handlers/secondlife/enabled true) || echo Warning: Did not register secondlife:// handler with GNOME: ${LLGCONFTOOL} failed. -else - echo Warning: Did not register secondlife:// handler with GNOME: ${LLGCONFTOOL} not found. +print "Requested Handler: ${desired_handler}" + +# Register handler for gconf-aware apps +# TODO: use dconf or another modern alternative +gconftool=$(command -v "${LLGCONFTOOL:=gconftool-2}") +if [[ -z "${gconftool}" ]]; then + print "gconf not found, skipped. (This is good)" + else + if "${gconftool}" -s -t string /desktop/gnome/url-handlers/secondlife/command "${desired_handler} \"%s\"" \ + && ${gconftool} -s -t bool /desktop/gnome/url-handlers/secondlife/enabled true; then + print "Registered secondlife:// handler with (deprecated) gconf." + else + print "Failed to register secondlife:// handler with (deprecated) gconf." + fi fi # Register handler for KDE-aware apps -for LLKDECONFIG in kde-config kde4-config; do - if [ $(which $LLKDECONFIG) ]; then - LLKDEPROTODIR=$($LLKDECONFIG --path services | cut -d ':' -f 1) - if [ -d "$LLKDEPROTODIR" ]; then - LLKDEPROTOFILE=${LLKDEPROTODIR}/secondlife.protocol - cat > ${LLKDEPROTOFILE} <<EOF || echo Warning: Did not register secondlife:// handler with KDE: Could not write ${LLKDEPROTOFILE} +for kdeconfig in ${LLKDECONFIG} kf5-config kde4-config kde-config; do + if command -v "${kdeconfig}" >/dev/null 2>&1; then + kde_protocols_folder=$("${kdeconfig}" --path services | cut -d ':' -f 1) + mkdir -p "${kde_protocols_folder}" + if [ -d "${kde_protocols_folder}" ]; then + kde_proto_file=${kde_protocols_folder}/secondlife.protocol + kde_handler_string=" [Protocol] -exec=${HANDLER} '%u' +exec=${desired_handler} %u protocol=secondlife input=none output=none @@ -39,49 +52,67 @@ listing= reading=false writing=false makedir=false -deleting=false -EOF +deleting=false" + if echo "${kde_handler_string}" > "${kde_proto_file}"; then + print "Registered secondlife:// handler with KDE" + success=1 + else + print 'Warning: Did not register secondlife:// handler with KDE: Could not write '"${kde_proto_file}" + fi else - echo Warning: Did not register secondlife:// handler with KDE: Directory $LLKDEPROTODIR does not exist. + print 'Warning: Did not register secondlife:// handler with KDE: Directory '"${kde_protocols_folder}"' does not exist.' fi - fi + # else + # print "Warning: KDE-Config binary '${kdeconfig}' not found" + fi done - -#Check if xdg-mime is present, if so, use it to register new protocol. +if [[ -z "${success}" ]]; then + print "Warning: secondlife:// protocol not registered with KDE: could not find any configuration utility. You can still register the application manually by editing ${HOME}/.local/share/mimeapps.list" +fi +# if [[ -n "${FALLBACK}" ]]; then + #Check if xdg-mime is present, if so, use it to register new protocol. if command -v xdg-mime query default x-scheme-handler/secondlife > /dev/null 2>&1; then urlhandler=$(xdg-mime query default x-scheme-handler/secondlife) localappdir="$HOME/.local/share/applications" newhandler="handle_secondlifeprotocol.desktop" - cat >"$localappdir/$newhandler" <<EOFnew || echo Warning: Did not register secondlife:// handler with xdg-mime: Could not write $newhandler + handlerpath="$localappdir/$newhandler" + print "New handler file: ${handlerpath}" + cat >"${handlerpath}" <<EOFnew || print Warning: Did not register secondlife:// handler with xdg-mime: Could not write $newhandler [Desktop Entry] Version=1.5 Name="Second Life URL handler" Comment="secondlife:// URL handler" Type=Application -Exec=$HANDLER %u +Exec=$desired_handler %u Terminal=false StartupNotify=false NoDisplay=true MimeType=x-scheme-handler/secondlife EOFnew - if [ -z $urlhandler ]; then - echo No SLURL handler currently registered, creating new... +# TODO: use absolute path for the desktop file +# TODO: Ensure that multiple channels behave properly due to different desktop file names in /usr/share/applications/ +# TODO: Better detection of what the handler actually is, as other viewer projects may use the same filename + if [ -z "$urlhandler" ]; then + print No SLURL handler currently registered, creating new... else - echo Current SLURL Handler: $urlhandler - Setting new default... #xdg-mime uninstall $localappdir/$urlhandler #Clean up handlers from other viewers if [ "$urlhandler" != "$newhandler" ]; then - mv $localappdir/$urlhandler $localappdir/$urlhandler.bak + print "Current SLURL Handler: ${urlhandler} - Setting ${newhandler} as the new default..." + mv "$localappdir"/"$urlhandler" "$localappdir"/"$urlhandler".bak + else + print "SLURL Handler has not changed, leaving as-is." fi fi xdg-mime default $newhandler x-scheme-handler/secondlife if command -v update-desktop-database > /dev/null 2>&1; then - update-desktop-database $localappdir - echo -e "Registered secondlife:// protocol with xdg-mime\nNew default: $(xdg-mime query default x-scheme-handler/secondlife)" + update-desktop-database "$localappdir" + print "Registered secondlife:// protocol with xdg-mime. New default: $(xdg-mime query default x-scheme-handler/secondlife)" else - echo Warning: Cannot update desktop database, command missing - installation may be incomplete. + print "Warning: Cannot update desktop database, command missing - installation may be incomplete." fi else - echo Warning: Did not register secondlife:// handler with xdg-mime: Package not found. + print "Warning: Did not register secondlife:// handler with xdg-mime: Package not found." fi +# fi