fnott: add module
Fnott is a keyboard driven and lightweight Wayland notification daemon for wlroots-based compositors. There are four unit test to validate behavior for an empty configuration, the default configuration, global properties and systemd service file generation.
This commit is contained in:
parent
84d54402a5
commit
521a03d8bf
3
.github/CODEOWNERS
vendored
3
.github/CODEOWNERS
vendored
|
@ -238,6 +238,9 @@
|
|||
|
||||
/modules/services/fluidsynth.nix @Valodim
|
||||
|
||||
/modules/services/fnott.nix @polykernel
|
||||
/tests/modules/services/fnott @polykernel
|
||||
|
||||
/modules/services/git-sync.nix @IvanMalison
|
||||
|
||||
/modules/services/gnome-keyring.nix @rycee
|
||||
|
|
|
@ -2180,6 +2180,14 @@ in
|
|||
A new module is available: 'services.git-sync'.
|
||||
'';
|
||||
}
|
||||
|
||||
{
|
||||
time = "2021-08-26T06:40:59+00:00";
|
||||
condition = hostPlatform.isLinux;
|
||||
message = ''
|
||||
A new module is available: 'services.fnott'.
|
||||
'';
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -162,6 +162,7 @@ let
|
|||
./services/etesync-dav.nix
|
||||
./services/flameshot.nix
|
||||
./services/fluidsynth.nix
|
||||
./services/fnott.nix
|
||||
./services/getmail.nix
|
||||
./services/git-sync.nix
|
||||
./services/gnome-keyring.nix
|
||||
|
|
130
modules/services/fnott.nix
Normal file
130
modules/services/fnott.nix
Normal file
|
@ -0,0 +1,130 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.services.fnott;
|
||||
|
||||
concatStringsSep' = sep: list:
|
||||
concatStringsSep sep (filter (str: str != "") list);
|
||||
|
||||
mkKeyValue = generators.mkKeyValueDefault { } "=";
|
||||
genINI = generators.toINI { };
|
||||
|
||||
iniFormatType = with types;
|
||||
let
|
||||
iniAtom = types.nullOr (types.oneOf [ bool int float str ]) // {
|
||||
description = "INI atom (null, bool, int, float or string)";
|
||||
};
|
||||
in attrsOf (attrsOf iniAtom);
|
||||
in {
|
||||
options = {
|
||||
services.fnott = {
|
||||
enable = mkEnableOption ''
|
||||
fnott, a lightweight Wayland notification daemon for wlroots-based compositors
|
||||
'';
|
||||
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = pkgs.fnott;
|
||||
defaultText = literalExample "pkgs.fnott";
|
||||
description = "Package providing <command>fnott</command>.";
|
||||
};
|
||||
|
||||
configFile = mkOption {
|
||||
type = types.either types.str types.path;
|
||||
default = "${config.xdg.configHome}/fnott/fnott.ini";
|
||||
defaultText = "$XDG_CONFIG_HOME/fnott/fnott.ini";
|
||||
description = ''
|
||||
Path to the configuration file read by fnott.
|
||||
</para><para>
|
||||
Note that environment variables in the path won't be properly expanded.
|
||||
</para><para>
|
||||
The configuration specified under
|
||||
<option>services.fnott.settings</option> will be generated and
|
||||
written to <filename>$XDG_CONFIG_HOME/fnott/fnott.ini</filename>
|
||||
regardless of this option. This allows using a mutable configuration file
|
||||
generated from the immutable one, useful in scenarios where live reloading is desired.
|
||||
'';
|
||||
};
|
||||
|
||||
extraFlags = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [ ];
|
||||
example = [ "-s" ];
|
||||
description = ''
|
||||
Extra arguments to use for executing fnott.
|
||||
'';
|
||||
};
|
||||
|
||||
settings = mkOption {
|
||||
type = iniFormatType;
|
||||
default = { };
|
||||
description = ''
|
||||
Configuration written to
|
||||
<filename>$XDG_CONFIG_HOME/fnott/fnott.ini</filename>.
|
||||
</para><para>
|
||||
See
|
||||
<citerefentry>
|
||||
<refentrytitle>fnott.ini</refentrytitle>
|
||||
<manvolnum>5</manvolnum>
|
||||
</citerefentry> for a list of avaliable options and <link
|
||||
xlink:href="https://codeberg.org/dnkl/fnott/src/branch/master/fnott.ini"/>
|
||||
for an example configuration.
|
||||
'';
|
||||
example = literalExample ''
|
||||
{
|
||||
main = {
|
||||
notification-margin = 5;
|
||||
};
|
||||
|
||||
low = {
|
||||
timeout = 5;
|
||||
title-font = "Dina:weight=bold:slant=italic";
|
||||
title-color = "ffffff";
|
||||
};
|
||||
}
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
assertions =
|
||||
[ (hm.assertions.assertPlatform "services.fnott" pkgs platforms.linux) ];
|
||||
|
||||
home.packages = [ cfg.package ];
|
||||
|
||||
systemd.user.services.fnott = {
|
||||
Unit = {
|
||||
Description = "Fnott notification daemon";
|
||||
Documentation = "man:fnott(1)";
|
||||
After = [ "graphical-session-pre.target" ];
|
||||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
Service = {
|
||||
Type = "dbus";
|
||||
BusName = "org.freedesktop.Notifications";
|
||||
ExecStart = concatStringsSep' " " [
|
||||
"${cfg.package}/bin/fnott -c ${cfg.configFile}"
|
||||
(escapeShellArgs cfg.extraFlags)
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
# FIXME: Remove after next version release (https://codeberg.org/dnkl/fnott/pulls/24).
|
||||
xdg.configFile."fnott/fnott.ini" = mkIf (cfg.settings != { }) (mkMerge [
|
||||
{ text = genINI cfg.settings; }
|
||||
(mkIf (cfg.settings ? main) {
|
||||
text = mkForce (concatStringsSep' "\n" [
|
||||
''
|
||||
${concatStringsSep "\n"
|
||||
(mapAttrsToList mkKeyValue cfg.settings.main)}
|
||||
''
|
||||
(genINI (removeAttrs cfg.settings [ "main" ]))
|
||||
]);
|
||||
})
|
||||
]);
|
||||
};
|
||||
}
|
|
@ -120,6 +120,7 @@ import nmt {
|
|||
./modules/services/dropbox
|
||||
./modules/services/emacs
|
||||
./modules/services/fluidsynth
|
||||
./modules/services/fnott
|
||||
./modules/services/git-sync
|
||||
./modules/services/kanshi
|
||||
./modules/services/lieer
|
||||
|
|
6
tests/modules/services/fnott/default.nix
Normal file
6
tests/modules/services/fnott/default.nix
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
fnott-empty-settings = ./empty-settings.nix;
|
||||
fnott-example-settings = ./example-settings.nix;
|
||||
fnott-global-properties = ./global-properties.nix;
|
||||
fnott-systemd-user-service = ./systemd-user-service.nix;
|
||||
}
|
15
tests/modules/services/fnott/empty-settings.nix
Normal file
15
tests/modules/services/fnott/empty-settings.nix
Normal file
|
@ -0,0 +1,15 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
config = {
|
||||
services.fnott = {
|
||||
enable = true;
|
||||
package = pkgs.writeScriptBin "dummy-fnott" "";
|
||||
settings = { };
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertPathNotExists home-files/.config/fnott
|
||||
'';
|
||||
};
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
notification-margin=5
|
||||
|
||||
[low]
|
||||
timeout=5
|
||||
title-color=ffffff
|
||||
title-font=Dina:weight=bold:slant=italic
|
26
tests/modules/services/fnott/example-settings.nix
Normal file
26
tests/modules/services/fnott/example-settings.nix
Normal file
|
@ -0,0 +1,26 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
config = {
|
||||
services.fnott = {
|
||||
enable = true;
|
||||
package = pkgs.writeScriptBin "dummy-fnott" "";
|
||||
|
||||
settings = {
|
||||
main = { notification-margin = 5; };
|
||||
|
||||
low = {
|
||||
timeout = 5;
|
||||
title-font = "Dina:weight=bold:slant=italic";
|
||||
title-color = "ffffff";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertFileContent \
|
||||
home-files/.config/fnott/fnott.ini \
|
||||
${./example-settings-expected.ini}
|
||||
'';
|
||||
};
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
max-icon-size=32
|
||||
notification-margin=5
|
24
tests/modules/services/fnott/global-properties.nix
Normal file
24
tests/modules/services/fnott/global-properties.nix
Normal file
|
@ -0,0 +1,24 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
# FIXME: Deprecate on next version release of fnott (https://codeberg.org/dnkl/fnott/pulls/24).
|
||||
{
|
||||
config = {
|
||||
services.fnott = {
|
||||
enable = true;
|
||||
package = pkgs.writeScriptBin "dummy-fnott" "";
|
||||
|
||||
settings = {
|
||||
main = {
|
||||
max-icon-size = 32;
|
||||
notification-margin = 5;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertFileContent \
|
||||
home-files/.config/fnott/fnott.ini \
|
||||
${./global-properties-expected.ini}
|
||||
'';
|
||||
};
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
[Service]
|
||||
BusName=org.freedesktop.Notifications
|
||||
ExecStart=@fnott@/bin/fnott -c /home/hm-user/.config/fnott/fnott.ini
|
||||
Type=dbus
|
||||
|
||||
[Unit]
|
||||
After=graphical-session-pre.target
|
||||
Description=Fnott notification daemon
|
||||
Documentation=man:fnott(1)
|
||||
PartOf=graphical-session.target
|
18
tests/modules/services/fnott/systemd-user-service.nix
Normal file
18
tests/modules/services/fnott/systemd-user-service.nix
Normal file
|
@ -0,0 +1,18 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
config = {
|
||||
services.fnott = {
|
||||
enable = true;
|
||||
package = pkgs.writeScriptBin "dummy-foot" "" // { outPath = "@fnott@"; };
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertPathNotExists home-files/.config/fnott/fnott.ini
|
||||
|
||||
assertFileContent \
|
||||
home-files/.config/systemd/user/fnott.service \
|
||||
${./systemd-user-service-expected.service}
|
||||
'';
|
||||
};
|
||||
}
|
Loading…
Reference in a new issue