Files
EzVibeR/docs/usage/04-桌宠窗口使用.md
Claude Agent 205c57e9b7 Update: Usage
2026-06-20 14:55:47 +08:00

144 lines
6.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 04 · 桌宠窗口使用
桌宠窗口是 EzVibeR+ 的主界面:一个**透明、置顶、可缩放**的小窗,里面有 Live2D 模型 + 右侧聊天面板。
## 1. 窗口特性
| 特性 | 行为 |
|---|---|
| 透明 | 背景完全透明,只有模型本身看得见 |
| 始终置顶 | 在所有应用之上 |
| 所有工作区可见 | 切换虚拟桌面时仍跟着你 |
| 不在任务栏显示 | 任务栏不会出现图标,只能从系统托盘进 |
| 可调整大小 | 拖窗口边缘,最小 555×280最大 800×640 |
| 位置记忆 | 移动/缩放后位置和尺寸自动存盘(`live2d.conf.json` |
| 禁双击最大化 | 透明窗口的双击被拦截,不会被窗口管理器意外全屏化 |
### 1.1 调整窗口大小
1. 点工具栏 **⬚ 大小** 按钮(倒数第 4 个)— 窗口边缘会变成虚线,进入可调整状态
2. 鼠标拖边缘/角,调到合适大小
3. 失焦后自动退出调整模式
### 1.2 移动窗口
1. 点工具栏 **📍 位置** 按钮(中间)— 模型上叠加一个 drag region
2. 直接拖模型本体即可
3. 再点 **📍 位置** 退出移动模式
> 也可以直接拖**模型上方 35% 的区域**(即"头部" — 但这会切到下一个表情,不是移动。
### 1.3 隐藏/恢复
- **隐藏**:右键托盘 → 「隐藏桌宠」 / 点工具栏 **❌ 关闭** 按钮(隐藏后 1.3 秒)
- **恢复**:右键托盘 → 「显示桌宠」
## 2. 浮动工具栏9 个按钮)
桌宠窗口**右侧**有一个半透明白底竖排工具栏,从上到下:
| # | 图标 | 含义 | 操作 |
|---|---|---|---|
| 1 | 💬 | **聊天面板切换** | 展开/收起右侧聊天面板(收起后模型占满整个窗口) |
| 2 | ⚙ | **配置** | 打开「配置中心」窗口(独立窗口,可关) |
| 3 | ☐ | **背景遮罩** | 给桌宠背景加 20% 灰底(视觉辅助,可关) |
| 4 | 👁 | **换模型** | 随机换一个模型 |
| 5 | 📍 | **位置移动** | 进入/退出"拖拽移动"模式(蓝色高亮表示激活) |
| 6 | ⬚ | **调整大小** | 让窗口边缘变虚线可调 |
| 7 | ⓘ | **复制模型 URL** | 把当前模型地址复制到剪贴板(可粘贴到浏览器看) |
| 8 | 🔒 | **鼠标穿透** | 开启后鼠标点穿桌宠到下面的应用(**谨慎**:开了就点不到桌宠了,要右键托盘恢复) |
| 9 | ❌ | **关闭桌宠** | 隐藏窗口(不退出应用,托盘还在) |
> 💡 鼠标悬停每个按钮都有 tooltip 提示。
## 3. 与模型互动
### 3.1 鼠标点击模型
| 点击位置 | 反应 |
|---|---|
| **头部**(模型上方 35% | 切换到下一个表情(循环) |
| **身体**(其余 75% | 播放一个随机动作 + 触发"用户互动"情绪事件 + 截图 |
> **点击身体**会同时触发**两件事**
> 1. 播放动作(`tap_body` / `TapBody` / `Tap` / `tap` 之一,从你模型自带的动作里选第一个匹配的)
> 2. **触发全屏截图** — 详见 §4
### 3.2 鼠标双击
**双击不会**最大化(已禁掉),但也**不**有别的特殊功能。
### 3.3 键盘(仅在"位置移动"模式下)
按住 **Shift** 的同时:
- **`+`**(数字键盘 `+` 或主键盘 `=`):放大模型 1%
- **`-`**(数字键盘 `-` 或主键盘 `_`):缩小模型 1%
> 缩放比例会随每个模型单独存盘。
## 4. 截图 → AI
点桌宠**身体** → **整屏截图**自动进入聊天面板。
### 4.1 流程
1. 桌宠窗口**隐藏**(避免截到模型自己)
2. 后端调系统截图能力Linux: `xdg-desktop-portal``convert` 回退macOS/Windows: 系统能力)
3. 桌宠窗口**恢复**显示 + 拿回焦点 + 恢复置顶(这一系列动作全自动)
4. 聊天面板右侧出现一个**预览气泡**,里面是截图缩略图 + 一个输入框 + 两个按钮
### 4.2 预览气泡三个状态
| 状态 | 行为 |
|---|---|
| 在聊天流里 | 等待你输入或操作(**不持久化**reboot 后会自动消失) |
| 输入了文字 + 点 **"发送给AI"** | 截图 + 文字以"user"消息身份发出AI 回复;气泡**立即消失** |
| 直接点 **"取消"** | 气泡**立即消失**,不发送任何东西 |
> ⚠️ **截图预览气泡不会被存盘**。即使你在 250 ms 内连续操作(移除 + 重新添加),也保证不写入 jsonl 聊天记录(前端清理 debounce timer + 后端拒绝写入 + reload 跳过读出三层防御)。
### 4.3 截图保存位置
截图原图 + 压缩预览存在 `<app_data>/sessions/<当前会话 id>/images/<uuid>.{png,jpg}`,消息里只存路径不存 base64节省内存
> 启动时会自动跑 GC把磁盘上没人引用的孤儿 PNG/JPG 删掉,**不会删你正在用的**。日志里会打印"扫描/引用/删除/释放字节"统计。
## 5. 情绪引擎
桌宠有 5 种情绪状态,**所有状态都对应 Live2D 动作 + 表情**(如果你的模型有的话):
| 状态 | 中文 | 触发条件 | 默认动作 | 默认表情关键词 |
|---|---|---|---|---|
| **Idle** | 空闲 | 启动默认 / 长时间无互动 | `idle` | (无) |
| **Happy** | 开心 | 点击身体、收到对话、点"赞"按钮 | `happy` | 星星/比耶/happy/smile |
| **Focused** | 专注 | 点"专注模式"或类似 | `focused` | 照相/serious/focus |
| **Annoyed** | 烦躁 | 忽略提醒、久坐超时 | `angry` | 黑脸/流汗/angry |
| **Sleepy** | 困倦 | 长时间无互动(每 60 秒一个 TimePasses 事件累计推进) | `sleepy` | 哭/sleepy/tired |
### 5.1 情绪如何驱动 Live2D
- **动作匹配** — 按关键词从模型自带的 motion 列表里找(精确 → 包含 → 反向包含),找不到就用第一个
- **表情匹配** — 按关键词从模型自带的 expression 列表里找(中文优先),找不到就保持当前
- **没模型或模型没这些动作/表情** — 静默跳过,控制台打 debug 日志
### 5.2 心跳
后端每 60 秒发一次 `ezvibe:heartbeat` 事件,前端接收后会做:
1. 更新情绪状态
2. 如果当前是 Idle 且 45 秒内没交互,从当前情绪的"微表情"列表里轮换一个(避免长时静置呆板)
### 5.3 状态最短驻留
切换情绪后**至少停留 5 秒**,避免连续事件导致的"闪烁"。这是情绪引擎的内部保护,不可关闭。
## 6. 键盘焦点问题Linux 已知)
如果你发现聊天面板"卡住"点不动:
- 大概率是窗口管理器GNOME mutter / KDE在某些操作后把焦点丢了
- 一般重新点一下桌宠窗口内部任意位置就能拿回焦点
- 截图后会自动 `set_focus()` 恢复(**截图后丢失焦点是已知问题**
---
下一步:[05-聊天功能.md](05-聊天功能.md) — 多会话、搜索、导出、提醒中心。