depot/third_party/nixpkgs/nixos/modules/services/desktops/ayatana-indicators.nix

82 lines
2.7 KiB
Nix
Raw Normal View History

{
config,
pkgs,
lib,
...
}:
let
cfg = config.services.ayatana-indicators;
in
{
options.services.ayatana-indicators = {
enable = lib.mkEnableOption ''
Ayatana Indicators, a continuation of Canonical's Application Indicators
'';
packages = lib.mkOption {
type = lib.types.listOf lib.types.package;
default = [ ];
example = lib.literalExpression "with pkgs; [ ayatana-indicator-messages ]";
description = ''
List of packages containing Ayatana Indicator services
that should be brought up by a SystemD "ayatana-indicators" user target.
Packages specified here must have passthru.ayatana-indicators set correctly.
If, how, and where these indicators are displayed will depend on your DE.
Which target they will be brought up by depends on the packages' passthru.ayatana-indicators.
'';
};
};
config = lib.mkIf cfg.enable {
environment = {
systemPackages = cfg.packages;
pathsToLink = [ "/share/ayatana" ];
};
# libayatana-common's ayatana-indicators.target with explicit Wants & Before to bring up requested indicator services
systemd.user.targets =
let
namesToServices = map (indicator: "${indicator}.service");
indicatorServices =
target:
lib.lists.flatten (
map (
pkg:
if lib.isList pkg.passthru.ayatana-indicators then
# Old format, add to every target
(lib.warn "${pkg.name} is using the old passthru.ayatana-indicators format, please update it!" (
namesToServices pkg.passthru.ayatana-indicators
))
else
# New format, filter by target being mentioned
(namesToServices (
builtins.filter (
service:
builtins.any (
targetPrefix: "${targetPrefix}-indicators" == target
) pkg.passthru.ayatana-indicators.${service}
) (builtins.attrNames pkg.passthru.ayatana-indicators)
))
) cfg.packages
);
in
lib.attrsets.mapAttrs
(name: desc: {
description = "Target representing the lifecycle of the ${desc}. Each indicator should be bound to it in its individual service file";
partOf = [ "graphical-session.target" ];
wants = indicatorServices name;
before = indicatorServices name;
})
{
ayatana-indicators = "Ayatana Indicators";
lomiri-indicators = "Ayatana/Lomiri Indicators that shall be run in Lomiri";
};
};
meta.maintainers = with lib.maintainers; [ OPNA2608 ];
}