# 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) Find your screen locker's PAM service file. On macOS 13+ the screensaver uses `/etc/pam.d/screensaverui`; on older versions it may be `/etc/pam.d/screensaver`. Add the following line after the existing `auth` entries (requires `sudo`): ``` auth optional /usr/local/lib/ahfail/libahfail_pam.so ``` ### Configure PAM (Linux/X11) Add to `/etc/pam.d/gtklock` (or `i3lock`, `xscreensaver`, etc.). Use the full path because `$(libdir)/ahfail` is not in PAM's default search path: ``` auth optional /usr/lib/ahfail/libahfail_pam.so ``` On Fedora/RHEL replace `/usr/lib` with `/usr/lib64`. ## 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.