Skip to content

Releases: myxiyues/dsh-window-size

dsh-window-size 0.1.0

Choose a tag to compare

@myxiyues myxiyues released this 21 Oct 13:03

在客户端「设置」里保存主窗口的尺寸与位置,客户端每次启动自动恢复一次。

三条硬约束(就这么实现的)

  • 控制入口只在设置里:settings.section 插槽一栏「窗口尺寸」;主界面零入口(不注册工具、不加按钮/面板、不加命令)。
  • 保存后重启生效:配置存 ~/.dsh/window-size.json;客户端启动、主窗口出现后应用一次即收手。
  • 没有计划任务、没有常驻轮询、没有外部脚本进程:窗口操作全在客户端宿主进程内用 koffi → user32 完成(EnumWindows / GetWindowRect / SetWindowPos / ShowWindow),不产生任何可见窗口;客户端没开时这套机制里什么都不存在。

机制要点

  • 宿主进程是客户端主进程的子进程,完整性级别一致,SetWindowPos 不会被 UIPI 拦下(不需要提权)。
  • 只认「标题含 DeepSeek Harness」或「属于本进程树」的可见窗口,永不碰其它程序的窗口。
  • 应用后回读校验,最多 4 次尝试收敛;不做后台定时守护。
  • 宽高下限就是客户端自己的 minWidth 520 / minHeight 600;X / Y 可留空(位置交给客户端)。
  • 设置页还能「用当前窗口填充」「应用已保存」「清除保存」「最大化启动」「启动时自动应用」。

安装

# profile 在 ~/.dsh/profiles/<name>,用客户端自带 pnpm
pnpm add link:<this repo>
# 再把 dsh-window-size 加进 profile package.json 的 dsh.profile.bundles

包内 cordis.patch.yml 只有一行 insert,保证重启后由 bundles 正常装配。

卸载

删掉 profile node_modules 里的链接、dependencies 与 dsh.profile.bundles 里的该项,再删 ~/.dsh/window-size.json 与 ~/.dsh/window-size.log。

组成

文件 作用
lib/index.js 宿主半:/api/window-size/dispatch RPC(state.get / config.save / config.apply / config.clear / window.read / windows.list)+ 启动应用
lib/win32.js koffi 懒加载绑定 user32:找窗口 / 读 / 改 / 报错说人话
lib/store.js ~/.dsh/window-size.json 与日志的读写(读永不抛)
lib/client.js 客户端半:手写 bundle,只 require("react"),注册「设置 → 窗口尺寸」

依赖

只用到客户端自带的 @deepseek-ai/dsh-client-connection、@deepseek-ai/dsh-client-ui-settings 与内置 koffi。不依赖任何 npm 包。