linux-wallpaperengine/README.md
Alexis Maiquez 7bffcded09
feat: make custom version of glslang to improve shader compatibility + random improvements (#291)
* feat: added glslang and spirv-core for handling shaders, should provide better results than current systems

* fix: brought back proper include placement, should fix some shaders not working

* chore: dial down required version to 330

* fix: crash when taking screenshot

* fix: use glReadnPixels for X11 copying to be more memory safe

* chore: reverted part of last commit

* chore: delay initialization of browser until it's used once

* chore: do not initialize web browser unless explicitly needed

* chore: cleanup filesystem functions to use containers directly

* chore: memory cleanup fixes

* chore: fix glReadPixels for older opengl versions

* chore: remove shader patches as they shouldn't be needed anymore

* chore: initialise variables

* chore: update deps, actions and readme

* chore: make use of custon glslang and SPIRV-Cross

* Revert "chore: update deps, actions and readme"

This reverts commit c3fbc9340b.

* chore: update actions to include submodules

* chore: do not depend on SPIRV-Tools

* fix: added log10 macro

* feat: update to latest glslang (swizzle and vec2/vec3/vec4 implicit casting to float)

* revert: delayed initialization of cef was causing issues, reverted

* chore: re-organized web wallpaper support to use custom scheme and better handle multiprocessing

* chore: make use of external repos for all deps instead of copying things manually and more cleanup work

* chore: wrong include file used in CGLSLContext.cpp

* chore: fix wayland generation folder not being present

* feat: somewhat support TEXB0004

* chore: improve function call matching and fallback to more lax method if no function is found

* chore: changed shader compilation slightly so they're passed onto glsl just once

* feat: swap android's fft implementation (which wasn't right) with kissfft's and fix update frequency issues

* chore: added missing dependency

* chore: added missing dep to PKGBUILD

* feat: add testing tools to run over all backgrounds and getting output data

* chore: jail CDirectory to the basepath and prevent accessing data outside of the main directory

* chore: process script now scales the previews so the html file is not too big

* chore: add showcase gallery to the README.md

* chore: update README

* chore: some readability improvements on code

* chore: fix segfault after code cleanup

* chore: make use of std::filesystem::canonical instead of basepath and slight typing changes on texture objects

* chore: fix path detection being wrong, make use of std::filesystem::path on CContainers

* chore: cleanup of the core part of the project

* chore: bring back std::move and make some methods const where it makes sense

* feat: added a pretty printer for easier debug and comparison between different versions of linux-wallpaperengine

* chore: refactored shader compilation code once more to be easier to follow and fixed the longstanding bug of #include not being added in the right place

* chore: more debug info for the pretty printer

* fix: some textures applied were not the right ones

* chore: properly set combos based on textures

* feat: take into account project properties for shader values
feat: proper parsing of combo values in shaders
fix: shader units weren't linked as they should
chore: more support for detecting shader things automatically

* fix: blending mode for passes using the wrong value
fix: shader uniforms from project properties should now be taken into account

* chore: use ubuntu 22 and ubuntu 24 as builders, ubuntu 20 is retired

* chore: use ubuntu 22 and ubuntu 24 as builders, ubuntu 20 is retired

* chore: hopefully fix github actions build

* refactor: simplified working with properties, constants and shader variables

* chore: remove a couple of todos that aren't needed anymore

* chore: simplify the texture detection a little bit, still work left to do

* fix: regression on texture setup not working properly

* fix: filenames with dots were not being handled properly

* chore: remove some uselesss messages

* chore: fixed std::string json values not casting anything to it as it was assumed

* fix: null user value for constants means it cannot be modified by the user

* chore: remove exception when a shader constant uses a non-existant property

* fix: angles can be an user setting too, also added detection for animation frames to show a warning

* fix: ensure variable information is not commented out by a line comment

* fix: shader includes weren't being processed properly

* chore: update to latest glslang and SPIRV-Cross to support non-integer array indices

* chore: make use of auto where it made sense

* feat: make use of in/out promotion on glslang-WallpaperEngine
feat: use glslang-WallpaperEngine linkin process as an extra validation

* chore: improve scripts for running the app

* chore: hide background structure dump behind a command-line switch

* chore: rewritten bloom effect as a json object inside C++ so it's easier to follow

* chore: removed deprecated parameters and switched to argparse instead of getopt
fix: clamping mode wasn't applied by background properly, only globally

* chore: removed help prompt from the output unless actually required

* fix: web subprocesses weren't launching due to parameter's parsing, temporal fix

* feat: added material command copy support

* feat: do not initialize some subsystems if they're disabled or not used by backgrounds

* chore: ignore type in combos as only seems to be used in the editor

* chore: update to latest glslang-WallpaperEngine changes

* chore: delete uniforms if they already exist before setting

* chore: more cleanup and fixes

* chore: more cleanup and fixes

* chore: more cleanup and fixes

* chore: update file functions to make use of shared_ptr/unique_ptr instead of copying things around

* chore: more changes to unique_ptr and shared_ptr

* chore: more changes to unique_ptr and shared_ptr

* chore: more changes to unique_ptr and shared_ptr
feat: improved render initialization process to make it easier and simpler to add new drivers (no more #ifdef in CWallpaperApplication.cpp)

* chore: change all is/as castings to use typeid so no string comparison takes place

* chore: more cleanup, default initialization of values wherever possible

* chore: moved more things to std::unique_ptr and std::shared_ptr

* chore: moved more things to std::unique_ptr and std::shared_ptr

* fix: browser context usage crashed the app

* chore: the setting controls fullscreen detection creation the same way audio works

* fix: ensure that at least one frame is rendered before detecting fullscreen windows

* chore: slight changes to output and documentation to properly reflect current build configuration

* chore: fix mipmap texture creation

* chore: fix pass uniforms not taking into account fragment shader's uniforms
chore: keep processed code in the shader sent to opengl so it appears on RenderDoc

* chore: formating issues by codefactor

* chore: do not use new to allocate the pretty printer

* fix: strchr wasn't properly done for window geometry

* chore: add recording mode for status page generation

* chore: update .gitignore

* chore: update script to make use of video generation instead of the old python scripts

* chore: also copy project.json so it can be used on the site too

* fix: regression on invisible images not being rendered

* feat: add option to disable camera parallax

* chore: add the reversing tools I have locally

* chore: mention some of the common issues in the README.md

* chore: take submodules into account for archlinux

* chore: missed cd "$pkgname" in arch's prepare step
2025-05-10 19:34:59 +02:00

9.3 KiB
Raw Blame History

help wanted Compatibility gallery

🖼️ Linux Wallpaper Engine

Bring Wallpaper Engine-style live wallpapers to Linux! This project allows you to run animated wallpapers from Steams Wallpaper Engine right on your desktop.

⚠️ This is an educational project that evolved into a functional OpenGL-based wallpaper engine for Linux. Expect some limitations and quirks!


📦 System Requirements

To compile and run this, you'll need:

  • OpenGL 3.3 support
  • CMake
  • LZ4, Zlib
  • SDL2
  • FFmpeg
  • X11 or Wayland
  • Xrandr (for X11)
  • GLFW3, GLEW, GLUT, GLM
  • MPV
  • PulseAudio
  • FFTW3

Install the required dependencies on Ubuntu/Debian-based systems:

Ubuntu 22.04

sudo apt-get update
sudo apt-get install build-essential cmake libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libgl-dev libglew-dev freeglut3-dev libsdl2-dev liblz4-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libxxf86vm-dev libglm-dev libglfw3-dev libmpv-dev mpv libmpv1 libpulse-dev libpulse0 libfftw3-dev

Ubuntu 24.04

sudo apt-get update
sudo apt-get install build-essential cmake libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libgl-dev libglew-dev freeglut3-dev libsdl2-dev liblz4-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libxxf86vm-dev libglm-dev libglfw3-dev libmpv-dev mpv libmpv2 libpulse-dev libpulse0 libfftw3-dev

🐧 Arch Linux Users

You can install this directly from the AUR using your favorite AUR helper:

yay -S linux-wallpaperengine-git

This installs the latest development version.

Note: Youll still need assets from the official Wallpaper Engine (via Steam). See below for details.


🚀 Getting Started

1. Get Wallpaper Engine Assets

You must own and install Wallpaper Engine via Steam. This provides the required assets used by many backgrounds.

Good news: you usually dont need to copy anything manually. The app will automatically look in these common install paths:

~/.steam/steam/steamapps/common
~/.local/share/Steam/steamapps/common
~/.var/app/com.valvesoftware.Steam/.local/share/Steam/steamapps/common
~/snap/steam/common/.local/share/Steam/steamapps/common

If Wallpaper Engine is installed in one of these paths, the assets will be detected automatically!


If Assets Arent Found Automatically

You can copy the assets folder manually:

  1. In Steam, right-click Wallpaper EngineManageBrowse local files
  2. Copy the assets folder
  3. Paste it into the same folder where the linux-wallpaperengine binary is located

2. Build from Source

Clone the repo:

git clone --recurse-submodules https://github.com/Almamu/linux-wallpaperengine.git
cd linux-wallpaperengine

Build it:

mkdir build && cd build
cmake ..
make

Once the build process is finished, this should create a new output folder containing the app and all the required support files to run.

Remember: Place the assets folder next to the built binary if it isnt detected automatically.


🧪 Usage

Basic syntax:

./linux-wallpaperengine [options] <background_id or path>

You can use either:

  • A Steam Workshop ID (e.g. 1845706469)
  • A path to a background folder

🔧 Common Options

Option Description
--silent Mute background audio
--volume <val> Set audio volume
--noautomute Don't mute when other apps play audio
--no-audio-processing Disable audio reactive features
--fps <val> Limit frame rate
--window <XxYxWxH> Run in windowed mode with custom size/position
--screen-root <screen> Set as background for specific screen
--bg <id/path> Assign a background to a specific screen (use after --screen-root)
--scaling <mode> Wallpaper scaling: stretch, fit, fill, or default
--clamping <mode> Set texture clamping: clamp, border, repeat
--assets-dir <path> Set custom path for assets
--screenshot <file> Save screenshot (PNG, JPEG, BMP)
--list-properties Show customizable properties of a wallpaper
--set-property name=value Override a specific property
--disable-mouse Disable mouse interaction
--disable-parallax Disable parallax effect on backgrounds that support it
--no-fullscreen-pause Prevent pausing while fullscreen apps are running

💡 Examples

Run a background by ID

./linux-wallpaperengine 1845706469

Run a background from a folder

./linux-wallpaperengine ~/backgrounds/1845706469/

Assign backgrounds to screens with scaling

./linux-wallpaperengine \
  --scaling stretch --screen-root eDP-1 --bg 2667198601 \
  --scaling fill --screen-root HDMI-1 --bg 2667198602

Run in a window

./linux-wallpaperengine --window 0x0x1280x720 1845706469

Limit FPS to save power

./linux-wallpaperengine --fps 30 1845706469

Take a screenshot

./linux-wallpaperengine --screenshot ~/wallpaper.png 1845706469

This can be useful as output for pywal or other color systems that use images as basis to generate a set of colors to apply to your system.

View and change properties

./linux-wallpaperengine --list-properties 2370927443

The output includes all the relevant information for each of the different properties:

barcount - slider
	Description: Bar Count
	Value: 64
	Minimum value: 16
	Maximum value: 64
	Step: 1

bloom - boolean
	Description: Bloom
	Value: 0
frequency - combolist
	Description: Frequency
	Value: 2
		Posible values:
		16 -> 1
		32 -> 2
		64 -> 3

owl - boolean
	Description: Owl
	Value: 0
rain - boolean
	Description: Rain
	Value: 1
schemecolor - color
	Description: ui_browse_properties_scheme_color
	R: 0.14902 G: 0.23137 B: 0.4 A: 1
visualizer - boolean
	Description: <hr>Add Visualizer<hr>
	Value: 1
visualizercolor - color
	Description: Bar Color
	R: 0.12549 G: 0.215686 B: 0.352941 A: 1
visualizeropacity - slider
	Description: Bar Opacity
	Value: 1
	Minimum value: 0
	Maximum value: 1
	Step: 0.1

visualizerwidth - slider
	Description: Bar Spacing
	Value: 0.25
	Minimum value: 0
	Maximum value: 0.5
	Step: 0.01

Any of these values can be modified with the --set-property switch. Say you want to enable the bloom in this background, you would do so like this:

./linux-wallpaperengine --set-property bloom=1 2370927443

🧪 Wayland & X11 Support

  • Wayland: Works with compositors that support wlr-layer-shell-unstable.
  • X11: Requires XRandr. Use --screen-root <screen_name> (as shown in xrandr).

⚠ For X11 users: Currently doesn't work if a compositor or desktop environment (e.g. GNOME, KDE, Nautilus) is drawing the background.


🌈 Example Backgrounds

example1 example2

🪲 Common issues

Black screen when setting as screen's background

This can be caused by a few different things depending on your environment and setup.

X11

Common symptom of a compositor drawing to the background which prevents Wallpaper Engine from being properly visible. The only solution currently is disabling the compositor so Wallpaper Engine can properly draw on the screen

NVIDIA

Some users have had issues with GLFW initialization and other OpenGL errors. These are generally something that's worth reporting in the issues. Sometimes adding this variable when running Wallpaper Engine helps and/or solves the issue:

__GL_THREADED_OPTIMIZATIONS=0 linux-wallpaperengine

We'll be looking at improving this in the future, but for now it can be a useful workaround.


🙏 Special Thanks

  • RePKG for texture flag insights
  • RenderDoc the best OpenGL debugger out there!