Display web content as desktop wallpaper on Windows, Linux and macOS.
A cross-platform Rust CLI tool that renders web pages (URLs or local HTML files) as fullscreen desktop wallpaper with multi-monitor support. Especially support ShaderToy page as dynamic wallpaper out of box, and also Ships with 37 built-in ShaderToy shaders — just run wewa -b <name> and enjoy.
跨平台 Rust CLI 工具,将网页内容渲染为全屏桌面壁纸,支持多显示器。特别支持了ShaderToy站点的支持(传入地址即可设置为壁纸),并且内置 37 款 ShaderToy 着色器作为动态壁纸,运行 wewa -b <名称> 即可开箱即用。
Built-in wallpapers are all dynamic wallpapers and optimized with GPU performance, you can check out demonstraition from clicking preview screenshots as below to link to ShaderToy page.
内建的着色器壁纸均为动态壁纸,并且已优化了GPU性能,可以通过点击下方的预览图至ShaderToy站点来预览效果。
![]() 2dclouds by drift |
![]() accretion by Xor |
![]() ascend by bug |
![]() auroras by nimitz |
![]() chillywave by Tornax07 |
![]() chillywave2 by Tornax07 |
![]() classic4colors by zosxavius |
![]() clouds by iq |
![]() crumpledwave by nasana |
![]() darktransit by diatribes |
![]() forknixietubeclock by picoplanetdev |
![]() hexagonalgrid by iq |
![]() hexneonlove by tutmann |
![]() hieroglyphs by nayk |
![]() iceandfire by mattz |
![]() linuxwallpaper by movAX13h |
![]() mandelbrot by JennySchub |
![]() montereywannabe by mrange |
![]() patternminimax by PAEz |
![]() pinkvoid by iVader |
![]() plasma by Xor |
![]() plasmawaves by scarletshark |
![]() polyhedrons by yli110 |
![]() proteanclouds by nimitz |
![]() ps3xmb by llmciv |
![]() seventymelt by tomorrowevening |
![]() singularity by Xor |
![]() spiralgalaxy by mrange |
![]() starnest by Kali |
![]() starshipreentry by negentrope |
![]() synthwavecanyon by mrange |
![]() tilewarppt3 by byt3_m3chanic |
![]() tumblerock by diatribes |
![]() undulatingurchin by ChunderFPV |
![]() voronoigradient by gls9102 |
![]() wadongmo759 by dongmo |
![]() waveymc by feresr |
All shaders are sourced from ShaderToy. Thanks to all the talented shader artists!
所有着色器均来自 ShaderToy,感谢所有才华横溢的着色器艺术家!
- Cross-Platform — Windows, Linux (Wayland: Hyprland, Sway, KDE 6+, GNOME) and macOS
- Multi-Monitor — Apply to all displays or target specific ones
- Local File Support — Built-in streaming HTTP server for local HTML/JS/CSS projects, with byte-range support
- Video Wallpapers — Muted, looping local videos using the system WebView; preserve the full image by default or crop to fill with
--video-fit cover - ShaderToy Integration — Automatically converts ShaderToy URLs to fullscreen embed format. (Caution : native resolution may cause performance issues.)
- Local
.shaderSupport — Wrap single-pass ShaderToy snippets into a fullscreen WebGL runtime (Better performance with--scaleparameter) - iChannel Textures — Supply 2D textures (
.png/.jpg) and 3D volume textures (.bin) for ShaderToy shaders that useiChannel0–iChannel3 - 37 Built-in Shaders — Curated collection of ShaderToy shaders with pre-tuned parameters, ready to use with
-b <name> - IPC Control — Stop wallpapers remotely via named pipes (Windows) or Unix domain sockets (Linux/macOS)
- Graceful Shutdown — Ctrl+C handling with platform-specific cleanup
| Platform | Technique | WebView Backend |
|---|---|---|
| Windows | WorkerW desktop embedding | WebView2 (Edge) |
| Linux (Hyprland, Sway, KDE 6+) | GTK layer-shell background surface | WebKitGTK |
| Linux (GNOME) | GTK window + companion GNOME Shell extension | WebKitGTK |
| macOS | NSWindow desktop-level ordering | WKWebView |
- Windows — Windows 10 (April 2018+) or Windows 11; WebView2 Runtime (usually pre-installed)
- Linux (Hyprland / Sway / KDE 6+) — Wayland session with layer-shell support; GTK 3, WebKitGTK, gtk-layer-shell
- Linux (GNOME) — GNOME Shell 45+; GTK 3, WebKitGTK. A companion GNOME Shell extension is automatically installed on first run. A one-time log-out/log-in is required to activate the extension.
- macOS — macOS 10.10+; no additional dependencies (WKWebView is a system framework)
# Homebrew
brew tap ownself/app-distribution https://github.com/ownself/app-distribution
brew install wewa
# Scoop
scoop bucket add ownself-app-distribution https://github.com/ownself/app-distribution
scoop install wewa
# AUR
yay -S wewa-bingit clone https://github.com/ownself/wewa.git
cd wewa
# Linux dependencies (Debian/Ubuntu)
sudo apt install libgtk-3-dev libwebkit2gtk-4.1-dev libgtk-layer-shell-dev
cargo build --release
# Binary: target/release/wewa(.exe)# URL as wallpaper (all monitors)
wewa https://example.com/wallpaper.html
# Target a specific monitor (0-based index)
wewa https://example.com --display 0
# ShaderToy (auto-converted to fullscreen embed)
wewa "https://www.shadertoy.com/view/tlVGDt"
# Local ShaderToy-style shader with default full-resolution rendering
wewa ./octagrams.shader
# Lower shader render scale for better performance
wewa ./octagrams.shader --scale 0.5
# Slow down shader animation without changing shader source
wewa ./octagrams.shader --time-scale 0.5
# Speed up shader animation for comparison or debugging
wewa ./octagrams.shader --time-scale 2.0
# Shader with iChannel textures (2D png/jpg or 3D .bin volume)
wewa ./clouds.shader --channel0 textures/noise_rgba.png --channel1 textures/noise_grey.png --channel2 textures/noise_volume.bin
# Short aliases for channel and time-scale options
wewa ./clouds.shader --c0 textures/noise_rgba.png --c1 textures/noise_grey.png --ts 0.5
# Use a built-in shader (no files needed)
wewa -b starnest
# List all available built-in shaders
wewa -b list
# Pick a random built-in shader
wewa -r
# Override built-in defaults
wewa -b clouds -s 1.0 --ts 0.5
# Local video: muted loop, full image with black bars if needed
wewa ./wallpaper.mp4
# Preserve aspect ratio and crop to fill the display
wewa ./wallpaper.mp4 --video-fit cover
# Video on one monitor, with a custom server port
wewa "./my videos/wallpaper.mp4" --display 0 --port 9000
# Local HTML file
wewa ./my-wallpaper/index.html
# Directory containing index.html
wewa ./my-wallpaper/
# Custom HTTP server port
wewa ./wallpaper.html --port 9000
# Stop wallpaper on display 0
wewa --stop 0
# Stop all wallpapers
wewa --stopall
wewa --sa
# Verbose output
wewa --verbose https://example.com| Option | Short | Description |
|---|---|---|
--builtin <NAME> |
-b |
Use a built-in shader by name (use list to see all) |
--random |
-r |
Use a random built-in shader |
--display <N> |
-d |
Target specific display (0-based index) |
--stop <N> |
Stop wallpaper on display N | |
--stopall |
--sa |
Stop all running wallpapers |
--port <PORT> |
-p |
HTTP server port for local files (default: 8080) |
--video-fit <MODE> |
Local video sizing: contain (default, black bars) or cover (crop to fill) |
|
--scale <FACTOR> |
-s |
Shader render scale (default: 1.0, or per-shader default with -b) |
--time-scale <FACTOR> |
--ts |
Shader animation time scale (default: 1.0, or per-shader default with -b) |
--channel0 <FILE> |
--c0 |
Texture file for iChannel0 (2D image or 3D .bin volume) |
--channel1 <FILE> |
--c1 |
Texture file for iChannel1 |
--channel2 <FILE> |
--c2 |
Texture file for iChannel2 |
--channel3 <FILE> |
--c3 |
Texture file for iChannel3 |
--verbose |
-v |
Enable verbose output |
--help |
-h |
Show help message |
--version |
-V |
Show version |
Local .mp4, .m4v, .webm, .mov and .ogv files are recognized (case-insensitive). Recognition is not a codec guarantee: playback depends on WebView2 / WKWebView / WebKitGTK and the system's codecs. H.264 MP4 is the recommended starting point; on Linux, media support also depends on GStreamer plugins and GPU drivers. Remote URLs remain ordinary web pages, not video inputs.
- Playback is always muted and looping, without controls, using the media element's native
loopbehavior. Each display adapts independently; synchronized playback and strictly seamless loops are not guaranteed. containpreserves the entire picture with a black background.coverpreserves aspect ratio while cropping the edges; it cannot automatically remove black bars encoded into the video itself.--video-fitapplies only to local video inputs. Shader--scaleand--time-scaleretain their existing meanings.- The generated HTML is served from memory; the video is streamed directly from its original path. No video copy or write permission in the source directory is required, and sibling files are not exposed.
- The page has no JavaScript frame loop or Canvas. Hardware decoding is selected by the system WebView, not guaranteed by wewa. Check actual decoder activity, CPU usage and power consumption on your hardware, especially with multiple displays.
- Playback errors appear on the wallpaper and in stderr.
--verbosereports the first playback event, but this is not proof of hardware decoding. Lock-screen/fullscreen auto-pause is not implemented in this version.
The file server supports complete GET, HEAD and single byte ranges (start-end, start-, -suffix), returning 206 or 416 as appropriate. Malformed, multi-range or If-Range requests fall back to full 200 responses. Video data is not buffered as a whole file in Rust; browser media buffering still uses memory. Static project paths are URL-encoded and path traversal is rejected. Explicit symlinks and directory junctions inside a static project are followed, including external media targets; only serve trusted project directories. Single-video mode still exposes only the specified video and its player page.
Implementation and outstanding platform/performance acceptance tasks: specs/002-webview-video-wallpaper/tasks.md.
--scalechanges render resolution for local.shaderinputs. Lower values usually improve performance at the cost of sharpness.--time-scalechanges the speed of the injectediTimeandiTimeDeltavalues for local.shaderinputs.- Use
--time-scale 1.0for original speed, values below1.0to slow animation down, values above1.0to speed it up, and0to freeze time for debugging. --time-scaleavoids editing shader source when you only want to compare animation pacing across different shaders.
Many ShaderToy shaders read from iChannel0–iChannel3 for noise, photos, or other data. You can supply these textures from local files:
- 2D textures — any image format (
.png,.jpg, etc.) → declared assampler2D - 3D volume textures — ShaderToy
.binformat (header: 4-byte signature + width/height/depth/channels, followed by raw uint8 data) → declared assampler3D
The file extension determines the type: .bin = 3D volume, anything else = 2D texture.
Channels that are not provided are automatically declared. If the shader fails to compile with sampler2D, the engine retries with sampler3D — so most shaders work without any --channel flags, albeit with blank (black) texture reads.
To find a ShaderToy shader's iChannel configuration, open the shader page in a browser and run this in DevTools (F12) Console:
JSON.stringify(gShaderToy.mEffect.mPasses.map((pass, pi) => ({
pass: pi, type: pass.mType,
inputs: pass.mInputs.map((inp, i) => inp ? {
channel: i, type: inp.mInfo.mType, src: inp.mInfo.mSrc
} : null).filter(x => x)
})), null, 2)Then download the textures from https://www.shadertoy.com<src_path> in your browser.
The binary ships with 37 curated shaders and their required textures — no external files needed:
wewa -b list # see all available names
wewa -b starnest # use itEach built-in shader has pre-tuned scale and time_scale defaults (configured in builtins.json) optimized for desktop wallpaper use. You can override any default with CLI flags:
wewa -b clouds -s 1.0 --ts 0.5The built-in shaders are sourced from ShaderToy. We are grateful to the talented shader artists who created and shared these works:
| Shader | Author | ShaderToy |
|---|---|---|
| 2dclouds | drift | 4tdSWr |
| accretion | Xor | WcKXDV |
| ascend | bug | 33KBDm |
| auroras | nimitz | XtGGRt |
| chillywave | Tornax07 | 3XSBDW |
| chillywave2 | Tornax07 | NflGRM |
| classic4colors | zosxavius | W3K3zy |
| clouds | iq | XslGRr |
| crumpledwave | nasana | 3ttSzr |
| darktransit | diatribes | WcdczB |
| forknixietubeclock | picoplanetdev | Dds3WB |
| hexagonalgrid | iq | WtSfWK |
| hexneonlove | tutmann | 3tKSWV |
| hieroglyphs | nayk | Nff3Ds |
| iceandfire | mattz | MdfBzl |
| linuxwallpaper | movAX13h | 4dcGRn |
| mandelbrot | JennySchub | NlcSRj |
| montereywannabe | mrange | NdVfzK |
| patternminimax | PAEz | sfS3Dz |
| pinkvoid | iVader | ddKXWh |
| plasma | Xor | WfS3Dd |
| plasmawaves | scarletshark | ltXczj |
| polyhedrons | yli110 | sc2GzW |
| proteanclouds | nimitz | 3l23Rh |
| ps3xmb | llmciv | fcf3Dn |
| seventymelt | tomorrowevening | XsX3zl |
| singularity | Xor | 3csSWB |
| spiralgalaxy | mrange | wsBBWD |
| starnest | Kali | XlfGRj |
| starshipreentry | negentrope | XX3fDH |
| synthwavecanyon | mrange | slcXW8 |
| tilewarppt3 | byt3_m3chanic | sff3RB |
| tumblerock | diatribes | NcjGDh |
| undulatingurchin | ChunderFPV | 332XWd |
| voronoigradient | gls9102 | WdlyRS |
| wadongmo759 | dongmo | fd3fD2 |
| waveymc | feresr | NtKGWw |
- WebView2 not available (Windows) — Install from Microsoft
- Layer-shell not available (Linux) — Ensure you are on a Wayland session with a layer-shell compositor (e.g. Hyprland, Sway, KDE 6+), and install
libgtk-3-dev libwebkit2gtk-4.1-dev libgtk-layer-shell-dev - GNOME: "please log out and log back in" — On first run, wewa automatically installs its companion GNOME Shell extension. GNOME Shell must be restarted to load new extensions, and on Wayland the only way is to log out and log back in. Subsequent runs will work without restart.
- Port already in use — Use
--port 9000to pick a different port - Shader performance is poor — Use
--scale 0.5or--scale 0.75for.shaderinputs - Finding display numbers — Run with
--verboseto list detected displays
src/
├── main.rs # Entry point, CLI dispatch, URL transformation
├── builtin.rs # 37 embedded shaders & textures, built-in shader extraction
├── cli.rs # Argument parsing (clap)
├── config.rs # Configuration and instance tracking
├── shader.rs # Shader file support, iChannel textures, WebGL runtime generation
├── video.rs # Local video detection, minimal media page and diagnostics
├── server.rs # Streaming HTTP server, byte ranges, isolated video routes
├── ipc.rs # IPC (named pipes / Unix sockets)
├── display.rs # Shared monitor data model
├── wallpaper.rs # Shared wallpaper config / errors
└── platform/
├── windows/ # WorkerW technique + WebView2
├── linux/ # GTK layer-shell + WebKitGTK
└── macos/ # NSWindow desktop-level + WKWebView
MIT
- 跨平台 — 支持 Windows、Linux(Wayland:Hyprland、Sway、KDE 6+、GNOME)和 macOS
- 多显示器 — 应用到所有显示器或指定特定显示器
- 本地文件支持 — 内置流式 HTTP 服务器,支持本地 HTML/JS/CSS 项目及字节范围请求
- 视频壁纸 — 使用系统 WebView 静音循环播放本地视频;默认完整显示,可用
--video-fit cover等比裁剪铺满 - ShaderToy 集成 — 自动将 ShaderToy URL 转换为全屏嵌入格式(警告:原生分辨率可能会导致性能问题)
- 本地
.shader支持 — 将单文件 ShaderToy 片段包装成全屏 WebGL 运行时(使用--scale参数使得性能更友好) - iChannel 纹理 — 为使用
iChannel0–iChannel3的 ShaderToy 着色器提供 2D 纹理(.png/.jpg)和 3D 体积纹理(.bin) - 37 款内置着色器 — 精选 ShaderToy 着色器合集,预调参数,通过
-b <名称>即可开箱即用 - IPC 控制 — 通过命名管道 (Windows) 或 Unix Domain Socket (Linux/macOS) 远程停止壁纸
- 优雅关闭 — Ctrl+C 处理并执行平台相关清理
| 平台 | 技术方案 | WebView 后端 |
|---|---|---|
| Windows | WorkerW 桌面嵌入 | WebView2 (Edge) |
| Linux (Hyprland, Sway, KDE 6+) | GTK layer-shell 背景层 | WebKitGTK |
| Linux (GNOME) | GTK 窗口 + GNOME Shell 配套扩展 | WebKitGTK |
| macOS | NSWindow 桌面层级窗口 | WKWebView |
- Windows — Windows 10 (2018年4月更新+) 或 Windows 11;WebView2 运行时(通常已预装)
- Linux (Hyprland / Sway / KDE 6+) — 支持 layer-shell 的 Wayland 会话;GTK 3、WebKitGTK、gtk-layer-shell
- Linux (GNOME) — GNOME Shell 45+;GTK 3、WebKitGTK。配套 GNOME Shell 扩展会在首次运行时自动安装,需注销并重新登录一次以激活扩展。
- macOS — macOS 10.10+;无额外依赖(WKWebView 为系统框架)
# Homebrew
brew tap ownself/app-distribution https://github.com/ownself/app-distribution
brew install wewa
# Scoop
scoop bucket add ownself-app-distribution https://github.com/ownself/app-distribution
scoop install wewa
# AUR
yay -S wewa-bingit clone https://github.com/ownself/wewa.git
cd wewa
# Linux 依赖(Debian/Ubuntu 系)
sudo apt install libgtk-3-dev libwebkit2gtk-4.1-dev libgtk-layer-shell-dev
cargo build --release
# 二进制文件:target/release/wewa(.exe)# 将 URL 设为壁纸(所有显示器)
wewa https://example.com/wallpaper.html
# 指定显示器(从 0 开始的索引)
wewa https://example.com --display 0
# ShaderToy(自动转换为全屏嵌入格式)
wewa "https://www.shadertoy.com/view/tlVGDt"
# 本地 ShaderToy 风格着色器
wewa ./octagrams.shader
# 降低渲染缩放以提升性能
wewa ./octagrams.shader --scale 0.5
# 不修改 shader 源码,直接放慢动画速度
wewa ./octagrams.shader --time-scale 0.5
# 加快动画速度,便于对比或调试
wewa ./octagrams.shader --time-scale 2.0
# 带 iChannel 纹理的 Shader(2D png/jpg 或 3D .bin 体积纹理)
wewa ./clouds.shader --channel0 textures/noise_rgba.png --channel1 textures/noise_grey.png --channel2 textures/noise_volume.bin
# 使用简短别名
wewa ./clouds.shader --c0 textures/noise_rgba.png --c1 textures/noise_grey.png --ts 0.5
# 使用内置着色器(无需任何文件)
wewa -b starnest
# 列出所有可用的内置着色器
wewa -b list
# 随机选取一款内置着色器
wewa -r
# 覆盖内置默认参数
wewa -b clouds -s 1.0 --ts 0.5
# 本地视频:静音循环,比例不同时默认黑边
wewa ./wallpaper.mp4
# 等比缩放并裁剪,铺满显示器
wewa ./wallpaper.mp4 --video-fit cover
# 指定显示器和服务端口
wewa "./我的视频/wallpaper.mp4" --display 0 --port 9000
# 本地 HTML 文件
wewa ./my-wallpaper/index.html
# 包含 index.html 的目录
wewa ./my-wallpaper/
# 自定义 HTTP 服务器端口
wewa ./wallpaper.html --port 9000
# 停止显示器 0 上的壁纸
wewa --stop 0
# 停止所有壁纸
wewa --stopall
wewa --sa
# 详细输出
wewa --verbose https://example.com| 选项 | 简写 | 描述 |
|---|---|---|
--builtin <NAME> |
-b |
使用内置着色器(list 查看全部) |
--random |
-r |
随机选取一款内置着色器 |
--display <N> |
-d |
指定目标显示器(从 0 开始的索引) |
--stop <N> |
停止显示器 N 上的壁纸 | |
--stopall |
--sa |
停止所有运行中的壁纸 |
--port <PORT> |
-p |
本地文件 HTTP 服务器端口(默认:8080) |
--video-fit <MODE> |
本地视频适配:contain(默认,允许黑边)或 cover(裁剪铺满) |
|
--scale <FACTOR> |
-s |
渲染缩放(默认:1.0,使用 -b 时按内置配置) |
--time-scale <FACTOR> |
--ts |
动画时间缩放(默认:1.0,使用 -b 时按内置配置) |
--channel0 <FILE> |
--c0 |
iChannel0 纹理文件(2D 图片或 3D .bin 体积纹理) |
--channel1 <FILE> |
--c1 |
iChannel1 纹理文件 |
--channel2 <FILE> |
--c2 |
iChannel2 纹理文件 |
--channel3 <FILE> |
--c3 |
iChannel3 纹理文件 |
--verbose |
-v |
启用详细输出 |
--help |
-h |
显示帮助信息 |
--version |
-V |
显示版本信息 |
自动识别本地 .mp4、.m4v、.webm、.mov、.ogv(不区分大小写)。识别扩展名不等于保证编码可播放:具体支持取决于 WebView2 / WKWebView / WebKitGTK 和系统解码器。建议先使用 H.264 MP4;Linux 还依赖 GStreamer 插件及显卡驱动。远程 URL 仍作为普通网页处理,不自动包装为视频。
- 始终静音、循环、无控件,使用媒体元素原生
loop行为。各显示器独立适配,不保证同步或严格无缝循环。 contain完整显示并使用黑色背景;cover保持比例并裁剪边缘,不能自动去除视频文件内嵌的黑边。--video-fit仅用于本地视频;Shader 的--scale、--time-scale含义不变。- 播放器 HTML 保存在内存中,视频直接从原路径流式读取;不复制视频,不要求源目录可写,不公开同目录的其他文件。
- 页面不使用 JavaScript 逐帧循环或 Canvas。硬件解码由系统 WebView 选择,wewa 不保证必定启用;尤其在多屏时,请实测解码器、CPU 和功耗。
- 播放失败会显示壁纸内错误提示并输出 stderr;
--verbose输出首次播放事件,但不代表硬件解码已启用。本版没有锁屏/全屏自动暂停。
文件服务器支持完整 GET、HEAD 及单字节范围(start-end、start-、-suffix),正确返回 206/416。畸形、多区间或含 If-Range 的请求回退完整 200 响应。Rust 侧不将视频完整缓冲进内存,但 WebView 仍有媒体缓冲开销。静态项目路径按 URL 编码并拒绝路径穿越;支持项目目录内显式建立的符号链接和目录联接,包括指向外部媒体目录的链接,因此只应服务可信项目目录。单视频模式仍仅暴露指定视频及播放器页面。
实现及待完成的平台/性能验收任务:specs/002-webview-video-wallpaper/tasks.md。
--scale用于调整本地.shader输入的渲染分辨率;值越小通常性能越好,但画面会更模糊。--time-scale用于调整本地.shader输入注入的iTime和iTimeDelta速度。--time-scale 1.0表示原始速度,小于1.0表示减速,大于1.0表示加速,0可用于冻结时间以便调试。- 当你只是想对比不同 shader 的动画节奏时,
--time-scale可以避免逐个修改 shader 源码。
许多 ShaderToy 着色器通过 iChannel0–iChannel3 读取噪声、照片或其他数据。你可以通过本地文件提供这些纹理:
- 2D 纹理 — 任意图片格式(
.png、.jpg等)→ 声明为sampler2D - 3D 体积纹理 — ShaderToy
.bin格式(文件头:4 字节签名 + 宽/高/深/通道数,后接 uint8 原始数据)→ 声明为sampler3D
文件扩展名决定类型:.bin = 3D 体积纹理,其他 = 2D 纹理。
未提供的通道会自动声明。如果以 sampler2D 编译失败,引擎会自动重试 sampler3D——因此大多数着色器无需任何 --channel 参数即可运行,只是未绑定的纹理读取结果为黑色。
要查看某个 ShaderToy 着色器的 iChannel 配置,在浏览器中打开该着色器页面,在开发者工具(F12)控制台中执行:
JSON.stringify(gShaderToy.mEffect.mPasses.map((pass, pi) => ({
pass: pi, type: pass.mType,
inputs: pass.mInputs.map((inp, i) => inp ? {
channel: i, type: inp.mInfo.mType, src: inp.mInfo.mSrc
} : null).filter(x => x)
})), null, 2)然后在浏览器中从 https://www.shadertoy.com<src路径> 下载对应的纹理文件。
程序内嵌了 37 款精选着色器及其所需纹理,无需任何外部文件即可使用:
wewa -b list # 查看所有可用名称
wewa -b starnest # 直接使用每款内置着色器都有预调的 scale 和 time_scale 默认值(配置在 builtins.json 中),针对桌面壁纸场景优化。你可以通过命令行参数覆盖任意默认值:
wewa -b clouds -s 1.0 --ts 0.5内置着色器来源于 ShaderToy。感谢才华横溢的着色器艺术家们创作并分享了这些精彩的作品:
| 着色器 | 作者 | ShaderToy |
|---|---|---|
| 2dclouds | drift | 4tdSWr |
| accretion | Xor | WcKXDV |
| ascend | bug | 33KBDm |
| auroras | nimitz | XtGGRt |
| chillywave | Tornax07 | 3XSBDW |
| chillywave2 | Tornax07 | NflGRM |
| classic4colors | zosxavius | W3K3zy |
| clouds | iq | XslGRr |
| crumpledwave | nasana | 3ttSzr |
| darktransit | diatribes | WcdczB |
| forknixietubeclock | picoplanetdev | Dds3WB |
| hexagonalgrid | iq | WtSfWK |
| hexneonlove | tutmann | 3tKSWV |
| hieroglyphs | nayk | Nff3Ds |
| iceandfire | mattz | MdfBzl |
| linuxwallpaper | movAX13h | 4dcGRn |
| mandelbrot | JennySchub | NlcSRj |
| montereywannabe | mrange | NdVfzK |
| patternminimax | PAEz | sfS3Dz |
| pinkvoid | iVader | ddKXWh |
| plasma | Xor | WfS3Dd |
| plasmawaves | scarletshark | ltXczj |
| polyhedrons | yli110 | sc2GzW |
| proteanclouds | nimitz | 3l23Rh |
| ps3xmb | llmciv | fcf3Dn |
| seventymelt | tomorrowevening | XsX3zl |
| singularity | Xor | 3csSWB |
| spiralgalaxy | mrange | wsBBWD |
| starnest | Kali | XlfGRj |
| starshipreentry | negentrope | XX3fDH |
| synthwavecanyon | mrange | slcXW8 |
| tilewarppt3 | byt3_m3chanic | sff3RB |
| tumblerock | diatribes | NcjGDh |
| undulatingurchin | ChunderFPV | 332XWd |
| voronoigradient | gls9102 | WdlyRS |
| wadongmo759 | dongmo | fd3fD2 |
| waveymc | feresr | NtKGWw |
- WebView2 不可用 (Windows) — 从 Microsoft 安装
- Layer-shell 不可用 (Linux) — 确认在支持 layer-shell 的 Wayland 会话中运行(如 Hyprland、Sway、KDE 6+),并安装
libgtk-3-dev libwebkit2gtk-4.1-dev libgtk-layer-shell-dev - GNOME:提示"请注销并重新登录" — 首次运行时 wewa 会自动安装配套的 GNOME Shell 扩展。GNOME Shell 需要重启才能加载新扩展,Wayland 下只能通过注销重新登录来重启。后续运行无需再次重启。
- 端口被占用 — 使用
--port 9000指定其他端口 - Shader 性能较差 — 对
.shader输入使用--scale 0.5或--scale 0.75 - 查找显示器编号 — 使用
--verbose运行以查看检测到的显示器
src/
├── main.rs # 入口点、CLI 分发、URL 转换
├── cli.rs # 参数解析 (clap)
├── config.rs # 配置和实例跟踪
├── shader.rs # Shader 文件支持、iChannel 纹理、WebGL 运行时生成
├── video.rs # 视频识别、最小播放器页面、媒体事件反馈
├── server.rs # 流式 HTTP、字节范围、隔离的视频路由
├── ipc.rs # 进程间通信(命名管道 / Unix Socket)
├── display.rs # 共享显示器数据模型
├── wallpaper.rs # 共享壁纸配置与错误类型
└── platform/
├── windows/ # WorkerW 技术 + WebView2
├── linux/ # GTK layer-shell + WebKitGTK
└── macos/ # NSWindow 桌面层级 + WKWebView
MIT




































