diff options
author | piegames <git@piegames.de> | 2020-06-29 23:23:50 +0200 |
---|---|---|
committer | piegames <git@piegames.de> | 2020-06-29 23:23:50 +0200 |
commit | 51cc55330719be8918cff038b74f5b2c5612995a (patch) | |
tree | d8130a976f1acbbc527b76cac92844895a405b6e /pkgs/build-support/make-desktopitem | |
parent | 56f8f6f31fbccd429bb3eced05c4fa46779f1211 (diff) |
make-desktopitem: refactoring, documentation and improvement
- New parameter `extraDesktopEntries` to easily add some less usual entries to the desktop file
- Rewrite of the core logic. Instead of a key-value-list, use an attribute set with nullable values to make it overridable
- Added some comments
- Some cosmetic/readability code refactors
- I didn't like the doubly nested strings around the `fileValidation`
Diffstat (limited to 'pkgs/build-support/make-desktopitem')
-rw-r--r-- | pkgs/build-support/make-desktopitem/default.nix | 66 |
1 files changed, 37 insertions, 29 deletions
diff --git a/pkgs/build-support/make-desktopitem/default.nix b/pkgs/build-support/make-desktopitem/default.nix index 8355a5ad29bc..f5020c036aac 100644 --- a/pkgs/build-support/make-desktopitem/default.nix +++ b/pkgs/build-support/make-desktopitem/default.nix @@ -1,50 +1,58 @@ { lib, runCommandLocal, desktop-file-utils }: -{ name +# See https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html +{ name # The name of the desktop file , type ? "Application" , exec , icon ? null , comment ? null , terminal ? "false" -, desktopName +, desktopName # The name of the application , genericName ? null , mimeType ? null , categories ? null , startupNotify ? null -, extraEntries ? null +, extraDesktopEntries ? {} # Extra key-value pairs to add to the [Desktop Entry] section. This may override other values +, extraEntries ? "" # Extra configuration. Will be appended to the end of the file and may thus contain extra sections , 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;}]; + # like builtins.toString, but null -> null instead of null -> "" + nullableToString = value: if value == null then null else builtins.toString value; - valueNotNull = {k, v}: v != null; - entriesToKeep = builtins.filter valueNotNull optionalEntriesList; + # The [Desktop entry] section of the desktop file, as attribute set. + mainSection = { + "Type" = toString type; + "Exec" = (nullableToString exec); + "Icon" = (nullableToString icon); + "Comment" = (nullableToString comment); + "Terminal" = (nullableToString terminal); + "Name" = toString name; + "GenericName" = (nullableToString genericName); + "MimeType" = (nullableToString mimeType); + "Categories" = (nullableToString categories); + "StartupNotify" = (nullableToString startupNotify); + } // extraDesktopEntries; - mkEntry = {k, v}: k + "=" + v; - optionalEntriesString = lib.concatMapStringsSep "\n" mkEntry entriesToKeep; + # Map all entries to a list of lines + desktopFileStrings = + ["[Desktop Entry]"] + ++ builtins.filter + (v: v != null) + (lib.mapAttrsToList + (name: value: if value != null then "${name}=${value}" else null) + mainSection + ) + ++ (if extraEntries == "" then [] else ["${extraEntries}"]); 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" - ''} - '' + ${builtins.concatStringsSep "\n" desktopFileStrings} + EOF + '' + lib.optionalString fileValidation '' + echo "Running desktop-file validation" + ${desktop-file-utils}/bin/desktop-file-validate "$out/share/applications/${name}.desktop" + '') |