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.wip/yesman
parent
814b38541f
commit
dbc414a8a5
@ -0,0 +1,149 @@ |
||||
{ 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"; |
||||
}; |
||||
}; |
||||
} |
@ -0,0 +1,25 @@ |
||||
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"); |
||||
''; |
||||
}) |
Loading…
Reference in new issue