xdg-mime-apps: add module

This commit is contained in:
pacien 2019-09-05 11:25:31 +02:00 committed by Robert Helgesson
parent 0dfa1eef25
commit e347e932af
No known key found for this signature in database
GPG Key ID: 36BDAA14C2797E89
6 changed files with 133 additions and 1 deletions

View File

@ -0,0 +1,88 @@
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.xdg.mimeApps;
strListOrSingleton = with types;
coercedTo (either (listOf str) str) toList (listOf str);
in
{
meta.maintainers = with maintainers; [ pacien ];
options.xdg.mimeApps = {
enable = mkOption {
type = types.bool;
default = false;
description = ''
Whether to manage <filename>$XDG_CONFIG_HOME/mimeapps.list</filename>.
</para>
<para>
The generated file is read-only.
'';
};
# descriptions from
# https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-1.0.1.html
associations.added = mkOption {
type = types.attrsOf strListOrSingleton;
default = { };
example = literalExample ''
{
"mimetype1" = [ "foo1.desktop" "foo2.desktop" "foo3.desktop" ];
"mimetype2" = "foo4.desktop";
}
'';
description = ''
Defines additional associations of applications with
mimetypes, as if the .desktop file was listing this mimetype
in the first place.
'';
};
associations.removed = mkOption {
type = types.attrsOf strListOrSingleton;
default = { };
example = { "mimetype1" = "foo5.desktop"; };
description = ''
Removes associations of applications with mimetypes, as if the
.desktop file was <emphasis>not</emphasis> listing this
mimetype in the first place.
'';
};
defaultApplications = mkOption {
type = types.attrsOf strListOrSingleton;
default = { };
example = literalExample ''
{
"mimetype1" = [ "default1.desktop" "default2.desktop" ];
}
'';
description = ''
The default application to be used for a given mimetype. This
is, for instance, the one that will be started when
double-clicking on a file in a file manager. If the
application is no longer installed, the next application in
the list is attempted, and so on.
'';
};
};
config = mkIf cfg.enable {
xdg.configFile."mimeapps.list".text =
let
joinValues = mapAttrs (n: concatStringsSep ";");
in
generators.toINI {} {
"Added Associations" = joinValues cfg.associations.added;
"Removed Associations" = joinValues cfg.associations.removed;
"Default Applications" = joinValues cfg.defaultApplications;
};
};
}

View File

@ -33,8 +33,9 @@ let
(loadModule ./misc/qt.nix { })
(loadModule ./misc/submodule-support.nix { })
(loadModule ./misc/version.nix { })
(loadModule ./misc/xdg.nix { })
(loadModule ./misc/xdg-mime-apps.nix { condition = hostPlatform.isLinux; })
(loadModule ./misc/xdg-user-dirs.nix { condition = hostPlatform.isLinux; })
(loadModule ./misc/xdg.nix { })
(loadModule ./programs/afew.nix { })
(loadModule ./programs/alacritty.nix { })
(loadModule ./programs/alot.nix { })

View File

@ -34,6 +34,7 @@ import nmt {
i3-keybindings = ./modules/services/window-managers/i3-keybindings.nix;
}
// import ./modules/misc/pam
// import ./modules/misc/xdg
// import ./modules/misc/xsession
// import ./modules/programs/firefox
// import ./modules/programs/rofi

View File

@ -0,0 +1,3 @@
{
xdg-mime-apps-basics = ./mime-apps-basics.nix;
}

View File

@ -0,0 +1,9 @@
[Added Associations]
mimetype1=foo1.desktop;foo2.desktop;foo3.desktop
mimetype2=foo4.desktop
[Default Applications]
mimetype1=default1.desktop;default2.desktop
[Removed Associations]
mimetype1=foo5.desktop

View File

@ -0,0 +1,30 @@
{ config, lib, pkgs, ... }:
with lib;
{
config = {
xdg.mimeApps = {
enable = true;
associations = {
added = {
"mimetype1" = [ "foo1.desktop" "foo2.desktop" "foo3.desktop" ];
"mimetype2" = "foo4.desktop";
};
removed = {
mimetype1 = "foo5.desktop";
};
};
defaultApplications = {
"mimetype1" = [ "default1.desktop" "default2.desktop" ];
};
};
nmt.script = ''
assertFileExists home-files/.config/mimeapps.list
assertFileContent \
home-files/.config/mimeapps.list \
${./mime-apps-basics-expected.ini}
'';
};
}