54 Commits

Author SHA1 Message Date
93af32d386 pkg(feat,aur): multiarch -bin pkg 2025-08-21 21:41:23 +02:00
6f5413903a pkg(aur): -bin only has to depend on the .so file 2025-08-21 21:40:51 +02:00
d52de80107 chore: make standard PKGBUIDLs 2025-08-21 19:02:34 +02:00
dad5296839 chore: organize and parallelize some checks 2025-08-21 18:53:33 +02:00
947c92ce3f build: allow to override git-rev and timestamp build info 2025-07-21 18:30:28 +02:00
e529483c28 fix(pkg,aur): sources now are version unique 2025-07-21 18:25:35 +02:00
363deeab28 docs: update dead links 2025-07-20 22:09:28 +02:00
github-actions[bot]
98b898fc08 Update AUR pkgs to v1.2.3 (#67)
Co-authored-by: GitHub Actions <actions@github.com>
Co-authored-by: javalsai <javalsai@proton.me>
2025-07-20 22:03:51 +02:00
github-actions[bot]
6b4b64d3fc Update NixOS module to v1.2.3 (#66)
Co-authored-by: GitHub Actions <actions@github.com>
2025-07-20 22:01:56 +02:00
7e1ec83c7f version: bump to v1.2.3 2025-07-20 21:53:47 +02:00
8f0213db74 misc batch of fixes before v1.2.3 (#65)
* fix some formatter and linter issues
* make clang-tidy/clang-format fail with error status and output in github error format
* docs, add kmscon thing
* and some CI stuff
2025-07-20 21:50:12 +02:00
4a1b868b8e docs: linter & packagers guide & chores (#64)
add prettier, move most markdown into `docs/` and add a packagers guide

---

* lint(md): add prettier

* docs(packagers): add a guide

* docs(correctness): Index -> ToC

* docs: link to package maintainers guide

* docs: move install docs to `./docs`

* docs(fix): typo
2025-07-16 18:13:12 +02:00
SpamixOfficial
589f33ffec feat(PAM service configuration) (#62)
* docs(typo): fix typo in Contributing.md

* add optional PAM service name

* feat(PAM service name): Add ENV variable configuration for the PAM service name

* feat(PAM service name): Implement suggested changes + update README instructions

* docs(remove segment)
2025-07-16 14:53:23 +02:00
Ar1gin
8fc6bff60f fix: hostname truncation (#63)
Co-authored-by: javalsai <javalsai@proton.me>
2025-07-16 14:19:58 +02:00
6c99675be7 Merge pull request #61 from javalsai/musl-build
build: preparations for musl
2025-07-16 13:55:18 +02:00
663b882f34 ci(feat): add x86_64 musl builds 2025-07-10 23:11:30 +02:00
grialion
cd5a3ede52 fix(auth.c): use POSIX pid_t
Use standard pid_t type instead of libc specific __pid_t type.
2025-07-09 23:14:36 +02:00
grialion
3f264a66b9 fix(util.h): use standard system header
Use standard sys/time.h instead of libc specific header bits/types/... for musl compatibility
2025-07-09 23:07:32 +02:00
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
a22c6b4597 checks: add AUR codespell ignore path 2025-07-07 04:26:27 +02:00
ab7666f561 ci(perf): only run push build checks if code changed 2025-07-07 04:25:43 +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
ee244be195 fix: oopsie path
istg if I keep making these silly mistakes...
2025-07-06 01:54:23 +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
3ad16d3a3c fix: Makefile 2025-07-05 20:16:40 +02:00
df6a565874 release: v1.2.1 2025-07-05 19:01:55 +02:00
310b0a87dc Merge pull request #55 from javalsai/fix_makefile_rsync
fix: makefile rsync dependency, runit installation
2025-07-05 18:45:02 +02:00
6384a94f61 pkg(Makefile): make services packaging easier 2025-07-05 18:27:29 +02:00
56e8897565 fix(Makefile): wrong path 2025-07-05 18:23:05 +02:00
f67e30991a fix(Makedile): proper service install recipes
update docs too
2025-07-05 17:53:53 +02:00
grialion
e8a9e57af9 fix(Makefile): comprehensive runit installation 2025-07-05 15:19:39 +02:00
31c3ad6d42 fix(Makefile): duplicated s6 install 2025-07-05 14:52:13 +02:00
a00a73756c fix: support /etc/sv/ and /etc/<init>/sv 2025-07-05 14:50:43 +02:00
grialion
51c12eefdc fix: makefile rsync dependency, runit installation 2025-07-05 11:16:02 +02:00
f678056c5b Merge pull request #54 from javalsai/actions/update-aur-
[AUR update]: Bump to v1.2.0
2025-07-04 22:53:04 +02:00
3a7bd6f9f5 fix(ci,aur): empty version strings 2025-07-04 22:50:45 +02:00
5207e1e94b Merge branch 'master' into actions/update-aur- 2025-07-04 22:49:01 +02:00
GitHub Actions
69d48d32d6 Update AUR pkgs to v 2025-07-04 20:47:25 +00:00
41 changed files with 907 additions and 323 deletions

View File

@@ -1,2 +1,2 @@
[codespell] [codespell]
skip = ./assets/pkg/aur/*/src,./assets/pkg/aur/*/*/objects skip = ./assets/pkg/aur/*/src,./assets/pkg/aur/*/*/objects,./assets/pkg/aur/*/*.tar.*

View File

@@ -67,7 +67,8 @@ jobs:
apt-get update && \ apt-get update && \
apt-get install -y make gcc libpam0g-dev apt-get install -y make gcc libpam0g-dev
run: ARCH=aarch64 GITHUB_STEP_SUMMARY=gss.out GITHUB_OUTPUT=go.out assets/github_scripts/build.sh run: ARCH=aarch64 GITHUB_STEP_SUMMARY=gss.out GITHUB_OUTPUT=go.out assets/github_scripts/build.sh
- run: set +e; cat gss.out >>"$GITHUB_STEP_SUMMARY"; cat go.out >>"$GITHUB_OUTPUT" - if: always()
run: set +e; cat gss.out >>"$GITHUB_STEP_SUMMARY"; cat go.out >>"$GITHUB_OUTPUT"
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
@@ -94,7 +95,8 @@ jobs:
apt-get update && \ apt-get update && \
apt-get install -y make gcc libpam0g-dev apt-get install -y make gcc libpam0g-dev
run: ARCH=armv7 GITHUB_STEP_SUMMARY=gss.out GITHUB_OUTPUT=go.out assets/github_scripts/build.sh run: ARCH=armv7 GITHUB_STEP_SUMMARY=gss.out GITHUB_OUTPUT=go.out assets/github_scripts/build.sh
- run: set +e; cat gss.out >>"$GITHUB_STEP_SUMMARY"; cat go.out >>"$GITHUB_OUTPUT" - if: always()
run: set +e; cat gss.out >>"$GITHUB_STEP_SUMMARY"; cat go.out >>"$GITHUB_OUTPUT"
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
@@ -121,10 +123,39 @@ jobs:
apt-get update && \ apt-get update && \
apt-get install -y make gcc libpam0g-dev apt-get install -y make gcc libpam0g-dev
run: ARCH=riscv64 GITHUB_STEP_SUMMARY=gss.out GITHUB_OUTPUT=go.out assets/github_scripts/build.sh run: ARCH=riscv64 GITHUB_STEP_SUMMARY=gss.out GITHUB_OUTPUT=go.out assets/github_scripts/build.sh
- run: set +e; cat gss.out >>"$GITHUB_STEP_SUMMARY"; cat go.out >>"$GITHUB_OUTPUT" - if: always()
run: set +e; cat gss.out >>"$GITHUB_STEP_SUMMARY"; cat go.out >>"$GITHUB_OUTPUT"
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
name: build-riscv64 name: build-riscv64
path: lidm-riscv64 path: lidm-riscv64
retention-days: 1 retention-days: 1
build-linux-amd64-musl:
name: amd64-musl
runs-on: ubuntu-24.04
permissions: write-all
steps:
- uses: actions/checkout@v4
- name: Run in Musl Container
uses: addnab/docker-run-action@v3
with:
image: ghcr.io/void-linux/void-musl-full
options: -v ${{ github.workspace }}:/workspace
run: |
cd /workspace
xbps-install -Sy
xbps-install -y git pam-devel make gcc bash git
ARCH=amd64-musl GITHUB_STEP_SUMMARY=gss.out GITHUB_OUTPUT=go.out assets/github_scripts/build.sh
- if: always()
run: set +e; cat gss.out >>"$GITHUB_STEP_SUMMARY"; cat go.out >>"$GITHUB_OUTPUT"
- uses: actions/upload-artifact@v4
with:
name: build-amd64-musl
path: lidm-amd64-musl
retention-days: 1

View File

@@ -26,18 +26,26 @@ jobs:
with: with:
packages: "shellcheck" packages: "shellcheck"
version: 1.0 version: 1.0
- run: find . -type f -name '*.sh' -not -path './assets/pkg/aur/*/src/*' | xargs shellcheck - run: git ls-files "*.sh" "*/PKGBUILD" | xargs shellcheck --shell=bash
clangcheck: clangcheck:
name: Clang name: Clang
runs-on: ubuntu-24.04 runs-on: ubuntu-latest
container:
image: ubuntu:25.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: awalsh128/cache-apt-pkgs-action@latest - run: apt -y update && apt install -y clang-format clang-tidy make gcc git bear libpam0g-dev
with:
packages: "clang-format clang-tidy bear libpam0g-dev"
version: 1.0
- run: bear -- make - run: bear -- make
- run: clang-format -ni src/*.c include/*.h - run: clang-format -version && clang-format -dump-config
- run: clang-tidy -p . src/*.c include/*.h - run: |
set -euo pipefail
clang-format -ni src/*.c include/*.h -Werror 2>&1 | \
sed -E 's/^([^ ]+\.[ch]):([0-9]+):([0-9]+): ([a-z]+): (.*)$/::\4 file=\1,line=\2,col=\3::\5/'
- run: clang-tidy -version && clang-tidy -dump-config
- run: |
set -euo pipefail
clang-tidy -p . src/*.c include/*.h -warnings-as-errors=\* 2>&1 1>/dev/null |
sed -E 's/^([^ ]+\.[ch]):([0-9]+):([0-9]+): ([a-z]+): (.*)$/::\4 file=\1,line=\2,col=\3::\5/'

View File

@@ -16,6 +16,8 @@ jobs:
packages: "git" packages: "git"
version: 1.0 version: 1.0
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
fetch-tags: true
- name: Check Version Changed - name: Check Version Changed
id: check-ver-changed id: check-ver-changed
@@ -27,6 +29,7 @@ jobs:
echo "ERR: Git tag matches makefile, did you bump Makefile up?" >&2 echo "ERR: Git tag matches makefile, did you bump Makefile up?" >&2
exit 1 exit 1
fi fi
echo "VERSION=$MAKE_TAG" >> "$GITHUB_OUTPUT" echo "VERSION=$MAKE_TAG" >> "$GITHUB_OUTPUT"
@@ -70,7 +73,6 @@ jobs:
needs: [ release-checks, release ] needs: [ release-checks, release ]
steps: steps:
- run: pacman -Sy --noconfirm git github-cli base-devel pacman-contrib - run: pacman -Sy --noconfirm git github-cli base-devel pacman-contrib
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- run: | - run: |
@@ -84,15 +86,49 @@ jobs:
chown $UID:$(id -g) . -R chown $UID:$(id -g) . -R
- run: | - run: |
BRANCH=actions/update-aur-${{ inputs.version }} BRANCH=actions/update-aur-${{ needs.release-checks.outputs.VERSION }}
git config --global --add safe.directory $GITHUB_WORKSPACE git config --global --add safe.directory $GITHUB_WORKSPACE
git config user.name "GitHub Actions" git config user.name "GitHub Actions"
git config user.email "actions@github.com" git config user.email "actions@github.com"
git checkout -b $BRANCH git checkout -b $BRANCH
git commit -am "Update AUR pkgs to v${{ inputs.version }}" git commit -am "Update AUR pkgs to v${{ needs.release-checks.outputs.VERSION }}"
git push -u origin $BRANCH git push -u origin $BRANCH
gh pr create --head $BRANCH \ gh pr create --head $BRANCH \
--title "[AUR update]: Bump to ${{ inputs.version }}" \ --title "[AUR update]: Bump to ${{ needs.release-checks.outputs.VERSION }}" \
--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*" --body "*This PR was created automatically*"
env: env:
GH_TOKEN: ${{ github.token }} GH_TOKEN: ${{ github.token }}

View File

@@ -12,7 +12,24 @@ jobs:
name: Check name: Check
uses: ./.github/workflows/check.yml uses: ./.github/workflows/check.yml
permissions: write-all permissions: write-all
check_paths:
name: Paths Filter
runs-on: ubuntu-latest
outputs:
code_changed: ${{ steps.filter.outputs.code }}
steps:
- uses: actions/checkout@v4
- id: filter
uses: dorny/paths-filter@v3
with:
filters: |
code:
- Makefile
- 'src/**'
- 'include/**'
build: build:
name: Build name: Build
needs: check_paths
if: github.event_name != 'push' || needs.check_paths.outputs.code_changed == 'true'
uses: ./.github/workflows/build.yml uses: ./.github/workflows/build.yml
permissions: write-all permissions: write-all

View File

@@ -1,69 +0,0 @@
# Index
- [Index](#index)
- [Installing from Source](#installing-from-source)
- [AUR](#aur)
- [Nix Flake](#nix-flake)
> [!CAUTION]
> I encourage you to read the manual installation steps to understand what will get installed in your computer by this package.
# Installing from Source
Firstly, you'll need to build the package, this also includes man pages, default config, themes and other files you might need.
To build it you only need to have some basic packages (should come pre-installed in almost all distros): `make`, `gcc` or another `gcc`ish compiler, and libpam headers. If it builds, it surely works anyways.
```sh
git clone https://github.com/javalsai/lidm.git
cd lidm
make # 👍
```
> [!NOTE]
> There's pre-built binaries on the [releases tab](https://github.com/javalsai/lidm/releases) too.
Then you can install the files onto your filesystem with:
```sh
make install
```
And additionally, to install service files (start-up behavior). <sup>[more docs](./assets/services/README.md)</sup>
```sh
# automatically detects your init system
# and install service file (for tty7)
make install-service
# or if you don't like autodetection
make install-service-systemd # systemd
make install-service-dinit # dinit
make install-service-runit # runit
make install-service-openrc # openrc
make install-service-s6 # s6
```
# AUR
[AUR packages](https://aur.archlinux.org/packages?K=lidm\&SeB=n) will automatically install most files.
> [!CAUTION]
> [service files](./assets/pkg/aur#services) have to be manually installed by now.
# Nix Flake
You can install by doing
```sh
nix profile install github:javalsai/lidm
```
or try it out without installing by:
```sh
nix run github:javalsai/lidm
```
> [!CAUTION]
> This doesn't include [service files](./assets/pkg/aur#services) neither

View File

@@ -1,4 +1,4 @@
VERSION = 1.2.0 VERSION = 1.2.3
.DEFAULT_GOAL := lidm .DEFAULT_GOAL := lidm
CDIR=src CDIR=src
@@ -10,7 +10,9 @@ PREFIX=/usr
CC?=gcc CC?=gcc
CFLAGS?=-O3 -Wall CFLAGS?=-O3 -Wall
ALLFLAGS=$(CFLAGS) -I$(IDIR) # C PreProcessor flags, not C Plus Plus
CPPFLAGS?=
ALLFLAGS=$(CFLAGS) $(CPPFLAGS) -I$(IDIR)
LIBS=-lpam LIBS=-lpam
@@ -20,14 +22,15 @@ DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = main.o log.o util.o ui.o ui_state.o config.o desktop.o auth.o ofield.o efield.o users.o sessions.o chvt.o launch_state.o _OBJ = main.o log.o util.o ui.o ui_state.o config.o desktop.o auth.o ofield.o efield.o users.o sessions.o chvt.o launch_state.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
.git/HEAD: INFO_GIT_REV?=$$(git describe --long --tags --always || echo '?')
INFO_BUILD_TS?=$$(date +%s)
$(IDIR)/version.h: Makefile .git/HEAD $(IDIR)/version.h: Makefile
@tmp=$$(mktemp); \ @tmp=$$(mktemp); \
printf '' > $$tmp; \ printf '' > $$tmp; \
echo '#define LIDM_VERSION "'$(VERSION)'"' >> $$tmp; \ echo '#define LIDM_VERSION "'$(VERSION)'"' >> $$tmp; \
echo '#define LIDM_GIT_REV "'$$(git describe --long --tags --always || echo '?')'"' >> $$tmp; \ echo '#define LIDM_GIT_REV "'$(INFO_GIT_REV)'"' >> $$tmp; \
echo '#define LIDM_BUILD_TS '$$(date +%s) >> $$tmp; \ echo '#define LIDM_BUILD_TS '$(INFO_BUILD_TS) >> $$tmp; \
if ! cmp -s $$tmp $@; then \ if ! cmp -s $$tmp $@; then \
mv $$tmp $@; \ mv $$tmp $@; \
fi; \ fi; \
@@ -54,7 +57,7 @@ install: lidm
uninstall: uninstall:
rm -rf ${DESTDIR}${PREFIX}/bin/lidm ${DESTDIR}/etc/lidm.ini rm -rf ${DESTDIR}${PREFIX}/bin/lidm ${DESTDIR}/etc/lidm.ini
rm -rf ${DESTDIR}/usr/share/man/man{1/lidm.1,5/lidm-config.5}.gz rm -rf ${DESTDIR}/usr/share/man/man{1/lidm.1,5/lidm-config.5}.gz
rm -rf /etc/systemd/system/lidm.service /etc/dinit.d/lidm /etc/runit/sv/lidm rm -rf ${DESTDIR}/etc/systemd/system/lidm.service ${DESTDIR}/etc/dinit.d/lidm ${DESTDIR}/etc/runit/sv/lidm
install-service: install-service:
@if command -v systemctl &> /dev/null; then \ @if command -v systemctl &> /dev/null; then \
@@ -62,36 +65,81 @@ install-service:
elif command -v dinitctl &> /dev/null; then \ elif command -v dinitctl &> /dev/null; then \
make install-service-dinit; \ make install-service-dinit; \
elif command -v sv &> /dev/null; then \ elif command -v sv &> /dev/null; then \
make install-service-runit; \ if [ -d /etc/sv ]; then \
make install-service-runit; \
elif [ -d /etc/runit/sv ]; then \
make install-service-runit-etc; \
else \
printf '\033[31m%s\033[0m\n' "Unknown init system structure, skipping service install..." >&2; \
fi \
elif command -v rc-update &> /dev/null; then \ elif command -v rc-update &> /dev/null; then \
make install-service-openrc; \ make install-service-openrc; \
elif command -v s6-service &> /dev/null; then \ elif command -v s6-service &> /dev/null; then \
make install-service-s6; \ if [ -d /etc/sv ]; then \
make install-service-s6; \
elif [ -d /etc/r6nit/sv ]; then \
make install-service-s6-etc; \
else \
printf '\033[31m%s\033[0m\n' "Unknown init system structure, skipping service install..." >&2; \
fi \
else \ else \
printf '\x1b[1;31m%s\x1b[0m\n' "Unknown init system, skipping service install..."; \ printf '\033[1;31m%s\033[0m\n' "Unknown init system, skipping service install..." >&2; \
fi fi
install-service-systemd: install-service-systemd:
install -m644 ./assets/services/systemd.service /etc/systemd/system/lidm.service install -m644 ./assets/services/systemd.service ${DESTDIR}/etc/systemd/system/lidm.service
@printf '\x1b[1m%s\x1b[0m\n\n' " don't forget to run 'systemctl enable lidm'" @printf '\033[1m%s\033[0m\n\n' " don't forget to run 'systemctl enable lidm'"
install-service-dinit: install-service-dinit:
install -m644 ./assets/services/dinit /etc/dinit.d/lidm install -m644 ./assets/services/dinit ${DESTDIR}/etc/dinit.d/lidm
@printf '\x1b[1m%s\x1b[0m\n\n' " don't forget to run 'dinitctl enable lidm'" @printf '\033[1m%s\033[0m\n\n' " don't forget to run 'dinitctl enable lidm'"
install-service-runit: install-service-runit:
rsync -a --no-owner --no-group ./assets/services/runit/. /etc/runit/sv/lidm @if [ ! -e /etc/sv ] && [ -d /etc/runit/sv ] && [ -z "$FORCE" ]; then \
@printf '\x1b[1m%s\x1b[0m\n\n' " don't forget to run 'ln -s /etc/runit/sv/lidm /run/runit/service' and 'sv enable lidm'" printf '\033[31m%s\033[0m\n' "/etc/sv doesn't exist but /etc/runit/sv does" >&2; \
printf '\033[31m%s\033[0m\n' "you probably meant to 'make install-service-runit-etc'" >&2; \
exit 1; \
fi
mkdir -p ${DESTDIR}/etc/sv/lidm
cp -r --update=all ./assets/services/runit/* ${DESTDIR}/etc/sv/lidm/
@printf '\033[1m%s\033[0m\n\n' " don't forget to run 'ln -s ${DESTDIR}/etc/sv/lidm /var/service' or your distro equivalent"
install-service-runit-etc:
@if [ ! -e /etc/runit/sv ] && [ -d /etc/sv ] && [ -z "$FORCE" ]; then \
printf '\033[31m%s\033[0m\n' "/etc/runit/sv doesn't exist but /etc/sv does" >&2; \
printf '\033[31m%s\033[0m\n' "you probably meant to 'make install-service-runit'" >&2; \
exit 1; \
fi
mkdir -p ${DESTDIR}/etc/runit/sv/lidm
cp -r --update=all ./assets/services/runit/* ${DESTDIR}/etc/runit/sv/lidm/
@printf '\033[1m%s\033[0m\n\n' " don't forget to run 'ln -s ${DESTDIR}/etc/runit/sv/lidm /run/runit/service' or your distro equivalent"
install-service-openrc: install-service-openrc:
install -m755 ./assets/services/openrc /etc/init.d/lidm install -m755 ./assets/services/openrc ${DESTDIR}/etc/init.d/lidm
@printf '\x1b[1m%s\x1b[0m\n\n' " don't forget to run 'rc-update add lidm'" @printf '\033[1m%s\033[0m\n\n' " don't forget to run 'rc-update add lidm'"
install-service-s6: install-service-s6:
rsync -a --no-owner --no-group ./assets/services/s6/. /etc/s6/sv/lidm @if [ ! -e /etc/sv ] && [ -d /etc/s6/sv ] && [ -z "$FORCE" ]; then \
@printf '\x1b[1m%s\x1b[0m\n\n' " don't forget to run 's6-service add default lidm' and 's6-db-reload'" printf '\033[31m%s\033[0m\n' "/etc/sv doesn't exist but /etc/s6/sv does" >&2; \
printf '\033[31m%s\033[0m\n' "you probably meant to 'make install-service-s6-etc'" >&2; \
exit 1; \
fi
mkdir -p ${DESTDIR}/etc/sv/lidm
cp -r --update=all ./assets/services/s6/* ${DESTDIR}/etc/sv/lidm/
@printf '\033[1m%s\033[0m\n\n' " don't forget to run 's6-service add default lidm' and 's6-db-reload'"
install-service-s6-etc:
@if [ ! -e /etc/s6/sv ] && [ -d /etc/sv ] && [ -z "$FORCE" ]; then \
printf '\033[31m%s\033[0m\n' "/etc/s6/sv doesn't exist but /etc/sv does" >&2; \
printf '\033[31m%s\033[0m\n' "you probably meant to 'make install-service-s6'" >&2; \
exit 1; \
fi
mkdir -p ${DESTDIR}/etc/s6/sv/lidm
cp -r --update=all ./assets/services/s6/* ${DESTDIR}/etc/s6/sv/lidm/
@printf '\033[1m%s\033[0m\n\n' " don't forget to run 's6-service add default lidm' and 's6-db-reload'"
pre-commit: pre-commit:
codespell codespell
find . -type f -name '*.sh' -not -path './assets/pkg/aur/*/src/*' | xargs shellcheck prettier -c "**/*.md"
git ls-files "*.sh" "*/PKGBUILD" | xargs shellcheck --shell=bash
clang-format -i $$(git ls-files "*.c" "*.h") clang-format -i $$(git ls-files "*.c" "*.h")
clang-tidy -p . $$(git ls-files "*.c" "*.h") git ls-files -z "*.h" | \
parallel -j$$(nproc) -q0 --no-notice --will-cite --tty clang-tidy --quiet |& \
grep -v "warnings generated." || true
print-version: print-version:
@echo $(VERSION) @echo $(VERSION)
@@ -100,8 +148,10 @@ print-version:
install uninstall \ install uninstall \
install-service \ install-service \
install-service-s6 \ install-service-s6 \
install-service-s6-etc \
install-service-dinit \ install-service-dinit \
install-service-runit \ install-service-runit \
install-service-runit-etc \
install-service-openrc \ install-service-openrc \
install-service-systemd \ install-service-systemd \
pre-commit \ pre-commit \

100
README.md
View File

@@ -10,33 +10,41 @@ LiDM is like any [Display Manager](https://en.wikipedia.org/wiki/X_display_manag
![demo gif](assets/media/lidm.gif) ![demo gif](assets/media/lidm.gif)
> *shown as in a featured terminal emulator, actual linux console doesn't support as much color and decorations* <blockquote><details>
<summary><i>
shown as in a featured terminal emulator, actual linux console doesn't support as much color and decorations
</i></summary>
> *however, all colors and strings are fully customizable* If you want to add fancy color and font support to your TTYs you can wrap lidm in [`kmscon`](https://wiki.archlinux.org/title/KMSCON). (edit appropriate service files). e.g:
```sh
kmscon -l --vt /dev/tty7 --font-name "Cascadia Code" -- /usr/bin/lidm
```
</details></blockquote>
> _however, all colors and strings are fully customizable_
## Features ## Features
* Simple as C, you only need a C compiler and standard unix libraries to build this. - Simple as C, you only need a C compiler and standard unix libraries to build this.
* Fully customizable, from strings, including action keys, to colors (I hope you know ansi escape codes) - Fully customizable, from strings, including action keys, to colors (I hope you know ansi escape codes)
* Automatically detects xorg and wayland sessions, plus allowing to launch the default user shell (if enabled in config) - Automatically detects xorg and wayland sessions, plus allowing to launch the default user shell (if enabled in config)
* Starts with many init systems (systemd, dinit, runit, openrc and s6). - Starts with many init systems (systemd, dinit, runit, openrc and s6).
# Index # Table of Contents
* [LiDM](#lidm) - [Ideology](#ideology)
* [Features](#features) - [Usage](#usage)
* [WIP](#wip) - [Arguments](#arguments)
* [Index](#index) - [Program](#program)
* [Ideology](#ideology) - [Requirements](#requirements)
* [Usage](#usage) - [Installation](#installation)
* [Arguments](#arguments) - [Configuring](#configuring)
* [Program](#program) - [PAM](#pam)
* [Requirements](#requirements) - [Contributing](#contributing)
* [Installation](#installation) - [Inspiration](#inspiration)
* [Configuring](#configuring) - [Contributors](#contributors)
* [Contributing](#contributing)
* [Inspiration](#inspiration)
* [Contributors](#contributors)
# Ideology # Ideology
@@ -44,7 +52,7 @@ We all know that the most important thing in a project is the ideology of the au
[ ![stopchatcontrol](https://stopchatcontrol.eu/wp-content/uploads/2023/09/1-1-1024x1024.png) ](https://stopchatcontrol.eu) [ ![stopchatcontrol](https://stopchatcontrol.eu/wp-content/uploads/2023/09/1-1-1024x1024.png) ](https://stopchatcontrol.eu)
> *there's also a [change.org post](https://www.change.org/p/stoppt-die-chatkontrolle-grundrechte-gelten-auch-im-netz).* > _there's also a [change.org post](https://www.change.org/p/stoppt-die-chatkontrolle-grundrechte-gelten-auch-im-netz)._
# Usage # Usage
@@ -56,25 +64,33 @@ If a single argument is provided (don't even do `--` or standard unix parsing...
Base (mostly intuitive): Base (mostly intuitive):
* Use arrow keys to navigate the inputs and type over any of them to override the default value. - Use arrow keys to navigate the inputs and type over any of them to override the default value.
* Enter will just attempt to login. - Enter will just attempt to login.
* If you are focused on an edited input, horizontal arrow keys will attempt to move across the text just as expected. - If you are focused on an edited input, horizontal arrow keys will attempt to move across the text just as expected.
On top of that: On top of that:
* Using the horizontal arrow keys if the focused input is not in text mode or the movement would overflow the input. It will try to change in such direction the option of session or the user. - Using the horizontal arrow keys if the focused input is not in text mode or the movement would overflow the input. It will try to change in such direction the option of session or the user.
* Pressing <kbd>ESC</kbd> and then horizontal arrows will force to change the option of the focused input even if it's in edit mode. - Pressing <kbd>ESC</kbd> and then horizontal arrows will force to change the option of the focused input even if it's in edit mode.
* Editing an option on a user or a shell session will put you in edit mode appending after the original value. - Editing an option on a user or a shell session will put you in edit mode appending after the original value.
# Requirements # Requirements
* Make (Also optional, but does things automatically, make sure `gcc` and `mkdir -p` work as expected). - Make (Also optional, but does things automatically, make sure `gcc` and `mkdir -p` work as expected).
* A compiler like `cc`, `gcc` or `clang`. Make sure to use the desired `CC=<compiler>` on the `make` command. - A compiler like `cc`, `gcc` or `clang`. Make sure to use the desired `CC=<compiler>` on the `make` command.
* PAM library, used for user authentication, just what `login` or `su` use internally. Don't worry, it's surely pre-installed. - PAM library, used for user authentication, just what `login` or `su` use internally. Don't worry, it's surely pre-installed.
# Installation # Installation
Check the [installation guide](INSTALL.md) to use your preferred installation source. Check the [installation guide](./docs/INSTALL.md) to use your preferred installation source.
<details>
<summary>Packagers read here!!</summary>
If you are a package maintainer or are willing to become one, please read [the packagers guide](./docs/PACKAGERS.md).
</details>
# Configuring # Configuring
@@ -90,6 +106,12 @@ Colors are gonna be put inside `\x1b[...m`, if you don't know what this is check
> [!TIP] > [!TIP]
> If you don't like seeing an element, you can change the fg color of it to be the same as the bg, making it invisible. > If you don't like seeing an element, you can change the fg color of it to be the same as the bg, making it invisible.
# PAM
If your distribution does not use the standard PAM service name `login` (`/etc/pam.d/login`) for its PAM services or if you want to use another PAM file, simply set the `LIDM_PAM_SERVICE` env variable to your PAM service name.
When the env variable is empty it defaults to the `login` PAM service or whatever fallback your distribution packager has defined during compilation.
# Contributing # Contributing
If you want to contribute check the [contribution guide](docs/CONTRIBUTING.md). If you want to contribute check the [contribution guide](docs/CONTRIBUTING.md).
@@ -102,21 +124,21 @@ For this reason the project's philosophy is to be simple and minimal, such that
I forgot what exactly the name came from, but it surely was a mix of a few things so: I forgot what exactly the name came from, but it surely was a mix of a few things so:
* Obviously it's inspired by `ly`. `ly-dm` leads to "lydm". - Obviously it's inspired by `ly`. `ly-dm` leads to "lydm".
* Wow make "lydm" simple with a "y" → "i" transformation. - Wow make "lydm" simple with a "y" → "i" transformation.
* Associate it with the "i" in s**i**mple and other display managers like **Li**ghtDM. - Associate it with the "i" in s**i**mple and other display managers like **Li**ghtDM.
* And the **la**ptop this project started in has a **lid**. - And the **la**ptop this project started in has a **lid**.
# Contributors # Contributors
[![GitHub Contributors](https://contrib.rocks/image?repo=javalsai/lidm\&max=20)](https://github.com/javalsai/lidm/graphs/contributors) [![GitHub Contributors](https://contrib.rocks/image?repo=javalsai/lidm&max=20)](https://github.com/javalsai/lidm/graphs/contributors)
[killertofus](https://github.com/killertofus), [deadvey](https://github.com/deadvey), [grialion](https://github.com/grialion/), cerealexperiments\_, [antiz96](https://github.com/Antiz96), [rmntgx](https://github.com/rmntgx) and [more...](https://github.com/javalsai/lidm/graphs/contributors) [killertofus](https://github.com/killertofus), [deadvey](https://github.com/deadvey), [grialion](https://github.com/grialion/), cerealexperiments\_, [antiz96](https://github.com/Antiz96), [rmntgx](https://github.com/rmntgx) and [more...](https://github.com/javalsai/lidm/graphs/contributors)
With their big or small contributions, every commit has helped in its own way and encouraged me to keep putting my soul into this. With their big or small contributions, every commit has helped in its own way and encouraged me to keep putting my soul into this.
*** ---
🌟 Finally, consider starring this repo [or...](https://www.reddit.com/r/github/comments/1l2mchg/is_this_allowed) 🔪 🌟 Finally, consider starring this repo [or...](https://www.reddit.com/r/github/comments/1l2mchg/is_this_allowed) 🔪
![star-history](https://api.star-history.com/svg?repos=javalsai/lidm\&type=Date) ![star-history](https://api.star-history.com/svg?repos=javalsai/lidm&type=Date)

View File

@@ -13,8 +13,9 @@ make -j"$(nproc)" "$@" 2> /tmp/stderr || ERR=$?
BSIZE=$(stat --printf="%s" lidm) BSIZE=$(stat --printf="%s" lidm)
HSIZE=$(numfmt --to=iec-i<<<"$BSIZE")B HSIZE=$(numfmt --to=iec-i<<<"$BSIZE")B
WARNS=$( WARNS=$(
{ grep -E '^[^ ]+\.[ch]:[0-9]+:[0-9]+: [a-z]+:' /tmp/stderr || :; } \ sed -nE \
| sed -E 's/^([^ ]+\.[ch]):([0-9]+):([0-9]+): ([a-z]+): (.*)$/::\4 file=\1,line=\2,col=\3::\5/' 's/^([^ ]+\.[ch]):([0-9]+):([0-9]+): ([a-z]+): (.*)$/::\4 file=\1,line=\2,col=\3::\5/p' \
/tmp/stderr
) )
WARNS_NUM=$({ [[ "$WARNS" == "" ]] && echo 0; } || wc -l <<<"$WARNS") WARNS_NUM=$({ [[ "$WARNS" == "" ]] && echo 0; } || wc -l <<<"$WARNS")

View File

@@ -4,9 +4,9 @@ These files are just for reference, I'll manually edit and publish them, at leas
There are three packages that follow standard conventions: There are three packages that follow standard conventions:
* [`lidm`](https://aur.archlinux.org/packages/lidm): Builds latest release (manually updated per release basis) - [`lidm`](https://aur.archlinux.org/packages/lidm): Builds latest release (manually updated per release basis)
* [`lidm-bin`](https://aur.archlinux.org/packages/lidm-bin): Fetches latest release binary (compiled by GitHub Actions, also updated per release) - [`lidm-bin`](https://aur.archlinux.org/packages/lidm-bin): Fetches latest release binary (compiled by GitHub Actions, also updated per release)
* [`lidm-git`](https://aur.archlinux.org/packages/lidm-git): Fetches latest commit and builds it (should be updated automatically) - [`lidm-git`](https://aur.archlinux.org/packages/lidm-git): Fetches latest commit and builds it (should be updated automatically)
> \[!IMPORTANT] > \[!IMPORTANT]
> None of those packages include the service files. [You have to do this yourself](../../services/README.md). > None of those packages include the service files. [You have to do this yourself](../../services/README.md).

View File

@@ -1,20 +1,32 @@
pkgbase = lidm-bin pkgbase = lidm-bin
pkgdesc = A fully colorful customizable TUI display manager made in C. (release binary) pkgdesc = A fully colorful customizable TUI display manager made in C. (release binary)
pkgver = 1.1.1 pkgver = 1.2.3
pkgrel = 1 pkgrel = 1
url = https://github.com/javalsai/lidm url = https://github.com/javalsai/lidm
arch = x86_64 arch = x86_64
arch = i686
arch = aarch64
arch = armv7h
arch = riscv64
license = GPL license = GPL
depends = pam depends = libpam.so=0
provides = lidm provides = lidm
conflicts = lidm conflicts = lidm
source = lidm::https://github.com/javalsai/lidm/releases/download/v1.1.1/lidm-amd64 source = lidm-default-theme-1.2.3.ini::https://raw.githubusercontent.com/javalsai/lidm/v1.2.3/themes/default.ini
source = default-theme.ini::https://raw.githubusercontent.com/javalsai/lidm/v1.1.1/themes/default.ini source = lidm-1.2.3.1::https://raw.githubusercontent.com/javalsai/lidm/v1.2.3/assets/man/lidm.1
source = lidm.1::https://raw.githubusercontent.com/javalsai/lidm/v1.1.1/assets/man/lidm.1 source = lidm-config-1.2.3.5::https://raw.githubusercontent.com/javalsai/lidm/v1.2.3/assets/man/lidm-config.5
source = lidm-config.5::https://raw.githubusercontent.com/javalsai/lidm/v1.1.1/assets/man/lidm-config.5 sha256sums = ffaa5fe2cf5011bf53c90f81bfec8585158d35f72c0666db0bd4d3866ae041ca
sha256sums = c4e82ae2c08c223ef417edca50f86f516e3f9154339f67110c87d01855673fcf
sha256sums = a8d29e220c23b48b5cd3aac0c0e395e90a9d6c9ca9c9c35a45ad6f3df5f55542
sha256sums = 7f2fb91f55088be1a9b1c93ecf5d6c1e437f369b56df2eacc9d10b00c93c39f8 sha256sums = 7f2fb91f55088be1a9b1c93ecf5d6c1e437f369b56df2eacc9d10b00c93c39f8
sha256sums = 5dbe088ce29c95a400080190560d4308c10519a953e83d2d5020dfdf47dd830f sha256sums = 0aa5755bdcc60ea80cd9ee0f89233ffaf22c6cee9db9da277274a62c6ed477d9
source_x86_64 = lidm-1.2.3-x86_64::https://github.com/javalsai/lidm/releases/download/v1.2.3/lidm-amd64
sha256sums_x86_64 = a533b5aee3ffe04268f8d3ff8d7eb87f09d31fbe25e1b8b1ed29c42ef465bd4b
source_i686 = lidm-1.2.3-i686::https://github.com/javalsai/lidm/releases/download/v1.2.3/lidm-i386
sha256sums_i686 = 75018578e68bffda9807de8a65e16eaed8a16c6cf2417a0b58c5d5bcfa603e45
source_aarch64 = lidm-1.2.3-aarch64::https://github.com/javalsai/lidm/releases/download/v1.2.3/lidm-aarch64
sha256sums_aarch64 = 1b81a1537a1e31ca1902cbc3b60add4ac712aa64fd4d266685f53372cc365882
source_armv7h = lidm-1.2.3-armv7h::https://github.com/javalsai/lidm/releases/download/v1.2.3/lidm-armv7
sha256sums_armv7h = e86f59509fe2366d6312b9bc9e8d89c14e9c049fd713a04c41dab49a848b1ada
source_riscv64 = lidm-1.2.3-riscv64::https://github.com/javalsai/lidm/releases/download/v1.2.3/lidm-riscv64
sha256sums_riscv64 = 3f0eb0315c523d367bac332641e5cd3c86cfd9aa4e7c14b2efc036937b97a598
pkgname = lidm-bin pkgname = lidm-bin

View File

@@ -1,29 +1,39 @@
# shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164 # shellcheck disable=SC2034,SC2154,SC2164
# Maintainer: javalsai <javalsai@proton.me> # Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm-bin pkgname=lidm-bin
pkgver=1.1.1 pkgver=1.2.3
pkgrel=1 pkgrel=1
depends=('pam') depends=('libpam.so')
pkgdesc="A fully colorful customizable TUI display manager made in C. (release binary)" pkgdesc="A fully colorful customizable TUI display manager made in C. (release binary)"
arch=('x86_64') arch=('x86_64' 'i686' 'aarch64' 'armv7h' 'riscv64')
url="https://github.com/javalsai/lidm" url="https://github.com/javalsai/lidm"
license=('GPL') license=('GPL')
provides=('lidm') provides=('lidm')
conflicts=('lidm') conflicts=('lidm')
source=( source=(
"lidm::$url/releases/download/v$pkgver/lidm-amd64" "lidm-default-theme-${pkgver}.ini::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/themes/default.ini"
"default-theme.ini::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/themes/default.ini" "lidm-${pkgver}.1::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/assets/man/lidm.1"
"lidm.1::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/assets/man/lidm.1" "lidm-config-${pkgver}.5::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/assets/man/lidm-config.5"
"lidm-config.5::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/assets/man/lidm-config.5"
) )
sha256sums=('c4e82ae2c08c223ef417edca50f86f516e3f9154339f67110c87d01855673fcf' source_x86_64=("lidm-${pkgver}-x86_64::$url/releases/download/v$pkgver/lidm-amd64")
'a8d29e220c23b48b5cd3aac0c0e395e90a9d6c9ca9c9c35a45ad6f3df5f55542' source_i686=("lidm-${pkgver}-i686::$url/releases/download/v$pkgver/lidm-i386")
source_aarch64=("lidm-${pkgver}-aarch64::$url/releases/download/v$pkgver/lidm-aarch64")
source_armv7h=("lidm-${pkgver}-armv7h::$url/releases/download/v$pkgver/lidm-armv7")
source_riscv64=("lidm-${pkgver}-riscv64::$url/releases/download/v$pkgver/lidm-riscv64")
sha256sums=('ffaa5fe2cf5011bf53c90f81bfec8585158d35f72c0666db0bd4d3866ae041ca'
'7f2fb91f55088be1a9b1c93ecf5d6c1e437f369b56df2eacc9d10b00c93c39f8' '7f2fb91f55088be1a9b1c93ecf5d6c1e437f369b56df2eacc9d10b00c93c39f8'
'5dbe088ce29c95a400080190560d4308c10519a953e83d2d5020dfdf47dd830f') '0aa5755bdcc60ea80cd9ee0f89233ffaf22c6cee9db9da277274a62c6ed477d9')
sha256sums_x86_64=('a533b5aee3ffe04268f8d3ff8d7eb87f09d31fbe25e1b8b1ed29c42ef465bd4b')
sha256sums_i686=('75018578e68bffda9807de8a65e16eaed8a16c6cf2417a0b58c5d5bcfa603e45')
sha256sums_aarch64=('1b81a1537a1e31ca1902cbc3b60add4ac712aa64fd4d266685f53372cc365882')
sha256sums_armv7h=('e86f59509fe2366d6312b9bc9e8d89c14e9c049fd713a04c41dab49a848b1ada')
sha256sums_riscv64=('3f0eb0315c523d367bac332641e5cd3c86cfd9aa4e7c14b2efc036937b97a598')
package() { package() {
install -Dm755 lidm "${pkgdir}/usr/bin/lidm" cd "$srcdir"
install -Dm644 default-theme.ini "${pkgdir}/etc/lidm.ini"
install -Dm644 lidm.1 "${pkgdir}/usr/share/man/man1/lidm.1" install -Dm755 "lidm-${pkgver}-$CARCH" "${pkgdir}/usr/bin/lidm"
install -Dm644 lidm-config.5 "${pkgdir}/usr/share/man/man5/lidm-config.5" install -Dm644 "lidm-default-theme-${pkgver}.ini" "${pkgdir}/etc/lidm.ini"
install -Dm644 "lidm-${pkgver}.1" "${pkgdir}/usr/share/man/man1/lidm.1"
install -Dm644 "lidm-config-${pkgver}.5" "${pkgdir}/usr/share/man/man5/lidm-config.5"
} }

View File

@@ -1,6 +1,6 @@
pkgbase = lidm-git pkgbase = lidm-git
pkgdesc = A fully colorful customizable TUI display manager made in C. (last git commit) pkgdesc = A fully colorful customizable TUI display manager made in C. (last git commit)
pkgver = 0.1.0.r0.g8071694 pkgver = 1.2.3.r3.g363deea
pkgrel = 1 pkgrel = 1
url = https://github.com/javalsai/lidm url = https://github.com/javalsai/lidm
arch = any arch = any

View File

@@ -1,10 +1,10 @@
# shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164 # shellcheck disable=SC2034,SC2154,SC2164
# Maintainer: javalsai <javalsai@proton.me> # Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm-git pkgname=lidm-git
pkgver=1.1.1.r0.g3bfc2f5 pkgver=1.2.3.r3.g363deea
pkgrel=1 pkgrel=1
depends=('pam') depends=('pam')
makedepends=('git' 'make' 'gcc') makedepends=('git')
pkgdesc="A fully colorful customizable TUI display manager made in C. (last git commit)" pkgdesc="A fully colorful customizable TUI display manager made in C. (last git commit)"
arch=('any') arch=('any')
url="https://github.com/javalsai/lidm" url="https://github.com/javalsai/lidm"
@@ -15,17 +15,17 @@ source=("lidm::git+https://github.com/javalsai/lidm")
sha256sums=('SKIP') sha256sums=('SKIP')
pkgver() { pkgver() {
cd "lidm" cd "$srcdir/lidm"
git describe --long --abbrev=7 --tags | \ git describe --long --abbrev=7 --tags | \
sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g' sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g'
} }
build() { build() {
cd "lidm" cd "$srcdir/lidm"
make CFLAGS="-O3" make
} }
package() { package() {
cd "lidm" cd "$srcdir/lidm"
make install DESTDIR="${pkgdir}" make DESTDIR="${pkgdir}" install
} }

View File

@@ -1,14 +1,12 @@
pkgbase = lidm pkgbase = lidm
pkgdesc = A fully colorful customizable TUI display manager made in C. (build latest tag) pkgdesc = A fully colorful customizable TUI display manager made in C. (build latest tag)
pkgver = 1.1.1 pkgver = 1.2.3
pkgrel = 1 pkgrel = 1
url = https://github.com/javalsai/lidm url = https://github.com/javalsai/lidm
arch = any arch = any
license = GPL license = GPL
makedepends = git
makedepends = gcc
depends = pam depends = pam
source = tarball.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v1.1.1.tar.gz source = lidm-1.2.3.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v1.2.3.tar.gz
sha256sums = 915dc5acce413d5d32bb52c6f9980661a389a0939a49ac31bc250b2d162a5479 sha256sums = 1ce414b510c5bbc3e32ea882f915b4d3958cb82eb1fbb5cf33e62f69c844bf93
pkgname = lidm pkgname = lidm

View File

@@ -1,25 +1,21 @@
# shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164 # shellcheck disable=SC2034,SC2154,SC2164
# Maintainer: javalsai <javalsai@proton.me> # Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm pkgname=lidm
pkgver=1.1.1 pkgver=1.2.3
pkgrel=1 pkgrel=1
depends=('pam') depends=('pam')
makedepends=('git' 'gcc') makedepends=()
pkgdesc="A fully colorful customizable TUI display manager made in C. (build latest tag)" pkgdesc="A fully colorful customizable TUI display manager made in C. (build latest tag)"
arch=('any') arch=('any')
url="https://github.com/javalsai/lidm" url="https://github.com/javalsai/lidm"
license=('GPL') license=('GPL')
source=("tarball.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v$pkgver.tar.gz") source=("${pkgname}-${pkgver}.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v$pkgver.tar.gz")
sha256sums=('915dc5acce413d5d32bb52c6f9980661a389a0939a49ac31bc250b2d162a5479') sha256sums=('1ce414b510c5bbc3e32ea882f915b4d3958cb82eb1fbb5cf33e62f69c844bf93')
build() { build() {
tar -xzf "tarball.tar.gz" make -C "$srcdir/lidm-$pkgver"
cd "lidm-$pkgver"
make CFLAGS="-O3"
} }
package() { package() {
cd "lidm-$pkgver" make -C "$srcdir/lidm-$pkgver" DESTDIR="$pkgdir" install
make install DESTDIR="${pkgdir}"
} }

22
assets/pkg/aur/makepkg-clean.sh Executable file
View File

@@ -0,0 +1,22 @@
#!/usr/bin/env bash
set -e
MYSELF=$(realpath "$0")
MYDIR=$(dirname "$MYSELF")
cd "$MYDIR"
typeset -a pkgs=(lidm{,-git,-bin})
for pkg in "${pkgs[@]}"; do
printf "\x1b[mEntering '%s'\x1b[0m\n" "$pkg"
cd "$pkg"
# shellcheck disable=SC1091
source PKGBUILD
# shellcheck disable=SC2154
for f in "${source[@]}"; do
echo "$f"
awk -F:: '{print $1}' <<<"$f" | xargs rm -rf
done
cd ..
echo
done

View File

@@ -4,18 +4,19 @@ set -e
MYSELF=$(realpath "$0") MYSELF=$(realpath "$0")
MYDIR=$(dirname "$MYSELF") MYDIR=$(dirname "$MYSELF")
for pkg in "$MYDIR"/*/; do cd "$MYDIR"
printf "\x1b[1mEntering '%s'\x1b[0m\n" "$pkg" typeset -a pkgs=(lidm{,-git,-bin})
for pkg in "${pkgs[@]}"; do
printf "\x1b[mEntering '%s'\x1b[0m\n" "$pkg"
cd "$pkg" cd "$pkg"
makepkg -Cf
# shellcheck disable=SC1091 cd ..
source "PKGBUILD"
for source in "${source[@]}"; do
awk -F'::' '{print $1}' <<<"$source" | xargs rm -rf
done
rm -rf ./*.{gz,zst} src pkg
makepkg -f .
echo echo
done done
if [[ -n "${PRINT_TREE:-}" ]]; then
for pkg in "${pkgs[@]}"; do
eza --tree "$pkg/pkg/"*
done
fi

View File

@@ -17,12 +17,6 @@ for pkg in "$MYDIR"/lidm{,-bin}/; do
sed -i "s/pkgver=.*/pkgver=$1/" PKGBUILD sed -i "s/pkgver=.*/pkgver=$1/" PKGBUILD
sed -i "s/pkgrel=.*/pkgrel=1/" PKGBUILD sed -i "s/pkgrel=.*/pkgrel=1/" PKGBUILD
grep 'source = ' <.SRCINFO | awk -F'= |::' '{print $2}' | \
while read -r srcfile; do
printf "\x1b[31mDeleting '%s'\x1b[0m\n" "$srcfile"
rm -f "$srcfile"
done
updpkgsums updpkgsums
makepkg --printsrcinfo | tee .SRCINFO makepkg --printsrcinfo | tee .SRCINFO
echo echo

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.3";
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-eKgBoh+bRcl2Y7oOxW77Kjtb9Ws2Xln1SenknIsGxD4=";
};
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

@@ -4,7 +4,7 @@ This folder contains the files necessary to set up lidm on start up for the supp
If you don't know what a init system is, you're certainly using `systemd`. If you don't know what a init system is, you're certainly using `systemd`.
There's make scripts to automatically copy the service files to the proper locations, you just have to run `make install-service-$INIT`. `make install-service` will attempt to detect the init system in use and install for it. There's make scripts to automatically copy the service files to the proper locations, you just have to run `make install-service-$INIT` (or `make install-service-$INIT-etc`). `make install-service` will attempt to detect the init system in use and install for it.
The manual steps for installation are: The manual steps for installation are:
@@ -13,30 +13,30 @@ The manual steps for installation are:
## Systemd ## Systemd
* Copy `systemd.service` to `/etc/systemd/system/lidm.service` - Copy `systemd.service` to `/etc/systemd/system/lidm.service`
* To enable it you can run `systemctl enable lidm` - To enable it you can run `systemctl enable lidm`
## Dinit ## Dinit
* Copy `dinit` to `/etc/dinit.d/lidm` - Copy `dinit` to `/etc/dinit.d/lidm`
* To enable it, run `dinitctl enable lidm` - To enable it, run `dinitctl enable lidm`
## Runit ## Runit
* Copy `runit/` to `/etc/runit/sv/lidm/` - Copy `runit/` to `/etc/runit/sv/lidm/`
* Add the service with `ln -s /etc/runit/sv/lidm /run/runit/service` - Add the service with `ln -s /etc/runit/sv/lidm /run/runit/service`
* And to enable it `sv enable lidm` - And to enable it `sv enable lidm`
## OpenRC ## OpenRC
* Copy `openrc` to `/etc/init.d/lidm` - Copy `openrc` to `/etc/init.d/lidm`
* Enable the service with `rc-update add lidm` - Enable the service with `rc-update add lidm`
## S6 ## S6
* Copy `s6/` to `/etc/s6/sv/lidm/` - Copy `s6/` to `/etc/s6/sv/lidm/`
* Add the service with `s6-service add default lidm` - Add the service with `s6-service add default lidm`
* Reload the database with `s6-db-reload` (you might have to run this every time the service file changes) - Reload the database with `s6-db-reload` (you might have to run this every time the service file changes)
> [!WARNING] > [!WARNING]
> Make sure to disable any other service that might run on tty7, such us lightdm or most display managers out there. > Make sure to disable any other service that might run on tty7, such us lightdm or most display managers out there.

View File

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

View File

@@ -2,9 +2,10 @@
Contributions are welcome! Here's how you can help: Contributions are welcome! Here's how you can help:
* [Contributing code](#code) - [Contributing](#contributing)
* [Reporting issues](#issues) - [Code](#code)
* [Other](#other) - [Issues](#issues)
- [Other](#other)
## Code ## Code
@@ -12,33 +13,33 @@ For small fixes or incremental improvements simply fork the repo and follow the
1. [Fork](https://help.github.com/articles/fork-a-repo/) the repository and [clone](https://help.github.com/articles/cloning-a-repository/) your fork. 1. [Fork](https://help.github.com/articles/fork-a-repo/) the repository and [clone](https://help.github.com/articles/cloning-a-repository/) your fork.
2. Start coding! (it might be helpful to read a [quide on the project structure and conventions](structure.md) before this) 2. Start coding! (it might be helpful to read a [quide on the project structure and conventions](./structure.md) before this)
* Configure clangd LSP by generating `compile_commands.json` (e.g. `bear -- make` or `compiledb make`) - Configure clangd LSP by generating `compile_commands.json` (e.g. `bear -- make` or `compiledb make`)
* Implement your feature. - Implement your feature.
* Check your code works as expected. - Check your code works as expected.
* Run the code formatter: `clang-format -i $(git ls-files "*.c" "*.h")` - Run the code formatter: `clang-format -i $(git ls-files "*.c" "*.h")`.
* Run the code linter: `clang-tidy -p . $(git ls-files "*.c" "*.h")`. Some checks are pretty pedantic, feel free to ignore or debate some of the rules. - Run the code linter: `clang-tidy -p . $(git ls-files "*.c" "*.h")`. Some checks are pretty pedantic, feel free to ignore or debate some of the rules.
* If you prefer, you can run `make pre-commit` to run several code style checks like the avobe along a few extra stuff. - If you prefer, you can run `make pre-commit` to run several code style checks like the above along a few extra stuff (shellcheck, spellcheck, prettier, etc).
3. Commit your changes to a new branch (not `master`, one change per branch) and push it: 3. Commit your changes to a new branch (not `master`, one change per branch) and push it:
* Commit messages should: - Commit messages should:
* Header line: explain the commit in one line (use the imperative) ("feat" for features, "fix", "style", "chore", "docs", etc) - Header line: explain the commit in one line (use the imperative) ("feat" for features, "fix", "style", "chore", "docs", etc)
* Be descriptive. - Be descriptive.
* Don't make the title too long and add commit descriptions if you think the changes need it. - Don't make the title too long and add commit descriptions if you think the changes need it.
* e.g. "feat: add support for X", "fix(config): config parser segfaulting", "docs(typo): fix a typo in README.md" - e.g. "feat: add support for X", "fix(config): config parser segfaulting", "docs(typo): fix a typo in README.md"
4. Once you are happy with your changes, submit a pull request. 4. Once you are happy with your changes, submit a pull request.
* Open the pull request. - Open the pull request.
* Add a short description explaining what you've done (or if it's a work-in-progress - what you need to do) - Add a short description explaining what you've done (or if it's a work-in-progress - what you need to do)
## Issues ## Issues
1. Do a quick search on GitHub to check if the issue has already been reported. 1. Do a quick search on GitHub to check if the issue has already been reported.
2. [Open an issue](https://github.com//javalsai/lidm/issues/new) and describe the issue you are having - you could include: 2. [Open an issue](https://github.com//javalsai/lidm/issues/new) and describe the issue you are having - you could include:
* Screenshots. - Screenshots.
* Ways to reproduce the issue. - Ways to reproduce the issue.
* Your lidm version. - Your lidm version.
* Your platform (e.g. arch linux or Ubuntu 15.04 x64) and init system if you know. - Your platform (e.g. arch linux or Ubuntu 15.04 x64) and init system if you know.
After reporting you should aim to answer questions or clarifications as this helps pinpoint the cause of the issue. After reporting you should aim to answer questions or clarifications as this helps pinpoint the cause of the issue.

128
docs/INSTALL.md Normal file
View File

@@ -0,0 +1,128 @@
# Table of Contents
- [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.
# Installing from Source
Firstly, you'll need to build the package, this also includes man pages, default config, themes and other files you might need.
To build it you only need to have some basic packages (should come pre-installed in almost all distros): `make`, `gcc` or another `gcc`ish compiler, and libpam headers. If it builds, it surely works anyways.
```sh
git clone https://github.com/javalsai/lidm.git
cd lidm
make # 👍
```
> [!NOTE]
> There's pre-built binaries on the [releases tab](https://github.com/javalsai/lidm/releases) too.
Then you can install the files onto your filesystem with:
```sh
make install
```
And additionally, to install service files (start-up behavior). <sup>[more docs](../assets/services/README.md)</sup>
```sh
# automatically detects your init system
# and install service file (for tty7)
make install-service
# or if you don't like autodetection
make install-service-systemd # systemd
make install-service-dinit # dinit
make install-service-runit # runit (/etc/sv)
make install-service-runit-etc # runit (/etc/runit/sv)
make install-service-openrc # openrc
make install-service-s6 # s6 (/etc/sv)
make install-service-s6-etc # s6 (/etc/s6/sv)
# For runit and s6, some distros (e.g. Artix) like to put it in /etc/<init>/sv
# to better isolate their packages while other distros (e.g. Void) just put it
# in /etc/sv
```
# AUR
[AUR packages](https://aur.archlinux.org/packages?K=lidm&SeB=n) will automatically install most files.
> [!CAUTION]
> [service files](../assets/pkg/aur#services) have to be manually installed by now.
# Nix Flake
You can install by doing
```sh
nix profile install github:javalsai/lidm
```
or try it out without installing by:
```sh
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 it's not valid config_
> [!NOTE]
> [service files](../assets/pkg/aur#services) **are** included and enabled

73
docs/PACKAGERS.md Normal file
View File

@@ -0,0 +1,73 @@
This is a guide listing all possible options packagers have to tweak behavior of lidm and the extra stuff to package.
# Components
If you want to package lidm for a distribution you have to package the binary and:
- Man pages ([`../assets/man/`](../assets/man/))
- Service files ([`../assets/services/`](../assets/services/))
- PAM (see [#preprocessor-defines](#preprocessor-defines))
- And optionally you can include some default themes in `/usr` ([`../themes/`](../themes/))
# Preprocessor Defines
Most of the behavior that can be tweaked using preprocessor `#define`s, to include some simply add `CPPFLAGS+='-D{{name}}={{value}}'` to your `make` command. e.g:
```sh
make \
CPPFLAGS+='-DSESSIONS_XSESSIONS=\"/var/empty\"' \
CPPFLAGS+='-DSESSIONS_WAYLAND=\"/var/empty\"'
```
The list of possible `#define`s is:
| Name | Default | Description | Env Override? |
| ---------------------- | ------------------------------- | -------------------------------------------------------------------------- | ------------------------ |
| `PAM_SERVICE_FALLBACK` | `"login"` | Name of the default PAM module to use. Defaults to the distro's `"login"`. | Yes (`LIDM_PAM_SERVICE`) |
| `SESSIONS_XSESSIONS` | `"/usr/share/xsessions"` | | No |
| `SESSIONS_WAYLAND` | `"/usr/share/wayland-sessions"` | | No |
| `LIDM_CONF_PATH` | `"/etc/lidm.ini"` | Path of the default configuration. | Yes (`LIDM_CONF`) |
# Other Build Settings
## Compiler
Lidm attempts to support being built by `gcc` and `clang` with preference over the first. However, if you wish to take advantage of LLVM's optimizations over GNU's you can change the compiler with `make CC=clang` or try any other compiler.
## Compiler Flags
Compiler flags should be passed with `CFLAGS`, its `-O3 -Wall` by default so adding anything will overwrite this.
## Build Metadata
`lidm -v` outputs some information about the build version, this can be weaked with `INFO_GIT_REV` and `INFO_BUILD_TS`, by default they are:
```make
INFO_GIT_REV?=$$(git describe --long --tags --always || echo '?')
INFO_BUILD_TS?=$$(date +%s)
```
But this can be changed by just passing those env variables, for example, in the case git is not applicable in the build environment of the package.
## Target Directory
`DESTDIR` can be used to for installation recipes to install on alternative root directories. Along with `PREFIX` (defaults to `/usr`) for systems which don't use the common `/usr` structure. e.g. `make install DESTDIR=$out PREFIX=`
```txt
$ fd -t f . --base-directory $out
bin/lidm
etc/lidm.ini
share/man/man1/lidm.1
share/man/man5/lidm-config.5
```
# Build Recipes for Packaging
To ease most of the installation process there's several `make` recipes to install man pages and service files, I encpurage you to check their source yourself, but:
- `make` / `make lidm`: Builds the app binary.
- `make install`: Attempts to install the binary, place a default config file in `/etc/lidm.ini` and install the man pages.
- `make install-service-(systemd|dinit|runit|openrc|s6)(|-etc)`: Just check the source, service files for different init systems and `-etc` variants for alternative paths.
- `make print-version`: Outputs the current version in the `Makefile` for scripts that might want to extract that info.
You can choose to use these packages or create your own service files / etc. There's are merely suggestions on what to use.

12
flake.lock generated
View File

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

View File

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

View File

@@ -3,10 +3,12 @@
#include <stdio.h> #include <stdio.h>
void log_init(FILE* fd); #include "macros.h"
void log_puts(const char* msg);
void log_printf(const char* fmt, ...); void log_init(FILE* NNULLABLE fd);
void log_puts(const char* NNULLABLE msg);
void log_printf(const char* NNULLABLE fmt, ...);
// NOLINTNEXTLINE(readability-identifier-length) // NOLINTNEXTLINE(readability-identifier-length)
void log_perror(const char* s); void log_perror(const char* NNULLABLE s);
#endif #endif

View File

@@ -1,6 +1,11 @@
#ifndef MACROSH_ #ifndef MACROSH_
#define 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?? // Do we just replace the compiler with clang??
#if defined(__clang__) #if defined(__clang__)
#define NULLABLE _Nullable #define NULLABLE _Nullable

View File

@@ -1,11 +1,11 @@
#ifndef UTILH_ #ifndef UTILH_
#define UTILH_ #define UTILH_
#include <bits/types/struct_timeval.h>
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <sys/time.h>
#include <sys/types.h> #include <sys/types.h>
#include "keys.h" #include "keys.h"
@@ -19,6 +19,7 @@ bool read_press_nb(u_char* length, char* out, struct timeval* tv);
bool utf8_iscont(char byte); bool utf8_iscont(char byte);
size_t utf8len(const char* str); size_t utf8len(const char* str);
size_t utf8len_until(const char* str, const char* until); size_t utf8len_until(const char* str, const char* until);
size_t utf8trunc(char* str, size_t n);
const char* utf8back(const char* str); const char* utf8back(const char* str);
const char* utf8seek(const char* str); const char* utf8seek(const char* str);
const char* utf8seekn(const char* str, size_t n); const char* utf8seekn(const char* str, size_t n);

View File

@@ -35,6 +35,10 @@ int pam_conversation(int num_msg, const struct pam_message** msg,
return PAM_SUCCESS; return PAM_SUCCESS;
} }
#ifndef PAM_SERVICE_FALLBACK
#define PAM_SERVICE_FALLBACK "login"
#endif
#define CHECK_PAM_RET(call) \ #define CHECK_PAM_RET(call) \
ret = (call); \ ret = (call); \
if (ret != PAM_SUCCESS) { \ if (ret != PAM_SUCCESS) { \
@@ -51,7 +55,11 @@ pam_handle_t* get_pamh(char* user, char* passwd) {
struct pam_conv pamc = {pam_conversation, (void*)passwd}; struct pam_conv pamc = {pam_conversation, (void*)passwd};
int ret; int ret;
CHECK_PAM_RET(pam_start("login", user, &pamc, &pamh)) char* pam_service_override = getenv("LIDM_PAM_SERVICE");
char* pam_service_name =
pam_service_override ? pam_service_override : PAM_SERVICE_FALLBACK;
CHECK_PAM_RET(pam_start(pam_service_name, user, &pamc, &pamh))
CHECK_PAM_RET(pam_authenticate(pamh, 0)) CHECK_PAM_RET(pam_authenticate(pamh, 0))
CHECK_PAM_RET(pam_acct_mgmt(pamh, 0)) CHECK_PAM_RET(pam_acct_mgmt(pamh, 0))
CHECK_PAM_RET(pam_setcred(pamh, PAM_ESTABLISH_CRED)) CHECK_PAM_RET(pam_setcred(pamh, PAM_ESTABLISH_CRED))
@@ -245,7 +253,7 @@ bool launch(char* user, char* passwd, struct session session, void (*cb)(void),
perror("execl error"); perror("execl error");
(void)fputs("failure calling session\n", stderr); (void)fputs("failure calling session\n", stderr);
} else { } else {
__pid_t child_pid = (__pid_t)pid; pid_t child_pid = (pid_t)pid;
waitpid(child_pid, NULL, 0); waitpid(child_pid, NULL, 0);
pam_setcred(pamh, PAM_DELETE_CRED); pam_setcred(pamh, PAM_DELETE_CRED);

View File

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

View File

@@ -66,7 +66,7 @@ int read_desktop(FILE* fd, void* ctx,
buf_start[eq_idx] = '\0'; // the equal buf_start[eq_idx] = '\0'; // the equal
key = trim_str(key); key = trim_str(key);
char* value = &buf_start[eq_idx + 1]; 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); value = trim_str(value);
// Callback // Callback

View File

@@ -32,7 +32,7 @@ void log_perror(const char* s) {
if (!logger_out) return; if (!logger_out) return;
if (s) if (s)
(void)fprintf(logger_out, "%s: %s", s, strerror(errno)); (void)fprintf(logger_out, "%s: %s\n", s, strerror(errno));
else else
(void)fprintf(logger_out, "%s", strerror(errno)); (void)fprintf(logger_out, "%s\n", strerror(errno));
} }

View File

@@ -72,9 +72,10 @@ int main(int argc, char* argv[]) {
chvt_str(argv[1]); chvt_str(argv[1]);
} }
// Copy
struct config config = DEFAULT_CONFIG; struct config config = DEFAULT_CONFIG;
char* conf_override = getenv("LIDM_CONF"); 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) { if (parse_config(&config, conf_path) != 0) {
(void)fputs("error parsing config\n", stderr); (void)fputs("error parsing config\n", stderr);
return 1; return 1;

View File

@@ -16,9 +16,16 @@ struct source_dir {
enum session_type type; enum session_type type;
char* dir; 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[] = { static const struct source_dir SOURCES[] = {
{XORG, "/usr/share/xsessions"}, {XORG, SESSIONS_XSESSIONS},
{WAYLAND, "/usr/share/wayland-sessions"}, {WAYLAND, SESSIONS_WAYLAND},
}; };
static struct Vector* cb_sessions = NULL; static struct Vector* cb_sessions = NULL;

View File

@@ -3,6 +3,7 @@
#include <asm-generic/errno.h> #include <asm-generic/errno.h>
#include <errno.h> #include <errno.h>
#include <limits.h>
#include <pwd.h> #include <pwd.h>
#include <signal.h> #include <signal.h>
#include <stdbool.h> #include <stdbool.h>
@@ -108,30 +109,22 @@ static char* fmt_time(const char* fmt) {
} }
} }
char* trunc_gethostname(const size_t MAXSIZE, const char* const ELLIPSIS) { char* trunc_gethostname(const size_t MAXLEN, const char* const ELLIPSIS) {
if (utf8len(ELLIPSIS) > MAXSIZE) return NULL; if (utf8len(ELLIPSIS) > MAXLEN) return NULL;
size_t alloc_size = MAXSIZE + 1; size_t alloc_size = HOST_NAME_MAX + strlen(ELLIPSIS) + 1;
char* buf = malloc(alloc_size); char* buf = malloc(alloc_size);
if (!buf) return NULL; if (!buf) return NULL;
while (true) {
if (gethostname(buf, alloc_size) == 0) return buf;
if (errno == ENAMETOOLONG) {
buf[alloc_size] = '\0';
if (utf8len(buf) > MAXSIZE - utf8len(ELLIPSIS)) {
strcpy(&buf[MAXSIZE - utf8len(ELLIPSIS)], ELLIPSIS);
return buf;
}
alloc_size *= 2; if (gethostname(buf, alloc_size) != 0) {
char* nbuf = realloc(buf, alloc_size); free(buf);
if (!nbuf) goto fail; return NULL;
buf = nbuf;
} else
goto fail;
} }
fail:
free(buf); if (utf8len(buf) > MAXLEN) {
return NULL; size_t end = utf8trunc(buf, MAXLEN - utf8len(ELLIPSIS));
strcpy(&buf[end], ELLIPSIS);
}
return buf;
} }
void ui_update_cursor_focus() { void ui_update_cursor_focus() {

View File

@@ -103,6 +103,24 @@ size_t utf8len_until(const char* str, const char* until) {
return len; return len;
} }
size_t utf8trunc(char* str, size_t n) {
size_t bytes = 0;
while (true) {
if (str[bytes] == '\0') break;
if (utf8_iscont(str[bytes])) {
bytes++;
continue;
}
if (n == 0) {
str[bytes] = '\0';
break;
}
bytes++;
n--;
}
return bytes;
}
const char* utf8back(const char* str) { const char* utf8back(const char* str) {
while (utf8_iscont(*(--str))) { while (utf8_iscont(*(--str))) {
} }