yabar: add module

To make the configuration of `yabar` more pleasant and easier to
validate, a NixOS module will be quite helpful.

An example config could look like this:

```
{
programs.yabar = {
enable = true;
bars.top.indicators.exec = "YA_DATE";
};
}
```

The module adds a user-controlled systemd service which runs `yabar` after
starting up X.

Changed files
+176
nixos
+1
nixos/modules/module-list.nix
···
./programs/wireshark.nix
./programs/xfs_quota.nix
./programs/xonsh.nix
+
./programs/yabar.nix
./programs/zsh/oh-my-zsh.nix
./programs/zsh/zsh.nix
./programs/zsh/zsh-syntax-highlighting.nix
+149
nixos/modules/programs/yabar.nix
···
+
{ lib, pkgs, config, ... }:
+
+
with lib;
+
+
let
+
cfg = config.programs.yabar;
+
+
mapExtra = v: lib.concatStringsSep "\n" (mapAttrsToList (
+
key: val: "${key} = ${if (isString val) then "\"${val}\"" else "${builtins.toString val}"};"
+
) v);
+
+
listKeys = r: concatStringsSep "," (map (n: "\"${n}\"") (attrNames r));
+
+
configFile = let
+
bars = mapAttrsToList (
+
name: cfg: ''
+
${name}: {
+
font: "${cfg.font}";
+
position: "${cfg.position}";
+
+
${mapExtra cfg.extra}
+
+
block-list: [${listKeys cfg.indicators}]
+
+
${concatStringsSep "\n" (mapAttrsToList (
+
name: cfg: ''
+
${name}: {
+
exec: "${cfg.exec}";
+
align: "${cfg.align}";
+
${mapExtra cfg.extra}
+
};
+
''
+
) cfg.indicators)}
+
};
+
''
+
) cfg.bars;
+
in pkgs.writeText "yabar.conf" ''
+
bar-list = [${listKeys cfg.bars}];
+
${concatStringsSep "\n" bars}
+
'';
+
in
+
{
+
options.programs.yabar = {
+
enable = mkEnableOption "yabar";
+
+
package = mkOption {
+
default = pkgs.yabar;
+
example = literalExample "pkgs.yabar-unstable";
+
type = types.package;
+
+
description = ''
+
The package which contains the `yabar` binary.
+
+
Nixpkgs provides the `yabar` and `yabar-unstable`
+
derivations since 18.03, so it's possible to choose.
+
'';
+
};
+
+
bars = mkOption {
+
default = {};
+
type = types.attrsOf(types.submodule {
+
options = {
+
font = mkOption {
+
default = "sans bold 9";
+
example = "Droid Sans, FontAwesome Bold 9";
+
type = types.string;
+
+
description = ''
+
The font that will be used to draw the status bar.
+
'';
+
};
+
+
position = mkOption {
+
default = "top";
+
example = "bottom";
+
type = types.enum [ "top" "bottom" ];
+
+
description = ''
+
The position where the bar will be rendered.
+
'';
+
};
+
+
extra = mkOption {
+
default = {};
+
type = types.attrsOf types.string;
+
+
description = ''
+
An attribute set which contains further attributes of a bar.
+
'';
+
};
+
+
indicators = mkOption {
+
default = {};
+
type = types.attrsOf(types.submodule {
+
options.exec = mkOption {
+
example = "YABAR_DATE";
+
type = types.string;
+
description = ''
+
The type of the indicator to be executed.
+
'';
+
};
+
+
options.align = mkOption {
+
default = "left";
+
example = "right";
+
type = types.enum [ "left" "center" "right" ];
+
+
description = ''
+
Whether to align the indicator at the left or right of the bar.
+
'';
+
};
+
+
options.extra = mkOption {
+
default = {};
+
type = types.attrsOf (types.either types.string types.int);
+
+
description = ''
+
An attribute set which contains further attributes of a indicator.
+
'';
+
};
+
});
+
+
description = ''
+
Indicators that should be rendered by yabar.
+
'';
+
};
+
};
+
});
+
+
description = ''
+
List of bars that should be rendered by yabar.
+
'';
+
};
+
};
+
+
config = mkIf cfg.enable {
+
systemd.user.services.yabar = {
+
description = "yabar service";
+
wantedBy = [ "graphical-session.target" ];
+
partOf = [ "graphical-session.target" ];
+
+
script = ''
+
${cfg.package}/bin/yabar -c ${configFile}
+
'';
+
+
serviceConfig.Restart = "always";
+
};
+
};
+
}
+1
nixos/release.nix
···
tests.wordpress = callTest tests/wordpress.nix {};
tests.xfce = callTest tests/xfce.nix {};
tests.xmonad = callTest tests/xmonad.nix {};
+
tests.yabar = callTest tests/yabar.nix {};
tests.zookeeper = callTest tests/zookeeper.nix {};
/* Build a bunch of typical closures so that Hydra can keep track of
+25
nixos/tests/yabar.nix
···
+
import ./make-test.nix ({ pkgs, lib }:
+
+
with lib;
+
+
{
+
name = "yabar";
+
meta = with pkgs.stdenv.lib.maintainers; {
+
maintainers = [ ma27 ];
+
};
+
+
nodes.yabar = {
+
imports = [ ./common/x11.nix ./common/user-account.nix ];
+
+
services.xserver.displayManager.auto.user = "bob";
+
+
programs.yabar.enable = true;
+
};
+
+
testScript = ''
+
$yabar->start;
+
$yabar->waitForX;
+
+
$yabar->waitForUnit("yabar.service", "bob");
+
'';
+
})