Skip to content

[Feature] 外观背景:支持多图轮播与动态壁纸(动图 → 视频,分阶段) #422

Description

@emo172

Summary (EN) — The Appearance settings currently support only a single static background image. This request asks for (1) multi-image backgrounds with a timed slideshow, shuffle order and random-on-startup, (2) animated wallpapers (GIF / animated WebP) as a first stage without new decoding dependencies, and (3) real video wallpapers (mp4/webm, muted loop) as a later stage, with an explicit power/performance policy (pause when hidden or unfocused, frame-rate caps).

现状(当前版本的行为)

设置 → 外观 → 自定义背景 目前提供(全部为单项设置):

  • 背景图片:「选择图片」按钮打开的对话框是单选(multiple: false,且未设置扩展名过滤);选中后直接写入单个 background_image 路径;
  • 背景图像拉伸模式(Fill / Uniform / UniformToFill / None)、背景图像对齐(9 向)、背景图像不透明度(默认 38%)、将背景图扩展到标题栏和侧边栏开关。

实现层面(供定位参考):

  • 设置模型:nebula_settings::RuntimeSettings 的 background_image、background_image_opacity、background_image_fit、background_image_alignment、background_image_cover_chrome;
  • 设置页交互:nebula_app/src/gpui_shell/settings_pane.rs 的 background_image_row / choose_background_image,页面组织在 settings_pane/appearance_advanced.rs;
  • 渲染:nebula_app/src/gpui_shell/wallpaper.rs(后台串行解码、generation 取消、替换旧纹理即释放)+ wallpaper/image_loader.rs(解码预算:文件 ≤64MB、解码 ≤128MB、纹理 ≤8MB、最长边 ≤2048);
  • 绘制:图片被上传为一张单帧纹理(RenderImage::new([Frame::new(pixels)])),绘制时固定使用帧 0;适配几何在 nebula_app/src/renderer/image_layout.rs。

因此:GIF / 动画 WebP 作背景只会停在第一帧,视频无法播放,多张图片也无法配置。

需求(分阶段)

P1 多图背景:轮播 + 启动随机

  • 「背景图片」升级为图片列表:多选添加、移除单张、清空、排序;
  • 定时轮播:可设置切换间隔(建议 10s / 30s / 1min / 5min / 15min / 30min / 1h 若干档 + 自定义);
  • 顺序模式:按列表顺序 / 随机;可选启动时随机选一张;
  • 与既有 拉伸 / 对齐 / 不透明度 / 覆盖整窗 设置共用,行为保持一致。

P2 动图壁纸(GIF / 动画 WebP)

  • 作为"动态壁纸"的第一步:预计无需引入新的解码依赖即可覆盖;
  • 需要把壁纸管线从"单帧纹理"升级为"帧序列 + 帧调度",并纳入既有解码与内存预算(见上);
  • 注意:变更日志记载过 GPUI 多帧图帧下标复用的 panic 规避(Markdown 图像路径会把 GIF / 动画 WebP 压成单帧 PNG)。动图壁纸建议走独立的帧管理,避免复用该静态图路径时的退化或崩溃。

P3 真视频壁纸(mp4 / webm 等)

  • 静音、循环播放;Windows 优先(项目主平台)。
  • 解码方案候选(供权衡):
    • Windows Media Foundation:系统原生、不增加安装包体积(项目有 <30MB 安装包预算);
    • FFmpeg:格式覆盖更广,但显著增加体积与许可成本,建议仅作为可选构建特性评估。
  • 性能与省电:
    • 解码放后台线程,帧上传统一成壁纸纹理;
    • 可选帧率上限(如 30fps)与降采样;
    • 窗口失焦 / 最小化 / 被遮挡时暂停——可沿用现有帧调度中"窗口隐藏即停止请求动画帧"的模式;
    • 与不透明度、拉伸、对齐、覆盖整窗等既有设置保持正交。

设计建议(仅供参考,最终以维护者判断为准)

  1. 设置模型向后兼容:保留 background_image 原语义(等价于单项列表)。建议新增键示例:
    • background_media_type(image / animated / video)
    • background_images(多路径列表;可用分隔符或 JSON 编码,随实现定)
    • background_interval_secs、background_order(sequential / random)、background_random_on_start
    • 持久化沿用现有 key=value 体制;Lua 配置的同步暴露作为后续可选项。
  2. 文件选择:复用已有的多选文件对话框基础设施(nebula_app/src/platform/file_picker.rs 的 files() 已返回 Vec<PathBuf>,目前用于上传/传输),为动图/视频增加扩展名提示。
  3. 渲染复用:image_layout.rs 的 wallpaper_rect(fit / alignment 几何)与 wallpaper.rs 的双层结构(卡片层 / 覆盖整窗层)可直接沿用;把"一张纹理"扩展为"当前帧 + 预取/缓存",并保留现有 generation 取消与替换时释放旧资源的纪律。
  4. 省电默认值:建议默认"失焦暂停 + 帧率上限",并提供关闭动态效果的入口(可与系统"减少动画"偏好联动)。

兼容性

  • 旧配置文件与旧键继续有效,单图用户无感知;不透明度滑块、覆盖整窗确认弹窗等既有交互应同样适用于新类型;
  • 需要明确多窗口 / 多实例的行为(见开放问题);
  • 新增 UI 文案需同步进入既有 i18n 体系(nebula_app/i18n/*.json)。

开放问题(请维护者定夺)

  1. 多窗口下每窗独立播放/轮播,还是共享解码结果?
  2. 轮播是否需要过渡效果(如淡入淡出)?建议至少提供"无过渡"选项。
  3. 动态壁纸默认是否仅在前台窗口播放?电池模式是否进一步降载?
  4. 移动端(mobile/)是否同步支持?

环境

  • Pebrel 2.1.x,Windows 11(x64),默认 shell:PowerShell 7.6.6;
  • 使用场景:希望像常见壁纸软件一样,以多张图片轮播或动图/视频作为终端背景。

本请求由社区用户整理;若以上"建议"与项目既定方向冲突,以维护者方案为准。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions