14 Commits

Author SHA1 Message Date
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
25 changed files with 293 additions and 148 deletions

View File

@@ -67,7 +67,8 @@ jobs:
apt-get update && \
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: 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
with:
@@ -94,7 +95,8 @@ jobs:
apt-get update && \
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: 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
with:
@@ -121,10 +123,39 @@ jobs:
apt-get update && \
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: 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
with:
name: build-riscv64
path: lidm-riscv64
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

@@ -30,14 +30,22 @@ jobs:
clangcheck:
name: Clang
runs-on: ubuntu-24.04
runs-on: ubuntu-latest
container:
image: ubuntu:25.04
steps:
- uses: actions/checkout@v4
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: "clang-format clang-tidy bear libpam0g-dev"
version: 1.0
- run: apt -y update && apt install -y clang-format clang-tidy make gcc git bear libpam0g-dev
- run: bear -- make
- run: clang-format -ni src/*.c include/*.h
- run: clang-tidy -p . src/*.c include/*.h
- run: clang-format -version && clang-format -dump-config
- 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

@@ -116,7 +116,7 @@ jobs:
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
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: |

View File

@@ -1,4 +1,4 @@
VERSION = 1.2.2
VERSION = 1.2.3
.DEFAULT_GOAL := lidm
CDIR=src
@@ -133,6 +133,7 @@ install-service-s6-etc:
pre-commit:
codespell
prettier --write "**/*.md"
find . -type f -name '*.sh' -not -path './assets/pkg/aur/*/src/*' | xargs shellcheck
clang-format -i $$(git ls-files "*.c" "*.h")
clang-tidy -p . $$(git ls-files "*.c" "*.h")

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)
> *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
* 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)
* 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).
- 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)
- 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).
# Index
# Table of Contents
* [LiDM](#lidm)
* [Features](#features)
* [WIP](#wip)
* [Index](#index)
* [Ideology](#ideology)
* [Usage](#usage)
* [Arguments](#arguments)
* [Program](#program)
* [Requirements](#requirements)
* [Installation](#installation)
* [Configuring](#configuring)
* [Contributing](#contributing)
* [Inspiration](#inspiration)
* [Contributors](#contributors)
- [Ideology](#ideology)
- [Usage](#usage)
- [Arguments](#arguments)
- [Program](#program)
- [Requirements](#requirements)
- [Installation](#installation)
- [Configuring](#configuring)
- [PAM](#pam)
- [Contributing](#contributing)
- [Inspiration](#inspiration)
- [Contributors](#contributors)
# 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)
> *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
@@ -56,25 +64,33 @@ If a single argument is provided (don't even do `--` or standard unix parsing...
Base (mostly intuitive):
* Use arrow keys to navigate the inputs and type over any of them to override the default value.
* 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.
- Use arrow keys to navigate the inputs and type over any of them to override the default value.
- 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.
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.
* 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.
- 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.
- Editing an option on a user or a shell session will put you in edit mode appending after the original value.
# Requirements
* 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.
* PAM library, used for user authentication, just what `login` or `su` use internally. Don't worry, it's surely pre-installed.
- 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.
- PAM library, used for user authentication, just what `login` or `su` use internally. Don't worry, it's surely pre-installed.
# 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
@@ -90,6 +106,12 @@ Colors are gonna be put inside `\x1b[...m`, if you don't know what this is check
> [!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.
# 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
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:
* Obviously it's inspired by `ly`. `ly-dm` leads to "lydm".
* 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.
* And the **la**ptop this project started in has a **lid**.
- Obviously it's inspired by `ly`. `ly-dm` leads to "lydm".
- 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.
- And the **la**ptop this project started in has a **lid**.
# 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)
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) 🔪
![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)
HSIZE=$(numfmt --to=iec-i<<<"$BSIZE")B
WARNS=$(
{ grep -E '^[^ ]+\.[ch]:[0-9]+:[0-9]+: [a-z]+:' /tmp/stderr || :; } \
| sed -E 's/^([^ ]+\.[ch]):([0-9]+):([0-9]+): ([a-z]+): (.*)$/::\4 file=\1,line=\2,col=\3::\5/'
sed -nE \
'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")

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:
* [`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-git`](https://aur.archlinux.org/packages/lidm-git): Fetches latest commit and builds it (should be updated automatically)
- [`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-git`](https://aur.archlinux.org/packages/lidm-git): Fetches latest commit and builds it (should be updated automatically)
> \[!IMPORTANT]
> None of those packages include the service files. [You have to do this yourself](../../services/README.md).

View File

@@ -1,6 +1,6 @@
pkgbase = lidm-bin
pkgdesc = A fully colorful customizable TUI display manager made in C. (release binary)
pkgver = 1.2.0
pkgver = 1.2.3
pkgrel = 1
url = https://github.com/javalsai/lidm
arch = x86_64
@@ -8,11 +8,11 @@ pkgbase = lidm-bin
depends = pam
provides = lidm
conflicts = lidm
source = lidm::https://github.com/javalsai/lidm/releases/download/v1.2.0/lidm-amd64
source = default-theme.ini::https://raw.githubusercontent.com/javalsai/lidm/v1.2.0/themes/default.ini
source = lidm.1::https://raw.githubusercontent.com/javalsai/lidm/v1.2.0/assets/man/lidm.1
source = lidm-config.5::https://raw.githubusercontent.com/javalsai/lidm/v1.2.0/assets/man/lidm-config.5
sha256sums = 6bf4403c21bd26607302d99d7bd1a129822e7d2506e949fb483ea445e022eb6d
source = lidm::https://github.com/javalsai/lidm/releases/download/v1.2.3/lidm-amd64
source = default-theme.ini::https://raw.githubusercontent.com/javalsai/lidm/v1.2.3/themes/default.ini
source = lidm.1::https://raw.githubusercontent.com/javalsai/lidm/v1.2.3/assets/man/lidm.1
source = lidm-config.5::https://raw.githubusercontent.com/javalsai/lidm/v1.2.3/assets/man/lidm-config.5
sha256sums = a533b5aee3ffe04268f8d3ff8d7eb87f09d31fbe25e1b8b1ed29c42ef465bd4b
sha256sums = ffaa5fe2cf5011bf53c90f81bfec8585158d35f72c0666db0bd4d3866ae041ca
sha256sums = 7f2fb91f55088be1a9b1c93ecf5d6c1e437f369b56df2eacc9d10b00c93c39f8
sha256sums = 0aa5755bdcc60ea80cd9ee0f89233ffaf22c6cee9db9da277274a62c6ed477d9

View File

@@ -1,7 +1,7 @@
# shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164
# Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm-bin
pkgver=1.2.0
pkgver=1.2.3
pkgrel=1
depends=('pam')
pkgdesc="A fully colorful customizable TUI display manager made in C. (release binary)"
@@ -16,7 +16,7 @@ source=(
"lidm.1::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/assets/man/lidm.1"
"lidm-config.5::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/assets/man/lidm-config.5"
)
sha256sums=('6bf4403c21bd26607302d99d7bd1a129822e7d2506e949fb483ea445e022eb6d'
sha256sums=('a533b5aee3ffe04268f8d3ff8d7eb87f09d31fbe25e1b8b1ed29c42ef465bd4b'
'ffaa5fe2cf5011bf53c90f81bfec8585158d35f72c0666db0bd4d3866ae041ca'
'7f2fb91f55088be1a9b1c93ecf5d6c1e437f369b56df2eacc9d10b00c93c39f8'
'0aa5755bdcc60ea80cd9ee0f89233ffaf22c6cee9db9da277274a62c6ed477d9')

View File

@@ -1,7 +1,7 @@
# shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164
# Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm-git
pkgver=1.2.0.r0.g7f75b8e
pkgver=1.2.3.r0.g7e1ec83
pkgrel=1
depends=('pam')
makedepends=('git' 'make' 'gcc')

View File

@@ -1,6 +1,6 @@
pkgbase = lidm
pkgdesc = A fully colorful customizable TUI display manager made in C. (build latest tag)
pkgver = 1.2.0
pkgver = 1.2.3
pkgrel = 1
url = https://github.com/javalsai/lidm
arch = any
@@ -8,7 +8,7 @@ pkgbase = lidm
makedepends = git
makedepends = gcc
depends = pam
source = tarball.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v1.2.0.tar.gz
sha256sums = 0dffded5fcef45cb45fe88358b0cba8de04f614e323a9c6e4162f84b6e3a50b6
source = tarball.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v1.2.3.tar.gz
sha256sums = 1ce414b510c5bbc3e32ea882f915b4d3958cb82eb1fbb5cf33e62f69c844bf93
pkgname = lidm

View File

@@ -1,7 +1,7 @@
# shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164
# Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm
pkgver=1.2.0
pkgver=1.2.3
pkgrel=1
depends=('pam')
makedepends=('git' 'gcc')
@@ -10,7 +10,7 @@ arch=('any')
url="https://github.com/javalsai/lidm"
license=('GPL')
source=("tarball.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v$pkgver.tar.gz")
sha256sums=('0dffded5fcef45cb45fe88358b0cba8de04f614e323a9c6e4162f84b6e3a50b6')
sha256sums=('1ce414b510c5bbc3e32ea882f915b4d3958cb82eb1fbb5cf33e62f69c844bf93')
build() {
tar -xzf "tarball.tar.gz"

View File

@@ -11,7 +11,7 @@ let
dmcfg = config.services.displayManager;
desktops = dmcfg.sessionData.desktops;
version = "1.2.2";
version = "1.2.3";
lidmPkg = pkgs.callPackage ./lidm.nix {
inherit pkgs;
config = {
@@ -21,7 +21,7 @@ let
owner = "javalsai";
repo = "lidm";
rev = "v${version}";
sha256 = "sha256-3CgUI8PUs4c1bfBrykPw87SSa4lzrh4E4Hug7cGRKFk=";
sha256 = "sha256-eKgBoh+bRcl2Y7oOxW77Kjtb9Ws2Xln1SenknIsGxD4=";
};
xsessions = "${desktops}/share/xsessions";

View File

@@ -13,30 +13,30 @@ The manual steps for installation are:
## Systemd
* Copy `systemd.service` to `/etc/systemd/system/lidm.service`
* To enable it you can run `systemctl enable lidm`
- Copy `systemd.service` to `/etc/systemd/system/lidm.service`
- To enable it you can run `systemctl enable lidm`
## Dinit
* Copy `dinit` to `/etc/dinit.d/lidm`
* To enable it, run `dinitctl enable lidm`
- Copy `dinit` to `/etc/dinit.d/lidm`
- To enable it, run `dinitctl enable lidm`
## Runit
* Copy `runit/` to `/etc/runit/sv/lidm/`
* Add the service with `ln -s /etc/runit/sv/lidm /run/runit/service`
* And to enable it `sv enable lidm`
- Copy `runit/` to `/etc/runit/sv/lidm/`
- Add the service with `ln -s /etc/runit/sv/lidm /run/runit/service`
- And to enable it `sv enable lidm`
## OpenRC
* Copy `openrc` to `/etc/init.d/lidm`
* Enable the service with `rc-update add lidm`
- Copy `openrc` to `/etc/init.d/lidm`
- Enable the service with `rc-update add lidm`
## S6
* Copy `s6/` to `/etc/s6/sv/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)
- Copy `s6/` to `/etc/s6/sv/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)
> [!WARNING]
> Make sure to disable any other service that might run on tty7, such us lightdm or most display managers out there.

View File

@@ -2,9 +2,10 @@
Contributions are welcome! Here's how you can help:
* [Contributing code](#code)
* [Reporting issues](#issues)
* [Other](#other)
- [Contributing](#contributing)
- [Code](#code)
- [Issues](#issues)
- [Other](#other)
## 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.
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`)
* Implement your feature.
* Check your code works as expected.
* 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.
* If you prefer, you can run `make pre-commit` to run several code style checks like the avobe along a few extra stuff.
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`)
- Implement your feature.
- Check your code works as expected.
- 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.
- 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:
* Commit messages should:
* Header line: explain the commit in one line (use the imperative) ("feat" for features, "fix", "style", "chore", "docs", etc)
* Be descriptive.
* 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"
- Commit messages should:
- Header line: explain the commit in one line (use the imperative) ("feat" for features, "fix", "style", "chore", "docs", etc)
- Be descriptive.
- 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"
4. Once you are happy with your changes, submit a 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)
- 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)
## Issues
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:
* Screenshots.
* Ways to reproduce the issue.
* Your lidm version.
* Your platform (e.g. arch linux or Ubuntu 15.04 x64) and init system if you know.
- Screenshots.
- Ways to reproduce the issue.
- Your lidm version.
- 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.

View File

@@ -1,6 +1,5 @@
# Index
# Table of Contents
- [Index](#index)
- [Installing from Source](#installing-from-source)
- [AUR](#aur)
- [Nix Flake](#nix-flake)
@@ -30,7 +29,7 @@ Then you can install the files onto your filesystem with:
make install
```
And additionally, to install service files (start-up behavior). <sup>[more docs](./assets/services/README.md)</sup>
And additionally, to install service files (start-up behavior). <sup>[more docs](../assets/services/README.md)</sup>
```sh
# automatically detects your init system
@@ -53,10 +52,10 @@ make install-service-s6-etc # s6 (/etc/s6/sv)
# AUR
[AUR packages](https://aur.archlinux.org/packages?K=lidm\&SeB=n) will automatically install most files.
[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.
> [service files](../assets/pkg/aur#services) have to be manually installed by now.
# Nix Flake
@@ -73,7 +72,7 @@ nix run github:javalsai/lidm
```
> [!CAUTION]
> This doesn't include [service files](./assets/pkg/aur#services) neither
> This doesn't include [service files](../assets/pkg/aur#services) neither
# Nix Module
@@ -99,9 +98,9 @@ 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
- 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:
- An attribute tree with the same names as the config file, e.g:
```nix
with config.lidm.keysEnum; {
@@ -123,8 +122,7 @@ with config.lidm.keysEnum; {
};
```
> *it's not necessary to cover all keys and anything can be put there, even if
> its not valid config*
> _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
> [service files](../assets/pkg/aur#services) **are** included and enabled

62
docs/PACKAGERS.md Normal file
View File

@@ -0,0 +1,62 @@
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.
## 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.

View File

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

View File

@@ -1,11 +1,11 @@
#ifndef UTILH_
#define UTILH_
#include <bits/types/struct_timeval.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.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);
size_t utf8len(const char* str);
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* utf8seek(const char* str);
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;
}
#ifndef PAM_SERVICE_FALLBACK
#define PAM_SERVICE_FALLBACK "login"
#endif
#define CHECK_PAM_RET(call) \
ret = (call); \
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};
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_acct_mgmt(pamh, 0))
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");
(void)fputs("failure calling session\n", stderr);
} else {
__pid_t child_pid = (__pid_t)pid;
pid_t child_pid = (pid_t)pid;
waitpid(child_pid, NULL, 0);
pam_setcred(pamh, PAM_DELETE_CRED);

View File

@@ -243,7 +243,7 @@ int parse_config(struct config* NNULLABLE config, char* NNULLABLE path) {
if (fd == NULL) {
log_perror("fopen");
log_printf(" [I] No config, place one at " LIDM_CONF_PATH
" or set the LIDM_CONF env variable");
" or set the LIDM_CONF env variable\n");
return 0; // Its fine now anyways
}

View File

@@ -66,8 +66,7 @@ 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];
if(buf_start[read_size - 1] == '\n')
buf_start[read_size - 1] = '\0';
if (buf_start[read_size - 1] == '\n') buf_start[read_size - 1] = '\0';
value = trim_str(value);
// Callback

View File

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

View File

@@ -3,6 +3,7 @@
#include <asm-generic/errno.h>
#include <errno.h>
#include <limits.h>
#include <pwd.h>
#include <signal.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) {
if (utf8len(ELLIPSIS) > MAXSIZE) return NULL;
size_t alloc_size = MAXSIZE + 1;
char* trunc_gethostname(const size_t MAXLEN, const char* const ELLIPSIS) {
if (utf8len(ELLIPSIS) > MAXLEN) return NULL;
size_t alloc_size = HOST_NAME_MAX + strlen(ELLIPSIS) + 1;
char* buf = malloc(alloc_size);
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;
char* nbuf = realloc(buf, alloc_size);
if (!nbuf) goto fail;
buf = nbuf;
} else
goto fail;
if (gethostname(buf, alloc_size) != 0) {
free(buf);
return NULL;
}
fail:
free(buf);
return NULL;
if (utf8len(buf) > MAXLEN) {
size_t end = utf8trunc(buf, MAXLEN - utf8len(ELLIPSIS));
strcpy(&buf[end], ELLIPSIS);
}
return buf;
}
void ui_update_cursor_focus() {

View File

@@ -103,6 +103,24 @@ size_t utf8len_until(const char* str, const char* until) {
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) {
while (utf8_iscont(*(--str))) {
}