waywestands for 'Wayland Wallpaper Engine'
waywe-demo-lowres.mp4
- This software is still in development, some major features may be unimplemented.
- This project uses a lot of hardware-dependent code to make it work fast as F.
- Special warning for the ones who concerned about unsafe code in Rust: this project contains a lot of it and built upon it. Of course, to speed up a lot of processing code.
- Image wallpapers in various formats.
- Video wallpapers in .mp4 (h.264 and h.265 -encoded formats)
- Configurable transition animations.
- Custom scene wallpapers loaded from dynamic libraries (
.so).
- Modern Linux distribution.
wlroots-based Wayland compositor (e.g. Hyprland or Sway).- Support for
libvahardware acceleration. - Support for minor (yet unpopular) Vulkan features:
VK_KHR_external_memory_fdVK_EXT_image_drm_format_modifier
git clone https://github.com/hack3rmann/waywe-rs.git --depth 1Build whole project
cd waywe-rs
cargo build --release --lockedYou can find both waywe and waywe-daemon executables under target/release directory:
sudo cp target/release/waywe target/release/waywe-daemon /usr/binStart the daemon:
waywe start
# or
waywe-daemon --run-in-backgroundThen use the waywe cli tool to control daemon's behavior:
waywe show path/to/your/video.mp4
waywe show path/to/your/picture.jpg
waywe show path/to/your/scene.soScene wallpapers are shared libraries built with waywe-scene or
waywe-rendering-api (experimental). You implement
rendering yourself; see the crate READMEs for how to author and build them.
Note that it will set the same wallpaper for all currently plugged monitors.
You can also specify on which monitor to set wallpaper to with --monitor <NAME> key.
Also, you can create preview image of currently running wallpaper:
waywe preview preview.pngFor other handy commands run waywe help.
With waywe-scene, put #[derive(Scene)] on your wallpaper type —
the FFI entry point is generated for you. With waywe-rendering-api
directly, you write waywe_ffi_create_opaque_renderer yourself and implement all rendering.
Build an example scene and set it as wallpaper:
cargo build --release -p waywe-test-scene
waywe show target/release/libwaywe_test_scene.soShaderToy example:
cargo build --release -p shadertoy-computer-were-made-for-cubes
waywe show target/release/libshadertoy_computer_were_made_for_cubes.soYou can configure your transition animations in ~/.config/waywe/config.toml.
Default config will be generated if user would not have one.
Default configuration:
[animation]
# Transition duration in milliseconds
duration-milliseconds = 2000
# Animation direction: "in" | "out"
direction = "out"
# Interpolation function: "none" | "ease-in" | "ease-out" | "ease-in-out" | "bezier"
#
# - "none": f(t) = t
# - "ease-in": f(t) = t**2
# - "ease-out": f(t) = 1 - (1 - t)**2
# - "ease-in-out": f(t) = 3 * x**2 - 2 * x**3
# - "bezeier": [a, b, c, d] where a, b, c, d are floats and a, c are from [0.0, 1.0]
easing = "ease-out"
# Animation style: "circle" | "slide"
style = "circle"
[animation.center-position]
# Animation circle center position type: "random" | "point" [default="random"]
#
# - "random": center will be picked randomly on screen and `position` parameter will be ignored
# - "point": center position will be at point `position` (see next)
type = "random"
# Exact center position of animation circle, used with `type = "point"`.
# Describes position coordinares in range `-1.0..=1.0`
position = [0.0, 0.0]
# Optional post-proccess effects
[[effects]]
# Convolution filter
type = "convolve"
# Convolution kernel (for example, sharpen filter)
kernel = [0.0, -1.0, 0.0, -1.0, 5.0, -1.0, 0.0, -1.0, 0.0]
[[effects]]
# Fast blur filter
type = "blur"
# Number of downsample passes
n_levels = 4
# Growth rate of blur passes on each downsample step (0 for no growth)
level_multiplier = 2And if you want slide animation:
[animation]
duration-milliseconds = 2000
easing = "ease-out"
# Animation style: "circle" | "slide"
style = "slide"
[animation.angle]
# Animation angle type: "random" | "value" [default="random"]
#
# - "random": angle will be picked randomly from 0 to 360 and `value` will be ignored
# - "value": angle in degrees
type = "random"
# value from 0 to 360 degrees
degrees = 0This project is tested only on several machines with Intel or AMD CPUs with integrated graphics running Fedora 42.
ERROR_FORMAT_NOT_SUPPORTED:- try install
ffmpegandlibvalibraries - try update/install your video drivers
- try install
- You have both discrete and integrated graphics:
- try
vainfo | grep Driver- it will show the current driver name. - if you are on Intel, set
LIBVA_DRIVER_NAME=iHDenvironment variable before you run the daemon. - or for AMD, set
LIBVA_DRIVER_NAME=Gallium - otherwise set it accordingly with your integrated graphics driver.
- try
There are already tools with quite similar features:
swww- great tool to use with picture wallpapers.swaybg- from the authors ofwlrootsprotocol.mpvpaper- play videos withmpvdirectly on your wallpaper.hyprpaper- simplest solution for Hyprland users
Special thanks to swww. waywe project is heavily inspired by swww.
- Using Wallpaper Engine assets with
waywe.