Skip to content

feat: native video wallpaper support via QML MediaPlayer - #1710

Open
DipCrai wants to merge 19 commits into
caelestia-dots:mainfrom
DipCrai:feature/video-wallpaper-support
Open

feat: native video wallpaper support via QML MediaPlayer#1710
DipCrai wants to merge 19 commits into
caelestia-dots:mainfrom
DipCrai:feature/video-wallpaper-support

Conversation

@DipCrai

@DipCrai DipCrai commented Jul 16, 2026

Copy link
Copy Markdown
  • Wallpaper.qml: single-layer architecture with MediaPlayer+VideoOutput for videos, CachingImage for images, fade-in animations, timer-based cleanup preventing flash between transitions
  • WallpaperItem.qml: video/image badge icons, thumbnail via .thumbs/
  • Wallpapers.qml: merged image+video FileSystemModels
  • Images.qml: isValidVideoByName, isVideoFile utilities
  • Paths.qml: videowallsdir property
  • shell.qml: QT_MEDIA_BACKEND=ffmpeg

Edit: this PR has a CLI part caelestia-dots/cli#136

Edit 2:

  • isPaused: unloads video on fullscreen/game mode, shows static thumbnail

Edit 3:

  • Nexus: video thumbnails with badge in wallpaper grid, fixed preview

Edit 4:

  • Auto generate video wallpaper thumbnails and refresh on completion

@dxnnv

dxnnv commented Jul 16, 2026

Copy link
Copy Markdown
Member

Worth also mentioning this seems to have a cli PR counterpart in caelestia-dots/cli#136 to achieve full functionality.

@DipCrai

DipCrai commented Jul 17, 2026

Copy link
Copy Markdown
Author

Worth also mentioning this seems to have a cli PR counterpart in caelestia-dots/cli#136 to achieve full functionality.

Yeah, you're right. I forgot to mention this. 🫪

@dxnnv dxnnv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These suppressions appear to be compensating for a missing CI dependency rather than an issue in QML. The lines marked don't actually produce any linter warnings in a normal install, the properties are just a result of the CI image not installing qt6-multimedia, so qmllint can't resolve VideoOutput as a QQuickItem. Hiding QtMultimedia locally reproduces the exact warnings, while installing it removes them.

The linting workflow doesn't necessarily have to pass for this, since it's not an issue with the code and would be fixed if/when this is merged when Sora updates the CI image to include qt6-multimedia/qt6-multimedia-ffmpeg.

Comment thread modules/background/Wallpaper.qml Outdated
Comment thread modules/background/Wallpaper.qml Outdated
Comment thread modules/background/Wallpaper.qml Outdated
Comment thread modules/background/Wallpaper.qml Outdated
Comment thread modules/background/Wallpaper.qml Outdated

@dxnnv dxnnv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems these can also be dropped

Comment thread modules/background/Wallpaper.qml Outdated
Comment thread modules/background/Wallpaper.qml Outdated
@DipCrai
DipCrai requested a review from a team July 19, 2026 07:30
DipCrai and others added 14 commits July 23, 2026 20:37
- Wallpaper.qml: single-layer architecture with MediaPlayer+VideoOutput
  for videos, CachingImage for images, fade-in animations, timer-based
  cleanup preventing flash between transitions
- WallpaperItem.qml: video/image badge icons, thumbnail via .thumbs/
- Wallpapers.qml: merged image+video FileSystemModels
- Images.qml: isValidVideoByName, isVideoFile utilities
- Paths.qml: videowallsdir property
- shell.qml: QT_MEDIA_BACKEND=ffmpeg
- Multi-line createObject calls per qmlformat
- Space before function parens, semicolons per qmlformat
- anchors.fill: root instead of parent in videoContainer
- qmllint disable pragmas for intentional dynamic typing
- extraSmall -> small (property does not exist)
When a fullscreen window is focused or game mode is enabled, video
wallpapers are fully unloaded from memory and replaced with a static
thumbnail. On exit, the video is recreated.

- isPaused property tracks fullscreen and GameMode state
- thumbPathFor() extracts thumbnail path from video source
- onSourceChanged respects isPaused (shows thumbnail during pause)
- onIsPausedChanged destroys/recreates components for full memory release
- ~300MB memory saved and ~0% CPU when paused
Co-authored-by: danny <danny@atropos.cc>
Co-authored-by: danny <danny@atropos.cc>
Co-authored-by: danny <danny@atropos.cc>
Co-authored-by: danny <danny@atropos.cc>
Co-authored-by: danny <danny@atropos.cc>
Co-authored-by: danny <danny@atropos.cc>
@DipCrai
DipCrai force-pushed the feature/video-wallpaper-support branch from 6888c4d to 605094b Compare July 23, 2026 17:37
@DipCrai
DipCrai force-pushed the feature/video-wallpaper-support branch from 0132eb0 to 774e523 Compare July 29, 2026 13:07
DipCrai added 2 commits July 29, 2026 23:13
- WallItem: detect video files, load .thumbs/*.jpg preview, show badge
- WallpaperAndStyle: show video thumbnails in main preview
- WallpaperSelect: include videowallsdir items directly in grid
@DipCrai
DipCrai force-pushed the feature/video-wallpaper-support branch from f7fd011 to 2543ec7 Compare July 29, 2026 20:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants