~willismonroe/ubuntu/precise/xdg-utils/typo-fix-996304

« back to all changes in this revision

Viewing changes to debian/patches/gnome-3.0.diff

  • Committer: Bazaar Package Importer
  • Author(s): Chris Coulson
  • Date: 2011-04-08 02:00:05 UTC
  • Revision ID: james.westby@ubuntu.com-20110408020005-w273n8dprc3nylw6
Tags: 1.1.0~rc1-2ubuntu2
* Fix LP: #670128 - gnome-open uses firefox while it's not the preferred
  browser. Backport upstream changes to use the x-scheme-handler types
  for checking/setting the default browser/mail client in xdg-settings
  and xdg-email. In addition to this, we fix xdg-mime to get/set
  default mimetype handlers using the users mimeapps.list, rather than
  the defaults.list, which doesn't work anywhere
  - add debian/patches/gnome-3.0.diff
  - update debian/patches/series

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
Description: Make the default mail client and browser settings work with the
 
2
 x-scheme-handler method of registering URI handlers in gnome3. Note, this is loosely
 
3
 based on http://cgit.freedesktop.org/xdg/xdg-utils/commit/?id=6f49c05ceb2a1935d07c49c2e100b5cf3cdf5f26,
 
4
 however, we don't maintain separate methods for gnome and gnome3. The upstream gnome3
 
5
 detection doesn't work on Natty because we're not really using gnome3. In addition to this,
 
6
 when we set the defaults we use both the new and old methods so that we preserve the
 
7
 functionality of legacy apps using gnomevfs.
 
8
 
 
9
 This also contains additional changes to get/set default mimetype handlers from the users
 
10
 mimeapps.list rather than defaults.list, which isn't used by anything
 
11
 (see http://www.freedesktop.org/wiki/Specifications/mime-actions-spec)
 
12
Author: Bastien Nocera <hadess@hadess.net>
 
13
Author: Chris Coulson <chris.coulson@canonical.com>
 
14
Bug-Ubuntu: https://launchpad.net/bugs/670128
 
15
 
 
16
--- a/scripts/xdg-email
 
17
+++ b/scripts/xdg-email
 
18
@@ -310,6 +310,24 @@ check_output_file()
 
19
     fi
 
20
 }
 
21
 
 
22
+desktop_file_to_binary()
 
23
+{
 
24
+    search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
 
25
+    desktop="`basename "$1"`"
 
26
+    IFS=:
 
27
+    for dir in $search; do
 
28
+        unset IFS
 
29
+        [ "$dir" -a -d "$dir/applications" ] || continue
 
30
+        file="$dir/applications/$desktop"
 
31
+        [ -r "$file" ] || continue
 
32
+        # Remove any arguments (%F, %f, %U, %u, etc.).
 
33
+        command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
 
34
+        command="`which "$command"`"
 
35
+        readlink -f "$command"
 
36
+        return
 
37
+    done
 
38
+}
 
39
+
 
40
 #----------------------------------------
 
41
 # Checks for shared commands, e.g. --help
 
42
 
 
43
@@ -479,7 +497,9 @@ open_kde()
 
44
 open_gnome()
 
45
 {
 
46
     local client
 
47
-    client=`gconftool-2 --get /desktop/gnome/url-handlers/mailto/command | cut -d ' ' -f 1` || ""
 
48
+    local desktop
 
49
+    desktop=`xdg-mime query default "x-scheme-handler/mailto"`
 
50
+    client=`desktop_file_to_binary "$browser"`
 
51
     echo $client | grep thunderbird > /dev/null 2>&1
 
52
     if [ $? -eq 0 ] ; then
 
53
         run_thunderbird "$client" "$1"
 
54
--- a/scripts/xdg-settings
 
55
+++ b/scripts/xdg-settings
 
56
@@ -418,21 +418,26 @@ desktop_file_to_binary()
 
57
 # This function is hard-coded for text/html but it could be adapted if needed.
 
58
 fix_local_desktop_file()
 
59
 {
 
60
+    if test -z "$2" ; then
 
61
+        MIME="text/html"
 
62
+    else
 
63
+        MIME="$2"
 
64
+    fi
 
65
     apps="${XDG_DATA_HOME:-$HOME/.local/share}/applications"
 
66
     # No local desktop file?
 
67
     [ ! -f "$apps/$1" ] && return
 
68
-    MIME="`grep "^MimeType=" "$apps/$1" | cut -d= -f 2-`"
 
69
-    case "$MIME" in
 
70
-      text/html\;*|*\;text/html\;*|*\;text/html\;|*\;text/html)
 
71
-        # Already has text/html? Great!
 
72
+    MIMETYPES="`grep "^MimeType=" "$apps/$1" | cut -d= -f 2-`"
 
73
+    case "$MIMETYPES" in
 
74
+        $MIME\;*|*\;$MIME\;*|*\;$MIME\;|*\;$MIME)
 
75
+        # Already has the mime-type? Great!
 
76
         return 0
 
77
         ;;
 
78
     esac
 
79
 
 
80
-    # Add text/html to the list
 
81
+    # Add the mime-type to the list
 
82
     temp="`mktemp "$apps/$1.XXXXXX"`" || return
 
83
     grep -v "^MimeType=" "$apps/$1" >> "$temp"
 
84
-    echo "MimeType=text/html;$MIME" >> "$temp"
 
85
+    echo "MimeType=$MIME;$MIMETYPES" >> "$temp"
 
86
 
 
87
     oldlines="`wc -l < "$apps/$1"`"
 
88
     newlines="`wc -l < "$temp"`"
 
89
@@ -466,22 +471,32 @@ xdg_mime_fixup()
 
90
 
 
91
 get_browser_mime()
 
92
 {
 
93
+    if test -z "$1" ; then
 
94
+        MIME="text/html"
 
95
+    else
 
96
+        MIME="$1"
 
97
+    fi
 
98
     xdg_mime_fixup
 
99
-    xdg-mime query default text/html
 
100
+    xdg-mime query default "$MIME"
 
101
 }
 
102
 
 
103
 set_browser_mime()
 
104
 {
 
105
     xdg_mime_fixup
 
106
-    orig="`get_browser_mime`"
 
107
+    if test -z "$2" ; then
 
108
+        MIME="text/html"
 
109
+    else
 
110
+        MIME="$2"
 
111
+    fi
 
112
+    orig="`get_browser_mime $MIME`"
 
113
     # Fixing the local desktop file can actually change the default browser all
 
114
     # by itself, so we fix it only after querying to find the current default.
 
115
-    fix_local_desktop_file "$1" || return
 
116
+    fix_local_desktop_file "$1" "$MIME" || return
 
117
     mkdir -p "${XDG_DATA_HOME:-$HOME/.local/share}/applications"
 
118
-    xdg-mime default "$1" text/html || return
 
119
-    if [ x"`get_browser_mime`" != x"$1" ]; then
 
120
+    xdg-mime default "$1" "$MIME" || return
 
121
+    if [ x"`get_browser_mime $MIME`" != x"$1" ]; then
 
122
         # Put back the original value
 
123
-        xdg-mime default "$orig" text/html
 
124
+        xdg-mime default "$orig" "$MIME"
 
125
         exit_failure_operation_failed
 
126
     fi
 
127
 }
 
128
@@ -585,32 +600,32 @@ set_browser_kde()
 
129
 
 
130
 get_browser_gnome()
 
131
 {
 
132
-    binary="`gconftool-2 --get /desktop/gnome/applications/browser/exec | first_word`"
 
133
-    if [ x"$binary" = x ]; then
 
134
-        # No default browser; GNOME might use the MIME type text/html.
 
135
-        get_browser_mime
 
136
-    else
 
137
-        # gconftool gives the binary (maybe with %s etc. afterward),
 
138
-        # but we want the desktop file name, not the binary. So, we
 
139
-        # have to find the desktop file to which it corresponds.
 
140
-        desktop="`binary_to_desktop_file "$binary"`"
 
141
-        basename "$desktop"
 
142
-    fi
 
143
+    get_browser_mime "x-scheme-handler/http"
 
144
 }
 
145
 
 
146
 check_browser_gnome()
 
147
 {
 
148
+    desktop="$1"
 
149
     check="`desktop_file_to_binary "$1"`"
 
150
     if [ -z "$check" ]; then
 
151
         echo no
 
152
         exit_success
 
153
     fi
 
154
+    # Check HTTP and HTTPS, but not about: and unknown:, using the GNOME 3 scheme.
 
155
+    for protocol in http https; do
 
156
+        browser="`get_browser_mime "x-scheme-handler/$protocol"`"
 
157
+        if [ x"$browser" != x"$desktop" ]; then
 
158
+            echo no
 
159
+            exit_success
 
160
+        fi
 
161
+    done
 
162
+
 
163
     binary="`gconftool-2 --get /desktop/gnome/applications/browser/exec | first_word`"
 
164
     if [ x"$binary" != x"$check" ]; then
 
165
         echo no
 
166
         exit_success
 
167
     fi
 
168
-    # Check HTTP and HTTPS, but not about: and unknown:.
 
169
+    # Check HTTP and HTTPS, but not about: and unknown:, using the legacy GNOME scheme.
 
170
     for protocol in http https; do
 
171
         binary="`gconftool-2 --get /desktop/gnome/url-handlers/$protocol/command | first_word`"
 
172
         if [ x"$binary" != x"$check" ]; then
 
173
@@ -634,7 +649,12 @@ set_browser_gnome()
 
174
     [ "$binary" ] || exit_failure_file_missing
 
175
     set_browser_mime "$1" || return
 
176
 
 
177
-    # Set the default browser.
 
178
+    # Set the default browser using the GNOME 3 scheme.
 
179
+    for protocol in http https about unknown; do
 
180
+        set_browser_mime "$1" "x-scheme-handler/$protocol" || return
 
181
+    done
 
182
+
 
183
+    # Set the default browser using the legacy GNOME scheme.
 
184
     gconftool-2 --type string --set /desktop/gnome/applications/browser/exec "$binary"
 
185
     gconftool-2 --type bool --set /desktop/gnome/applications/browser/needs_term false
 
186
     gconftool-2 --type bool --set /desktop/gnome/applications/browser/nremote true
 
187
--- a/scripts/xdg-mime
 
188
+++ b/scripts/xdg-mime
 
189
@@ -667,15 +667,57 @@ make_default_generic()
 
190
     # Add $2=$1 to XDG_DATA_HOME/applications/defaults.list
 
191
     xdg_user_dir="$XDG_DATA_HOME"
 
192
     [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share"
 
193
-    default_file="$xdg_user_dir/applications/defaults.list"
 
194
+    default_file="$xdg_user_dir/applications/mimeapps.list"
 
195
     DEBUG 2 "make_default_generic $1 $2"
 
196
     DEBUG 1 "Updating $default_file"
 
197
-    grep -v "$2=" $default_file > ${default_file}.new 2> /dev/null
 
198
-    if ! grep "[Default Applications]" ${default_file}.new > /dev/null; then
 
199
-       echo "[Default Applications]" >> ${default_file}.new
 
200
-    fi
 
201
-    echo $2=$1 >> ${default_file}.new
 
202
-    mv ${default_file}.new $default_file
 
203
+    awk -v mimetype="$2" -v application="$1" '
 
204
+    BEGIN {
 
205
+        prefix=mimetype "="
 
206
+        indefault=0
 
207
+        added=0
 
208
+        blanks=0
 
209
+        found=0
 
210
+    }
 
211
+    {
 
212
+        suppress=0
 
213
+        if (index($0, "[Default Applications]") == 1) {
 
214
+            indefault=1
 
215
+            found=1
 
216
+        } else if (index($0, "[") == 1) {
 
217
+            if (!added && indefault) {
 
218
+                print prefix application
 
219
+                added=1
 
220
+            }
 
221
+            indefault=0
 
222
+        } else if ($0 == "") {
 
223
+            suppress=1
 
224
+            blanks++
 
225
+        } else if (indefault && !added && index($0, prefix) == 1) {
 
226
+                $0=prefix application
 
227
+                added=1
 
228
+        }
 
229
+        if (!suppress) {
 
230
+            while (blanks > 0) {
 
231
+                print ""
 
232
+                blanks--
 
233
+            }
 
234
+            print $0
 
235
+        }
 
236
+    }
 
237
+    END {
 
238
+        if (!added) {
 
239
+            if (!found) {
 
240
+                print ""
 
241
+                print "[Default Applications]"
 
242
+            }
 
243
+            print prefix application
 
244
+        }
 
245
+        while (blanks > 0) {
 
246
+            print ""
 
247
+            blanks--
 
248
+        }
 
249
+    }
 
250
+'   $default_file > ${default_file}.new && mv ${default_file}.new $default_file
 
251
 }
 
252
 
 
253
 defapp_generic()
 
254
@@ -687,7 +729,34 @@ defapp_generic()
 
255
     xdg_system_dirs="$XDG_DATA_DIRS"
 
256
     [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/
 
257
 
 
258
-    for x in `echo "$xdg_user_dir:$xdg_system_dirs" | sed 's/:/ /g'`; do
 
259
+    for x in `echo "$xdg_user_dir" | sed 's/:/ /g'`; do
 
260
+        mimeapps_list="$x/applications/mimeapps.list"
 
261
+        if [ -f "$mimeapps_list" ] ; then
 
262
+            trader_result=`awk -v mimetype="$MIME" '
 
263
+    BEGIN {
 
264
+        prefix=mimetype "="
 
265
+        indefault=0
 
266
+        found=0
 
267
+    }
 
268
+    {
 
269
+        if (index($0, "[Default Applications]") == 1) {
 
270
+            indefault=1
 
271
+        } else if (index($0, "[") == 1) {
 
272
+            indefault=0
 
273
+        } else if (!found && indefault && index($0, prefix) == 1) {
 
274
+            print substr($0, length(prefix) +1, length)
 
275
+            found=1
 
276
+        }
 
277
+    }
 
278
+'           $mimeapps_list`
 
279
+            if [ -n "$trader_result" ] ; then
 
280
+                echo $trader_result
 
281
+                exit_success
 
282
+            fi
 
283
+        fi
 
284
+    done
 
285
+
 
286
+    for x in `echo "$xdg_system_dirs" | sed 's/:/ /g'`; do
 
287
        DEBUG 2 "Checking $x/applications/defaults.list"
 
288
        trader_result=`grep "$MIME=" $x/applications/defaults.list 2> /dev/null | cut -d '=' -f 2 | cut -d ';' -f 1`
 
289
        if [ -n "$trader_result" ] ; then