7
7
# Refer to the usage() function below for usage.
8
8
#
9
9
# Copyright 2009-2010, Fathi Boudra <fabo@freedesktop.org>
10
- # Copyright 2009-2016 , Rex Dieter <rdieter@fedoraproject.org>
10
+ # Copyright 2009-2010 , Rex Dieter <rdieter@fedoraproject.org>
11
11
# Copyright 2006, Kevin Krammer <kevin.krammer@gmx.at>
12
12
# Copyright 2006, Jeremy White <jwhite@codeweavers.com>
13
13
#
14
14
# LICENSE:
15
15
#
16
+ # Permission is hereby granted, free of charge, to any person obtaining a
17
+ # copy of this software and associated documentation files (the "Software"),
18
+ # to deal in the Software without restriction, including without limitation
19
+ # the rights to use, copy, modify, merge, publish, distribute, sublicense,
20
+ # and/or sell copies of the Software, and to permit persons to whom the
21
+ # Software is furnished to do so, subject to the following conditions:
22
+ #
23
+ # The above copyright notice and this permission notice shall be included
24
+ # in all copies or substantial portions of the Software.
25
+ #
26
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
27
+ # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
29
+ # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
30
+ # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
31
+ # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
32
+ # OTHER DEALINGS IN THE SOFTWARE.
33
+ #
16
34
# ---------------------------------------------
17
35
18
36
manualpage ()
19
37
{
20
38
cat << _MANUALPAGE
39
+ Name
40
+
41
+ xdg-open -- opens a file or URL in the user's preferred
42
+ application
43
+
44
+ Synopsis
45
+
46
+ xdg-open { file | URL }
47
+
48
+ xdg-open { --help | --manual | --version }
49
+
50
+ Description
51
+
52
+ xdg-open opens a file or URL in the user's preferred
53
+ application. If a URL is provided the URL will be opened in the
54
+ user's preferred web browser. If a file is provided the file
55
+ will be opened in the preferred application for files of that
56
+ type. xdg-open supports file, ftp, http and https URLs.
57
+
58
+ xdg-open is for use inside a desktop session only. It is not
59
+ recommended to use xdg-open as root.
60
+
61
+ Options
62
+
63
+ --help
64
+ Show command synopsis.
65
+
66
+ --manual
67
+ Show this manual page.
68
+
69
+ --version
70
+ Show the xdg-utils version information.
71
+
72
+ Exit Codes
73
+
74
+ An exit code of 0 indicates success while a non-zero exit code
75
+ indicates failure. The following failure codes can be returned:
76
+
77
+ 1
78
+ Error in command line syntax.
79
+
80
+ 2
81
+ One of the files passed on the command line did not
82
+ exist.
83
+
84
+ 3
85
+ A required tool could not be found.
86
+
87
+ 4
88
+ The action failed.
89
+
90
+ See Also
91
+
92
+ xdg-mime(1), xdg-settings(1), MIME applications associations
93
+ specification
94
+
95
+ Examples
96
+
97
+ xdg-open 'http://www.freedesktop.org/'
98
+
99
+ Opens the freedesktop.org website in the user's default
100
+ browser.
101
+
102
+ xdg-open /tmp/foobar.png
103
+
104
+ Opens the PNG image file /tmp/foobar.png in the user's default
105
+ image viewing application.
21
106
_MANUALPAGE
22
107
}
23
108
24
109
usage ()
25
110
{
26
111
cat << _USAGE
112
+ xdg-open -- opens a file or URL in the user's preferred
113
+ application
114
+
115
+ Synopsis
116
+
117
+ xdg-open { file | URL }
118
+
119
+ xdg-open { --help | --manual | --version }
120
+
27
121
_USAGE
28
122
}
29
123
30
124
# @xdg-utils-common@
31
125
126
+ # ----------------------------------------------------------------------------
127
+ # Common utility functions included in all XDG wrapper scripts
128
+ # ----------------------------------------------------------------------------
129
+
130
+ DEBUG ()
131
+ {
132
+ [ -z " ${XDG_UTILS_DEBUG_LEVEL} " ] && return 0;
133
+ [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0;
134
+ shift
135
+ echo " $@ " >&2
136
+ }
137
+
138
+ # This handles backslashes but not quote marks.
139
+ first_word ()
140
+ {
141
+ read first rest
142
+ echo " $first "
143
+ }
144
+
145
+ # -------------------------------------------------------------
146
+ # map a binary to a .desktop file
147
+ binary_to_desktop_file ()
148
+ {
149
+ search=" ${XDG_DATA_HOME:- $HOME / .local/ share} :${XDG_DATA_DIRS:-/ usr/ local/ share:/ usr/ share} "
150
+ binary=" ` which " $1 " ` "
151
+ binary=" ` readlink -f " $binary " ` "
152
+ base=" ` basename " $binary " ` "
153
+ IFS=:
154
+ for dir in $search ; do
155
+ unset IFS
156
+ [ " $dir " ] || continue
157
+ [ -d " $dir /applications" ] || [ -d " $dir /applnk" ] || continue
158
+ for file in " $dir " /applications/* .desktop " $dir " /applications/* /* .desktop " $dir " /applnk/* .desktop " $dir " /applnk/* /* .desktop; do
159
+ [ -r " $file " ] || continue
160
+ # Check to make sure it's worth the processing.
161
+ grep -q " ^Exec.*$base " " $file " || continue
162
+ # Make sure it's a visible desktop file (e.g. not "preferred-web-browser.desktop").
163
+ grep -Eq " ^(NoDisplay|Hidden)=true" " $file " && continue
164
+ command=" ` grep -E " ^Exec(\[[^]=]*])?=" " $file " | cut -d= -f 2- | first_word` "
165
+ command=" ` which " $command " ` "
166
+ if [ x" ` readlink -f " $command " ` " = x" $binary " ]; then
167
+ # Fix any double slashes that got added path composition
168
+ echo " $file " | sed -e ' s,//*,/,g'
169
+ return
170
+ fi
171
+ done
172
+ done
173
+ }
174
+
175
+ # -------------------------------------------------------------
176
+ # map a .desktop file to a binary
177
+ desktop_file_to_binary ()
178
+ {
179
+ search=" ${XDG_DATA_HOME:- $HOME / .local/ share} :${XDG_DATA_DIRS:-/ usr/ local/ share:/ usr/ share} "
180
+ desktop=" ` basename " $1 " ` "
181
+ IFS=:
182
+ for dir in $search ; do
183
+ unset IFS
184
+ [ " $dir " ] && [ -d " $dir /applications" ] || [ -d " $dir /applnk" ] || continue
185
+ # Check if desktop file contains -
186
+ if [ " ${desktop#* -} " != " $desktop " ]; then
187
+ vendor=${desktop% -* }
188
+ app=${desktop#* -}
189
+ if [ -r $dir /applications/$vendor /$app ]; then
190
+ file_path=$dir /applications/$vendor /$app
191
+ elif [ -r $dir /applnk/$vendor /$app ]; then
192
+ file_path=$dir /applnk/$vendor /$app
193
+ fi
194
+ fi
195
+ if test -z " $file_path " ; then
196
+ for indir in " $dir " /applications/ " $dir " /applications/* / " $dir " /applnk/ " $dir " /applnk/* /; do
197
+ file=" $indir /$desktop "
198
+ if [ -r " $file " ]; then
199
+ file_path=$file
200
+ break
201
+ fi
202
+ done
203
+ fi
204
+ if [ -r " $file_path " ]; then
205
+ # Remove any arguments (%F, %f, %U, %u, etc.).
206
+ command=" ` grep -E " ^Exec(\[[^]=]*])?=" " $file_path " | cut -d= -f 2- | first_word` "
207
+ command=" ` which " $command " ` "
208
+ readlink -f " $command "
209
+ return
210
+ fi
211
+ done
212
+ }
213
+
214
+ # -------------------------------------------------------------
215
+ # Exit script on successfully completing the desired operation
216
+
217
+ exit_success ()
218
+ {
219
+ if [ $# -gt 0 ]; then
220
+ echo " $@ "
221
+ echo
222
+ fi
223
+
224
+ exit 0
225
+ }
226
+
227
+
228
+ # -----------------------------------------
229
+ # Exit script on malformed arguments, not enough arguments
230
+ # or missing required option.
231
+ # prints usage information
232
+
233
+ exit_failure_syntax ()
234
+ {
235
+ if [ $# -gt 0 ]; then
236
+ echo " xdg-open: $@ " >&2
237
+ echo " Try 'xdg-open --help' for more information." >&2
238
+ else
239
+ usage
240
+ echo " Use 'man xdg-open' or 'xdg-open --manual' for additional info."
241
+ fi
242
+
243
+ exit 1
244
+ }
245
+
246
+ # -------------------------------------------------------------
247
+ # Exit script on missing file specified on command line
248
+
249
+ exit_failure_file_missing ()
250
+ {
251
+ if [ $# -gt 0 ]; then
252
+ echo " xdg-open: $@ " >&2
253
+ fi
254
+
255
+ exit 2
256
+ }
257
+
258
+ # -------------------------------------------------------------
259
+ # Exit script on failure to locate necessary tool applications
260
+
261
+ exit_failure_operation_impossible ()
262
+ {
263
+ if [ $# -gt 0 ]; then
264
+ echo " xdg-open: $@ " >&2
265
+ fi
266
+
267
+ exit 3
268
+ }
269
+
270
+ # -------------------------------------------------------------
271
+ # Exit script on failure returned by a tool application
272
+
273
+ exit_failure_operation_failed ()
274
+ {
275
+ if [ $# -gt 0 ]; then
276
+ echo " xdg-open: $@ " >&2
277
+ fi
278
+
279
+ exit 4
280
+ }
281
+
282
+ # ------------------------------------------------------------
283
+ # Exit script on insufficient permission to read a specified file
284
+
285
+ exit_failure_file_permission_read ()
286
+ {
287
+ if [ $# -gt 0 ]; then
288
+ echo " xdg-open: $@ " >&2
289
+ fi
290
+
291
+ exit 5
292
+ }
293
+
294
+ # ------------------------------------------------------------
295
+ # Exit script on insufficient permission to write a specified file
296
+
297
+ exit_failure_file_permission_write ()
298
+ {
299
+ if [ $# -gt 0 ]; then
300
+ echo " xdg-open: $@ " >&2
301
+ fi
302
+
303
+ exit 6
304
+ }
305
+
306
+ check_input_file ()
307
+ {
308
+ if [ ! -e " $1 " ]; then
309
+ exit_failure_file_missing " file '$1 ' does not exist"
310
+ fi
311
+ if [ ! -r " $1 " ]; then
312
+ exit_failure_file_permission_read " no permission to read file '$1 '"
313
+ fi
314
+ }
315
+
316
+ check_vendor_prefix ()
317
+ {
318
+ file_label=" $2 "
319
+ [ -n " $file_label " ] || file_label=" filename"
320
+ file=` basename " $1 " `
321
+ case " $file " in
322
+ [[:alpha:]]* -* )
323
+ return
324
+ ;;
325
+ esac
326
+
327
+ echo " xdg-open: $file_label '$file ' does not have a proper vendor prefix" >&2
328
+ echo ' A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2
329
+ echo ' with a dash ("-"). An example ' " $file_label " ' is ' " 'example-$file '" >&2
330
+ echo " Use --novendor to override or 'xdg-open --manual' for additional info." >&2
331
+ exit 1
332
+ }
333
+
334
+ check_output_file ()
335
+ {
336
+ # if the file exists, check if it is writeable
337
+ # if it does not exists, check if we are allowed to write on the directory
338
+ if [ -e " $1 " ]; then
339
+ if [ ! -w " $1 " ]; then
340
+ exit_failure_file_permission_write " no permission to write to file '$1 '"
341
+ fi
342
+ else
343
+ DIR=` dirname " $1 " `
344
+ if [ ! -w " $DIR " ] || [ ! -x " $DIR " ]; then
345
+ exit_failure_file_permission_write " no permission to create file '$1 '"
346
+ fi
347
+ fi
348
+ }
349
+
350
+ # ----------------------------------------
351
+ # Checks for shared commands, e.g. --help
352
+
353
+ check_common_commands ()
354
+ {
355
+ while [ $# -gt 0 ] ; do
356
+ parm=" $1 "
357
+ shift
358
+
359
+ case " $parm " in
360
+ --help)
361
+ usage
362
+ echo " Use 'man xdg-open' or 'xdg-open --manual' for additional info."
363
+ exit_success
364
+ ;;
365
+
366
+ --manual)
367
+ manualpage
368
+ exit_success
369
+ ;;
370
+
371
+ --version)
372
+ echo " xdg-open 1.1.3"
373
+ exit_success
374
+ ;;
375
+ esac
376
+ done
377
+ }
378
+
379
+ check_common_commands " $@ "
380
+
381
+ [ -z " ${XDG_UTILS_DEBUG_LEVEL} " ] && unset XDG_UTILS_DEBUG_LEVEL;
382
+ if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then
383
+ # Be silent
384
+ xdg_redirect_output=" > /dev/null 2> /dev/null"
385
+ else
386
+ # All output to stderr
387
+ xdg_redirect_output=" >&2"
388
+ fi
389
+
390
+ # --------------------------------------
391
+ # Checks for known desktop environments
392
+ # set variable DE to the desktop environments name, lowercase
393
+
394
+ detectDE ()
395
+ {
396
+ # see https://bugs.freedesktop.org/show_bug.cgi?id=34164
397
+ unset GREP_OPTIONS
398
+
399
+ if [ -n " ${XDG_CURRENT_DESKTOP} " ]; then
400
+ case " ${XDG_CURRENT_DESKTOP} " in
401
+ # only recently added to menu-spec, pre-spec X- still in use
402
+ Cinnamon|X-Cinnamon)
403
+ DE=cinnamon;
404
+ ;;
405
+ ENLIGHTENMENT)
406
+ DE=enlightenment;
407
+ ;;
408
+ # GNOME, GNOME-Classic:GNOME, or GNOME-Flashback:GNOME
409
+ GNOME* )
410
+ DE=gnome;
411
+ ;;
412
+ KDE)
413
+ DE=kde;
414
+ ;;
415
+ # Deepin Desktop Environments
416
+ DEEPIN|Deepin|deepin)
417
+ DE=dde;
418
+ ;;
419
+ LXDE)
420
+ DE=lxde;
421
+ ;;
422
+ LXQt)
423
+ DE=lxqt;
424
+ ;;
425
+ MATE)
426
+ DE=mate;
427
+ ;;
428
+ XFCE)
429
+ DE=xfce
430
+ ;;
431
+ X-Generic)
432
+ DE=generic
433
+ ;;
434
+ esac
435
+ fi
436
+
437
+ if [ x" $DE " = x" " ]; then
438
+ # classic fallbacks
439
+ if [ x" $KDE_FULL_SESSION " != x" " ]; then DE=kde;
440
+ elif [ x" $GNOME_DESKTOP_SESSION_ID " != x" " ]; then DE=gnome;
441
+ elif [ x" $MATE_DESKTOP_SESSION_ID " != x" " ]; then DE=mate;
442
+ 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;
443
+ elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' > /dev/null 2>&1 ; then DE=xfce;
444
+ elif xprop -root 2> /dev/null | grep -i ' ^xfce_desktop_window' > /dev/null 2>&1 ; then DE=xfce
445
+ elif echo $DESKTOP | grep -q ' ^Enlightenment' ; then DE=enlightenment;
446
+ elif [ x" $LXQT_SESSION_CONFIG " != x" " ]; then DE=lxqt;
447
+ fi
448
+ fi
449
+
450
+ if [ x" $DE " = x" " ]; then
451
+ # fallback to checking $DESKTOP_SESSION
452
+ case " $DESKTOP_SESSION " in
453
+ gnome)
454
+ DE=gnome;
455
+ ;;
456
+ LXDE|Lubuntu)
457
+ DE=lxde;
458
+ ;;
459
+ MATE)
460
+ DE=mate;
461
+ ;;
462
+ xfce|xfce4|' Xfce Session' )
463
+ DE=xfce;
464
+ ;;
465
+ esac
466
+ fi
467
+
468
+ if [ x" $DE " = x" " ]; then
469
+ # fallback to uname output for other platforms
470
+ case " $( uname 2> /dev/null) " in
471
+ CYGWIN* )
472
+ DE=cygwin;
473
+ ;;
474
+ Darwin)
475
+ DE=darwin;
476
+ ;;
477
+ esac
478
+ fi
479
+
480
+ if [ x" $DE " = x" gnome" ]; then
481
+ # gnome-default-applications-properties is only available in GNOME 2.x
482
+ # but not in GNOME 3.x
483
+ which gnome-default-applications-properties > /dev/null 2>&1 || DE=" gnome3"
484
+ fi
485
+
486
+ if [ -f " $XDG_RUNTIME_DIR /flatpak-info" ]; then
487
+ DE=" flatpak"
488
+ fi
489
+ }
490
+
491
+ # ----------------------------------------------------------------------------
492
+ # kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4
493
+ # It also always returns 1 in KDE 3.4 and earlier
494
+ # Simply return 0 in such case
495
+
496
+ kfmclient_fix_exit_code ()
497
+ {
498
+ version=` LC_ALL=C.UTF-8 kde-config --version 2> /dev/null | grep ' ^KDE' `
499
+ major=` echo $version | sed ' s/KDE.*: \([0-9]\).*/\1/' `
500
+ minor=` echo $version | sed ' s/KDE.*: [0-9]*\.\([0-9]\).*/\1/' `
501
+ release=` echo $version | sed ' s/KDE.*: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/' `
502
+ test " $major " -gt 3 && return $1
503
+ test " $minor " -gt 5 && return $1
504
+ test " $release " -gt 4 && return $1
505
+ return 0
506
+ }
507
+
508
+ # ----------------------------------------------------------------------------
509
+ # Returns true if there is a graphical display attached.
510
+
511
+ has_display ()
512
+ {
513
+ if [ -n " $DISPLAY " ] || [ -n " $WAYLAND_DISPLAY " ]; then
514
+ return 0
515
+ else
516
+ return 1
517
+ fi
518
+ }
519
+
32
520
# This handles backslashes but not quote marks.
33
521
last_word ()
34
522
{
35
- # Backslash handling is intended, not using `first` too
36
- # shellcheck disable=SC2162,SC2034
37
523
read first rest
38
524
echo " $rest "
39
525
}
@@ -49,8 +535,7 @@ get_key()
49
535
50
536
IFS_=" ${IFS} "
51
537
IFS=" "
52
- # No backslash handling here, first_word and last_word do that
53
- while read -r line
538
+ while read line
54
539
do
55
540
case " $line " in
56
541
" [Desktop Entry]" )
@@ -71,47 +556,26 @@ get_key()
71
556
IFS=" ${IFS_} "
72
557
}
73
558
74
- has_url_scheme ()
75
- {
76
- echo " $1 " | LC_ALL=C grep -Eq ' ^[[:alpha:]][[:alpha:][:digit:]+\.\-]*:'
77
- }
78
-
79
559
# Returns true if argument is a file:// URL or path
80
560
is_file_url_or_path ()
81
561
{
82
- if echo " $1 " | grep -q ' ^file://' || ! has_url_scheme " $1 " ; then
562
+ if echo " $1 " | grep -q ' ^file://' \
563
+ || ! echo " $1 " | egrep -q ' ^[[:alpha:]+\.\-]+:' ; then
83
564
return 0
84
565
else
85
566
return 1
86
567
fi
87
568
}
88
569
89
- get_hostname () {
90
- if [ -z " $HOSTNAME " ]; then
91
- if command -v hostname > /dev/null; then
92
- HOSTNAME=$( hostname)
93
- else
94
- HOSTNAME=$( uname -n)
95
- fi
96
- fi
97
- }
98
-
99
570
# If argument is a file URL, convert it to a (percent-decoded) path.
100
571
# If not, leave it as it is.
101
572
file_url_to_path ()
102
573
{
103
574
local file=" $1 "
104
- get_hostname
105
- if echo " $file " | grep -q ' ^file://' ; then
106
- file=${file# file:// localhost}
107
- file=${file# file:// " $HOSTNAME " }
575
+ if echo " $file " | grep -q ' ^file:///' ; then
108
576
file=${file# file:// }
109
- if ! echo " $file " | grep -q ' ^/' ; then
110
- echo " $file "
111
- return
112
- fi
113
577
file=${file%%#* }
114
- file=${ file%% \? * }
578
+ file=$( echo " $ file" | sed -r ' s/\?.*$// ' )
115
579
local printf=printf
116
580
if [ -x /usr/bin/printf ]; then
117
581
printf=/usr/bin/printf
@@ -151,10 +615,7 @@ open_kde()
151
615
kde-open " $1 "
152
616
;;
153
617
5)
154
- " kde-open${KDE_SESSION_VERSION} " " $1 "
155
- ;;
156
- 6)
157
- kde-open " $1 "
618
+ kde-open${KDE_SESSION_VERSION} " $1 "
158
619
;;
159
620
esac
160
621
else
@@ -169,7 +630,7 @@ open_kde()
169
630
fi
170
631
}
171
632
172
- open_deepin ()
633
+ open_dde ()
173
634
{
174
635
if dde-open -version > /dev/null 2>&1 ; then
175
636
dde-open " $1 "
@@ -275,28 +736,11 @@ open_enlightenment()
275
736
276
737
open_flatpak ()
277
738
{
278
- if is_file_url_or_path " $1 " ; then
279
- local file
280
- file=" $( file_url_to_path " $1 " ) "
281
-
282
- check_input_file " $file "
283
-
284
- gdbus call --session \
285
- --dest org.freedesktop.portal.Desktop \
286
- --object-path /org/freedesktop/portal/desktop \
287
- --method org.freedesktop.portal.OpenURI.OpenFile \
288
- --timeout 5 \
289
- " " " 3" {} 3< " $file "
290
- else
291
- # $1 contains an URI
292
-
293
- gdbus call --session \
294
- --dest org.freedesktop.portal.Desktop \
295
- --object-path /org/freedesktop/portal/desktop \
296
- --method org.freedesktop.portal.OpenURI.OpenURI \
297
- --timeout 5 \
298
- " " " $1 " {}
299
- fi
739
+ gdbus call --session \
740
+ --dest org.freedesktop.portal.Desktop \
741
+ --object-path /org/freedesktop/portal/desktop \
742
+ --method org.freedesktop.portal.OpenURI.OpenURI \
743
+ " " " $1 " {}
300
744
301
745
if [ $? -eq 0 ]; then
302
746
exit_success
@@ -308,115 +752,105 @@ open_flatpak()
308
752
# -----------------------------------------
309
753
# Recursively search .desktop file
310
754
311
- # (application, directory, target file, target_url)
312
755
search_desktop_file ()
313
756
{
314
757
local default=" $1 "
315
758
local dir=" $2 "
316
759
local target=" $3 "
317
- local target_uri=" $4 "
318
760
319
761
local file=" "
320
762
# look for both vendor-app.desktop, vendor/app.desktop
321
763
if [ -r " $dir /$default " ]; then
322
764
file=" $dir /$default "
323
- elif [ -r " $dir /$( echo " $default " | sed -e ' s|-|/|' ) " ]; then
324
- file=" $dir /$( echo " $default " | sed -e ' s|-|/|' ) "
765
+ elif [ -r " $dir /` echo $default | sed -e ' s|-|/|' ` " ]; then
766
+ file=" $dir /` echo $default | sed -e ' s|-|/|' ` "
325
767
fi
326
768
327
769
if [ -r " $file " ] ; then
328
770
command=" $( get_key " ${file} " " Exec" | first_word) "
329
- if command -v " $command " > /dev/null; then
330
- icon=" $( get_key " ${file} " " Icon" ) "
331
- # FIXME: Actually LC_MESSAGES should be used as described in
332
- # http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s04.html
333
- localised_name=" $( get_key " ${file} " " Name" ) "
334
- # shellcheck disable=SC2046 # Splitting is intentional here
335
- set -- $( get_key " ${file} " " Exec" | last_word)
336
- # We need to replace any occurrence of "%f", "%F" and
337
- # the like by the target file. We examine each
338
- # argument and append the modified argument to the
339
- # end then shift.
340
- local args=$#
341
- local replaced=0
342
- while [ $args -gt 0 ]; do
343
- case $1 in
344
- %[c])
345
- replaced=1
346
- arg=" ${localised_name} "
347
- shift
348
- set -- " $@ " " $arg "
349
- ;;
350
- %[fF])
351
- # if there is only a target_url return,
352
- # this application can't handle it.
353
- [ -n " $target " ] || return
354
- replaced=1
355
- arg=" $target "
356
- shift
357
- set -- " $@ " " $arg "
358
- ;;
359
- %[uU])
360
- replaced=1
361
- # When an URI is requested use it,
362
- # otherwise fall back to the filepath.
363
- arg=" ${target_uri:- $target } "
364
- shift
365
- set -- " $@ " " $arg "
366
- ;;
367
- %[i])
368
- replaced=1
369
- shift
370
- set -- " $@ " " --icon" " $icon "
371
- ;;
372
- * )
373
- arg=" $1 "
374
- shift
375
- set -- " $@ " " $arg "
376
- ;;
377
- esac
378
- args=$(( args - 1 ))
379
- done
380
- [ $replaced -eq 1 ] || set -- " $@ " " ${target:- $target_uri } "
381
- env " $command " " $@ "
771
+ command_exec=` which $command 2> /dev/null`
772
+ icon=" $( get_key " ${file} " " Icon" ) "
773
+ # FIXME: Actually LC_MESSAGES should be used as described in
774
+ # http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s04.html
775
+ localised_name=" $( get_key " ${file} " " Name" ) "
776
+ set -- $( get_key " ${file} " " Exec" | last_word)
777
+ # We need to replace any occurrence of "%f", "%F" and
778
+ # the like by the target file. We examine each
779
+ # argument and append the modified argument to the
780
+ # end then shift.
781
+ local args=$#
782
+ local replaced=0
783
+ while [ $args -gt 0 ]; do
784
+ case $1 in
785
+ %[c])
786
+ replaced=1
787
+ arg=" ${localised_name} "
788
+ shift
789
+ set -- " $@ " " $arg "
790
+ ;;
791
+ %[fFuU])
792
+ replaced=1
793
+ arg=" $target "
794
+ shift
795
+ set -- " $@ " " $arg "
796
+ ;;
797
+ %[i])
798
+ replaced=1
799
+ shift
800
+ set -- " $@ " " --icon" " $icon "
801
+ ;;
802
+ * )
803
+ arg=" $1 "
804
+ shift
805
+ set -- " $@ " " $arg "
806
+ ;;
807
+ esac
808
+ args=$(( $args - 1 ))
809
+ done
810
+ [ $replaced -eq 1 ] || set -- " $@ " " $target "
811
+ " $command_exec " " $@ "
812
+
813
+ if [ $? -eq 0 ]; then
382
814
exit_success
383
815
fi
384
816
fi
385
817
386
- for d in " $dir /" * /; do
387
- [ -d " $d " ] && search_desktop_file " $default " " $d " " $target " " $target_uri "
818
+ for d in $dir /* /; do
819
+ [ -d " $d " ] && search_desktop_file " $default " " $d " " $target "
388
820
done
389
821
}
390
822
391
- # (file (or empty), mimetype, optional url)
823
+
392
824
open_generic_xdg_mime ()
393
825
{
394
826
filetype=" $2 "
395
- default=" $( xdg-mime query default " $filetype " ) "
827
+ default=` xdg-mime query default " $filetype " `
396
828
if [ -n " $default " ] ; then
397
829
xdg_user_dir=" $XDG_DATA_HOME "
398
830
[ -n " $xdg_user_dir " ] || xdg_user_dir=" $HOME /.local/share"
399
831
400
832
xdg_system_dirs=" $XDG_DATA_DIRS "
401
833
[ -n " $xdg_system_dirs " ] || xdg_system_dirs=/usr/local/share/:/usr/share/
402
834
403
- search_dirs=" $xdg_user_dir :$xdg_system_dirs "
404
- DEBUG 3 " $search_dirs "
405
- old_ifs=" $IFS "
406
- IFS=:
407
- for x in $search_dirs ; do
408
- IFS=" $old_ifs "
409
- search_desktop_file " $default " " $x /applications/" " $1 " " $3 "
835
+ DEBUG 3 " $xdg_user_dir :$xdg_system_dirs "
836
+ for x in ` echo " $xdg_user_dir :$xdg_system_dirs " | sed ' s/:/ /g' ` ; do
837
+ search_desktop_file " $default " " $x /applications/" " $1 "
410
838
done
411
839
fi
412
840
}
413
841
842
+ open_generic_xdg_file_mime ()
843
+ {
844
+ filetype=` xdg-mime query filetype " $1 " | sed " s/;.*//" `
845
+ open_generic_xdg_mime " $1 " " $filetype "
846
+ }
847
+
414
848
open_generic_xdg_x_scheme_handler ()
415
849
{
416
- scheme=" $( echo " $1 " | LC_ALL=C sed -n ' s/\(^[[:alpha:]][[: alnum:]+\.-]*\):.*$/\1/p' ) "
417
- if [ -n " $scheme " ]; then
850
+ scheme=" ` echo $1 | sed -n ' s/\(^[[:alnum:]+\.-]*\):.*$/\1/p' ` "
851
+ if [ -n $scheme ]; then
418
852
filetype=" x-scheme-handler/$scheme "
419
- open_generic_xdg_mime " " " $filetype " " $1 "
853
+ open_generic_xdg_mime " $1 " " $filetype "
420
854
fi
421
855
}
422
856
@@ -428,7 +862,7 @@ has_single_argument()
428
862
open_envvar ()
429
863
{
430
864
local oldifs=" $IFS "
431
- local browser
865
+ local browser browser_with_arg
432
866
433
867
IFS=" :"
434
868
for browser in $BROWSER ; do
@@ -442,8 +876,6 @@ open_envvar()
442
876
# Avoid argument injection.
443
877
# See https://bugs.freedesktop.org/show_bug.cgi?id=103807
444
878
# URIs don't have IFS characters spaces anyway.
445
- # shellcheck disable=SC2086,SC2091,SC2059
446
- # All the scary things here are intentional
447
879
has_single_argument $1 && $( printf " $browser " " $1 " )
448
880
else
449
881
$browser " $1 "
@@ -455,40 +887,19 @@ open_envvar()
455
887
done
456
888
}
457
889
458
- open_wsl ()
459
- {
460
- local win_path
461
- if has_url_scheme " $1 " ; then
462
- win_path=" $1 "
463
- else
464
- win_path=" $( wslpath -aw " $1 " ) "
465
- [ $? -eq 0 ] || exit_failure_operation_failed
466
- fi
467
- explorer.exe " ${win_path} "
468
-
469
- if [ $? -eq 0 ]; then
470
- exit_success
471
- else
472
- exit_failure_operation_failed
473
- fi
474
- }
475
-
476
890
open_generic ()
477
891
{
478
892
if is_file_url_or_path " $1 " ; then
479
- local file
480
- file=" $( file_url_to_path " $1 " ) "
893
+ local file=" $( file_url_to_path " $1 " ) "
481
894
482
895
check_input_file " $file "
483
896
484
897
if has_display; then
485
- filetype=" $( xdg-mime query filetype " $file " | sed " s/;.*//" ) "
486
- # passing a path a url is okay too,
487
- # see desktop file specification for '%u'
488
- open_generic_xdg_mime " $file " " $filetype " " $1 "
898
+ filetype=` xdg-mime query filetype " $file " | sed " s/;.*//" `
899
+ open_generic_xdg_mime " $file " " $filetype "
489
900
fi
490
901
491
- if command -v run-mailcap > /dev/null; then
902
+ if which run-mailcap 2 > /dev/null 1>&2 ; then
492
903
run-mailcap --action=view " $file "
493
904
if [ $? -eq 0 ]; then
494
905
exit_success
@@ -515,7 +926,7 @@ open_generic()
515
926
if [ x" $BROWSER " = x" " ]; then
516
927
BROWSER=www-browser:links2:elinks:links:lynx:w3m
517
928
if has_display; then
518
- BROWSER=x-www-browser:firefox:iceweasel:seamonkey:mozilla:epiphany:konqueror:chromium:chromium-browser:google-chrome:$BROWSER
929
+ BROWSER=x-www-browser:firefox:iceweasel:seamonkey:mozilla:epiphany:konqueror:chromium:chromium-browser:google-chrome:microsoft-edge: $BROWSER
519
930
fi
520
931
fi
521
932
@@ -529,8 +940,7 @@ open_lxde()
529
940
530
941
# pcmanfm only knows how to handle file:// urls and filepaths, it seems.
531
942
if pcmanfm --help > /dev/null 2>&1 && is_file_url_or_path " $1 " ; then
532
- local file
533
- file=" $( file_url_to_path " $1 " ) "
943
+ local file=" $( file_url_to_path " $1 " ) "
534
944
535
945
# handle relative paths
536
946
if ! echo " $file " | grep -q ^/; then
@@ -551,17 +961,7 @@ open_lxde()
551
961
552
962
open_lxqt ()
553
963
{
554
- if qtxdg-mat open --help 2> /dev/null 1>&2 ; then
555
- qtxdg-mat open " $1 "
556
- else
557
- exit_failure_operation_impossible " no method available for opening '$1 '"
558
- fi
559
-
560
- if [ $? -eq 0 ]; then
561
- exit_success
562
- else
563
- exit_failure_operation_failed
564
- fi
964
+ open_generic " $1 "
565
965
}
566
966
567
967
[ x" $1 " != x" " ] || exit_failure_syntax
597
997
598
998
DEBUG 2 " Selected DE $DE "
599
999
600
- # sanitize BROWSER (avoid calling ourselves in particular)
1000
+ # sanitize BROWSER (avoid caling ourselves in particular)
601
1001
case " ${BROWSER} " in
602
1002
* :" xdg-open" |" xdg-open" :* )
603
- BROWSER=" $( echo " $BROWSER " | sed -e ' s|:xdg-open||g' -e ' s|xdg-open:||g' ) "
1003
+ BROWSER=$( echo $BROWSER | sed -e ' s|:xdg-open||g' -e ' s|xdg-open:||g' )
604
1004
;;
605
1005
" xdg-open" )
606
1006
BROWSER=
@@ -612,8 +1012,8 @@ case "$DE" in
612
1012
open_kde " $url "
613
1013
;;
614
1014
615
- deepin )
616
- open_deepin " $url "
1015
+ dde )
1016
+ open_dde " $url "
617
1017
;;
618
1018
619
1019
gnome3|cinnamon)
@@ -656,10 +1056,6 @@ case "$DE" in
656
1056
open_flatpak " $url "
657
1057
;;
658
1058
659
- wsl)
660
- open_wsl " $url "
661
- ;;
662
-
663
1059
generic)
664
1060
open_generic " $url "
665
1061
;;
0 commit comments