From 1d3e1472f2073b53d2906dc7b15275e8f233c265 Mon Sep 17 00:00:00 2001 From: Gabriel Fontes Date: Wed, 27 Jul 2022 11:32:42 -0300 Subject: nix: add home-manager module (#395) --- nix/hm-module.nix | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 nix/hm-module.nix (limited to 'nix/hm-module.nix') diff --git a/nix/hm-module.nix b/nix/hm-module.nix new file mode 100644 index 00000000..8b2ce883 --- /dev/null +++ b/nix/hm-module.nix @@ -0,0 +1,98 @@ +self: { + config, + lib, + pkgs, + ... +}: let + cfg = config.wayland.windowManager.hyprland; + defaultHyprlandPackage = self.packages.${pkgs.system}.default.override { + enableXWayland = cfg.xwayland; + }; +in { + options.wayland.windowManager.hyprland = { + enable = lib.mkEnableOption "hyprland wayland compositor"; + package = lib.mkOption { + type = with lib.types; nullOr package; + default = defaultHyprlandPackage; + description = '' + Hyprland package to use. Will override the 'xwayland' option. + + Defaults to the one provided by the flake. Set it to + pkgs.hyprland to use the one provided by nixpkgs or + if you have an overlay. + + Set to null to not add any Hyprland package to your path. This should + be done if you want to use the NixOS module to install Hyprland. + ''; + }; + systemdIntegration = lib.mkOption { + type = lib.types.bool; + default = pkgs.stdenv.isLinux; + description = '' + Whether to enable hyprland-session.target on + hyprland startup. This links to graphical-session.target. + Some important environment variables will be imported to systemd + and dbus user environment before reaching the target, including + + DISPLAY + WAYLAND_DISPLAY + HYPRLAND_INSTANCE_SIGNATURE + XDG_CURRENT_DESKTOP + + ''; + }; + xwayland = lib.mkOption { + type = lib.types.bool; + default = true; + description = '' + Enable xwayland. + ''; + }; + + extraConfig = lib.mkOption { + type = lib.types.lines; + default = ""; + description = '' + Extra configuration lines to add to ~/.config/hypr/hyprland.conf. + ''; + }; + }; + + config = lib.mkIf cfg.enable { + home.packages = + lib.optional (cfg.package != null) cfg.package + ++ lib.optional cfg.xwayland pkgs.xwayland; + + xdg.configFile."hypr/hyprland.conf" = { + text = + (lib.optionalString cfg.systemdIntegration " + exec-once=${pkgs.dbus}/bin/dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY HYPRLAND_INSTANCE_SIGNATURE XDG_CURRENT_DESKTOP; systemctl --user start hyprland-session.target + ") + + cfg.extraConfig; + + onChange = let + hyprlandPackage = + if cfg.package == null + then defaultHyprlandPackage + else cfg.package; + in "${hyprlandPackage}/bin/hyprctl reload"; + }; + + systemd.user.targets.hyprland-session = lib.mkIf cfg.systemdIntegration { + Unit = { + Description = "hyprland compositor session"; + Documentation = ["man:systemd.special(7)"]; + BindsTo = ["graphical-session.target"]; + Wants = ["graphical-session-pre.target"]; + After = ["graphical-session-pre.target"]; + }; + }; + + systemd.user.targets.tray = { + Unit = { + Description = "Home Manager System Tray"; + Requires = ["graphical-session-pre.target"]; + }; + }; + }; +} -- cgit v1.2.3