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)与降采样;
- 窗口失焦 / 最小化 / 被遮挡时暂停——可沿用现有帧调度中"窗口隐藏即停止请求动画帧"的模式;
- 与不透明度、拉伸、对齐、覆盖整窗等既有设置保持正交。
设计建议(仅供参考,最终以维护者判断为准)
- 设置模型向后兼容:保留
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 配置的同步暴露作为后续可选项。
- 文件选择:复用已有的多选文件对话框基础设施(
nebula_app/src/platform/file_picker.rs 的 files() 已返回 Vec<PathBuf>,目前用于上传/传输),为动图/视频增加扩展名提示。
- 渲染复用:
image_layout.rs 的 wallpaper_rect(fit / alignment 几何)与 wallpaper.rs 的双层结构(卡片层 / 覆盖整窗层)可直接沿用;把"一张纹理"扩展为"当前帧 + 预取/缓存",并保留现有 generation 取消与替换时释放旧资源的纪律。
- 省电默认值:建议默认"失焦暂停 + 帧率上限",并提供关闭动态效果的入口(可与系统"减少动画"偏好联动)。
兼容性
- 旧配置文件与旧键继续有效,单图用户无感知;不透明度滑块、覆盖整窗确认弹窗等既有交互应同样适用于新类型;
- 需要明确多窗口 / 多实例的行为(见开放问题);
- 新增 UI 文案需同步进入既有 i18n 体系(
nebula_app/i18n/*.json)。
开放问题(请维护者定夺)
- 多窗口下每窗独立播放/轮播,还是共享解码结果?
- 轮播是否需要过渡效果(如淡入淡出)?建议至少提供"无过渡"选项。
- 动态壁纸默认是否仅在前台窗口播放?电池模式是否进一步降载?
- 移动端(
mobile/)是否同步支持?
环境
- Pebrel 2.1.x,Windows 11(x64),默认 shell:PowerShell 7.6.6;
- 使用场景:希望像常见壁纸软件一样,以多张图片轮播或动图/视频作为终端背景。
本请求由社区用户整理;若以上"建议"与项目既定方向冲突,以维护者方案为准。
现状(当前版本的行为)
设置 → 外观 → 自定义背景 目前提供(全部为单项设置):
multiple: false,且未设置扩展名过滤);选中后直接写入单个background_image路径;实现层面(供定位参考):
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 多图背景:轮播 + 启动随机
P2 动图壁纸(GIF / 动画 WebP)
P3 真视频壁纸(mp4 / webm 等)
设计建议(仅供参考,最终以维护者判断为准)
background_image原语义(等价于单项列表)。建议新增键示例:background_media_type(image / animated / video)background_images(多路径列表;可用分隔符或 JSON 编码,随实现定)background_interval_secs、background_order(sequential / random)、background_random_on_startkey=value体制;Lua 配置的同步暴露作为后续可选项。nebula_app/src/platform/file_picker.rs的files()已返回Vec<PathBuf>,目前用于上传/传输),为动图/视频增加扩展名提示。image_layout.rs的wallpaper_rect(fit / alignment 几何)与wallpaper.rs的双层结构(卡片层 / 覆盖整窗层)可直接沿用;把"一张纹理"扩展为"当前帧 + 预取/缓存",并保留现有 generation 取消与替换时释放旧资源的纪律。兼容性
nebula_app/i18n/*.json)。开放问题(请维护者定夺)
mobile/)是否同步支持?环境
本请求由社区用户整理;若以上"建议"与项目既定方向冲突,以维护者方案为准。