96 lines
2.6 KiB
Nix
96 lines
2.6 KiB
Nix
{
|
||
config,
|
||
pkgs,
|
||
lib,
|
||
...
|
||
}:
|
||
let
|
||
cfg = config.xdg.autoStart;
|
||
inherit (lib) hm types;
|
||
in
|
||
{
|
||
|
||
options.xdg.autoStart = {
|
||
|
||
packages = lib.mkOption {
|
||
description = ''
|
||
List of packages which should be autostarted.
|
||
|
||
This module tries to select the package’s default desktop file,
|
||
which is either described by its .desktopItem attribute
|
||
or by its first entry of its .desktopItems attribute.
|
||
|
||
Users who want to specifically select a certain desktop file
|
||
or who want to write their own
|
||
can make use of the {option}`xdg.autoStart.desktopItems` option.
|
||
'';
|
||
|
||
type = types.listOf types.package;
|
||
default = [ ];
|
||
example = lib.literalExpression ''
|
||
with pkgs; [
|
||
pkgs.trilium-desktop
|
||
]
|
||
'';
|
||
};
|
||
|
||
desktopItems = lib.mkOption {
|
||
description = ''
|
||
List of desktop files which should be autostarted.
|
||
|
||
Users should prefer to use {option}`xdg.autoStart.packages`
|
||
and only use this option in case
|
||
they want to specifically
|
||
select a package’s desktop item
|
||
or want to create their own desktop item.
|
||
|
||
Be warned, this may shadow entries of {option}`xdg.autoStart.packages`.
|
||
'';
|
||
|
||
type = types.attrsOf (types.unspecified); # TODO replace unspecified
|
||
default = { };
|
||
# TODO improve example, take one where it would make sense to use this option
|
||
example = lib.literalExpression ''
|
||
{
|
||
discord = pkgs.discord.desktopItem
|
||
firefox-custom = makeDesktopItem {
|
||
exec = "firefox -P custom";
|
||
};
|
||
}
|
||
'';
|
||
};
|
||
|
||
};
|
||
|
||
config =
|
||
let
|
||
# helpers
|
||
retrieveDesktopItem = (
|
||
pkg:
|
||
if pkg ? desktopItem then
|
||
pkg.desktopItem
|
||
else if pkg ? desktopItems && pkg.desktopItems != [ ] then
|
||
builtins.head pkg.desktopItems
|
||
else
|
||
abort "package '${pkg.pname}' is missing a desktop file"
|
||
);
|
||
emulateDesktopItem = (pkg: lib.nameValuePair pkg.pname (retrieveDesktopItem pkg));
|
||
embedDesktopItem = (
|
||
name: deskItem:
|
||
lib.nameValuePair "autostart/${name}.desktop" {
|
||
source = "${deskItem}/share/applications/${deskItem.name}";
|
||
}
|
||
);
|
||
# parse opts
|
||
desktopItemsPackages = builtins.listToAttrs (map emulateDesktopItem cfg.packages);
|
||
desktopItems = desktopItemsPackages // cfg.desktopItems;
|
||
in
|
||
{
|
||
assertions = [
|
||
(hm.assertions.assertPlatform "xdg.autoStart" pkgs lib.platforms.linux)
|
||
];
|
||
|
||
xdg.configFile = lib.attrsets.mapAttrs' embedDesktopItem desktopItems;
|
||
};
|
||
|
||
}
|