Index: chrome_linux/xdg-settings |
=================================================================== |
--- chrome_linux/xdg-settings (revision 89368) |
+++ chrome_linux/xdg-settings (working copy) |
@@ -129,7 +129,65 @@ |
echo "$@" >&2 |
} |
+# This handles backslashes but not quote marks. |
+first_word() |
+{ |
+ read first rest |
+ echo "$first" |
+} |
+ |
#------------------------------------------------------------- |
+# map a binary to a .desktop file |
+binary_to_desktop_file() |
+{ |
+ search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" |
+ binary="`which "$1"`" |
+ binary="`readlink -f "$binary"`" |
+ base="`basename "$binary"`" |
+ IFS=: |
+ for dir in $search; do |
+ unset IFS |
+ [ "$dir" ] || continue |
+ [ -d "$dir/applications" -o -d "$dir/applnk" ] || continue |
+ for file in "$dir"/applications/*.desktop "$dir"/applications/*/*.desktop "$dir"/applnk/*.desktop "$dir"/applnk/*/*.desktop; do |
+ [ -r "$file" ] || continue |
+ # Check to make sure it's worth the processing. |
+ grep -q "^Exec.*$base" "$file" || continue |
+ # Make sure it's a visible desktop file (e.g. not "preferred-web-browser.desktop"). |
+ grep -Eq "^(NoDisplay|Hidden)=true" "$file" && continue |
+ command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`" |
+ command="`which "$command"`" |
+ if [ x"`readlink -f "$command"`" = x"$binary" ]; then |
+ # Fix any double slashes that got added path composition |
+ echo "$file" | sed -e 's,//*,/,g' |
+ return |
+ fi |
+ done |
+ done |
+} |
+ |
+#------------------------------------------------------------- |
+# map a .desktop file to a binary |
+## FIXME: handle vendor dir case |
+desktop_file_to_binary() |
+{ |
+ search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" |
+ desktop="`basename "$1"`" |
+ IFS=: |
+ for dir in $search; do |
+ unset IFS |
+ [ "$dir" -a -d "$dir/applications" ] || continue |
+ file="$dir/applications/$desktop" |
+ [ -r "$file" ] || continue |
+ # Remove any arguments (%F, %f, %U, %u, etc.). |
+ command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`" |
+ command="`which "$command"`" |
+ readlink -f "$command" |
+ return |
+ done |
+} |
+ |
+#------------------------------------------------------------- |
# Exit script on successfully completing the desired operation |
exit_success() |
@@ -287,7 +345,7 @@ |
;; |
--version) |
- echo "xdg-settings 1.0.2" |
+ echo "xdg-settings 1.1.0 rc1" |
exit_success |
;; |
esac |
@@ -311,11 +369,45 @@ |
detectDE() |
{ |
+ # see https://bugs.freedesktop.org/show_bug.cgi?id=34164 |
+ unset GREP_OPTIONS |
+ |
if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde; |
elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome; |
elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome; |
elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce; |
+ elif xprop -root 2> /dev/null | grep -i '^xfce_desktop_window' >/dev/null 2>&1; then DE=xfce |
fi |
+ |
+ if [ x"$DE" = x"" ]; then |
+ # fallback to checking $DESKTOP_SESSION |
+ case "$DESKTOP_SESSION" in |
+ gnome) |
+ DE=gnome; |
+ ;; |
+ LXDE) |
+ DE=lxde; |
+ ;; |
+ xfce|xfce4) |
+ DE=xfce; |
+ ;; |
+ esac |
+ fi |
+ |
+ if [ x"$DE" = x"" ]; then |
+ # fallback to uname output for other platforms |
+ case "$(uname 2>/dev/null)" in |
+ Darwin) |
+ DE=darwin; |
+ ;; |
+ esac |
+ fi |
+ |
+ if [ x"$DE" = x"gnome" ]; then |
+ # gnome-default-applications-properties is only available in GNOME 2.x |
+ # but not in GNOME 3.x |
+ which gnome-default-applications-properties > /dev/null 2>&1 || DE="gnome3" |
+ fi |
} |
#---------------------------------------------------------------------------- |
@@ -325,10 +417,10 @@ |
kfmclient_fix_exit_code() |
{ |
- version=`kde${KDE_SESSION_VERSION}-config --version 2>/dev/null | grep KDE` |
- major=`echo $version | sed 's/KDE: \([0-9]\).*/\1/'` |
- minor=`echo $version | sed 's/KDE: [0-9]*\.\([0-9]\).*/\1/'` |
- release=`echo $version | sed 's/KDE: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'` |
+ version=`LC_ALL=C.UTF-8 kde-config --version 2>/dev/null | grep '^KDE'` |
+ major=`echo $version | sed 's/KDE.*: \([0-9]\).*/\1/'` |
+ minor=`echo $version | sed 's/KDE.*: [0-9]*\.\([0-9]\).*/\1/'` |
+ release=`echo $version | sed 's/KDE.*: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'` |
test "$major" -gt 3 && return $1 |
test "$minor" -gt 5 && return $1 |
test "$release" -gt 4 && return $1 |
@@ -353,59 +445,6 @@ |
# {{{ default browser |
# {{{ utility functions |
-# This handles backslashes but not quote marks. |
-first_word() |
-{ |
- read first rest |
- echo "$first" |
-} |
- |
-binary_to_desktop_file() |
-{ |
- search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" |
- binary="`which "$1"`" |
- binary="`readlink -f "$binary"`" |
- base="`basename "$binary"`" |
- IFS=: |
- for dir in $search; do |
- unset IFS |
- [ "$dir" ] || continue |
- [ -d "$dir/applications" -o -d "$dir/applnk" ] || continue |
- for file in "$dir"/applications/*.desktop "$dir"/applnk/*.desktop; do |
- [ -r "$file" ] || continue |
- # Check to make sure it's worth the processing. |
- grep -q "^Exec.*$base" "$file" || continue |
- # Make sure it's a visible desktop file (e.g. not "preferred-web-browser.desktop"). |
- grep -Eq "^(NoDisplay|Hidden)=true" "$file" && continue |
- command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`" |
- command="`which "$command"`" |
- if [ x"`readlink -f "$command"`" = x"$binary" ]; then |
- # Fix any double slashes that got added path composition |
- echo "$file" | sed -e 's,//*,/,g' |
- return |
- fi |
- done |
- done |
-} |
- |
-desktop_file_to_binary() |
-{ |
- search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" |
- desktop="`basename "$1"`" |
- IFS=: |
- for dir in $search; do |
- unset IFS |
- [ "$dir" -a -d "$dir/applications" ] || continue |
- file="$dir/applications/$desktop" |
- [ -r "$file" ] || continue |
- # Remove any arguments (%F, %f, %U, %u, etc.). |
- command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`" |
- command="`which "$command"`" |
- readlink -f "$command" |
- return |
- done |
-} |
- |
# In order to remove an application from the automatically-generated list of |
# applications for handling a given MIME type, the desktop environment may copy |
# the global .desktop file into the user's .local directory, and remove that |
@@ -416,21 +455,26 @@ |
# This function is hard-coded for text/html but it could be adapted if needed. |
fix_local_desktop_file() |
{ |
+ if test -z "$2" ; then |
+ MIME="text/html" |
+ else |
+ MIME="$2" |
+ fi |
apps="${XDG_DATA_HOME:-$HOME/.local/share}/applications" |
# No local desktop file? |
[ ! -f "$apps/$1" ] && return |
- MIME="`grep "^MimeType=" "$apps/$1" | cut -d= -f 2-`" |
- case "$MIME" in |
- text/html\;*|*\;text/html\;*|*\;text/html\;|*\;text/html) |
- # Already has text/html? Great! |
+ MIMETYPES="`grep "^MimeType=" "$apps/$1" | cut -d= -f 2-`" |
+ case "$MIMETYPES" in |
+ $MIME\;*|*\;$MIME\;*|*\;$MIME\;|*\;$MIME) |
+ # Already has the mime-type? Great! |
return 0 |
;; |
esac |
- # Add text/html to the list |
+ # Add the mime-type to the list |
temp="`mktemp "$apps/$1.XXXXXX"`" || return |
grep -v "^MimeType=" "$apps/$1" >> "$temp" |
- echo "MimeType=text/html;$MIME" >> "$temp" |
+ echo "MimeType=$MIME;$MIMETYPES" >> "$temp" |
oldlines="`wc -l < "$apps/$1"`" |
newlines="`wc -l < "$temp"`" |
@@ -464,22 +508,32 @@ |
get_browser_mime() |
{ |
+ if test -z "$1" ; then |
+ MIME="text/html" |
+ else |
+ MIME="$1" |
+ fi |
xdg_mime_fixup |
- xdg-mime query default text/html |
+ xdg-mime query default "$MIME" |
} |
set_browser_mime() |
{ |
xdg_mime_fixup |
- orig="`get_browser_mime`" |
+ if test -z "$2" ; then |
+ MIME="text/html" |
+ else |
+ MIME="$2" |
+ fi |
+ orig="`get_browser_mime $MIME`" |
# Fixing the local desktop file can actually change the default browser all |
# by itself, so we fix it only after querying to find the current default. |
- fix_local_desktop_file "$1" || return |
+ fix_local_desktop_file "$1" "$MIME" || return |
mkdir -p "${XDG_DATA_HOME:-$HOME/.local/share}/applications" |
- xdg-mime default "$1" text/html || return |
+ xdg-mime default "$1" "$MIME" || return |
if [ x"`get_browser_mime`" != x"$1" ]; then |
# Put back the original value |
- xdg-mime default "$orig" text/html |
+ xdg-mime default "$orig" "$MIME" |
exit_failure_operation_failed |
fi |
} |
@@ -649,6 +703,45 @@ |
} |
# }}} GNOME |
+# {{{ GNOME 3.x |
+ |
+get_browser_gnome3() |
+{ |
+ get_browser_mime "x-scheme-handler/http" |
+} |
+ |
+check_browser_gnome3() |
+{ |
+ desktop="$1" |
+ check="`desktop_file_to_binary "$1"`" |
+ if [ -z "$check" ]; then |
+ echo no |
+ exit_success |
+ fi |
+ # Check HTTP and HTTPS, but not about: and unknown:. |
+ for protocol in http https; do |
+ browser="`get_browser_mime "x-scheme-handler/$protocol"`" |
+ if [ x"$browser" != x"$desktop" ]; then |
+ echo no |
+ exit_success |
+ fi |
+ done |
+ echo yes |
+ exit_success |
+} |
+ |
+set_browser_gnome3() |
+{ |
+ binary="`desktop_file_to_binary "$1"`" |
+ [ "$binary" ] || exit_failure_file_missing |
+ set_browser_mime "$1" || return |
+ |
+ # Set the default browser. |
+ for protocol in http https about unknown; do |
+ set_browser_mime "$1" "x-scheme-handler/$protocol" || return |
+ done |
+} |
+# }}} GNOME 3.x |
# {{{ xfce |
get_browser_xfce() |
@@ -858,7 +951,7 @@ |
detectDE |
case "$DE" in |
- kde|gnome|xfce) |
+ kde|gnome*|xfce) |
dispatch_specific "$@" |
;; |