{ config, options, lib, pkgs, ... }: let cfg = config.programs.pop-launcher; # This assumes the package contains the built-in plugins being symlinked to # the main binary with absolute paths. Most sensibly, the nixpkgs builder # will rewrite symlinks relative to its output directory. Since we're putting # them outside of its output directory, we'll have to stop it from doing # that. package = cfg.package.overrideAttrs (prev: { dontRewriteSymlinks = true; }); # Plugins and scripts are assumed to be packaged at # `$out/share/pop-launcher`. pluginsDir = pkgs.symlinkJoin { name = "pop-launcher-plugins-system"; paths = builtins.map (p: "${p}/share/pop-launcher") (cfg.plugins ++ [ package ]); }; in { options.programs.pop-launcher = { enable = lib.mkOption { description = '' Whether to enable Pop launcher, a launcher service for application launchers. Take note you have to install an application launcher frontend to make use of this such as onagre or cosmic-launcher. ''; type = lib.types.bool; default = false; example = true; }; package = lib.mkOption { type = lib.types.package; description = '' The package where pop-launcher binary and built-in plugins are expected. ''; default = pkgs.pop-launcher; }; plugins = lib.mkOption { # Wait, why isn't this working? WHY IS THIS NOT WORKING?! #type = with lib.types; listOf package; type = lib.types.listOf lib.types.package; description = '' List of packages containing Pop launcher plugins and scripts to be installed as system-wide plugins. ''; default = []; defaultText = "[]"; example = lib.literalExpression '' with pkgs; [ pop-launcher-plugin-duckduckgo-bangs pop-launcher-plugin-jetbrains ]; ''; }; }; config = lib.mkIf cfg.enable { environment.etc.pop-launcher = lib.mkIf (cfg.plugins != []) { source = pluginsDir; }; environment.systemPackages = with pkgs; [ pop-launcher ]; }; }