19 Commits

Author SHA1 Message Date
ecf254bf7f manual-ci: update nix hash to v1.2.2 2025-07-09 20:12:59 +02:00
57fedc9fd5 ci(fix): release, sed nix update replace 2025-07-09 20:10:45 +02:00
3d993c6260 version: bump 1.2.1 -> 1.2.2 2025-07-09 19:54:12 +02:00
ba3c15b0f4 Merge pull request #57 from javalsai/fix-51
packaging: properly package for nixos
2025-07-09 19:53:00 +02:00
54953a18e8 Merge branch 'master' into fix-51 2025-07-07 04:28:01 +02:00
f0ef834eaa ci(release): add nix module version&sha256 bump 2025-07-07 04:03:10 +02:00
d85ebc0e78 feat(nix): add keys enum to global cfg 2025-07-07 03:23:14 +02:00
4611ad87a8 fmt(nix): add nix fmt, fmt and update flake.lock 2025-07-07 02:38:04 +02:00
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
2574ef4ac0 Merge branch 'master' into fix-51 2025-07-06 05:22:54 +02:00
689c962cc9 fix: necessary code changes for nix configurability 2025-07-06 05:13:09 +02:00
be6e039a9b feat: make a complete nix module 2025-07-06 05:06:54 +02:00
6cac2f91ed fix: neccessary code changes for nix 2025-07-06 04:21:49 +02:00
b580b6917b feat(nix): reorganize nix flake for modularity and flexibility 2025-07-06 01:24:43 +02:00
22c75a37e1 feat(nix): make flake read version from makefile 2025-07-05 22:28:02 +02:00
15 changed files with 370 additions and 45 deletions

View File

@@ -16,6 +16,8 @@ jobs:
packages: "git"
version: 1.0
- uses: actions/checkout@v4
with:
fetch-tags: true
- name: Check Version Changed
id: check-ver-changed
@@ -27,6 +29,7 @@ jobs:
echo "ERR: Git tag matches makefile, did you bump Makefile up?" >&2
exit 1
fi
echo "VERSION=$MAKE_TAG" >> "$GITHUB_OUTPUT"
@@ -70,7 +73,6 @@ jobs:
needs: [ release-checks, release ]
steps:
- run: pacman -Sy --noconfirm git github-cli base-devel pacman-contrib
- uses: actions/checkout@v4
- run: |
@@ -96,3 +98,37 @@ jobs:
--body "*This PR was created automatically*"
env:
GH_TOKEN: ${{ github.token }}
nix-update:
name: Update NixOS module
runs-on: ubuntu-24.04
permissions: write-all
needs: [ release-checks, release ]
steps:
- uses: cachix/install-nix-action@v31
- uses: actions/checkout@v4
with:
fetch-tags: true
- run: |
tmpdir=$(mktemp -d)
git archive v${{ needs.release-checks.outputs.VERSION }} | tar -xC "$tmpdir"
sha256sum=$(nix hash path "$tmpdir")
sed -i -E 's/(.*version\s*=\s*")[0-9.]*(".*)/\1'${{ needs.release-checks.outputs.VERSION }}'\2/' assets/pkg/nix/module.nix
sed -i -E 's|(.*sha256\s*=\s*")[^"]*(".*)|\1'"$sha256sum"'\2|' assets/pkg/nix/module.nix
# would be cool to be able to check the new module.nix builds
- run: |
BRANCH=actions/update-nix-${{ needs.release-checks.outputs.VERSION }}
git config --global --add safe.directory $GITHUB_WORKSPACE
git config user.name "GitHub Actions"
git config user.email "actions@github.com"
git checkout -b $BRANCH
git commit -am "Update NixOS module to v${{ needs.release-checks.outputs.VERSION }}"
git push -u origin $BRANCH
gh pr create --head $BRANCH \
--title "[Nix update]: Bump to ${{ needs.release-checks.outputs.VERSION }}" \
--body "*This PR was created automatically*"
env:
GH_TOKEN: ${{ github.token }}

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,57 @@ 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
with config.lidm.keysEnum; {
strings = {
f_poweroff = "custom_poweroff";
};
behavior = {
include_defshell = true;
source = [
"path1"
"path2"
];
};
functions = { poweroff = F1; };
# 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

@@ -1,4 +1,4 @@
VERSION = 1.2.1
VERSION = 1.2.2
.DEFAULT_GOAL := lidm
CDIR=src
@@ -10,7 +10,9 @@ PREFIX=/usr
CC?=gcc
CFLAGS?=-O3 -Wall
ALLFLAGS=$(CFLAGS) -I$(IDIR)
# C PreProcessor flags, not C Plus Plus
CPPFLAGS?=
ALLFLAGS=$(CFLAGS) $(CPPFLAGS) -I$(IDIR)
LIBS=-lpam

View File

@@ -0,0 +1,23 @@
{
cfg,
src,
lib,
...
}:
let
maker = import ./make-cfg.nix {
inherit lib;
keys-h-file = builtins.readFile "${src}/include/keys.h";
};
in
{
inherit maker;
file = 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"
);
}

50
assets/pkg/nix/lidm.nix Normal file
View File

@@ -0,0 +1,50 @@
{
config,
pkgs,
lib,
...
}:
let
get-cfg =
if config.cfg != null then
import ./get-cfg-file.nix {
inherit lib;
inherit (config) cfg src;
}
else
null;
cfg-file = get-cfg.file;
maker = get-cfg.maker;
in
pkgs.stdenv.mkDerivation rec {
pname = "lidm";
version = config.version;
src = config.src;
nativeBuildInputs = with pkgs; [
gcc
gnumake
linux-pam
];
makeFlags =
[
"DESTDIR=$(out)"
"PREFIX="
]
++ lib.optional (
config.xsessions != null
) "CPPFLAGS+=-DSESSIONS_XSESSIONS=\\\"${config.xsessions}\\\""
++ lib.optional (
config.wayland-sessions != null
) "CPPFLAGS+=-DSESSIONS_WAYLAND=\\\"${config.wayland-sessions}\\\""
++ lib.optional (cfg-file != null) "CPPFLAGS+=-DLIDM_CONF_PATH=\\\"${cfg-file}\\\"";
fixupPhase = ''
rm -rf $out/etc
'';
passthru = {
keysEnum = maker.keys-enum;
};
}

View File

@@ -0,0 +1,73 @@
{ 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);
}

73
assets/pkg/nix/module.nix Normal file
View File

@@ -0,0 +1,73 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.services.lidm;
dmcfg = config.services.displayManager;
desktops = dmcfg.sessionData.desktops;
version = "1.2.2";
lidmPkg = pkgs.callPackage ./lidm.nix {
inherit pkgs;
config = {
inherit version lib;
cfg = cfg.config;
src = pkgs.fetchFromGitHub {
owner = "javalsai";
repo = "lidm";
rev = "v${version}";
sha256 = "sha256-rvxSNv/F+ksy68D7zP7NwbCBV9/6OfEZSfGxKsGiVYc=";
};
xsessions = "${desktops}/share/xsessions";
wayland-sessions = "${desktops}/share/wayland-sessions";
};
};
in
{
options = {
lidm.keysEnum = lib.mkOption {
type = with lib.types; attrs;
default = lidm.passthru.keysEnum;
readOnly = true;
description = "Keys enum constants";
};
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";
systemd.services.lidm = {
description = "TUI display manager";
aliases = [ "display-manager.service" ];
after = [
"systemd-user-sessions.service"
"plymouth-quit-wait.service"
];
serviceConfig = {
Type = "idle";
ExecStart = "${lidmPkg}/bin/lidm 7";
StandardInput = "tty";
StandardOutput = "tty";
StandardError = "tty";
TTYPath = "/dev/tty7";
TTYReset = "yes";
TTYVHangup = "yes";
};
};
};
}

View File

@@ -5,9 +5,9 @@ After=systemd-user-sessions.service plymouth-quit-wait.service
[Service]
Type=idle
ExecStart=/usr/bin/lidm 7
StandardError=journal
StandardInput=tty
StandardOutput=tty
StandardError=tty
TTYPath=/dev/tty7
TTYReset=yes
TTYVHangup=yes

12
flake.lock generated
View File

@@ -5,11 +5,11 @@
"systems": "systems"
},
"locked": {
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
@@ -20,11 +20,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1724224976,
"narHash": "sha256-Z/ELQhrSd7bMzTO8r7NZgi9g5emh+aRKoCdaAv5fiO0=",
"lastModified": 1751637120,
"narHash": "sha256-xVNy/XopSfIG9c46nRmPaKfH1Gn/56vQ8++xWA8itO4=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "c374d94f1536013ca8e92341b540eba4c22f9c62",
"rev": "5c724ed1388e53cc231ed98330a60eb2f7be4be3",
"type": "github"
},
"original": {

View File

@@ -1,46 +1,46 @@
{
description = "A fully colorful customizable TUI display manager made in C for simplicity.";
inputs = {
flake-utils.url = "github:numtide/flake-utils";
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
};
outputs =
{ flake-utils, nixpkgs, ... }:
{
flake-utils,
nixpkgs,
self,
}:
flake-utils.lib.eachDefaultSystem (
system:
let
pkgs = import nixpkgs { inherit system; };
name = "lidm";
version = "0.0.2";
lidm = (
pkgs.stdenv.mkDerivation {
pname = name;
version = version;
version = builtins.elemAt (builtins.match "VERSION[[:blank:]]*=[[:space:]]*([^\n]*)\n.*" (builtins.readFile ./Makefile)) 0;
lidm = pkgs.callPackage assets/pkg/nix/lidm.nix {
inherit pkgs;
lib = pkgs.lib;
config = {
inherit version;
src = ./.;
nativeBuildInputs = with pkgs; [
gcc
gnumake
linux-pam
];
makeFlags = [
"DESTDIR=$(out)"
"PREFIX="
];
fixupPhase = ''
rm -rf $out/etc
'';
}
);
xsessions = null;
wayland-sessions = null;
cfg = null;
# cfg = "cherry";
};
};
in
rec {
defaultApp = flake-utils.lib.mkApp { drv = defaultPackage; };
defaultPackage = lidm;
devShell = pkgs.mkShell { buildInputs = lidm.nativeBuildInputs ++ [ pkgs.clang-tools ]; };
formatter = nixpkgs.legacyPackages.${system}.nixfmt-tree;
}
);
)
// {
nixosModules.lidm = assets/pkg/nix/module.nix;
};
}

View File

@@ -1,6 +1,11 @@
#ifndef MACROSH_
#define MACROSH_
// More like constants but I'm not making yet another header file just for this
#ifndef LIDM_CONF_PATH
#define LIDM_CONF_PATH "/etc/lidm.ini"
#endif
// Do we just replace the compiler with clang??
#if defined(__clang__)
#define NULLABLE _Nullable

View File

@@ -12,6 +12,7 @@
#include "config.h"
#include "desktop.h"
#include "log.h"
#include "macros.h"
#include "util.h"
#define UPPER_HALF_BYTE 4
@@ -240,12 +241,10 @@ struct status config_line_handler(void* _config, char* table, char* k,
int parse_config(struct config* NNULLABLE config, char* NNULLABLE path) {
FILE* fd = fopen(path, "r");
if (fd == NULL) {
perror("fopen");
(void)fputs(
"Please place a config file at /etc/lidm.ini or set the LIDM_CONF "
"env variable",
stderr);
return -1;
log_perror("fopen");
log_printf(" [I] No config, place one at " LIDM_CONF_PATH
" or set the LIDM_CONF env variable");
return 0; // Its fine now anyways
}
bool ret = read_desktop(fd, config, config_line_handler);

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

View File

@@ -72,9 +72,10 @@ int main(int argc, char* argv[]) {
chvt_str(argv[1]);
}
// Copy
struct config config = DEFAULT_CONFIG;
char* conf_override = getenv("LIDM_CONF");
char* conf_path = conf_override ? conf_override : "/etc/lidm.ini";
char* conf_path = conf_override ? conf_override : LIDM_CONF_PATH;
if (parse_config(&config, conf_path) != 0) {
(void)fputs("error parsing config\n", stderr);
return 1;

View File

@@ -16,9 +16,16 @@ struct source_dir {
enum session_type type;
char* dir;
};
#ifndef SESSIONS_XSESSIONS
#define SESSIONS_XSESSIONS "/usr/share/xsessions"
#endif
#ifndef SESSIONS_WAYLAND
#define SESSIONS_WAYLAND "/usr/share/wayland-sessions"
#endif
static const struct source_dir SOURCES[] = {
{XORG, "/usr/share/xsessions"},
{WAYLAND, "/usr/share/wayland-sessions"},
{XORG, SESSIONS_XSESSIONS},
{WAYLAND, SESSIONS_WAYLAND},
};
static struct Vector* cb_sessions = NULL;