diff --git a/README.md b/README.md index 9951a59..d1e6823 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,7 @@ like `MAOMAOCONFIG=/home/xxx/maomao` ''; autostart_sh = '' # see autostart.sh + # Note: here no need to add shebang ''; }; } diff --git a/nix/hm-modules.nix b/nix/hm-modules.nix index 30996fe..1793b14 100644 --- a/nix/hm-modules.nix +++ b/nix/hm-modules.nix @@ -4,41 +4,127 @@ pkgs, ... }: - let maomaowm = pkgs.callPackage ./. { }; + cfg = config.wayland.windowManager.maomaowm; + 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.maomaowm = { - enable = lib.mkOption { - type = lib.types.bool; + wayland.windowManager.maomaowm = with lib; { + enable = mkOption { + type = types.bool; default = false; }; - - settings = lib.mkOption { - type = lib.types.str; - default = ""; + systemd = { + enable = mkOption { + type = types.bool; + default = pkgs.stdenv.isLinux; + example = false; + description = '' + Whether to enable {file}`maomao-session.target` on + maomao 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 maomao-session.target" + ]; + description = '' + Extra commands to run after D-Bus activation. + ''; + }; + xdgAutostart = mkEnableOption '' + autostart of applications using + {manpage}`systemd-xdg-autostart-generator(8)` + ''; }; - - autostart_sh = lib.mkOption { - type = lib.types.str; + settings = mkOption { + description = "maomaowm config content"; + type = types.str; 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.str; + default = ""; + example = '' + waybar & + ''; }; }; }; - config = lib.mkIf config.wayland.windowManager.maomaowm.enable { + config = lib.mkIf cfg.enable { home.packages = [ maomaowm ]; - - home.file = { - ".config/maomao/config.conf" = { - text = config.wayland.windowManager.maomaowm.settings; + home.activation = + lib.optionalAttrs (cfg.autostart_sh != "") { + createMaomaoScript = lib.hm.dag.entryAfter [ "clearMaomaoConfig" ] '' + cat ${autostart_sh} > $HOME/.config/maomao/autostart.sh + chmod +x $HOME/.config/maomao/autostart.sh + ''; + } + // lib.optionalAttrs (cfg.settings != "") { + createMaomaoConfig = lib.hm.dag.entryAfter [ "clearMaomaoConfig" ] '' + cat > $HOME/.config/maomao/config.conf <