Repository navigation
Replies: 2 comments 1 reply
附:完整需求文档需求说明:给 DSH 插件开放「浮动窗口」能力
1. 一句话诉求希望 DSH 提供一个插件可调用的窗口 API,允许插件创建"无边框 + 可置顶 + 可设置位置与大小"的 2. 现状与实测证据(为什么插件自己做不到)
⇒ 结论:能力只差"暴露给插件"这一步;机制已经在跑。 3. 目标场景(我们的插件)小鲸鱼挂件目前只能活在整个 DSH 页面里。我们希望:
这类需求(桌宠、便签、状态浮标、计时器)对任何"界面型"插件都成立,不是我们独有。 4. 建议 API(草案)4.1 Host 侧(插件宿主 Node 进程内的 Cordis service,推荐)
// 由 DSH 提供,插件通过 ctx.get('desktopWindows') / ctx.desktopWindows 取用
interface DesktopWindows {
/** 打开一个属于本插件的浮窗;url 必须解析到本插件自有路由(同源、不可外站) */
open(options: FloatingWindowOptions): Promise<FloatingWindowHandle>
/** 当前本插件已开的浮窗 */
list(): FloatingWindowInfo[]
/** 关闭某个/全部 */
close(id?: string): Promise<void>
}
interface FloatingWindowOptions {
/** 相对 URL(如 '/dsh-whale/float.html'),必须由本插件注册的路由提供 */
url: string
width: number
height: number
/** 打开位置;省略则由系统决定。给出后必须"尽力"精确到位(吸附功能依赖它) */
x?: number
y?: number
/** 默认 false。为 true 时使用系统级置顶(默认不抢焦点) */
alwaysOnTop?: boolean
/** 默认 true:无系统边框(由页面自己画外观) */
frameless?: boolean
/** 默认 true:背景透明(配合页面透明区域实现"异形窗口") */
transparent?: boolean
/** 默认 true:不出现在任务栏 */
skipTaskbar?: boolean
/** 默认 true:不可缩放 */
resizable?: boolean
/** 打开时不抢焦点(置顶浮窗应当默认不抢) */
focusable?: boolean
title?: string
}
interface FloatingWindowHandle {
id: string
/** 移动窗口(吸附/贴边必需);返回是否成功 */
setPosition(x: number, y: number): Promise<boolean>
setSize(width: number, height: number): Promise<boolean>
setAlwaysOnTop(on: boolean): Promise<void>
setIgnoreMouseEvents(ignore: boolean, forward?: boolean): Promise<void> // 异形窗口点击穿透
show(): Promise<void>; hide(): Promise<void>; close(): Promise<void>
/** 事件:窗口被用户移动/缩放/关闭 */
on(event: 'moved' | 'resized' | 'closed', cb: (info: FloatingWindowInfo) => void): () => void
/** 当前几何(屏幕坐标) */
bounds(): Promise<{ x: number; y: number; width: number; height: number }>
/** 所在显示器的工作区(吸附要按"当前屏幕"算,多屏必须支持) */
displayWorkArea(): Promise<{ x: number; y: number; width: number; height: number }>
}4.2 Client 侧(可选,便于"页面内按钮直接开浮窗")如果 Host 侧服务不方便,至少在 window.dshDesktop.openFloatingWindow(options): Promise<{ id: string }>
window.dshDesktop.floatingWindows(): Promise<FloatingWindowInfo[]>
window.dshDesktop.closeFloatingWindow(id?: string): Promise<void>(页面内的客户端插件即可直接调用;建议同时限制"只有被激活的插件页面可以调用"。) 5. 行为与安全约定(建议)
6. 最小实现建议(成本评估:小)主进程已有完整能力,按"复用"的思路大致是:
参考: 7. 兼容与降级
8. 验收标准(我们会照这个写自测)
9. 附:为什么"做一个插件来给 DSH 加这个能力"行不通(这是提出方自己的查证,供参考,避免上游重复讨论。) 插件运行在 |
|
我就说,star这么高的插件,为什么不做桌面悬浮,搞得很多人一个agent,还有几个悬浮宠物 |
Uh oh!
There was an error while loading. Please reload this page.
背景
我们在维护 dsh-whale-widget(DeepSeek 余额小鲸鱼挂件,https://github.com/MeteorNOX/DeepSeek-Balance-Whale-Widget)。
用户希望挂件能像"桌宠 / 便签"那样:拖到屏幕边缘停留 0.5 秒 ⇒ 从 DSH 页面脱离出去,成为桌面上的常驻小窗
(可置顶、可贴边);脱离状态下按压动画、余额显示、音效照旧,只把菜单换成「回到 DSH」;
DSH 页面里留一个小的召回点。
这个诉求其实对任何界面型插件都成立(桌宠、便签、状态浮标、计时器、悬浮终端),不是我们独有。
现状(我们已实测,供参考)
require('electron')process.type === 'node')⇒Cannot find module 'electron'✗window.open()null(被setWindowOpenHandler拒绝)✗documentPictureInPicture.requestWindow()InvalidStateError: Internal error: no window✗(Electron 没有浏览器外壳)new BrowserWindow/ipcMain.handle,且PLATFORM_IPC.open / bounds / close已经在用浮动小窗(平台账号登录)✓也就是说:能力已经在主进程里,只差"暴露给插件"这一步。
建议(最小可用 API)
Host 侧 Cordis service:
建议的约束:URL 归属校验 / 每插件窗口数上限 / 不可导航 / 不可全屏 / 默认不抢焦点 /
插件卸载与 DSH 退出时自动回收 / 托盘提供「关闭全部浮窗」。
成本评估
复用现有
PLATFORM_IPC.*的实现路径:主进程加一组 IPC(约 80–120 行)、preload 白名单(约 10 行)、Host 侧桥接(约 40 行)、校验与回收(约 30 行)。
附:我们的降级方案
在拿到这个能力之前,我们先做了个"宿主 spawn 本机浏览器
--app=窗口 + Win32 定位"的原型 ——可跑,但带系统标题栏、多一个任务栏项、依赖用户本机安装了浏览器、生命周期在进程外。
如果 DSH 提供上面这个能力,这些代价都会消失,体验也会回到"原生浮窗"。
需要的话我们可以补一份完整的需求文档(含 API 细节、验收标准、多屏/吸附的边界条件)。
All reactions