2020-10-12 00:22:58 +00:00
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
with lib;
|
|
|
|
|
|
|
|
let
|
|
|
|
|
|
|
|
cfg = config.programs.ncmpcpp;
|
|
|
|
|
|
|
|
renderSettings = settings:
|
|
|
|
concatStringsSep "\n" (mapAttrsToList renderSetting settings);
|
|
|
|
|
|
|
|
renderSetting = name: value: "${name}=${renderValue value}";
|
|
|
|
|
|
|
|
renderValue = option:
|
|
|
|
{
|
|
|
|
int = toString option;
|
2023-01-10 09:35:00 +00:00
|
|
|
bool = lib.hm.booleans.yesNo option;
|
2020-10-12 00:22:58 +00:00
|
|
|
string = option;
|
|
|
|
}.${builtins.typeOf option};
|
|
|
|
|
|
|
|
renderBindings = bindings: concatStringsSep "\n" (map renderBinding bindings);
|
|
|
|
|
|
|
|
renderBinding = { key, command }:
|
|
|
|
concatStringsSep "\n " ([ ''def_key "${key}"'' ] ++ maybeWrapList command);
|
|
|
|
|
|
|
|
maybeWrapList = xs: if isList xs then xs else [ xs ];
|
|
|
|
|
|
|
|
valueType = with types; oneOf [ bool int str ];
|
|
|
|
|
|
|
|
bindingType = types.submodule ({ name, config, ... }: {
|
|
|
|
options = {
|
|
|
|
key = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
description = "Key to bind.";
|
|
|
|
example = "j";
|
|
|
|
};
|
|
|
|
|
|
|
|
command = mkOption {
|
|
|
|
type = with types; either str (listOf str);
|
|
|
|
description = "Command or sequence of commands to be executed.";
|
|
|
|
example = "scroll_down";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
|
|
|
in {
|
2023-01-10 09:35:00 +00:00
|
|
|
meta.maintainers = [ hm.maintainers.olmokramer ];
|
2020-10-12 00:22:58 +00:00
|
|
|
|
|
|
|
options.programs.ncmpcpp = {
|
|
|
|
enable =
|
|
|
|
mkEnableOption "ncmpcpp - an ncurses Music Player Daemon (MPD) client";
|
|
|
|
|
|
|
|
package = mkOption {
|
|
|
|
type = types.package;
|
|
|
|
default = pkgs.ncmpcpp;
|
2021-11-04 16:42:44 +00:00
|
|
|
defaultText = literalExpression "pkgs.ncmpcpp";
|
2020-10-12 00:22:58 +00:00
|
|
|
description = ''
|
2023-08-08 10:19:01 +00:00
|
|
|
Package providing the `ncmpcpp` command.
|
2020-10-12 00:22:58 +00:00
|
|
|
'';
|
|
|
|
example =
|
2021-11-04 16:42:44 +00:00
|
|
|
literalExpression "pkgs.ncmpcpp.override { visualizerSupport = true; }";
|
2020-10-12 00:22:58 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
mpdMusicDir = mkOption {
|
2023-01-10 09:35:00 +00:00
|
|
|
type = with types; nullOr (coercedTo path toString str);
|
2020-10-12 00:22:58 +00:00
|
|
|
default = let mpdCfg = config.services.mpd;
|
|
|
|
in if pkgs.stdenv.hostPlatform.isLinux && mpdCfg.enable then
|
|
|
|
mpdCfg.musicDirectory
|
|
|
|
else
|
|
|
|
null;
|
2021-11-04 16:42:44 +00:00
|
|
|
defaultText = literalExpression ''
|
2020-10-12 00:22:58 +00:00
|
|
|
if pkgs.stdenv.hostPlatform.isLinux && config.services.mpd.enable then
|
|
|
|
config.services.mpd.musicDirectory
|
|
|
|
else
|
|
|
|
null
|
|
|
|
'';
|
|
|
|
description = ''
|
2023-08-08 10:19:01 +00:00
|
|
|
Value of the `mpd_music_dir` setting. On Linux platforms the
|
|
|
|
value of {var}`services.mpd.musicDirectory` is used as the
|
|
|
|
default if {var}`services.mpd.enable` is
|
|
|
|
`true`.
|
2020-10-12 00:22:58 +00:00
|
|
|
'';
|
|
|
|
example = "~/music";
|
|
|
|
};
|
|
|
|
|
|
|
|
settings = mkOption {
|
|
|
|
type = types.attrsOf valueType;
|
|
|
|
default = { };
|
|
|
|
description = ''
|
|
|
|
Attribute set from name of a setting to its value. For available options
|
|
|
|
see
|
2023-08-08 10:19:01 +00:00
|
|
|
{manpage}`ncmpcpp(1)`.
|
2020-10-12 00:22:58 +00:00
|
|
|
'';
|
|
|
|
example = { ncmpcpp_directory = "~/.local/share/ncmpcpp"; };
|
|
|
|
};
|
|
|
|
|
|
|
|
bindings = mkOption {
|
|
|
|
type = types.listOf bindingType;
|
|
|
|
default = [ ];
|
|
|
|
description = "List of keybindings.";
|
2021-11-04 16:42:44 +00:00
|
|
|
example = literalExpression ''
|
2020-10-12 00:22:58 +00:00
|
|
|
[
|
|
|
|
{ key = "j"; command = "scroll_down"; }
|
|
|
|
{ key = "k"; command = "scroll_up"; }
|
|
|
|
{ key = "J"; command = [ "select_item" "scroll_down" ]; }
|
|
|
|
{ key = "K"; command = [ "select_item" "scroll_up" ]; }
|
|
|
|
]
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
warnings = mkIf (cfg.settings ? mpd_music_dir && cfg.mpdMusicDir != null) [
|
|
|
|
("programs.ncmpcpp.settings.mpd_music_dir will be overridden by"
|
|
|
|
+ " programs.ncmpcpp.mpdMusicDir.")
|
|
|
|
];
|
|
|
|
|
|
|
|
home.packages = [ cfg.package ];
|
|
|
|
|
|
|
|
xdg.configFile = {
|
|
|
|
"ncmpcpp/config" = let
|
|
|
|
settings = cfg.settings // optionalAttrs (cfg.mpdMusicDir != null) {
|
2023-01-10 09:35:00 +00:00
|
|
|
mpd_music_dir = cfg.mpdMusicDir;
|
2020-10-12 00:22:58 +00:00
|
|
|
};
|
|
|
|
in mkIf (settings != { }) { text = renderSettings settings + "\n"; };
|
|
|
|
|
|
|
|
"ncmpcpp/bindings" = mkIf (cfg.bindings != [ ]) {
|
|
|
|
text = renderBindings cfg.bindings + "\n";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|