Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 21 additions & 9 deletions modules/services/window-managers/hyprland.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A bit late, but shouldn't source also be included here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think in some cases it might break users' configs.

allFields;
Comment on lines +191 to +193
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could hyprland possibly be made order-agnostic in the future?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will ask.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it could be made order-agnostic, but not with the current config parser, which processes the file line-by-line.

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))));
Comment thread
ncfavier marked this conversation as resolved.
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
Expand Down
24 changes: 17 additions & 7 deletions tests/modules/services/window-managers/hyprland/simple-config.conf
Original file line number Diff line number Diff line change
@@ -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
Expand Down
15 changes: 15 additions & 0 deletions tests/modules/services/window-managers/hyprland/simple-config.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down