All notable changes to this project will be documented in this file.
- Fullscreen focus tracking - The cat becomes visible again after leaving a fullscreen window for another window or workspace.
- Concurrent paw animation - Pressing keys on both sides of the keyboard now
moves both paws at once (the
both-downframe). Previously only the last-pressed key's paw animated. Per-paw deadlines preserve both input events. Fixes #78. - HiDPI output placement - Logical output dimensions, fractional scales, transformed outputs, and negative offsets now place overlays correctly. Fixes #75.
- Layer and hot reload safety - All layer-shell layers can be configured and reloaded safely. Fixes #76.
- Input and process lifecycle - Input monitoring restarts after relevant configuration changes; child process groups now stop reliably.
- Configuration validation - Invalid time, boolean, and integer values are rejected before they reach runtime.
- PNG → SVG asset migration - All cat assets are now SVG, rendered via nanosvg. The new artwork has a different aspect ratio (500x277 vs the old 864x360 PNGs, ~1.8:1 vs ~2.4:1). Users must re-tune their config values — at the same
cat_height, the cat will appear narrower than before. Recommended starting point:cat_height=110,overlay_height=120. enable_antialiasingis now a deprecated no-op. SVG rendering always produces anti-aliased output. The option is accepted but ignored.
- SVG Rendering - Pixel-perfect rendering at any size via nanosvg. No more scaling artifacts or blurry edges.
- Sleeping Animation - 5th animation frame.
idle_sleep_timeoutnow shows a sleeping cat instead of hiding the overlay. - Fast Input Retry - Input child retries device scanning every 5 seconds until devices are found, then switches to the configured
hotplug_scan_interval. Fixes #69.
- Default
hotplug_scan_intervalreduced from 300s to 30s for faster device detection after boot. - Build system - Generated Wayland protocol files are now committed to git. Building from source no longer requires
wayland-scannerorwayland-protocols. Usemake protocolsto regenerate after updating XML sources.make cleanno longer removes protocol files; usemake distcleanfor that. - Nix derivation - Dropped
wayland-scannerandwayland-protocolsbuild dependencies since protocol bindings are pre-generated.
- Hot-reload crash (#71) - Changing
overlay_height,overlay_position, orlayerwhile running with-wno longer crashes. Uses wlr-layer-shell double-buffered properties instead of destroying/recreating surfaces. - Build failure (#73) - Required protocol bindings are committed to git,
eliminating build-time
wayland-scannerdependencies. - KWin fullscreen detection (#28) - Relaxed the global fullscreen fallback for compositors (KDE/KWin) that don't send per-toplevel output events. Overlay now auto-hides during fullscreen on KDE.
- Missing protocol error (#70) - Error message now names the specific missing protocol instead of a generic failure.
- SVG edge artifacts - Premultiplied alpha compositing for correct Wayland ARGB8888 rendering, eliminating dark fringe on anti-aliased edges.
- Multi-monitor CSV -
monitornow accepts comma-separated output names; parent process launches dedicated children via--multi-monitor-childand CLI docs reflect new flow. - Safe hot reload hook - Config watcher now only signals reloads, the actual reload runs from a Wayland tick callback so Wayland structures stay main-thread bound.
- Config model -
config_tnow stores per-config device/output arrays, inline comments are stripped, andmonitorparsing loads multiple names with fallback to automatic output; keyboards hotplug state is rebuilt cleanly on reload. - Wayland rendering - Draw path takes
anim_lock, surface recreation checks the applied layer/output/size snapshots, and buffer recreation is serialized to avoid tearing/races when configs change. - Documentation & packaging - README/
bongocat.conf.exampledemonstrate comma-separated monitors, Makefile installs now ship the example config, and CLI help/version text was refreshed for v1.4.0.
- Dangling pointers on reload -
g_configswap, input device lists, and watcher cleanup now occur only after new config is validated so the old config isn’t left referencing freed memory. - Config watcher and animation races - Atomic flags and mutex coverage were tightened,
config_reload_callbackno longer touches Wayland structures directly, and animation draw/update now handle surface recreation safely. - Input hotplug robustness - Path truncation is guarded, static device comparisons check nulls, and signal handlers close cleanly when the child early-exits.
- Monitor Reconnection - Overlay now survives monitor disconnect/reconnect (fixes #15)
- Dynamic Overlay Resize - Changing
overlay_heightvia config reload no longer crashes - Ghost Process Prevention - Added SIGQUIT/SIGHUP handlers and parent liveness check in child
- Performance Optimizations
- Fast buffer clearing using memset (~4x faster)
- Skip unchanged frames when idle (~95% fewer redraws)
- Hoisted loop invariants in image scaling
- Thread Safety - Mutex protection during buffer recreation
- Memory Usage - Reduced from ~20MB to ~8MB RAM
- Keyboard Hand Mapping - Left half of keyboard triggers left cat hand, right half triggers right hand
- New config option
enable_hand_mapping=1(enabled by default) - Hand mapping respects
mirror_x- hands flip when cat is mirrored
enable_hand_mappingdefault is now1(enabled)- NixOS module
enableHandMappingdefault is nowtrue
- Improved Anti-Aliasing - Box filter for downscaling + proper alpha blending for smooth edges at any size
- Interactive Keyboard Detection - New
--interactivemode inbongocat-find-deviceslistens for actual key presses - Hot-Reload Device Changes - Changing keyboard devices in config now works without restart
- C23 Modern Codebase - RAII macros,
[[nodiscard]]attributes, guard clauses throughout
- Hot-Reload Bug - Keyboard device path changes now properly trigger input restart
- Memory Leaks - Fixed realloc leaks in config parsing
- Thread Safety - Atomic operations for shared state between threads
- Use-After-Free - Fixed crash in config reload callback
- Fullscreen Detection - Now correctly tracks active window per workspace
- README - Streamlined documentation with minimal config example
- Script Reliability - Device detection script distinguishes actual keyboards from power buttons/hotkeys
- Code Quality - Organized headers, consistent naming, comprehensive error handling
- Enhanced Configuration System - New config variables for fine-tuning appearance and behavior
- Sleep Mode - Scheduled or idle-based sleep mode with customizable timing
- Fixed Positioning - Fine-tune position, defaults to center
- Default Values - Refined default configuration values for better out-of-box experience
- Multi-Monitor Support - Choose which monitor to display bongocat on using the
monitorconfiguration option - Monitor Detection - Automatic detection of available monitors with fallback to first monitor if specified monitor not found
- XDG Output Protocol - Proper Wayland protocol implementation for monitor identification
- Memory Leaks - Fixed memory leak in monitor configuration cleanup
- Process Cleanup - Resolved child process cleanup warnings during shutdown
- Segmentation Fault - Fixed crash during application exit related to Wayland resource cleanup
- Error Handling - Better error messages when specified monitor is not found
- Resource Management - Improved cleanup order for Wayland resources
- Logging - Enhanced debug logging for monitor detection and selection
- Smart Fullscreen Detection - Automatically hides overlay during fullscreen applications for a cleaner experience
- Enhanced Artwork - Custom-drawn bongocat image files by @Shreyabardia
- Modular Architecture - Reorganized codebase into logical modules for better maintainability
- Signal Handling - Fixed duplicate log messages during shutdown
- Code Organization - Separated concerns into core, graphics, platform, config, and utils modules
- Build System - Updated to support new modular structure
- Automatic screen detection for all sizes and orientations
- Enhanced performance optimizations
- Configuration hot-reload system
- Dynamic device detection
- Hot-reload configuration support
- Dynamic Bluetooth/USB keyboard detection
- Performance optimizations with adaptive monitoring
- Batch processing for improved efficiency
- Multi-device support
- Embedded assets
- Cross-platform compatibility (x86_64 and ARM64)
- Basic configuration