diff --git a/modules/services/window-managers/hyprland.nix b/modules/services/window-managers/hyprland.nix index 71395115e..447421be2 100644 --- a/modules/services/window-managers/hyprland.nix +++ b/modules/services/window-managers/hyprland.nix @@ -175,22 +175,34 @@ in { shouldGenerate = cfg.systemdIntegration || cfg.extraConfig != "" || combinedSettings != { }; - toHyprconf = attrs: + toHyprconf = with lib; + attrs: indentLevel: let + indent = concatStrings (replicate indentLevel " "); + mkSection = n: attrs: '' - ${n} { - ${toHyprconf attrs}} + ${indent}${n} { + ${toHyprconf attrs (indentLevel + 1)}${indent}} ''; - mkFields = lib.generators.toKeyValue { listsAsDuplicateKeys = true; }; - sections = lib.filterAttrs (n: v: lib.isAttrs v) attrs; - fields = lib.filterAttrs (n: v: !(lib.isAttrs v)) attrs; - in lib.concatStringsSep "\n" (lib.mapAttrsToList mkSection sections) - + mkFields fields; + sections = filterAttrs (n: v: isAttrs v) attrs; + + mkFields = generators.toKeyValue { listsAsDuplicateKeys = true; }; + allFields = filterAttrs (n: v: !(isAttrs v)) attrs; + importantFields = + filterAttrs (n: _: (hasPrefix "$" n) || (hasPrefix "bezier" n)) + allFields; + fields = builtins.removeAttrs allFields + (mapAttrsToList (n: _: n) importantFields); + in mkFields importantFields + + concatStringsSep "\n" (mapAttrsToList mkSection sections) + + removeSuffix indent (indent + (concatStringsSep '' + + ${indent}'' (splitString "\n" (mkFields fields)))); in lib.mkIf shouldGenerate { 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 '' + lib.optionalString (combinedSettings != { }) - (toHyprconf combinedSettings) + (toHyprconf combinedSettings 0) + lib.optionalString (cfg.extraConfig != "") cfg.extraConfig; onChange = lib.mkIf (cfg.package != null) '' ( # execute in subshell so that `shopt` won't affect other scripts diff --git a/tests/modules/services/window-managers/hyprland/simple-config.conf b/tests/modules/services/window-managers/hyprland/simple-config.conf index 9d310ea8e..fa0f63f70 100644 --- a/tests/modules/services/window-managers/hyprland/simple-config.conf +++ b/tests/modules/services/window-managers/hyprland/simple-config.conf @@ -1,18 +1,28 @@ exec-once = /nix/store/00000000000000000000000000000000-dbus/bin/dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY HYPRLAND_INSTANCE_SIGNATURE XDG_CURRENT_DESKTOP && systemctl --user start hyprland-session.target +$mod=SUPER +bezier=smoothOut, 0.36, 0, 0.66, -0.56 +bezier=smoothIn, 0.25, 1, 0.5, 1 +bezier=overshot, 0.4,0.8,0.2,1.2 +animations { + animation=border, 1, 2, smoothIn + animation=fade, 1, 4, smoothOut + animation=windows, 1, 3, overshot, popin 80% + enabled=true +} + decoration { col.shadow=rgba(00000099) -shadow_offset=0 5 + shadow_offset=0 5 } input { touchpad { - scroll_factor=0.300000 + scroll_factor=0.300000 + } + accel_profile=flat + follow_mouse=1 + kb_layout=ro } -accel_profile=flat -follow_mouse=1 -kb_layout=ro -} -$mod=SUPER bindm=$mod, mouse:272, movewindow bindm=$mod, mouse:273, resizewindow bindm=$mod ALT, mouse:272, resizewindow diff --git a/tests/modules/services/window-managers/hyprland/simple-config.nix b/tests/modules/services/window-managers/hyprland/simple-config.nix index 2748e5952..ee8227550 100644 --- a/tests/modules/services/window-managers/hyprland/simple-config.nix +++ b/tests/modules/services/window-managers/hyprland/simple-config.nix @@ -15,6 +15,21 @@ "$mod" = "SUPER"; + animations = { + enabled = true; + animation = [ + "border, 1, 2, smoothIn" + "fade, 1, 4, smoothOut" + "windows, 1, 3, overshot, popin 80%" + ]; + }; + + bezier = [ + "smoothOut, 0.36, 0, 0.66, -0.56" + "smoothIn, 0.25, 1, 0.5, 1" + "overshot, 0.4,0.8,0.2,1.2" + ]; + input = { kb_layout = "ro"; follow_mouse = 1;