diff --git a/assets/pkg/nix/get-cfg-file.nix b/assets/pkg/nix/get-cfg-file.nix new file mode 100644 index 0000000..a1e3de0 --- /dev/null +++ b/assets/pkg/nix/get-cfg-file.nix @@ -0,0 +1,13 @@ +{ cfg, src, lib, ... }: +let + maker = import ./make-cfg.nix { + inherit lib; + keys-h-file = builtins.readFile "${src}/include/keys.h"; + }; +in builtins.toFile "lidm.conf" ( + if builtins.isString cfg + then builtins.readFile "${src}/themes/${cfg}.ini" + else if builtins.isAttrs cfg + then maker.make cfg + else builtins.throw "invalid cfg type, expected str or attrs" +) diff --git a/assets/pkg/nix/lidm.nix b/assets/pkg/nix/lidm.nix index 7753eb5..cbe77b4 100644 --- a/assets/pkg/nix/lidm.nix +++ b/assets/pkg/nix/lidm.nix @@ -1,4 +1,13 @@ -{ config, pkgs, lib, ...}: pkgs.stdenv.mkDerivation rec { +{ config, pkgs, lib, ...}: +let + cfg-file = if config.cfg != null then + import ./get-cfg-file.nix { + inherit lib; + inherit (config) cfg src; + } + else null; +in +pkgs.stdenv.mkDerivation rec { pname = "lidm"; version = config.version; src = config.src; @@ -16,7 +25,9 @@ ++ lib.optional (config.xsessions != null) "CPPFLAGS+=-DSESSIONS_XSESSIONS=\\\"${config.xsessions}\\\"" ++ lib.optional (config.wayland-sessions != null) - "CPPFLAGS+=-DSESSIONS_WAYLAND=\\\"${config.wayland-sessions}\\\""; + "CPPFLAGS+=-DSESSIONS_WAYLAND=\\\"${config.wayland-sessions}\\\"" + ++ lib.optional (cfg-file != null) + "CPPFLAGS+=-DLIDM_CONF_PATH=\\\"${cfg-file}\\\""; fixupPhase = '' rm -rf $out/etc diff --git a/assets/pkg/nix/make-cfg.nix b/assets/pkg/nix/make-cfg.nix new file mode 100644 index 0000000..659e9f3 --- /dev/null +++ b/assets/pkg/nix/make-cfg.nix @@ -0,0 +1,70 @@ +{ lib, keys-h-file }: + +let + double-match-to-nameval = dmatch: { name = builtins.elemAt dmatch 0; value = builtins.elemAt dmatch 1; }; + + keys-enum = let + key-names = builtins.replaceStrings ["\n" " "] ["" ""] ( + builtins.elemAt ( + builtins.match + ".*KEY_NAMES\\[][[:blank:]]*=[[:blank:]]*\\{([^}]*)}.*" + keys-h-file + ) 0 + ); + + keys-2d-list = builtins.map + (builtins.match "\\[(.*)]=\"(.*)\"") + (builtins.filter + (s: builtins.isString s && s != "") + (builtins.split "," key-names) + ); + + in builtins.listToAttrs ( + builtins.map + (k: k // { value = { __enum_key = k.value; }; }) + (builtins.map double-match-to-nameval keys-2d-list) + ); +in { + inherit keys-enum; + make = let + name-val-to-attrs = (name: value: { inherit name value; } ); + map-attrs = attrset: fn: lib.map fn + (lib.attrsets.mapAttrsToList name-val-to-attrs attrset); + + try-foldl' = op: nul: list: + if (builtins.length list) == 0 then "" + else builtins.foldl' op nul list; + concat-with = sepr: list: try-foldl' + (x: y: if x == null then y else x + sepr + y) + null + list; + + ser-bool = bool: if bool then "true" else "false"; + ser-str = str: "\"${builtins.replaceStrings ["\n" "\""] ["\\n" "\\\""] str}\""; + ser-kvs = { name, value }: if builtins.isList value then + concat-with "\n" ( + builtins.map + (value: ser-kvs { inherit name value; }) + value + ) + else "${name} = ${ + if builtins.isString value then + ser-str value + else if builtins.isInt value then + builtins.toString value + else if builtins.isBool value then + ser-bool value + else if builtins.isAttrs value then + value.__enum_key + else builtins.throw "type not supported" + }"; + + ser-table = table': let + tname = table'.name; + table = table'.value; + in + "[${tname}]\n" + ( + concat-with "\n" (map-attrs table ser-kvs) + ); + in cfg: concat-with "\n\n" (map-attrs cfg ser-table); +} diff --git a/assets/pkg/nix/module.nix b/assets/pkg/nix/module.nix index 69b013d..d530814 100644 --- a/assets/pkg/nix/module.nix +++ b/assets/pkg/nix/module.nix @@ -1,6 +1,8 @@ { config, lib, pkgs, ... }: let + cfg = config.services.lidm; + dmcfg = config.services.displayManager; desktops = dmcfg.sessionData.desktops; @@ -9,6 +11,7 @@ let inherit pkgs; config = { inherit version lib; + cfg = cfg.config; src = pkgs.fetchFromGitHub { owner = "javalsai"; repo = "lidm"; @@ -22,6 +25,11 @@ let }; in { + options.services.lidm.conig = lib.mkOption { + type = with lib.types; oneOf [ str attrs ]; + default = {}; + description = "Config options for lidm | Either attr tree or name of bundled themes"; + }; config = { services.displayManager.defaultSession = "lidm"; diff --git a/flake.nix b/flake.nix index 95f8e3c..1633d14 100644 --- a/flake.nix +++ b/flake.nix @@ -26,6 +26,8 @@ src = ./.; xsessions = null; wayland-sessions = null; + cfg = null; + # cfg = "cherry"; }; }; in