112 lines
2.8 KiB
Markdown
112 lines
2.8 KiB
Markdown
# Ah ah ah, you didn't say the magic word
|
||
|
||
This `gtklock` module listens for failed unlock attempts and recreates Dennis Nedry’s “ah ah ah” lockout scene from Jurassic Park.
|
||
|
||
* **Animation:** Spawns a looping "Nedry" sprite at a random location on the screen.
|
||
* **Audio:** Plays the "ah ah ah, you didn't say the magic word" clip.
|
||
* **Safety:** Sprites avoid overlapping a configurable "deadzone" (e.g., your login box).
|
||
* **Performance:** Uses pre-warmed audio players for low latency and scaled images to fit any screen.
|
||
|
||
## Requirements
|
||
|
||
* **Build:** Meson, Ninja, Rust (Cargo), GTK+3 development headers.
|
||
* **Runtime:** `gtklock`, `gstreamer`, `gst-plugins-base`, `gst-plugins-good` (for audio playback).
|
||
|
||
## Build & Install
|
||
|
||
1. **Install Dependencies (Arch Linux example):**
|
||
```bash
|
||
sudo pacman -S meson ninja rust gtk3 gstreamer gst-plugins-base gst-plugins-good gst-libav
|
||
```
|
||
|
||
2. **Build:**
|
||
```bash
|
||
meson setup builddir
|
||
meson compile -C builddir
|
||
```
|
||
|
||
3. **Install:**
|
||
```bash
|
||
sudo meson install -C builddir
|
||
```
|
||
|
||
## Usage
|
||
|
||
Run `gtklock` with the module path:
|
||
|
||
```bash
|
||
gtklock -m /usr/lib/gtklock/ahfail-module.so
|
||
```
|
||
|
||
### Arguments
|
||
|
||
* `--deadzone=X,Y,W,H`: Defines a rectangle where sprites will *not* spawn (e.g., to keep your password field visible).
|
||
```bash
|
||
gtklock -m ahfail-module.so -- --deadzone=860,440,200,200
|
||
```
|
||
*(Note the `--` separator before module arguments)*
|
||
|
||
* `--audio-uri=URI`: Override the default audio clip.
|
||
```bash
|
||
gtklock -m ahfail-module.so -- --audio-uri=file:///home/user/custom.mp3
|
||
```
|
||
|
||
## macOS (build from source)
|
||
|
||
### Prerequisites
|
||
|
||
```bash
|
||
brew install gtk+3 gstreamer gst-plugins-base gst-plugins-good meson ninja rust
|
||
```
|
||
|
||
### Build
|
||
|
||
```bash
|
||
meson setup builddir
|
||
meson compile -C builddir
|
||
```
|
||
|
||
Produces:
|
||
- `builddir/ahfail-module.so` — gtklock module (Wayland/Linux only)
|
||
- `builddir/libahfail_pam.so` — PAM module (macOS + X11 Linux)
|
||
- `builddir/ahfail-display` — display binary (spawned by PAM module)
|
||
|
||
### Install
|
||
|
||
```bash
|
||
sudo mkdir -p /usr/local/lib/ahfail
|
||
sudo cp builddir/libahfail_pam.so /usr/local/lib/ahfail/
|
||
sudo cp builddir/ahfail-display /usr/local/lib/ahfail/
|
||
```
|
||
|
||
### Configure PAM (macOS)
|
||
|
||
Add to `/etc/pam.d/screensaver` (requires `sudo`):
|
||
|
||
```
|
||
auth optional /usr/local/lib/ahfail/libahfail_pam.so
|
||
```
|
||
|
||
Place it after the existing `auth` line(s) so it observes the real auth result.
|
||
|
||
### Configure PAM (Linux/X11)
|
||
|
||
Add to `/etc/pam.d/gtklock` (or `i3lock`, `xscreensaver`, etc.):
|
||
|
||
```
|
||
auth optional ahfail-pam.so
|
||
```
|
||
|
||
## Development
|
||
|
||
* **Run Tests:** `cargo test`
|
||
* **Benchmarks:** `cargo test --test benchmarks -- --nocapture`
|
||
* **Linting:** `cargo clippy`
|
||
|
||
## Customization
|
||
|
||
To change the default sprite or audio:
|
||
1. Replace files in `assets/`.
|
||
2. Update `assets/ahfail.gresource.xml`.
|
||
3. Rebuild with Meson.
|