Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I6a6a696411e599829afb123a5f3c241768470163 |
||
---|---|---|
include | ||
protocols | ||
src | ||
systemd | ||
.editorconfig | ||
.envrc | ||
.gitattributes | ||
.gitignore | ||
chroma.conf.sample | ||
flake.lock | ||
flake.nix | ||
LICENSE | ||
Makefile | ||
README.md | ||
shell.nix |
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
# Check dependencies
make check-deps
# Build the daemon
make
# Or build debug version
make debug
Installation
# 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:
~/.config/chroma/chroma.conf
$XDG_CONFIG_HOME/chroma/chroma.conf
./chroma.conf
(current directory)
Sample Configuration
# 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:
wlr-randr
Command Line Options
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
# Run in foreground
chroma
# Run as daemon
chroma --daemon
# Use custom config
chroma -c /path/to/config.conf
Systemd Service
# 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
# 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
interfacewl_output
interface- EGL window surface creation
Tested only on Hyprland.
Development
Building Debug Version
make debug
Code Formatting
make format # requires clang-format
Static Analysis
make analyze # requires cppcheck
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- 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 for more details on the exact conditions. An online copy is provided here.