home-manager/modules/services/dunst.nix

204 lines
5.5 KiB
Nix
Raw Normal View History

2017-01-07 18:16:26 +00:00
{ config, lib, pkgs, ... }:
with lib;
2017-10-09 09:20:12 +00:00
let
cfg = config.services.dunst;
2018-12-05 10:53:17 +00:00
2020-02-01 23:39:17 +00:00
eitherStrBoolIntList = with types;
either str (either bool (either int (listOf str)));
2018-12-05 10:53:17 +00:00
2017-10-09 09:20:12 +00:00
toDunstIni = generators.toINI {
mkKeyValue = key: value:
2020-02-01 23:39:17 +00:00
let
value' = if isBool value then
(lib.hm.booleans.yesNo value)
2020-02-01 23:39:17 +00:00
else if isString value then
''"${value}"''
else
toString value;
in "${key}=${value'}";
2017-10-09 09:20:12 +00:00
};
themeType = types.submodule {
options = {
package = mkOption {
type = types.package;
example = literalExpression "pkgs.gnome.adwaita-icon-theme";
description = "Package providing the theme.";
};
name = mkOption {
type = types.str;
example = "Adwaita";
description = "The name of the theme within the package.";
};
size = mkOption {
type = types.str;
default = "32x32";
example = "16x16";
description = "The desired icon size.";
};
};
};
hicolorTheme = {
2020-06-06 12:52:22 +00:00
package = pkgs.hicolor-icon-theme;
name = "hicolor";
size = "32x32";
};
2020-02-01 23:39:17 +00:00
in {
meta.maintainers = [ maintainers.rycee ];
2017-01-07 18:16:26 +00:00
options = {
services.dunst = {
enable = mkEnableOption "the dunst notification daemon";
package = mkOption {
type = types.package;
default = pkgs.dunst;
defaultText = literalExpression "pkgs.dunst";
description = "Package providing <command>dunst</command>.";
};
configFile = mkOption {
type = with types; either str path;
default = "${config.xdg.configHome}/dunst/dunstrc";
defaultText = "$XDG_CONFIG_HOME/dunst/dunstrc";
description = ''
Path to the configuration file read by dunst.
</para><para>
Note that the configuration generated by Home Manager will be
written to <filename>$XDG_CONFIG_HOME/dunst/dunstrc</filename>
regardless. This allows using a mutable configuration file generated
from the immutable one, useful in scenarios where live reloading is
desired.
'';
};
iconTheme = mkOption {
type = themeType;
default = hicolorTheme;
description = "Set the icon theme.";
};
waylandDisplay = mkOption {
type = types.str;
default = "";
description =
"Set the service's <envar>WAYLAND_DISPLAY</envar> environment variable.";
};
2017-01-07 18:16:26 +00:00
settings = mkOption {
type = types.submodule {
freeformType = with types; attrsOf (attrsOf eitherStrBoolIntList);
options = {
global.icon_path = mkOption {
type = types.separatedString ":";
description = "Paths where dunst will look for icons.";
};
};
};
2020-02-01 23:39:17 +00:00
default = { };
description =
"Configuration written to <filename>$XDG_CONFIG_HOME/dunst/dunstrc</filename>.";
example = literalExpression ''
2017-10-09 09:20:12 +00:00
{
global = {
2022-06-20 06:07:29 +00:00
width = 300;
height = 300;
offset = "30x50";
origin = "top-right";
2017-10-09 09:20:12 +00:00
transparency = 10;
frame_color = "#eceff1";
font = "Droid Sans 9";
};
urgency_normal = {
background = "#37474f";
foreground = "#eceff1";
timeout = 10;
};
};
'';
2017-01-07 18:16:26 +00:00
};
};
};
2020-02-01 23:39:17 +00:00
config = mkIf cfg.enable (mkMerge [
{
home.packages = [ cfg.package ];
2020-03-22 20:08:45 +00:00
2020-02-01 23:39:17 +00:00
xdg.dataFile."dbus-1/services/org.knopwob.dunst.service".source =
"${pkgs.dunst}/share/dbus-1/services/org.knopwob.dunst.service";
services.dunst.settings.global.icon_path = let
useCustomTheme = cfg.iconTheme.package != hicolorTheme.package
|| cfg.iconTheme.name != hicolorTheme.name || cfg.iconTheme.size
!= hicolorTheme.size;
basePaths = [
"/run/current-system/sw"
config.home.profileDirectory
cfg.iconTheme.package
] ++ optional useCustomTheme hicolorTheme.package;
themes = [ cfg.iconTheme ] ++ optional useCustomTheme
(hicolorTheme // { size = cfg.iconTheme.size; });
categories = [
"actions"
"animations"
"apps"
"categories"
"devices"
"emblems"
"emotes"
"filesystem"
"intl"
2020-12-18 18:41:39 +00:00
"legacy"
2020-02-01 23:39:17 +00:00
"mimetypes"
"places"
"status"
"stock"
];
mkPath = { basePath, theme, category }:
"${basePath}/share/icons/${theme.name}/${theme.size}/${category}";
in concatMapStringsSep ":" mkPath (cartesianProductOfSets {
basePath = basePaths;
theme = themes;
category = categories;
});
2020-02-01 23:39:17 +00:00
systemd.user.services.dunst = {
Unit = {
Description = "Dunst notification daemon";
After = [ "graphical-session-pre.target" ];
PartOf = [ "graphical-session.target" ];
2017-10-09 09:20:12 +00:00
};
2020-02-01 23:39:17 +00:00
Service = {
Type = "dbus";
BusName = "org.freedesktop.Notifications";
ExecStart = "${cfg.package}/bin/dunst -config ${cfg.configFile}";
Environment = optionalString (cfg.waylandDisplay != "")
"WAYLAND_DISPLAY=${cfg.waylandDisplay}";
};
2020-02-01 23:39:17 +00:00
};
}
(mkIf (cfg.settings != { }) {
xdg.configFile."dunst/dunstrc" = {
text = toDunstIni cfg.settings;
onChange = ''
${pkgs.procps}/bin/pkill -u "$USER" ''${VERBOSE+-e} dunst || true
2020-02-01 23:39:17 +00:00
'';
};
})
]);
2017-01-07 18:16:26 +00:00
}