OLD | NEW |
1 #!/bin/sh | 1 #!/bin/sh |
2 #--------------------------------------------- | 2 #--------------------------------------------- |
3 # xdg-settings | 3 # xdg-settings |
4 # | 4 # |
5 # Utility script to get various settings from the desktop environment. | 5 # Utility script to get various settings from the desktop environment. |
6 # | 6 # |
7 # Refer to the usage() function below for usage. | 7 # Refer to the usage() function below for usage. |
8 # | 8 # |
9 # Copyright 2009, Google Inc. | 9 # Copyright 2009, Google Inc. |
10 # | 10 # |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 #---------------------------------------------------------------------------- | 122 #---------------------------------------------------------------------------- |
123 | 123 |
124 DEBUG() | 124 DEBUG() |
125 { | 125 { |
126 [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0; | 126 [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0; |
127 [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0; | 127 [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0; |
128 shift | 128 shift |
129 echo "$@" >&2 | 129 echo "$@" >&2 |
130 } | 130 } |
131 | 131 |
| 132 # This handles backslashes but not quote marks. |
| 133 first_word() |
| 134 { |
| 135 read first rest |
| 136 echo "$first" |
| 137 } |
| 138 |
| 139 #------------------------------------------------------------- |
| 140 # map a binary to a .desktop file |
| 141 binary_to_desktop_file() |
| 142 { |
| 143 search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/sha
re:/usr/share}" |
| 144 binary="`which "$1"`" |
| 145 binary="`readlink -f "$binary"`" |
| 146 base="`basename "$binary"`" |
| 147 IFS=: |
| 148 for dir in $search; do |
| 149 unset IFS |
| 150 [ "$dir" ] || continue |
| 151 [ -d "$dir/applications" -o -d "$dir/applnk" ] || continue |
| 152 for file in "$dir"/applications/*.desktop "$dir"/applications/*/*.deskto
p "$dir"/applnk/*.desktop "$dir"/applnk/*/*.desktop; do |
| 153 [ -r "$file" ] || continue |
| 154 # Check to make sure it's worth the processing. |
| 155 grep -q "^Exec.*$base" "$file" || continue |
| 156 # Make sure it's a visible desktop file (e.g. not "preferred-web-bro
wser.desktop"). |
| 157 grep -Eq "^(NoDisplay|Hidden)=true" "$file" && continue |
| 158 command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | fir
st_word`" |
| 159 command="`which "$command"`" |
| 160 if [ x"`readlink -f "$command"`" = x"$binary" ]; then |
| 161 # Fix any double slashes that got added path composition |
| 162 echo "$file" | sed -e 's,//*,/,g' |
| 163 return |
| 164 fi |
| 165 done |
| 166 done |
| 167 } |
| 168 |
| 169 #------------------------------------------------------------- |
| 170 # map a .desktop file to a binary |
| 171 ## FIXME: handle vendor dir case |
| 172 desktop_file_to_binary() |
| 173 { |
| 174 search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/sha
re:/usr/share}" |
| 175 desktop="`basename "$1"`" |
| 176 IFS=: |
| 177 for dir in $search; do |
| 178 unset IFS |
| 179 [ "$dir" -a -d "$dir/applications" ] || continue |
| 180 file="$dir/applications/$desktop" |
| 181 [ -r "$file" ] || continue |
| 182 # Remove any arguments (%F, %f, %U, %u, etc.). |
| 183 command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_w
ord`" |
| 184 command="`which "$command"`" |
| 185 readlink -f "$command" |
| 186 return |
| 187 done |
| 188 } |
| 189 |
132 #------------------------------------------------------------- | 190 #------------------------------------------------------------- |
133 # Exit script on successfully completing the desired operation | 191 # Exit script on successfully completing the desired operation |
134 | 192 |
135 exit_success() | 193 exit_success() |
136 { | 194 { |
137 if [ $# -gt 0 ]; then | 195 if [ $# -gt 0 ]; then |
138 echo "$@" | 196 echo "$@" |
139 echo | 197 echo |
140 fi | 198 fi |
141 | 199 |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 ;; | 438 ;; |
381 *) | 439 *) |
382 exit_failure_syntax "invalid application name" | 440 exit_failure_syntax "invalid application name" |
383 ;; | 441 ;; |
384 esac | 442 esac |
385 } | 443 } |
386 | 444 |
387 # {{{ default browser | 445 # {{{ default browser |
388 # {{{ utility functions | 446 # {{{ utility functions |
389 | 447 |
390 # This handles backslashes but not quote marks. | |
391 first_word() | |
392 { | |
393 read first rest | |
394 echo "$first" | |
395 } | |
396 | |
397 binary_to_desktop_file() | |
398 { | |
399 search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/sha
re:/usr/share}" | |
400 binary="`which "$1"`" | |
401 binary="`readlink -f "$binary"`" | |
402 base="`basename "$binary"`" | |
403 IFS=: | |
404 for dir in $search; do | |
405 unset IFS | |
406 [ "$dir" ] || continue | |
407 [ -d "$dir/applications" -o -d "$dir/applnk" ] || continue | |
408 for file in "$dir"/applications/*.desktop "$dir"/applnk/*.desktop; do | |
409 [ -r "$file" ] || continue | |
410 # Check to make sure it's worth the processing. | |
411 grep -q "^Exec.*$base" "$file" || continue | |
412 # Make sure it's a visible desktop file (e.g. not "preferred-web-bro
wser.desktop"). | |
413 grep -Eq "^(NoDisplay|Hidden)=true" "$file" && continue | |
414 command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | fir
st_word`" | |
415 command="`which "$command"`" | |
416 if [ x"`readlink -f "$command"`" = x"$binary" ]; then | |
417 # Fix any double slashes that got added path composition | |
418 echo "$file" | sed -e 's,//*,/,g' | |
419 return | |
420 fi | |
421 done | |
422 done | |
423 } | |
424 | |
425 desktop_file_to_binary() | |
426 { | |
427 search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/sha
re:/usr/share}" | |
428 desktop="`basename "$1"`" | |
429 IFS=: | |
430 for dir in $search; do | |
431 unset IFS | |
432 [ "$dir" -a -d "$dir/applications" ] || continue | |
433 file="$dir/applications/$desktop" | |
434 [ -r "$file" ] || continue | |
435 # Remove any arguments (%F, %f, %U, %u, etc.). | |
436 command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_w
ord`" | |
437 command="`which "$command"`" | |
438 readlink -f "$command" | |
439 return | |
440 done | |
441 } | |
442 | |
443 # In order to remove an application from the automatically-generated list of | 448 # In order to remove an application from the automatically-generated list of |
444 # applications for handling a given MIME type, the desktop environment may copy | 449 # applications for handling a given MIME type, the desktop environment may copy |
445 # the global .desktop file into the user's .local directory, and remove that | 450 # the global .desktop file into the user's .local directory, and remove that |
446 # MIME type from its list. In that case, we must restore the MIME type to the | 451 # MIME type from its list. In that case, we must restore the MIME type to the |
447 # application's list of MIME types before we can set it as the default for that | 452 # application's list of MIME types before we can set it as the default for that |
448 # MIME type. (We can't just delete the local version, since the user may have | 453 # MIME type. (We can't just delete the local version, since the user may have |
449 # made other changes to it as well. So, tweak the existing file.) | 454 # made other changes to it as well. So, tweak the existing file.) |
450 # This function is hard-coded for text/html but it could be adapted if needed. | 455 # This function is hard-coded for text/html but it could be adapted if needed. |
451 fix_local_desktop_file() | 456 fix_local_desktop_file() |
452 { | 457 { |
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
951 ;; | 956 ;; |
952 | 957 |
953 generic) | 958 generic) |
954 dispatch_generic "$@" | 959 dispatch_generic "$@" |
955 ;; | 960 ;; |
956 | 961 |
957 *) | 962 *) |
958 exit_failure_operation_impossible "unknown desktop environment" | 963 exit_failure_operation_impossible "unknown desktop environment" |
959 ;; | 964 ;; |
960 esac | 965 esac |
OLD | NEW |