Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
9e877d7
refactor: remove unused engine/camera.rs
code-wolf-byte Oct 18, 2026
3807912
refactor: remove unused engine/pass.rs
code-wolf-byte Oct 18, 2026
5e413a8
refactor: remove unused engine/resource.rs
code-wolf-byte Oct 18, 2026
ea1a3b8
refactor: move scan_wallpapers to src/bin
code-wolf-byte Oct 18, 2026
c66b046
refactor: move particle tests into engine/particle/tests.rs
code-wolf-byte Oct 18, 2026
4a16350
refactor: move gpu_renderer tests into engine/gpu_renderer/tests.rs
code-wolf-byte Oct 18, 2026
82c6f84
refactor: move transpiler tests into engine/shaders/transpiler/tests.rs
code-wolf-byte Oct 18, 2026
4d00d48
refactor: move scene-resolver tests into engine/render/tests.rs
code-wolf-byte Oct 18, 2026
d3426a3
refactor: add render/session.rs for per-output logic shared by backends
code-wolf-byte Oct 18, 2026
d704693
refactor: Wayland backend uses the shared render::session
code-wolf-byte Oct 18, 2026
c0dfa39
refactor: X11 backend uses the shared render::session
code-wolf-byte Oct 18, 2026
b3c261e
refactor: move engine/fbo.rs to engine/gpu/fbo.rs
code-wolf-byte Oct 18, 2026
fce4412
refactor: move engine/blend.rs to engine/gpu/blend.rs
code-wolf-byte Oct 18, 2026
3f54cc8
refactor: move engine/lighting.rs to engine/gpu/lighting.rs
code-wolf-byte Oct 18, 2026
0e4dba1
refactor: move engine/shadow.rs to engine/gpu/shadow.rs
code-wolf-byte Oct 18, 2026
41ad9cc
refactor: move engine/text.rs to engine/gpu/text.rs
code-wolf-byte Oct 18, 2026
a485b56
refactor: move engine/shaders/ to engine/gpu/shaders/
code-wolf-byte Oct 18, 2026
00ba415
refactor: move engine/gpu_renderer/ to engine/gpu/renderer/
code-wolf-byte Oct 18, 2026
b2e26b4
refactor: move engine/noise.rs to engine/sim/noise.rs
code-wolf-byte Oct 18, 2026
3adc40f
refactor: move engine/timeline.rs to engine/sim/timeline.rs
code-wolf-byte Oct 18, 2026
6b9c827
refactor: move engine/camera_dynamics.rs to engine/sim/camera_dynamic…
code-wolf-byte Oct 18, 2026
75e4622
refactor: move engine/camera3d.rs to engine/sim/camera3d.rs
code-wolf-byte Oct 18, 2026
118d783
refactor: move engine/puppet.rs to engine/sim/puppet.rs
code-wolf-byte Oct 18, 2026
2fad43f
refactor: move engine/script.rs to engine/sim/script.rs
code-wolf-byte Oct 18, 2026
fb1875d
refactor: move engine/particle/ to engine/sim/particle/
code-wolf-byte Oct 18, 2026
a0fb422
refactor: move engine/scene.rs to engine/model/scene.rs
code-wolf-byte Oct 18, 2026
2c45252
refactor: move engine/mesh3d.rs to engine/model/mesh3d.rs
code-wolf-byte Oct 18, 2026
5004a9e
refactor: move engine/render/ to engine/model/resolve/
code-wolf-byte Oct 18, 2026
2d14066
refactor: move engine/animated.rs to engine/cpu/animated.rs
code-wolf-byte Oct 18, 2026
a9290b7
refactor: move engine/effect.rs to engine/cpu/effect.rs
code-wolf-byte Oct 18, 2026
1ac8af5
refactor: move engine/graph.rs to engine/cpu/graph.rs
code-wolf-byte Oct 18, 2026
6758f50
refactor: move engine/material.rs to engine/cpu/material.rs
code-wolf-byte Oct 18, 2026
9bd17e5
refactor: move engine/pkg.rs to formats/pkg.rs
code-wolf-byte Oct 18, 2026
a14d9f2
refactor: move engine/tex.rs to formats/tex.rs
code-wolf-byte Oct 18, 2026
651ae77
refactor: move engine/assets.rs to formats/assets.rs
code-wolf-byte Oct 18, 2026
851c102
refactor: move engine.rs to audio.rs
code-wolf-byte Oct 18, 2026
1d25149
Revert "refactor: move engine.rs to audio.rs"
code-wolf-byte Oct 18, 2026
9117436
refactor: move engine/audio.rs to services/audio.rs
code-wolf-byte Oct 18, 2026
70ead0c
refactor: move platform/audio.rs to services/audio_devices.rs
code-wolf-byte Oct 18, 2026
0b8b7e8
refactor: move engine/media.rs to services/media.rs
code-wolf-byte Oct 18, 2026
a3f2603
refactor: move platform/power.rs to services/power.rs
code-wolf-byte Oct 18, 2026
7befcaa
refactor: move engine/playback_gate.rs to services/playback_gate.rs
code-wolf-byte Oct 18, 2026
2be6038
refactor: move engine/properties.rs to workshop/properties.rs
code-wolf-byte Oct 18, 2026
dd85810
refactor: describe engine's four groups in engine/mod.rs, trim re-exp…
code-wolf-byte Oct 18, 2026
f4a5efa
refactor: rename the top-level render/ module to content/
code-wolf-byte Oct 18, 2026
504185a
refactor: rename content/content.rs to content/wallpaper.rs
code-wolf-byte Oct 18, 2026
f353644
refactor: rename content/ffmpeg.rs to content/video.rs
code-wolf-byte Oct 18, 2026
3bc4872
docs: update module paths in content/frame.rs comments
code-wolf-byte Oct 18, 2026
350c8b4
docs: update module paths in content/session.rs comments
code-wolf-byte Oct 18, 2026
27580c3
docs: update module paths in content/settings.rs comments
code-wolf-byte Oct 18, 2026
e24d933
docs: update module paths in content/web.rs comments
code-wolf-byte Oct 18, 2026
4c173e0
docs: update module paths in engine/cpu/animated.rs comments
code-wolf-byte Oct 18, 2026
9ea85e1
docs: update module paths in engine/gpu/blend.rs comments
code-wolf-byte Oct 18, 2026
bce8f85
docs: update module paths in engine/gpu/lighting.rs comments
code-wolf-byte Oct 18, 2026
71e1cf9
docs: update module paths in engine/gpu/renderer/mod.rs comments
code-wolf-byte Oct 18, 2026
438e2c0
docs: update module paths in engine/model/resolve/mod.rs comments
code-wolf-byte Oct 18, 2026
eeecfbe
docs: update module paths in engine/model/resolve/tests.rs comments
code-wolf-byte Oct 18, 2026
a24a470
docs: update module paths in engine/model/scene.rs comments
code-wolf-byte Oct 18, 2026
047d79d
docs: update module paths in engine/sim/camera3d.rs comments
code-wolf-byte Oct 18, 2026
51871c6
docs: update module paths in engine/sim/particle/mod.rs comments
code-wolf-byte Oct 18, 2026
be12c88
docs: update module paths in engine/sim/particle/tests.rs comments
code-wolf-byte Oct 18, 2026
bc030fb
docs: update module paths in platform/wayland/mod.rs comments
code-wolf-byte Oct 18, 2026
0aeb509
docs: update module paths in platform/x11/mod.rs comments
code-wolf-byte Oct 18, 2026
8e98bbb
docs: update module paths in services/audio_devices.rs comments
code-wolf-byte Oct 18, 2026
6e89ae3
docs: update module paths in services/media.rs comments
code-wolf-byte Oct 18, 2026
732b888
docs: update module paths in services/playback_gate.rs comments
code-wolf-byte Oct 18, 2026
fd92047
docs: update module paths in services/power.rs comments
code-wolf-byte Oct 18, 2026
208d95a
fix: scan-wallpapers writes its report to target/
code-wolf-byte Oct 18, 2026
ad5b071
docs: describe engine/model/ in its mod.rs
code-wolf-byte Oct 18, 2026
6291640
docs: describe content/ in its mod.rs
code-wolf-byte Oct 18, 2026
c186978
docs: map the new source layout in ARCHITECTURE.md
code-wolf-byte Oct 18, 2026
c7c7364
refactor: split effect uniform packing out of the renderer into param…
code-wolf-byte Oct 18, 2026
664bad6
refactor: split GpuSceneRenderer's impl into renderer/pipelines.rs
code-wolf-byte Oct 18, 2026
4b2ee99
refactor: split scene lights out of the renderer into renderer/lights.rs
code-wolf-byte Oct 18, 2026
07703e2
refactor: split per-frame drawing out of the renderer into renderer/d…
code-wolf-byte Oct 18, 2026
622f10c
refactor: split live scene updates out of the renderer into renderer/…
code-wolf-byte Oct 18, 2026
d6e12a3
test: deflake the daemon lock test
code-wolf-byte Oct 18, 2026
73eeb09
refactor: split scene construction out of the renderer into renderer/…
code-wolf-byte Oct 18, 2026
0add8de
docs: map the renderer's files in engine/gpu/renderer/mod.rs
code-wolf-byte Oct 18, 2026
86dccd9
refactor: split particle config types into engine/sim/particle/config.rs
code-wolf-byte Oct 18, 2026
6469a33
refactor: split particle operator parameters into particle/operators.rs
code-wolf-byte Oct 18, 2026
7b5ac05
refactor: split particle drawing into engine/sim/particle/draw.rs
code-wolf-byte Oct 18, 2026
10b7dd9
refactor: split ParticleSystem::from_config into engine/sim/particle/…
code-wolf-byte Oct 18, 2026
acf4ef2
refactor: split particle simulation into engine/sim/particle/step.rs
code-wolf-byte Oct 18, 2026
dd25be3
docs: map the particle module's files in engine/sim/particle/mod.rs
code-wolf-byte Oct 18, 2026
ecacb75
refactor: drop needless glob imports in engine/sim/particle/mod.rs
code-wolf-byte Oct 18, 2026
927a0a3
refactor: split GLSL source rewrites into transpiler/rewrite.rs
code-wolf-byte Oct 18, 2026
787fa92
refactor: split error-driven shader repairs into transpiler/repair.rs
code-wolf-byte Oct 18, 2026
b7b6731
refactor: split shader source assembly into transpiler/preprocess.rs
code-wolf-byte Oct 18, 2026
9014235
docs: map the transpiler's files in engine/gpu/shaders/transpiler/mod.rs
code-wolf-byte Oct 18, 2026
ab6e37b
refactor: split texture loading into engine/model/resolve/textures.rs
code-wolf-byte Oct 18, 2026
254384e
refactor: split object transforms into engine/model/resolve/transform.rs
code-wolf-byte Oct 18, 2026
25ed809
refactor: split layer builders into engine/model/resolve/layers.rs
code-wolf-byte Oct 18, 2026
ed3d3f5
refactor: move the CPU compositor into engine/cpu/compose.rs
code-wolf-byte Oct 18, 2026
c7ca376
docs: map the resolver's files in engine/model/resolve/mod.rs
code-wolf-byte Oct 18, 2026
6d0c6cd
refactor: move the CLI out of main.rs into cli/mod.rs
code-wolf-byte Oct 18, 2026
a3967c9
refactor: split the CLI's library commands into cli/library.rs
code-wolf-byte Oct 18, 2026
8a5c2bc
refactor: split the CLI's apply commands into cli/apply.rs
code-wolf-byte Oct 18, 2026
29d6fe9
refactor: split the CLI's config commands into cli/config.rs
code-wolf-byte Oct 18, 2026
8c7c3cc
refactor: split the CLI's daemon commands into cli/daemon.rs
code-wolf-byte Oct 18, 2026
8d272d9
refactor: split the CLI's debug commands into cli/debug.rs
code-wolf-byte Oct 18, 2026
60da3ff
docs: wrap the module doc in cli/apply.rs
code-wolf-byte Oct 18, 2026
75e6358
docs: wrap the module doc in cli/daemon.rs
code-wolf-byte Oct 18, 2026
ef939f0
docs: wrap the module doc in cli/debug.rs
code-wolf-byte Oct 18, 2026
f48ca56
refactor: split the GUI's apply code into ui/apply.rs
code-wolf-byte Oct 18, 2026
2434b4e
refactor: split the GUI's thumbnails code into ui/thumbnails.rs
code-wolf-byte Oct 18, 2026
4cd0e58
refactor: split the GUI's browse code into ui/browse.rs
code-wolf-byte Oct 18, 2026
1c20a89
refactor: split the GUI's details code into ui/details.rs
code-wolf-byte Oct 18, 2026
2643627
refactor: split the GUI's playlist code into ui/playlist.rs
code-wolf-byte Oct 18, 2026
5194739
refactor: split the GUI's displays code into ui/displays.rs
code-wolf-byte Oct 18, 2026
a3d544d
refactor: split the GUI's footer code into ui/footer.rs
code-wolf-byte Oct 18, 2026
9516f71
refactor: split the property editor out of ui/config.rs into ui/prope…
code-wolf-byte Oct 18, 2026
32dcfac
refactor: move the playlist Configure popup from ui/config.rs to ui/p…
code-wolf-byte Oct 18, 2026
81777c6
refactor: move the GUI's shared helpers from ui/config.rs to ui/mod.rs
code-wolf-byte Oct 18, 2026
a574c64
refactor: rename ui/config.rs to ui/settings_window.rs
code-wolf-byte Oct 18, 2026
85647a7
docs: map the GUI's files in ui/mod.rs
code-wolf-byte Oct 18, 2026
ee93200
docs: add cli/ and the folder-module convention to ARCHITECTURE.md
code-wolf-byte Oct 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 55 additions & 21 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,41 @@ The scene engine is deliberately split into small stages so Wallpaper Engine's
original OpenGL pass model can be rebuilt incrementally in Rust, and so each
stage can be inspected on its own when a wallpaper renders wrongly.

## Source layout

```text
src/
main.rs, cli/ the wp-engine binary and its commands, one file per area
bin/ the scan-wallpapers tool
workshop/ finding Workshop items; project.json and user properties
formats/ .pkg archives, .tex textures, the asset store
engine/ the scene engine
model/ what a scene is: scene.json types, resolving into layers
sim/ what changes: particles, timelines, SceneScript, cameras, puppets
gpu/ how it's drawn: the renderer, targets, lighting, shadows, shaders
cpu/ the CPU fallback renderer
content/ wallpaper content (scene/video/web/image), frame sources,
render settings, the per-output session the backends share
services/ what wallpapers react to: audio, media, battery/lock, pause rules
platform/ presentation: wayland/, x11/, macos/, GPU device, scaler
daemon/, application/, settings.rs, schedule.rs lifecycle and saved setup
ui/ the desktop app, one file per part of the window
```

Large modules are folders whose `mod.rs` holds the types and says where the
rest lives — for example `engine/gpu/renderer/` splits into `pipelines`,
`build`, `live`, `draw`, `lights` and `params`, and `engine/sim/particle/`
into `config`, `build`, `step`, `operators` and `draw`. Tests sit beside
them in `tests.rs`.

## Pipeline

### 1. Workshop Content Detection

The app starts from either a Steam Workshop item or a direct file path.

- `src/workshop` scans Wallpaper Engine Workshop projects.
- `src/render/content.rs` classifies content as static image, video, scene, or
- `src/content/wallpaper.rs` classifies content as static image, video, scene, or
web.
- Static, video, and web wallpapers flow through the frame-source path.
- Scene wallpapers are handed to the engine pipeline below.
Expand All @@ -22,7 +51,7 @@ The app starts from either a Steam Workshop item or a direct file path.

Scene assets can exist as loose files or packed archives.

- `src/engine/assets.rs` mounts the wallpaper directory.
- `src/formats/assets.rs` mounts the wallpaper directory.
- Loose files are preferred.
- `scene.pkg` and `gifscene.pkg` are loaded as fallbacks.
- Asset paths are normalized to Wallpaper Engine's forward-slash layout.
Expand All @@ -36,7 +65,7 @@ lookup layer.

The engine reads `scene.json` into loose, tolerant Rust structs.

- `src/engine/scene.rs` parses objects, camera data, effects, visibility,
- `src/engine/model/scene.rs` parses objects, camera data, effects, visibility,
origins, sizes, parallax, and texture overrides.
- Fields that vary between Wallpaper Engine versions are kept as
`serde_json::Value` until a later stage knows how to interpret them.
Expand All @@ -48,7 +77,7 @@ slightly different schema.

The scene graph resolves object references into typed engine data.

- `src/engine/material.rs` loads model JSON files.
- `src/engine/cpu/material.rs` loads model JSON files for the CPU path.
- Models point at material JSON files.
- Materials contain passes, shaders, texture bindings, combos, constants,
blending, culling, and depth flags.
Expand All @@ -69,7 +98,7 @@ scene object

### 5. Scene Graph

`src/engine/graph.rs` builds a resolved scene graph.
`src/engine/cpu/graph.rs` builds a resolved scene graph.

For each visible object it records:

Expand All @@ -87,7 +116,7 @@ rendering.

### 6. Shader Translation Layer

`src/engine/shaders/transpiler.rs` turns Wallpaper Engine's GLSL into WGSL:
`src/engine/gpu/shaders/transpiler/` turns Wallpaper Engine's GLSL into WGSL:
resolve `shaders/<name>.vert|frag`, expand includes and combo `#define`s,
compile to SPIR-V with shaderc, then translate to WGSL with Naga.

Expand All @@ -104,7 +133,7 @@ compile — shaderc's line numbers refer to that text and nothing else prints it

### 7. GPU Scene Renderer

`src/engine/gpu_renderer.rs` is the production renderer — `GpuSceneInstance` and
`src/engine/gpu/renderer/` is the production renderer — `GpuSceneInstance` and
`gpu_scene_render_loop`, used by `set`, `set-file`, and `test-scene`.

It owns the full pass model: per-object composite buffers, ping-pong FBOs,
Expand All @@ -119,7 +148,7 @@ only way to inspect the live path off-screen.

### 8. Web Wallpapers

`src/render/web.rs` renders HTML wallpapers with an embedded Chromium through
`src/content/web.rs` renders HTML wallpapers with an embedded Chromium through
CEF, off-screen: each painted frame becomes an `RgbaImage` on the same channel
video and CPU scene rendering use, so every presentation path works unchanged.

Expand All @@ -130,7 +159,8 @@ bands. Behind the off-by-default `web` feature; see **Building**.

### 9. CPU Fallback Renderer

`src/engine/render.rs` keeps the older CPU compositor alive.
`ResolvedScene::render` (`src/engine/model/resolve/`) keeps the older CPU
compositor alive, with its frame loop and scene graph in `src/engine/cpu/`.

It:

Expand Down Expand Up @@ -161,33 +191,37 @@ handle; if that fails (or `WP_ENGINE_FORCE_SHM` is set) it falls back to RGBA
readback + SHM buffers. The same module feeds the real cursor position into
camera parallax and `g_PointerPosition`.

On **X11**, `src/platform/x11` draws into the root window's background pixmap
and publishes `_XROOTPMAP_ID`/`ESETROOT_PMAP_ID`, the convention every WM and
compositor honours (it is what `feh --bg` sets). There is no direct-presentation
equivalent, so every frame is read back and pushed with `PutImage`. X11 gets
On **X11**, `src/platform/x11` draws each frame into a root-sized pixmap and
publishes it as the root background (`_XROOTPMAP_ID`/`ESETROOT_PMAP_ID`, what
`feh --bg` sets). Desktop environments cover the root with their own desktop, so
when the window manager supports EWMH desktop windows the same pixmap also backs
a click-through `_NET_WM_WINDOW_TYPE_DESKTOP` window of ours. Frames are read
back and pushed with `PutImage`; there is no direct-presentation path yet. X11 gets
better parallax for free: `QueryPointer` reports the global cursor regardless of
which window has focus.

Both the X11 and Wayland backends also implement the real Wallpaper Engine's
own "pause wallpaper rendering when..." settings (`engine::playback_gate` —
own "pause wallpaper rendering when..." settings (`services::playback_gate` —
recovered from the Ghidra dump's import table, not the usual property scan;
see the report's Follow-up (ff)): on battery power, when the session is
locked, and when another application is fullscreen or maximized (X11 via
EWMH's `_NET_ACTIVE_WINDOW`/`_NET_WM_STATE`; Wayland via
`zwlr_foreign_toplevel_management`, so it only works on compositors that
support that wlroots-ecosystem protocol — Sway/Hyprland/river, not
GNOME/Mutter). Session-lock detection is Linux-only (logind over D-Bus, via
`platform::power::LockWatcher`). Each condition defaults per
`engine::playback_gate::PauseConditions::default`'s own doc comment (WE's
`services::power::LockWatcher`). Each condition defaults per
`services::playback_gate::PlaybackPolicy::default`'s own doc comment (WE's
real defaults for these aren't recoverable from the binary) and is
overridable with `WP_ENGINE_PAUSE_ON_BATTERY`/`_LOCK`/`_FULLSCREEN`/
`_MAXIMIZED=0`/`1`. macOS currently has none of this wired in (see
`platform::macos`'s own "step 2 of the port" status note) — `platform::
`platform::macos`'s own "step 2 of the port" status note) — `services::
power::is_on_battery` already works there (via `pmset`) for whenever that
backend's render loop is built out far enough to use it.

Static images, videos, and web wallpapers flow through `src/render/frame.rs`
frame sources.
Static images, videos, and web wallpapers flow through `src/content/frame.rs`
frame sources. What every output does whichever backend shows it — building its
renderer, live property edits, the pause rules — lives once in
`src/content/session.rs`.

### 11. Application Lifecycle

Expand All @@ -210,15 +244,15 @@ rather than stack. The GUI forwards live quality/volume changes the same way.

### 12. User Properties

`src/engine/properties.rs` loads `project.json` `general.properties`,
`src/workshop/properties.rs` loads `project.json` `general.properties`,
applies `--set-property NAME=VALUE` overrides, and rewrites `{"user": ...}`
references inside `scene.json` before parsing — the Rust counterpart of the
reference `PropertyParser`/`UserSettingParser`. `wp-engine list-properties
<id>` lists what a wallpaper exposes.

### 13. Camera Dynamics

`src/engine/camera_dynamics.rs` implements scene-level `camerashake`,
`src/engine/sim/camera_dynamics.rs` implements scene-level `camerashake`,
`camerafade`, and `cameraparallax` from the resolved general settings. Shake
and per-layer parallax feed the composite pass as UV offsets; fade drives
global scene opacity.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ path = "src/main.rs"

[[bin]]
name = "scan-wallpapers"
path = "src/tests/scan_wallpapers.rs"
path = "src/bin/scan_wallpapers.rs"

[features]
default = []
Expand Down
6 changes: 3 additions & 3 deletions src/application/application_context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::collections::HashMap;
use std::path::PathBuf;
use std::sync::{Arc, Mutex};

use crate::render::RenderSettings;
use crate::content::RenderSettings;

/// Runtime configuration for a wallpaper run (the Rust counterpart of the C++
/// `ApplicationContext`). Built from the CLI by `main.rs` and consumed by
Expand Down Expand Up @@ -36,7 +36,7 @@ pub struct ApplicationContext {
impl ApplicationContext {
pub fn new(background: PathBuf) -> Self {
let saved = crate::settings::WpSettings::load();
let fps = saved.fps.unwrap_or(crate::render::settings::DEFAULT_FPS);
let fps = saved.fps.unwrap_or(crate::content::settings::DEFAULT_FPS);
let scaling = saved.scaling.unwrap_or_default();
Self {
background,
Expand Down Expand Up @@ -83,7 +83,7 @@ impl ApplicationContext {
S: AsRef<str>,
{
for arg in args {
let (name, value) = crate::engine::properties::parse_property_arg(arg.as_ref());
let (name, value) = crate::workshop::properties::parse_property_arg(arg.as_ref());
self.properties.insert(name, value);
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/application/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ use std::time::Duration;

use anyhow::{Context, Result};

use crate::content::{ScreenContent, ScreenSettings, WallpaperContent};
use crate::platform::{self, WallpaperHandle};
use crate::render::{ScreenContent, ScreenSettings, WallpaperContent};

pub mod application_context;
pub use application_context::ApplicationContext;
Expand All @@ -37,7 +37,7 @@ impl WallpaperApplication {
/// Prepare the application: installs the context's property overrides so
/// every scene loaded afterwards resolves user settings against them.
pub fn new(context: ApplicationContext) -> Self {
crate::engine::properties::set_overrides_for(
crate::workshop::properties::set_overrides_for(
&context.background,
context.properties.clone(),
);
Expand Down
3 changes: 2 additions & 1 deletion src/tests/scan_wallpapers.rs → src/bin/scan_wallpapers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
results.sort_by(|a, b| a.id.cmp(&b.id));

// ── Write errors.txt ──────────────────────────────────────────────────────
let out_path = "src/tests/errors.txt";
// Generated output: target/ is already ignored and always exists after a build.
let out_path = "target/scan-wallpapers-errors.txt";
let mut out = fs::File::create(out_path)?;

for r in &results {
Expand Down
Loading
Loading