An ~100kb native translation layer for Wallpaper Engine on GNU/Linux based compositors.
- A C99 Compiler
- Valve's Proton (>= v11.0 was tested working)
Start by building the core of wallpiper
$ ./build.sh build-core
# optionally install wallpiper to `%HOME/.local/lib/wallpiper/`
$ ./build.sh install-wallpiperdWallpiper supports the following DE/WM(s) through the following portals. Jump to whatever section is relevant to you.
- wallpiper-portal-gnome
- wallpiper-portal-kde
- wallpiper-portal-hyprland
- wallpiper-portal-i3
- wallpiper-portal-sway
Pull requests are welcome for additional portals. You can also submit an issue report to suggest other portals.
Implemented as an in-process GObject-Introspection library driven by a GNOME Shell extension.
- mutter
- gobject-introspection
- mesa
- libdrm
On Arch Linux:
$ pacman -S mutter gobject-introspection mesa libdrm$ ./build.sh build-gnome
# requires root
$ ./build.sh install-gnomeLog out and back in, then ensure the extension is enabled.
Implemented as a Qt Quick/QML plugin, installed as a Plasma 6 Wallpaper KPackage.
- cmake
- extra-cmake-modules
- qt6-base
- qt6-declarative
On Arch Linux:
$ pacman -S cmake extra-cmake-modules qt6-base qt6-declarative$ ./build.sh build-kde
# requires root
$ ./build.sh install-kde- Open System Settings -> Wallpaper
- Open the Wallpaper type dropdown at the top of the panel
- Select Wallpiper
Uses wlr-layer-shell. No shell extension, and no install step.
None beyond the core dependencies.
$ ./build.sh build-hyprlandWarning
Sway's IPC has no query for the compositor's global cursor position, so this portal can't support cursor-reactive wallpapers.
I agree with the sway maintainer. Unfortunately, an after-thought-patch like this is not a proper solution and should not be merged.
Solutions like https://github.com/cjacker/wl-find-cursor/ exist, however this is a single event library, not meant to be constantly
driving mouse events. Mounting to OVERLAY instead of the BACKGROUND surface to actually intercept the mouse is not a proper solution.
OVERLAY can't watch the cursor without also being the sole consumer. Sway would be unusable.
Uses wlr-layer-shell. No shell extension, and no install step.
None beyond the core dependencies.
$ ./build.sh build-swayInterfaces with X11 directly. No shell extension, and no install step.
None beyond the core dependencies.
$ ./build.sh build-i3wallpiperd has no persistent configuration, all variability is mutable through environment variables.
| Variable | Default | Purpose |
|---|---|---|
WALLPIPER_PORTAL |
(required) | Which portal to use: hyprland, sway, i3, gnome, kde |
WALLPIPER_STATE_FILE |
(required) | Full path of the file to persist the selected wallpaper to (created if missing) |
WALLPIPER_STEAM_ROOT |
auto-detected (~/.local/share/Steam, ~/.steam/steam, ~/.steam/root, or the Flatpak path) |
Your Steam library root |
WALLPIPER_PROTON_BIN |
auto-detected under compatibilitytools.d/*/proton or steamapps/common/Proton */proton |
Path to the proton binary to run Wallpaper Engine with |
WALLPIPER_WE_EXE |
$STEAM_ROOT/steamapps/common/wallpaper_engine/wallpaper64.exe |
Path to Wallpaper Engine's executable |
WALLPIPER_TEMP_DIR |
/tmp/wallpiper |
Directory used for ephemeral, session-scoped files (control sockets, the Vulkan capture layer's search path, tracked renderer PIDs) |
WALLPIPER_RUNTIME_DIR |
$XDG_STATE_HOME/wallpiper, or ~/.local/state/wallpiper |
Directory used for state that should persist across reboots (e.g. the applied-DPI marker) |
# Check what it resolved before launching for real
$ ./target/release/wallpiperctl check-config
# Example on hyprland
$ WALLPIPER_PORTAL=hyprland ./target/release/wallpiperdwallpiperctl is a control process for the wallpiperd daemon. The following commands require wallpiperd to be actively running with the same WALLPIPER_RUNTIME_DIR.
# In research, not yet implemented:
# wallpiperctl mute
# wallpiperctl unmute
# wallpiperctl volume <0-100>
$ wallpiperctl debug-on
$ wallpiperctl debug-off
$ wallpiperctl check-configApache-2.0 see LICENSE.