config-builder.nix 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. { config, lib, pkgs, ... }:
  2. with lib;
  3. let
  4. cfg = config.programs.hyprlandLua;
  5. mkMonitorLua = m:
  6. let
  7. mirrorStr = if (m ? mirror && m.mirror != null) then ", mirror = \"${m.mirror}\"" else "";
  8. in
  9. ''hl.monitor({ output = "${m.output}", mode = "${m.mode}", position = "${m.position}", scale = ${toString m.scale}${mirrorStr} })'';
  10. mkBindLua = b:
  11. ''hl.bind("${b.key}", ${b.action})'';
  12. mkWorkspaceRules = rules: concatMapStringsSep "\n" (r: ''
  13. for i = ${toString r.startIdx}, ${toString r.endIdx} do
  14. hl.workspace_rule({ workspace = ${r.formula}, monitor = "${r.monitor}", default = ${boolToString r.default} })
  15. end
  16. '') rules;
  17. generatedLua = ''
  18. -- Auto-generated by Nix
  19. ${optionalString (cfg.shellCommand != "") ''
  20. hl.on("hyprland.start", function ()
  21. hl.exec_cmd("${cfg.shellCommand}")
  22. end)
  23. ''}
  24. mainMod = "${cfg.mainMod}"
  25. secMod = "${cfg.secMod}"
  26. ${concatMapStringsSep "\n" mkBindLua cfg.bindings}
  27. -- Monitors Configuration
  28. ${concatMapStringsSep "\n" mkMonitorLua cfg.monitors}
  29. -- Workspace Rules
  30. ${mkWorkspaceRules cfg.workspaceRules}
  31. ${optionalString (cfg.defaultCursorMonitor != "") ''
  32. hl.config({
  33. cursor = {
  34. default_monitor = "${cfg.defaultCursorMonitor}"
  35. }
  36. })
  37. ''}
  38. ${cfg.extraLua}
  39. '';
  40. in {
  41. options.programs.hyprlandLua = {
  42. enable = mkEnableOption "Nix-generated Hyprland Lua configuration";
  43. shellCommand = mkOption {
  44. type = types.str;
  45. default = "";
  46. example = "dms run";
  47. description = "Command executed on hyprland start (e.g. dms-shell, waybar, etc.)";
  48. };
  49. mainMod = mkOption { type = types.str; default = "ALT"; };
  50. secMod = mkOption { type = types.str; default = "SUPER"; };
  51. bindings = mkOption {
  52. type = types.listOf (types.submodule {
  53. options = {
  54. key = mkOption { type = types.str; };
  55. action = mkOption { type = types.str; example = ''hl.dsp.exec_cmd("dms screenshot")''; };
  56. };
  57. });
  58. default = [];
  59. };
  60. monitors = mkOption {
  61. type = types.listOf (types.submodule {
  62. options = {
  63. output = mkOption { type = types.str; default = ""; };
  64. mode = mkOption { type = types.str; default = "preferred"; };
  65. position = mkOption { type = types.str; default = "auto"; };
  66. scale = mkOption { type = types.int; default = 1; };
  67. mirror = mkOption { type = types.nullOr types.str; default = null; };
  68. };
  69. });
  70. default = [];
  71. };
  72. workspaceRules = mkOption {
  73. type = types.listOf (types.submodule {
  74. options = {
  75. startIdx = mkOption { type = types.int; };
  76. endIdx = mkOption { type = types.int; };
  77. formula = mkOption { type = types.str; example = "i % 10"; };
  78. monitor = mkOption { type = types.str; };
  79. default = mkOption { type = types.bool; default = true; };
  80. };
  81. });
  82. default = [];
  83. };
  84. defaultCursorMonitor = mkOption { type = types.str; default = ""; };
  85. extraLua = mkOption { type = types.lines; default = ""; };
  86. };
  87. config = mkIf cfg.enable {
  88. xdg.configFile."hypr/host_specific.lua".text = generatedLua;
  89. };
  90. }