self: { lib, config, pkgs, ... }: let cfg = config.wayland.windowManager.mango; variables = lib.concatStringsSep " " cfg.systemd.variables; extraCommands = lib.concatStringsSep " && " cfg.systemd.extraCommands; systemdActivation = ''${pkgs.dbus}/bin/dbus-update-activation-environment --systemd ${variables}; ${extraCommands}''; autostart_sh = pkgs.writeShellScript "autostart.sh" '' ${lib.optionalString cfg.systemd.enable systemdActivation} ${cfg.autostart_sh} ''; in { options = { wayland.windowManager.mango = with lib; { enable = mkOption { type = types.bool; default = false; }; package = lib.mkOption { type = lib.types.package; default = self.packages.${pkgs.system}.mango; description = "The mango package to use"; }; systemd = { enable = mkOption { type = types.bool; default = pkgs.stdenv.isLinux; example = false; description = '' Whether to enable {file}`mango-session.target` on mango startup. This links to {file}`graphical-session.target`. Some important environment variables will be imported to systemd and dbus user environment before reaching the target, including * {env}`DISPLAY` * {env}`WAYLAND_DISPLAY` * {env}`XDG_CURRENT_DESKTOP` * {env}`XDG_SESSION_TYPE` * {env}`NIXOS_OZONE_WL` You can extend this list using the `systemd.variables` option. ''; }; variables = mkOption { type = types.listOf types.str; default = [ "DISPLAY" "WAYLAND_DISPLAY" "XDG_CURRENT_DESKTOP" "XDG_SESSION_TYPE" "NIXOS_OZONE_WL" "XCURSOR_THEME" "XCURSOR_SIZE" ]; example = ["--all"]; description = '' Environment variables imported into the systemd and D-Bus user environment. ''; }; extraCommands = mkOption { type = types.listOf types.str; default = [ "systemctl --user reset-failed" "systemctl --user start mango-session.target" ]; description = '' Extra commands to run after D-Bus activation. ''; }; xdgAutostart = mkEnableOption '' autostart of applications using {manpage}`systemd-xdg-autostart-generator(8)` ''; }; settings = mkOption { description = "mango config content"; type = types.lines; default = ""; example = '' # menu and terminal bind=Alt,space,spawn,rofi -show drun bind=Alt,Return,spawn,foot ''; }; autostart_sh = mkOption { description = "WARRNING: This is a shell script, but no need to add shebang"; type = types.lines; default = ""; example = '' waybar & ''; }; }; }; config = lib.mkIf cfg.enable { home.packages = [ cfg.package ]; home.activation = lib.optionalAttrs (cfg.autostart_sh != "") { createMangoScript = lib.hm.dag.entryAfter ["clearMangoConfig"] '' cat ${autostart_sh} > $HOME/.config/mango/autostart.sh chmod +x $HOME/.config/mango/autostart.sh ''; } // lib.optionalAttrs (cfg.settings != "") { createMangoConfig = lib.hm.dag.entryAfter ["clearMangoConfig"] '' cat > $HOME/.config/mango/config.conf <