dsh-custom-wallpaper
Verifieddsh-custom-wallpaper · v1.0.2 · MIT · Web UI
Import your own picture as the DSH window background, with an adjustable scrim that keeps every panel and label readable.
Install
dsh plugin add dsh-custom-wallpaper Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
自定义背景(dsh-custom-wallpaper)
给 DeepSeek Harness 的窗口换一张你自己的图片当背景,同时保证面板、侧栏、输入框和文字依然清晰可读。
图片只保存在这台机器的浏览器里(IndexedDB),不会上传,也不会写进项目目录。
功能
- 导入自己的图片:任意 PNG / JPEG / WebP / GIF / AVIF,单张上限 30 MB,建议 1920×1080 以上。
- 图片遮罩:在图片上盖一层与主题同色的半透明遮罩,遮罩越浓、图片越淡、字越清楚。
- 面板不透明度:控制侧栏、主面板、底部输入区这些"大面"的透明度——调低更能看见图片,调高更接近原生界面。
- 自动保证文字清晰度:读取图片亮度,按 WCAG 4.5:1 对比度要求自动把遮罩抬到需要的浓度(最多 92%),避免亮图把字压掉。
- 一键开关:关掉后立刻恢复原生纯色界面,图片和参数都保留。
- 跟随主题:深色/浅色主题都用当前主题的背景色做遮罩,不会出现突兀的白块。
- Windows 标题栏也透图:右上角最小化/最大化/关闭那一块不再是一块死色,图片一直铺到窗口顶边。
- 自动保存:所有参数即时保存,下次打开 DSH 自动恢复。
安装
方式一:从 npm 安装(推荐)
打开 DSH,点左下角账号头像 → 设置。
左侧选 插件(插件管理页),点 添加插件。
在"包名或地址"里填:
dsh-custom-wallpaper点安装,然后重启 DSH(关闭窗口再打开)。
重新打开 设置,左侧列表里就会出现 背景 这一项。
方式二:从本地目录安装(自己改代码时用)
把 <插件目录> 换成你实际放它的位置,其余步骤同方式一:
<插件目录>\dsh-custom-wallpaper
方式三:从 GitHub 安装
在"包名或地址"里填仓库地址:
https://github.com/sqyr7/dsh-custom-background
这种方式要求本机已安装 git,并且能访问 GitHub;连不上会在安装前检查阶段就报错。
卸载
- 设置 → 背景 → 移除背景(清掉已存的图片)。
- 设置 → 插件,找到
dsh-custom-wallpaper,移除插件。 - 重启 DSH。
使用
设置 → 背景
| 控件 | 作用 |
|---|---|
| 背景图片 / 更换图片 / 移除背景 | 选图、换图、删图。选完立即生效。 |
| 图片遮罩(0–92%) | 图片上那层雾的浓度。越浓字越清楚、图越淡。 |
| 面板不透明度(0–100%) | 侧栏/主面板/输入区的透明度。越低越透、越能看见图。 |
| 自动保证文字清晰度 | 开(默认):按图片亮度自动加浓遮罩,最多到 92%。关:完全按你拖的值来。 |
| 启用背景 | 总开关。关掉恢复原生界面,图片和参数仍保留。 |
| 恢复默认参数 | 遮罩 55%、面板 30%、自动开、启用开。 |
推荐起点:先用默认值(遮罩 55% / 面板 30%),如果觉得图太淡就调低遮罩,觉得字不够清楚就调高遮罩或面板不透明度。
数据存在哪
- 图片:浏览器 IndexedDB,库名
dsh-custom-wallpaper,表assets,键background。 - 参数:浏览器 localStorage,键
dsh-custom-wallpaper:prefs。 - 两者都只在本机、只在这个 DSH 窗口的浏览器存储里;换机器或清了浏览器数据就没了,需要重新选图。
- 插件本身没有任何网络请求,不会把图片发到任何地方。
文件结构
dsh-custom-wallpaper/
├─ package.json # 插件清单(dsh.bundle / dsh.client)
├─ cordis.patch.yml # 挂载声明
├─ index.js # Host 半边(空实现,渲染全在 client)
├─ client.js # 全部逻辑:样式、存储、设置页 UI
├─ locale/
│ ├─ zh.json # 插件市场里显示的中文名/描述
│ └─ en.json
├─ icon.svg # 插件图标
└─ README.md # 本文件
工作原理(给想改的人)
client.js通过window.__ModuleLoader__.load({ id, factory })注册,导出{ inject: ['slots'], apply(ctx) }。apply()里ctx.slots.inject('settings.section', ...)把设置面板注册进 DSH 的设置页(iddsh-custom-wallpaper,order 45,标题"背景")。- 选图后用
createImageBitmap+ 64×64 canvas 算图片的平均亮度和 75 分位亮度,得到tone。 requiredScrim()用二分法求"满足 4.5:1 对比度所需的最小遮罩",与用户设置取较大值(受"自动"开关控制)。- 真正的背景画在
html.dcb-background-on body::before上:position:fixed; inset:0; z-index:-1,背景是linear-gradient(遮罩色, 遮罩色), url(blob:...),cover居中。 - 为了让图能透出来,把外层大面(layout 的
centerCol/sidebarCol/bottomRow/rightbarCol)设成color-mix(...)半透明,并把内层几个实心面板(窗口 frame、会话根、侧栏根、dock 标签页等)设成background-color: transparent。 - 类名怎么找:DSH 每次构建都会重算 CSS Module 的哈希前缀(今天是
mP3x-q_centerCol,昨天是BynINW_centerCol),写死哈希就是 1.0.1 在 rc.3 上失效的原因。所以:- 运行时发现(首选):
centerCol/sidebarCol/bottomRow/rightbarCol/composerSeat/panelBody/fade这几个语义后缀在整个类名空间里唯一,直接在 DOM 里按[class*="_后缀"]找出来,唯一才用,撞名就放弃;窗口 frame 找不到后缀,就按"中心列的父元素"结构定位。 - 静态表(兜底):其余写不出唯一后缀的(
frame有十几个同后缀类名、root/panel更多)用显式列表,同时列 rc.3 名和旧名——匹配不到的规则不生效,所以一张表能跨宿主版本。 - 外壳是懒挂载的,面板还会随导航替换,所以
MutationObserver在类名变化后重算一次样式(样式文本没变就不重写)。
- 运行时发现(首选):
- 关掉开关时移除
<style>和html上的类名,界面立刻回到原生样子。 - Windows 标题栏:原生最小化/最大化/关闭由 DWM 绘制,颜色来自桌面端 preload 往
<body>里塞的一个隐藏 span 的计算背景色(background-color:var(--dsw-specific-sidebar-fill)),再通过 IPC 交给setTitleBarOverlay()。那个 span 是独立元素,给面板上色影响不到它,所以按钮区永远是一块不透明死色。插件只把这个 span 的填充清成透明(html.dcb-background-on body > span[style*="--dsw-specific-sidebar-fill"]),宿主随即上报rgba(0,0,0,0),DWM 就把按钮直接画在已经透出图片的标题栏带上;span 的color不动,图标颜色照旧。只影响 Windows,其他平台宿主不会创建这个 span,规则匹配不到就不生效。
已知限制
- 半透明化依赖 DSH 的类名结构。语义后缀(
_centerCol等)跟着组件语义走、不随构建变,正常情况下跨版本可用;但如果 DSH 改了组件结构或语义名,仍需要更新STATIC_*表和DISCOVERABLE后缀列表。表现是"图不显示"或"某块区域仍是实心"。 - Windows 标题栏透图依赖桌面端 preload 的探针 span 仍然带
--dsw-specific-sidebar-fill内联样式。如果将来宿主换了取色方式(比如改用--dsw-alias-bg-base或换成真正的原生取色 API),这条规则会匹配不到、按钮区退回纯色——不会更糟,也不会影响其他功能。 - 标题栏透图后,三个按钮的图标颜色仍由主题的
--dsw-alias-label-primary决定(深色主题下是浅色图标)。如果壁纸在顶部特别亮、且面板不透明度调得很低,图标对比度会下降;此时把"面板不透明度"调高一点即可。 - 设置弹窗本身是独立的模态层,保持不透明,所以壁纸在弹窗周围透出、弹窗内文字始终清楚。
兼容性
- 在 DSH Web 前端(
platform: "web")上运行,桌面端即用此前端。 - 需要浏览器支持
createImageBitmap、color-mix()、IndexedDB(Edge / Chrome 均可)。
License
MIT © 识浅