1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
{ lib, runCommandLocal, desktop-file-utils }:
{ name
, type ? "Application"
, exec
, icon ? null
, comment ? null
, terminal ? "false"
, desktopName
, genericName ? null
, mimeType ? null
, categories ? null
, startupNotify ? null
, extraEntries ? null
, fileValidation ? true # whether to validate resulting desktop file.
}:
let
optionalEntriesList = [{k="Icon"; v=icon;}
{k="Comment"; v=comment;}
{k="GenericName"; v=genericName;}
{k="MimeType"; v=mimeType;}
{k="Categories"; v=categories;}
{k="StartupNotify"; v=startupNotify;}];
valueNotNull = {k, v}: v != null;
entriesToKeep = builtins.filter valueNotNull optionalEntriesList;
mkEntry = {k, v}: k + "=" + v;
optionalEntriesString = lib.concatMapStringsSep "\n" mkEntry entriesToKeep;
in
runCommandLocal "${name}.desktop" {}
''
mkdir -p "$out/share/applications"
cat > "$out/share/applications/${name}.desktop" <<EOF
[Desktop Entry]
Type=${type}
Exec=${exec}
Terminal=${terminal}
Name=${desktopName}
${optionalEntriesString}
${if extraEntries == null then ''EOF'' else ''
${extraEntries}
EOF''}
${lib.optionalString fileValidation ''
echo "Running desktop-file validation"
${desktop-file-utils}/bin/desktop-file-validate "$out/share/applications/${name}.desktop"
''}
''
|