# Chroma A simple, lightweight and efficientt wallpaper daeemon for Wayland compositors with multi-monitor & automatic hotplugging support. Born from my woes with Hyprpaper, swaybg and most ironically SWWW, which turned out to be NOT a solution to my Wayland wallpaper woes. ## Features I did not expect to be writing something too feature-rich, but I still ended up with something relatively convoluted. Chroma (mostly) reliably supports: - **Multi-monitors**: Automatically detects and manages wallpapers for all connected displays - **Hotplugging**: Dynamically handles monitor connection/disconnection events - **Per-output configuration**: Set different wallpapers for each monitor - **Multiple image formats**: Supports JPEG, PNG, BMP, TGA, PSD, GIF, HDR, PIC, PPM, PGM - **EGL/OpenGL rendering**: Hardware-accelerated wallpaper rendering - **Configuration file support**: Easy setup with INI-style config files - **Signal handling**: Graceful shutdown and configuration reload (SIGHUP) ## Usage ### Requirements #### Dependencies - **Wayland**: wayland-client, wayland-egl - **Graphics**: EGL, OpenGL - **System**: glibc, libm, libdl #### Development Dependencies - GCC or Clang compiler - Make - pkg-config - Wayland development headers - EGL/OpenGL development headers ### Building #### Quick Build ```bash # Check dependencies make check-deps # Build the daemon make # Or build debug version make debug ``` ### Installation ```bash # Install to /usr/local (default) sudo make install # Install to /usr sudo make PREFIX=/usr install # Create systemd service file make systemd-service # Create sample configuration make sample-config ``` ### Configuration #### Configuration File Chroma looks for configuration files in this order: 1. `~/.config/chroma/chroma.conf` 2. `$XDG_CONFIG_HOME/chroma/chroma.conf` 3. `./chroma.conf` (current directory) #### Sample Configuration ```ini # Default wallpaper for outputs without specific mapping default_image = ~/.config/chroma/default.jpg # Output-specific wallpapers # Format: output.OUTPUT_NAME = /path/to/image.jpg output.DP-1 = ~/Pictures/monitor1.jpg output.DP-2 = ~/Pictures/monitor2.png output.HDMI-A-1 = ~/Pictures/hdmi_wallpaper.jpg ``` ### Finding Output Names Use `wlr-randr` or similar tools to find your output names: ```bash wlr-randr ``` ### Command Line Options ```plaintext Usage: chroma [OPTIONS] Options: -c, --config FILE Configuration file path -d, --daemon Run as daemon -v, --verbose Verbose logging -h, --help Show help --version Show version information Examples: chroma -c ~/.config/chroma/chroma.conf chroma --daemon ``` ### Running Manually ```bash # Run in foreground chroma # Run as daemon chroma --daemon # Use custom config chroma -c /path/to/config.conf ``` ### Systemd Service ```bash # Enable and start the service systemctl --user enable chroma.service systemctl --user start chroma.service # Check status systemctl --user status chroma.service # View logs journalctl --user -u chroma.service -f # Reload configuration systemctl --user reload chroma.service ``` ### Auto-start with Desktop Session ```bash # Enable the service for auto-start systemctl --user enable chroma.service # The service will start automatically with your graphical session ``` ### Supported Wayland Compositors Chroma works with any Wayland compositor that supports: - `wl_compositor` interface - `wl_output` interface - EGL window surface creation Tested only on Hyprland. ## Development ### Building Debug Version ```bash make debug ``` ### Code Formatting ```bash make format # requires clang-format ``` ### Static Analysis ```bash make analyze # requires cppcheck ``` ## Contributing 1. Fork the repository 2. Create a feature branch 3. Make your changes 4. Test thoroughly 5. Submit a pull request ### Code Style - C11 standard - 2-space indentation - No tabs - Function names: `chroma_function_name` - Constants: `CHROMA_CONSTANT_NAME` ## License This project is made available under Mozilla Public License (MPL) version 2.0. See [LICENSE](LICENSE) for more details on the exact conditions. An online copy is provided [here](https://www.mozilla.org/en-US/MPL/2.0/).