5 Commits

Author SHA1 Message Date
3625aa9426 docs(nix module): add 2025-07-06 23:26:58 +02:00
fcc8be77ee dev(ci): add nix version check to pre-release ci checks 2025-07-06 23:14:04 +02:00
2f2a2c2696 fix(cfg): parser bugs on missing final newline 2025-07-06 23:03:41 +02:00
9af69c2417 fix(nix module): typo
howtf did it work in my VM, oh nvm
2025-07-06 22:56:38 +02:00
16901b14c8 feat: nixos module is configurable now 2025-07-06 22:53:09 +02:00
8 changed files with 176 additions and 3 deletions

View File

@@ -16,17 +16,33 @@ jobs:
packages: "git"
version: 1.0
- uses: actions/checkout@v4
with:
fetch-tags: true
- name: Check Version Changed
id: check-ver-changed
run: |
GIT_TAG=$(git describe --no-long --abbrev=0 --tags --always)
MAKE_TAG=$(make print-version)
NIX_VER=$(sed -nE \
's/.*version\s*=\s*"([0-9.]*)".*/\1/p' \
assets/pkg/nix/module.nix
)
if [[ "$GIT_TAG" == "v$MAKE_TAG" ]]; then
echo "ERR: Git tag matches makefile, did you bump Makefile up?" >&2
exit 1
fi
if [[ "$GIT_TAG" == "v$NIX_VER" ]]; then
echo "ERR: Nix module version matches git, did you bump Nix up?" >&2
exit 1
fi
if ! [[ "$NIX_VER" == "$MAKE_TAG" ]]; then
echo "ERR: Nix module version and make tag don't match" >&2
exit 1
fi
echo "VERSION=$MAKE_TAG" >> "$GITHUB_OUTPUT"

View File

@@ -4,6 +4,7 @@
- [Installing from Source](#installing-from-source)
- [AUR](#aur)
- [Nix Flake](#nix-flake)
- [Nix Module](#nix-module)
> [!CAUTION]
> I encourage you to read the manual installation steps to understand what will get installed in your computer by this package.
@@ -73,3 +74,54 @@ nix run github:javalsai/lidm
> [!CAUTION]
> This doesn't include [service files](./assets/pkg/aur#services) neither
# Nix Module
<details>
<summary>Sidenote</summary>
The nix module lacks on several aspects, if you know much about nix and know
how to improve this package, feel free to open an issue or a PR to help. The
nix package maintainer position is open too.
</details>
Lidm includes a nix module in `assets/pkg/nix/module.nix` that you can add
(along the included nix files) and import in your `configuration.nix`.
Once imported you'll need to add:
```nix
services.displayManager.enable = true;
systemd.services.lidm.enable = true;
```
Optionally, you can configure it setting `services.lidm.config`. You can either
pass:
* A string to copy the config from a theme in `themes/` with said name
(**name**, e.g `"cherry"`).
* An attribute tree with the same names as the config file, e.g:
```nix
{
strings = {
f_poweroff = "custom_poweroff";
# etc
};
behavior = {
include_defshell = true;
source = [
"path1"
"path2"
];
# etc
};
# etc
};
```
> *it's not necessary to cover all keys and anything can be put there, even if
> its not valid config*
> [!NOTE]
> [service files](./assets/pkg/aur#services) **are** included and enabled

View File

@@ -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"
)

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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.config = 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";

View File

@@ -26,6 +26,8 @@
src = ./.;
xsessions = null;
wayland-sessions = null;
cfg = null;
# cfg = "cherry";
};
};
in

View File

@@ -66,7 +66,8 @@ int read_desktop(FILE* fd, void* ctx,
buf_start[eq_idx] = '\0'; // the equal
key = trim_str(key);
char* value = &buf_start[eq_idx + 1];
buf_start[read_size - 1] = '\0'; // the newline
if(buf_start[read_size - 1] == '\n')
buf_start[read_size - 1] = '\0';
value = trim_str(value);
// Callback