1 #
   2 # Remove $1 desktop file from the list of default handlers for $2 mime type
   3 # in $3 file dumping output to stdout.
   4 #
   5 _filter_out_default_mime_handler ()
   6 {
   7   local defaults_list="$3"
   8 
   9   local desktop_file="$1"
  10   local mime_type="$2"
  11 
  12   awk -f- "$defaults_list" <<EOF
  13   BEGIN {
  14     mime_type="$mime_type"
  15     mime_type_regexp="~" mime_type "="
  16     desktop_file="$desktop_file"
  17   }
  18   \$0 ~ mime_type {
  19     \$0 = substr(\$0, length(mime_type) + 2);
  20     split(\$0, desktop_files, ";")
  21     remaining_desktop_files
  22     counter=0
  23     for (idx in desktop_files) {
  24       if (desktop_files[idx] != desktop_file) {
  25         ++counter;
  26       }
  27     }
  28     if (counter) {
  29       printf mime_type "="
  30       for (idx in desktop_files) {
  31         if (desktop_files[idx] != desktop_file) {
  32           printf desktop_files[idx]
  33           if (--counter) {
  34             printf ";"
  35           }
  36         }
  37       }
  38       printf "\n"
  39     }
  40     next
  41   }
  42 
  43   { print }
  44 EOF
  45 }
  46 
  47 
  48 #
  49 # Remove $2 desktop file from the list of default handlers for $@ mime types
  50 # in $1 file.
  51 # Result is saved in $1 file.
  52 #
  53 _uninstall_default_mime_handler ()
  54 {
  55   local defaults_list=$1
  56   shift
  57   [ -f "$defaults_list" ] || return 0
  58 
  59   local desktop_file="$1"
  60   shift
  61 
  62   tmpfile1=$(mktemp)
  63   tmpfile2=$(mktemp)
  64   cat "$defaults_list" > "$tmpfile1"
  65 
  66   local v
  67   local update=
  68   for mime in "$@"; do
  69     _filter_out_default_mime_handler "$desktop_file" "$mime" "$tmpfile1" > "$tmpfile2"
  70     v="$tmpfile2"
  71     tmpfile2="$tmpfile1"
  72     tmpfile1="$v"
  73 
  74     if ! diff -q "$tmpfile1" "$tmpfile2" > /dev/null; then
  75       update=yes
  76       trace Remove $desktop_file default handler for $mime mime type from $defaults_list file
  77     fi
  78   done
  79 
  80   if [ -n "$update" ]; then
  81     cat "$tmpfile1" > "$defaults_list"
  82     trace "$defaults_list" file updated
  83   fi
  84 
  85   rm -f "$tmpfile1" "$tmpfile2"
  86 }
  87 
  88 
  89 #
  90 # Remove $1 desktop file from the list of default handlers for $@ mime types
  91 # in all known system defaults lists.
  92 #
  93 uninstall_default_mime_handler ()
  94 {
  95   for f in /usr/share/applications/defaults.list /usr/local/share/applications/defaults.list; do
  96     _uninstall_default_mime_handler "$f" "$@"
  97   done
  98 }
  99 
 100 
 101 trace ()
 102 {
 103   echo "$@"
 104 }