All checks were successful
Update PKGBUILD version / update-pkgver (push) Successful in 3s
The v0.8.4 keyboard fix only half-worked: keys were still dropped until the pointer moved to the built-in panel. Niri scopes layer-shell keyboard routing per active output, so a single Exclusive surface is not enough when another output is active. Revert 2026-04-08 partially: only the built-in panel shows the login widget, other monitors get a wallpaper-only window with KeyboardMode::None. Hotplugged monitors also get wallpaper-only. Compositor-agnostic — no Niri IPC.
87 lines
2.5 KiB
Markdown
87 lines
2.5 KiB
Markdown
# Moongreet
|
||
|
||
A greetd greeter for Wayland, built with Rust + GTK4 + gtk4-layer-shell.
|
||
Part of the Moonarch ecosystem.
|
||
|
||
## Features
|
||
|
||
- **greetd IPC** — Communicates via `$GREETD_SOCK` (length-prefixed JSON)
|
||
- **User list** — Parsed from `/etc/passwd` (UID 1000–65533)
|
||
- **Avatars** — AccountsService icons, `~/.face` fallback, default SVG with theme tinting
|
||
- **Sessions** — Discovered from `/usr/share/wayland-sessions/` and `/usr/share/xsessions/`
|
||
- **Last user/session** — Remembered in `/var/cache/moongreet/`
|
||
- **Power actions** — Reboot / Shutdown via `loginctl`
|
||
- **Layer Shell** — Fullscreen via gtk4-layer-shell (TOP layer)
|
||
- **Multi-monitor + hotplug** — Login UI on the built-in display, wallpaper-only on other monitors; hotplugged monitors get wallpaper windows automatically
|
||
- **GPU blur** — Background blur via GskBlurNode (shared cache across monitors)
|
||
- **i18n** — German and English (auto-detected from system locale)
|
||
- **Faillock warning** — Warns after 2 failed attempts, locked message after 3
|
||
- **Fingerprint** — fprintd support via greetd multi-stage PAM (configurable)
|
||
- **Journal logging** — `journalctl -t moongreet`, debug level via `MOONGREET_DEBUG` env var
|
||
- **Password wiping** — Zeroize on drop
|
||
|
||
## Requirements
|
||
|
||
- GTK 4
|
||
- gtk4-layer-shell (for Wayland fullscreen)
|
||
- greetd
|
||
|
||
## Building
|
||
|
||
```bash
|
||
cargo build --release
|
||
```
|
||
|
||
## Installation
|
||
|
||
```bash
|
||
# Install binary
|
||
sudo install -Dm755 target/release/moongreet /usr/bin/moongreet
|
||
|
||
# Install config
|
||
sudo mkdir -p /etc/moongreet
|
||
sudo cp config/moongreet.toml /etc/moongreet/moongreet.toml
|
||
```
|
||
|
||
## System Setup
|
||
|
||
1. Edit `/etc/moongreet/moongreet.toml` — set an absolute path for the wallpaper.
|
||
|
||
2. Create cache directory:
|
||
```bash
|
||
sudo mkdir -p /var/cache/moongreet/last-session
|
||
sudo chown greeter:greeter /var/cache/moongreet
|
||
```
|
||
|
||
3. Configure greetd (`/etc/greetd/config.toml`):
|
||
```ini
|
||
[default_session]
|
||
command = "niri -c /etc/greetd/niri-greeter.kdl"
|
||
user = "greeter"
|
||
```
|
||
|
||
4. Install the polkit rule so the greeter user can reboot / power off:
|
||
```bash
|
||
sudo install -Dm644 config/polkit/50-moongreet-power.rules \
|
||
/etc/polkit-1/rules.d/50-moongreet-power.rules
|
||
```
|
||
Without this rule, `loginctl reboot` / `loginctl poweroff` fail because
|
||
greetd's greeter session is inactive in logind.
|
||
|
||
## Development
|
||
|
||
```bash
|
||
# Run tests
|
||
cargo test
|
||
|
||
# Build release
|
||
cargo build --release
|
||
|
||
# Run locally (without greetd, disables layer-shell)
|
||
MOONGREET_NO_LAYER_SHELL=1 ./target/release/moongreet
|
||
```
|
||
|
||
## License
|
||
|
||
MIT
|