22 Commits

Author SHA1 Message Date
grialion
583ff1ae0c chore: clang-format 2026-01-17 17:18:38 +01:00
grialion
9253381d72 fix: fflush(NULL) before fork 2026-01-17 17:15:04 +01:00
grialion
424b3930a2 fix(launch-state): replace last newline with nullbyte 2026-01-17 17:12:16 +01:00
grialion
9ce7cd61e1 fix: search Xorg binary in PATH 2026-01-17 17:11:23 +01:00
grialion
b0d0a2e890 fix: use pid_t for compatibility
pid_t is supported on musl, unlike __pid_t
2026-01-17 13:09:37 +01:00
grialion
ded6a119b0 fix: clang warnings 2026-01-17 12:43:45 +01:00
grialion
d07395c325 fix: handle SIGTERM for graceful graphical shutdown
Sending SIGTERM to X.org is necessary to avoid graphical lock-up.
2026-01-17 12:34:05 +01:00
grialion
e615968a17 chore: clang-format 2026-01-17 11:45:33 +01:00
grialion
d65ed54578 fix: color reset after returning from session 2026-01-17 11:45:03 +01:00
grialion
b2019c7934 feat: wait for X DISPLAY before starting session
Launch X.org with a pipe fd where it will output the DISPLAY number,
once ready.
2026-01-17 11:40:49 +01:00
grialion
2dfd2e5eaf fix(desktop_exec): skip resolving absolute paths
Previously it'd try to find the absolute binary path in the path env.
2026-01-16 22:06:22 +01:00
9cfe00c197 fix: pass clang-tidy 2026-01-16 01:03:32 +01:00
5749263605 bodge: shut linter 2026-01-16 00:51:05 +01:00
e5c3c619c3 Merge branch 'master' into support-xorg 2026-01-16 00:44:58 +01:00
64a1368717 feat: xorg sessions work
leaves a few TODOs:
* error handling
* properly passing VT around
* `wait_for_x_ready`
* allow compile-time overriding `DEFAULT_XORG_DISPLAY` and `XORG_COMMAND`
2025-09-03 14:50:39 +02:00
570a68c586 fix: satify all clang code requirements 2025-08-27 22:21:21 +02:00
ff3e58ee5b fix: satify clang nullability requirements 2025-08-27 22:07:04 +02:00
109c9bd0be chore: organize code
add -Wextra by default
pipefd to communicate better with parent and forked process
rustify some stuff
add the desktop parser to the file read
2025-08-27 22:02:14 +02:00
056ec64bcb feat: better spawn error handling 2025-08-27 20:29:16 +02:00
b58bd50e64 perf: some compiler flag optimizations
https://stackoverflow.com/questions/6687630/how-to-remove-unused-c-c-symbols-with-gcc-and-ld
2025-08-27 19:54:24 +02:00
6d9107b360 lint: stricter casing rules 2025-08-27 19:47:19 +02:00
b56aa19671 chore: modularize PAM
also helps with sanitizing the code flow when spawning the child, more
code though
2025-08-27 19:31:46 +02:00
30 changed files with 204 additions and 367 deletions

2
.gitignore vendored
View File

@@ -8,3 +8,5 @@ valgrind-out.txt
# nix build result
result
include/version.h

View File

@@ -1,10 +0,0 @@
<!-- Unspecified dates shall be in CET/CEST -->
<!-- Add only very relevant changes, bottom to top -->
<!-- By "very relevant" I mean big features or something manual packagers should know, like leftover files -->
<!-- Once a release would be opened, group the last bunch of dangling changes, add release version as header and its date -->
- Most stuff (most of `/etc` being a notable exception) now installs to `/usr/local` by default, check [`docs/PACKAGERS.md`](./docs/PACKAGERS.md).
- Added a changelog.
- Finally add proper (experimental) xorg support.
- Systemd service install path changed to `/usr/local/lib/systemd`, there could be a leftover file at `/etc/systemd/system/lidm.service`.

124
Makefile
View File

@@ -1,4 +1,4 @@
VERSION = 2.0.0
VERSION = 1.2.3
.DEFAULT_GOAL := lidm
CDIR=src
@@ -6,27 +6,36 @@ LDIR = lib
IDIR=include
ODIR=dist
PREFIX = /usr/local
INFO_GIT_REV ?= $(shell git describe --long --tags --always || echo '?')
INFO_BUILD_TS ?= $(shell date +%s)
PREFIX=/usr
CC?=gcc
CFLAGS?=-O3 -Wall -Wextra -fdata-sections -ffunction-sections
# C PreProcessor flags, not C Plus Plus
CPPFLAGS?=
_DFLAGS?= \
-DLIDM_VERSION=\"$(VERSION)\" \
-DLIDM_GIT_REV=\"$(INFO_GIT_REV)\" \
-DLIDM_BUILD_TS=$(INFO_BUILD_TS)
ALLFLAGS = $(_DFLAGS) $(CFLAGS) $(CPPFLAGS) -I$(IDIR)
ALLFLAGS=$(CFLAGS) $(CPPFLAGS) -I$(IDIR)
LDFLAGS?=-Wl,--gc-sections
LIBS=-lpam
# includes all headers in `$(IDIR)` and compiles everything in `$(CDIR)`
DEPS = $(wildcard $(IDIR)/*.h)
_SOURCES = $(notdir $(wildcard $(CDIR)/*.c))
OBJ = $(patsubst %.c,$(ODIR)/%.o,$(_SOURCES))
_DEPS = version.h log.h util.h ui.h ui_state.h config.h pam.h desktop.h desktop_exec.h auth.h ofield.h efield.h keys.h users.h sessions.h chvt.h macros.h launch_state.h signal_handler.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = main.o log.o util.o ui.o ui_state.o config.o pam.o desktop.o desktop_exec.o auth.o ofield.o efield.o users.o sessions.o chvt.o launch_state.o signal_handler.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
INFO_GIT_REV?=$$(git describe --long --tags --always || echo '?')
INFO_BUILD_TS?=$$(date +%s)
$(IDIR)/version.h: Makefile
@tmp=$$(mktemp); \
printf '' > $$tmp; \
echo '#define LIDM_VERSION "'$(VERSION)'"' >> $$tmp; \
echo '#define LIDM_GIT_REV "'$(INFO_GIT_REV)'"' >> $$tmp; \
echo '#define LIDM_BUILD_TS '$(INFO_BUILD_TS) >> $$tmp; \
if ! cmp -s $$tmp $@; then \
mv $$tmp $@; \
fi; \
rm -f $$tmp;
$(ODIR)/%.o: $(CDIR)/%.c $(DEPS)
@mkdir -p $(ODIR)
@@ -38,6 +47,7 @@ lidm: $(OBJ)
clean:
rm -f $(ODIR)/*.o lidm
# Copy lidm to ${DESTDIR}${PREFIX}/bin (/usr/bin)
install: lidm
mkdir -p ${DESTDIR}${PREFIX}/bin ${DESTDIR}${PREFIX}/share/man/man{1,5}
install -Dm755 ./lidm ${DESTDIR}${PREFIX}/bin/
@@ -45,11 +55,83 @@ install: lidm
install -Dm644 ./assets/man/lidm.1 ${DESTDIR}${PREFIX}/share/man/man1/
install -Dm644 ./assets/man/lidm-config.5 ${DESTDIR}${PREFIX}/share/man/man5/
uninstall: uninstall-service
uninstall:
rm -rf ${DESTDIR}${PREFIX}/bin/lidm ${DESTDIR}/etc/lidm.ini
rm -rf ${DESTDIR}${PREFIX}/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 ${DESTDIR}/usr/local/lib/systemd/system/lidm.service ${DESTDIR}/etc/dinit.d/lidm ${DESTDIR}/etc/runit/sv/lidm
include services.mk
install-service:
@if command -v systemctl &> /dev/null; then \
make install-service-systemd; \
elif command -v dinitctl &> /dev/null; then \
make install-service-dinit; \
elif command -v sv &> /dev/null; then \
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 \
make install-service-openrc; \
elif command -v s6-service &> /dev/null; then \
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 \
printf '\033[1;31m%s\033[0m\n' "Unknown init system, skipping service install..." >&2; \
fi
install-service-systemd:
install -m644 ./assets/services/systemd.service ${DESTDIR}/usr/local/lib/systemd/system/lidm.service
@printf '\033[1m%s\033[0m\n\n' " don't forget to run 'systemctl enable lidm'"
install-service-dinit:
install -m644 ./assets/services/dinit ${DESTDIR}/etc/dinit.d/lidm
@printf '\033[1m%s\033[0m\n\n' " don't forget to run 'dinitctl enable lidm'"
install-service-runit:
@if [ ! -e /etc/sv ] && [ -d /etc/runit/sv ] && [ -z "$FORCE" ]; then \
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 -m755 ./assets/services/openrc ${DESTDIR}/etc/init.d/lidm
@printf '\033[1m%s\033[0m\n\n' " don't forget to run 'rc-update add lidm'"
install-service-s6:
@if [ ! -e /etc/sv ] && [ -d /etc/s6/sv ] && [ -z "$FORCE" ]; then \
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:
codespell
@@ -65,5 +147,13 @@ print-version:
.PHONY: clean \
install uninstall \
install-service \
install-service-s6 \
install-service-s6-etc \
install-service-dinit \
install-service-runit \
install-service-runit-etc \
install-service-openrc \
install-service-systemd \
pre-commit \
print-version

View File

@@ -15,16 +15,12 @@ LiDM is like any [Display Manager](https://en.wikipedia.org/wiki/X_display_manag
shown as in a featured terminal emulator, actual linux console doesn't support as much color and decorations
</i></summary>
If you want to add fancy color and font support to your TTYs you can try wrapping lidm in [`kmscon`](https://wiki.archlinux.org/title/KMSCON). (edit appropriate service files). e.g:
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
```
Kmscon is NOT officially supported so you are on your own when trying this, [according to the arch wiki](https://wiki.archlinux.org/title/KMSCON#Window_managers_cannot_be_started_from_KMS_console) it's not possible to start window managers if you do this.
But [according to farouk](https://github.com/javalsai/lidm/issues/91#issuecomment-3708503568) you can make it work if you tell kmscon to work in `no-drm` mode. There's still input grabbing issues which cause <kbd><kbd>Ctrl</kbd> + <kbd>C</kbd></kbd> to kill lidm, they are likely fixable though.
</details></blockquote>
> _however, all colors and strings are fully customizable_
@@ -33,7 +29,7 @@ But [according to farouk](https://github.com/javalsai/lidm/issues/91#issuecommen
- Simple as C, meant to depend only on standard libc and basic unix system headers.
- Fully customizable: ALL strings, colors (with its ANSI keys) and most behavior.
- Experimental Xorg support[\*](https://github.com/javalsai/lidm/pull/80?#issuecomment-3764073217) and wayland sessions, while supporting the default user shell (if enabled in config)
- Xorg[\*](https://github.com/javalsai/lidm/issues/79) and wayland sessions, while supporting the default user shell (if enabled in config)
- Init agnostinc (systemd, dinit, runit, openrc and s6).
- Supports [fido yubikeys](./docs/yubikey.md) (via pam_u2f).
@@ -48,7 +44,6 @@ But [according to farouk](https://github.com/javalsai/lidm/issues/91#issuecommen
- [Configuring](#configuring)
- [PAM](#pam)
- [Contributing](#contributing)
- [License](#license)
- [Inspiration](#inspiration)
- [Contributors](#contributors)
@@ -122,10 +117,6 @@ When the env variable is empty it defaults to the `login` PAM service or whateve
If you want to contribute check the [contribution guide](docs/CONTRIBUTING.md).
# License
This project is licensed under the GNU General Public License v3.0 **only**.
# Inspiration
This project was started after facing some issues building [ly](https://github.com/fairyglade/ly) on an ancient laptop, the UI is heavily inspired by it.

View File

@@ -1,16 +1,15 @@
pkgbase = lidm-bin
pkgdesc = A fully colorful customizable TUI display manager made in C. (release binary)
pkgver = 1.2.3
pkgrel = 4
pkgrel = 3
url = https://github.com/javalsai/lidm
arch = x86_64
arch = i686
arch = aarch64
arch = armv7h
arch = riscv64
license = GPL-3.0-only
license = GPL
depends = libpam.so
depends = lidm-service
provides = lidm
conflicts = lidm
source = lidm-default-theme-1.2.3.ini::https://raw.githubusercontent.com/javalsai/lidm/v1.2.3/themes/default.ini

View File

@@ -2,12 +2,12 @@
# Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm-bin
pkgver=1.2.3
pkgrel=4
depends=('libpam.so' 'lidm-service')
pkgrel=3
depends=('libpam.so')
pkgdesc="A fully colorful customizable TUI display manager made in C. (release binary)"
arch=('x86_64' 'i686' 'aarch64' 'armv7h' 'riscv64')
url="https://github.com/javalsai/lidm"
license=('GPL-3.0-only')
license=('GPL')
provides=('lidm')
conflicts=('lidm')
source=(

View File

@@ -1,12 +0,0 @@
pkgbase = lidm-dinit
pkgdesc = A fully colorful customizable TUI display manager made in C. (dinit service files)
pkgver = 1.2.3
pkgrel = 1
url = https://github.com/javalsai/lidm
arch = any
license = GPL-3.0-only
provides = lidm-service
source = lidm-dinit-1.2.3-dinit::https://raw.githubusercontent.com/javalsai/lidm/v1.2.3/assets/services/dinit
sha256sums = 185cd76c1d29ddc73cf96be999f13278a427bb80aa9169f25f30673ad2de3770
pkgname = lidm-dinit

View File

@@ -1,3 +0,0 @@
*
!PKGBUILD
!.SRCINFO

View File

@@ -1,17 +0,0 @@
# shellcheck disable=SC2034,SC2154,SC2164
# Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm-dinit
pkgver=1.2.3
pkgrel=1
pkgdesc="A fully colorful customizable TUI display manager made in C. (dinit service files)"
provides=('lidm-service')
arch=('any')
url="https://github.com/javalsai/lidm"
license=('GPL-3.0-only')
source=("${pkgname}-${pkgver}-dinit::https://raw.githubusercontent.com/javalsai/lidm/v1.2.3/assets/services/dinit")
sha256sums=('185cd76c1d29ddc73cf96be999f13278a427bb80aa9169f25f30673ad2de3770')
package() {
cd "$srcdir"
install -Dm0644 "${pkgname}-${pkgver}-dinit" "$pkgdir/etc/dinit.d/lidm"
}

View File

@@ -1,13 +1,12 @@
pkgbase = lidm-git
pkgdesc = A fully colorful customizable TUI display manager made in C. (last git commit)
pkgver = 1.2.3.r12.g7e7a297
pkgrel = 1
pkgver = 1.2.3.r3.g363deea
pkgrel = 3
url = https://github.com/javalsai/lidm
arch = any
license = GPL-3.0-only
license = GPL
makedepends = git
depends = pam
depends = lidm-service
provides = lidm
conflicts = lidm
source = lidm::git+https://github.com/javalsai/lidm

View File

@@ -1,14 +1,14 @@
# shellcheck disable=SC2034,SC2154,SC2164
# Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm-git
pkgver=1.2.3.r13.g9cf5297
pkgrel=1
depends=('pam' 'lidm-service')
pkgver=1.2.3.r3.g363deea
pkgrel=3
depends=('pam')
makedepends=('git')
pkgdesc="A fully colorful customizable TUI display manager made in C. (last git commit)"
arch=('any')
url="https://github.com/javalsai/lidm"
license=('GPL-3.0-only')
license=('GPL')
provides=('lidm')
conflicts=('lidm')
source=("lidm::git+https://github.com/javalsai/lidm")

View File

@@ -1,12 +0,0 @@
pkgbase = lidm-systemd
pkgdesc = A fully colorful customizable TUI display manager made in C. (systemd service files)
pkgver = 1.2.3
pkgrel = 1
url = https://github.com/javalsai/lidm
arch = any
license = GPL-3.0-only
provides = lidm-service
source = lidm-systemd-1.2.3-systemd::https://raw.githubusercontent.com/javalsai/lidm/v1.2.3/assets/services/systemd.service
sha256sums = e63464441a97102194994adc82159871ccd3f23d5e97224f21a460e4296364cc
pkgname = lidm-systemd

View File

@@ -1,3 +0,0 @@
*
!PKGBUILD
!.SRCINFO

View File

@@ -1,17 +0,0 @@
# shellcheck disable=SC2034,SC2154,SC2164
# Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm-systemd
pkgver=1.2.3
pkgrel=1
pkgdesc="A fully colorful customizable TUI display manager made in C. (systemd service files)"
provides=('lidm-service')
arch=('any')
url="https://github.com/javalsai/lidm"
license=('GPL-3.0-only')
source=("${pkgname}-${pkgver}-systemd::https://raw.githubusercontent.com/javalsai/lidm/v1.2.3/assets/services/systemd.service")
sha256sums=('e63464441a97102194994adc82159871ccd3f23d5e97224f21a460e4296364cc')
package() {
cd "$srcdir"
install -Dm0644 "${pkgname}-${pkgver}-systemd" "$pkgdir/usr/lib/systemd/system/lidm.service"
}

View File

@@ -1,12 +1,11 @@
pkgbase = lidm
pkgdesc = A fully colorful customizable TUI display manager made in C. (build latest tag)
pkgver = 1.2.3
pkgrel = 5
pkgrel = 3
url = https://github.com/javalsai/lidm
arch = any
license = GPL-3.0-only
license = GPL
depends = pam
depends = lidm-service
source = lidm-1.2.3.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v1.2.3.tar.gz
sha256sums = 1ce414b510c5bbc3e32ea882f915b4d3958cb82eb1fbb5cf33e62f69c844bf93

View File

@@ -2,13 +2,13 @@
# Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm
pkgver=1.2.3
pkgrel=5
depends=('pam' 'lidm-service')
pkgrel=3
depends=('pam')
makedepends=()
pkgdesc="A fully colorful customizable TUI display manager made in C. (build latest tag)"
arch=('any')
url="https://github.com/javalsai/lidm"
license=('GPL-3.0-only')
license=('GPL')
source=("${pkgname}-${pkgver}.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v$pkgver.tar.gz")
sha256sums=('1ce414b510c5bbc3e32ea882f915b4d3958cb82eb1fbb5cf33e62f69c844bf93')

View File

@@ -5,7 +5,7 @@ MYSELF=$(realpath "$0")
MYDIR=$(dirname "$MYSELF")
cd "$MYDIR"
typeset -a pkgs=(lidm{,-git,-bin,-systemd,-dinit})
typeset -a pkgs=(lidm{,-git,-bin})
for pkg in "${pkgs[@]}"; do
printf "\x1b[mEntering '%s'\x1b[0m\n" "$pkg"

View File

@@ -5,7 +5,7 @@ MYSELF=$(realpath "$0")
MYDIR=$(dirname "$MYSELF")
cd "$MYDIR"
typeset -a pkgs=(lidm{,-git,-bin,-systemd,-dinit})
typeset -a pkgs=(lidm{,-git,-bin})
for pkg in "${pkgs[@]}"; do
printf "\x1b[mEntering '%s'\x1b[0m\n" "$pkg"

View File

@@ -11,7 +11,7 @@ fi
version="$1"
printf "\x1b[34mINF: Using '%s' version\x1b[0m\n" "$version"
for pkg in "$MYDIR"/lidm{,-bin,-systemd,-dinit}/; do
for pkg in "$MYDIR"/lidm{,-bin}/; do
cd "$pkg"
printf "\x1b[1mEntering '%s'\x1b[0m\n" "$pkg"
sed -i "s/pkgver=.*/pkgver=$1/" PKGBUILD

View File

@@ -2,17 +2,18 @@
This folder contains the files necessary to set up lidm on start up for the supported init systems, all of them are configured for tty7.
If you're using lidm from a packaged source, this should be included with the package. Only read this for manual installations, if you are packaging or if your package exceptionally doesn't include them.
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` (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:
> [!IMPORTANT]
> If you think this should be packaged too, there's [a discussion](https://github.com/javalsai/lidm/discussions/39) to talk about this.
## Systemd
- Copy `systemd.service` to `/usr/local/lib/systemd/system/lidm.service` (if the directory doesn't exist, create it first) or `/usr/lib/systemd/system/lidm.service` (if you wish to install along your system files).
- Copy `systemd.service` to `/usr/local/lib/systemd/system/lidm.service` (if the directory doesn't exist, create it first)
- To enable it you can run `systemctl enable lidm`
## Dinit
@@ -22,10 +23,8 @@ The manual steps for installation are:
## Runit
Your runit service path can be either `/etc/runit/sv` or `/etc/sv`.
- Copy `runit/` to `runit-path/lidm/`
- Add the service with `ln -s runit-path/lidm /run/runit/service`
- 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
@@ -35,9 +34,7 @@ Your runit service path can be either `/etc/runit/sv` or `/etc/sv`.
## S6
Your S6 service path can be either `/etc/s6/sv` or `/etc/sv`.
- Copy `s6/` to `s6-path/lidm/`
- 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)

View File

@@ -11,7 +11,6 @@ StandardError=tty
TTYPath=/dev/tty7
TTYReset=yes
TTYVHangup=yes
Restart=always
[Install]
Alias=display-manager.service

View File

@@ -1,73 +1,63 @@
# Table of Contents
- [Packages](#packages)
- [Void Linux](#void-linux)
- [Fedora](#fedora)
- [Installing from Source](#installing-from-source)
- [AUR](#aur)
- [Nix Flake](#nix-flake)
- [Nix Module](#nix-module)
- [Installing from Source](#installing-from-source)
# Packages
> [!CAUTION]
> I encourage you to read the manual installation steps to understand what will get installed in your computer by this package.
Lidm relies on its community to package lidm for distributions and make the installation easier for everyone. Please raise any issues on the packages themselves and not the source repository.
# Installing from Source
If you packaged lidm for any distribution not listed here or keep your own version of an inactive package, feel free to contact me to be added here. (could be a GitHub discussion or an email if you don't use GitHub)
Firstly, you'll need to build the package, this also includes man pages, default config, themes and other files you might need.
These packages just install lidm, once installed you have to enable it. It depends on your init system, but if you're using systemd (most likely), first find your currently active display manager (if any, examples are `sddm`, `gdm`, `ly`) and disable it:
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
systemctl disable <display manager name here>
git clone https://github.com/javalsai/lidm.git
cd lidm
make # 👍
```
And then enable lidm:
> [!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
systemctl enable lidm
make install
```
Lidm now should show on the next boot!
If you are on a TTY and don't wish to reboot, you should be able to use `--now` with both commands. It's likely to kill your current desktop environment if it was launched from it.
## Void Linux
Lidm can be installed from the official Void Linux packages:
And additionally, to install service files (start-up behavior). <sup>[more docs](../assets/services/README.md)</sup>
```sh
xbps-install lidm
# 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
```
To enable the service that starts on boot:
# AUR
```sh
ln -s /etc/sv/lidm /var/service/
```
[AUR packages](https://aur.archlinux.org/packages?K=lidm&SeB=n) will automatically install most files.
It is recommended to disable any other display managers that are still enabled:
> [!CAUTION]
> [service files](../assets/pkg/aur#services) have to be manually installed by now.
```sh
touch /etc/sv/lightdm/down # replace lightdm with your previous display manager (e.g., sddm, gdm)
```
## Fedora
Thanks to @KernelFreeze there's a COPR repo available at <https://copr.fedorainfracloud.org/coprs/celestelove/lidm/> to install lidm. (<https://github.com/javalsai/lidm/discussions/92>)
## AUR
There are several [AUR packages](https://aur.archlinux.org/packages?K=lidm&SeB=n) for most things. You only need to install one of the following:
* `lidm`
* `lidm-bin`
* `lidm-git`
Each of those depend on `lidm-service` which is provided by `lidm-systemd` and `lidm-dinit` (you'll have to pick one). I maintain both but I'm open to anyone that actually uses systemd to take the first one.
There's packagers needed for openrc, s6 and runit. If you know how to make AUR packages, feel free to take any of those if you use each init system.
## Nix Flake
# Nix Flake
You can install by doing
@@ -82,9 +72,9 @@ nix run github:javalsai/lidm
```
> [!CAUTION]
> This doesn't include [service files](../assets/pkg/aur#services)
> This doesn't include [service files](../assets/pkg/aur#services) neither
## Nix Module
# Nix Module
<details>
<summary>Sidenote</summary>
@@ -136,47 +126,3 @@ with config.lidm.keysEnum; {
> [!NOTE]
> [service files](../assets/pkg/aur#services) **are** included and enabled
# 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 are 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
```
This will install mostly into `/usr/local` by default, this path is mostly unused nowadays (systemd can load services from it but man usually doesn't find manual pages in there) and could feel like lidm didn't install at all. You can add `PREFIX=/usr` to install along the rest of your system packages if you wish.
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
```

View File

@@ -22,12 +22,10 @@ make \
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_XSESSIONS_LOCAL` | `"/usr/local/share/xsessions"` | | No |
| `SESSIONS_WAYLAND` | `"/usr/share/wayland-sessions"` | | No |
| `SESSIONS_WAYLAND_LOCAL` | `"/usr/local/share/wayland-sessions"` | | No |
| `LIDM_CONF_PATH` | `"/etc/lidm.ini"` | Path of the default configuration. | Yes (`LIDM_CONF`) |
# Other Build Settings
@@ -53,9 +51,7 @@ But this can be changed by just passing those env variables, for example, in the
## Target Directory
`DESTDIR` can be used to for installation recipes to install on alternative root directories. Along with `PREFIX` (defaults to `/usr/local`, packaging this you'll probably want to make it `/usr`) for systems which don't use the common `/usr` structure. e.g. `make install DESTDIR=$out PREFIX=`
`/etc` is sometimes in that `PREFIX` and sometimes not, be careful.
`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
@@ -71,7 +67,7 @@ To ease most of the installation process there's several `make` recipes to insta
- `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. You might need `FORCE=1` in the environment if you are packaging for other init system or scripting.
- `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

@@ -1,8 +1,3 @@
#ifndef SIGNALHANDLERH_
#define SIGNALHANDLERH_
// handle SIGTERM by sending SIGTERM to all children, resulting
// in a graceful graphical shutdown
void setup_sigterm();
#endif /* SIGNALHANDLERH_ */

View File

@@ -1,90 +0,0 @@
install-service:
@if command -v systemctl &> /dev/null; then \
make install-service-systemd; \
elif command -v dinitctl &> /dev/null; then \
make install-service-dinit; \
elif command -v sv &> /dev/null; then \
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 \
make install-service-openrc; \
elif command -v s6-service &> /dev/null; then \
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 \
printf '\033[1;31m%s\033[0m\n' "Unknown init system, skipping service install..." >&2; \
fi
install-service-systemd:
install -Dm644 ./assets/services/systemd.service ${DESTDIR}${PREFIX}/lib/systemd/system/lidm.service
@printf '\033[1m%s\033[0m\n\n' " don't forget to run 'systemctl enable lidm'"
install-service-dinit:
install -m644 ./assets/services/dinit ${DESTDIR}/etc/dinit.d/lidm
@printf '\033[1m%s\033[0m\n\n' " don't forget to run 'dinitctl enable lidm'"
install-service-runit:
@if [ ! -e /etc/sv ] && [ -d /etc/runit/sv ] && [ -z "$$FORCE" ]; then \
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 -m755 ./assets/services/openrc ${DESTDIR}/etc/init.d/lidm
@printf '\033[1m%s\033[0m\n\n' " don't forget to run 'rc-update add lidm'"
install-service-s6:
@if [ ! -e /etc/sv ] && [ -d /etc/s6/sv ] && [ -z "$$FORCE" ]; then \
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'"
uninstall-service:
rm -rf \
${DESTDIR}${PREFIX}/lib/systemd/system/lidm.service \
${DESTDIR}/etc/dinit.d/lidm \
${DESTDIR}/etc/sv/lidm \
${DESTDIR}/etc/runit/sv/lidm \
${DESTDIR}/etc/init.d/lidm \
${DESTDIR}/etc/s6/sv/lidm
.PHONY: install-service uninstall-service \
install-service-s6 \
install-service-s6-etc \
install-service-dinit \
install-service-runit \
install-service-runit-etc \
install-service-openrc \
install-service-systemd

View File

@@ -16,6 +16,7 @@
#include "ui.h"
#include "users.h"
#include "util.h"
#include "version.h"
#define DATESTR_MAXBUFSIZE 0x20

View File

@@ -22,19 +22,13 @@ struct source_dir {
#ifndef SESSIONS_XSESSIONS
#define SESSIONS_XSESSIONS "/usr/share/xsessions"
#endif
#ifndef SESSIONS_XSESSIONS_LOCAL
#define SESSIONS_XSESSIONS_LOCAL "/usr/local/share/xsessions"
#endif
#ifndef SESSIONS_WAYLAND
#define SESSIONS_WAYLAND "/usr/share/wayland-sessions"
#endif
#ifndef SESSIONS_WAYLAND_LOCAL
#define SESSIONS_WAYLAND_LOCAL "/usr/local/share/wayland-sessions"
#endif
static const struct source_dir SOURCES[] = {{XORG, SESSIONS_XSESSIONS},
{XORG, SESSIONS_XSESSIONS_LOCAL},
static const struct source_dir SOURCES[] = {
{XORG, SESSIONS_XSESSIONS},
{WAYLAND, SESSIONS_WAYLAND},
{WAYLAND, SESSIONS_WAYLAND_LOCAL}};
};
static struct Vector* cb_sessions = NULL;

View File

@@ -3,8 +3,6 @@
#include <sys/wait.h>
#include <unistd.h>
#include "signal_handler.h"
static void handle_sigterm(int sig) {
(void)sig;

View File

@@ -67,11 +67,6 @@ static void process_sigwinch(int signal) {
need_resize = 1;
}
static inline void draw_bg() {
// apply bg color to all screen
printf("\x1b[%sm\x1b[2J", g_config->colors.bg);
}
void setup(struct config* config) {
g_config = config;
@@ -81,9 +76,10 @@ void setup(struct config* config) {
term.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDOUT_FILENO, TCSANOW, &term);
// save cursor pos, save screen
printf("\x1b[s\x1b[?47h");
draw_bg();
// save cursor pos, save screen, set color and reset screen
// (applying color to all screen)
printf("\x1b[s\x1b[?47h\x1b[%s;%sm\x1b[2J", g_config->colors.bg,
g_config->colors.fg);
(void)atexit(restore_all);
(void)signal(SIGINT, signal_handler);
@@ -207,7 +203,6 @@ void scratch_print_ui() {
}
printf("\033[2J\033[H\033c"); // Clear screen
draw_bg();
/// PRINTING
// printf box