现状(2026-11-03 约 15:00,用户原话)
- 鼠标在任意屏幕点任何东西都没反应,只能 Win+Tab 切换激活窗口。
- 用户下令:定位后不要修,先记录。本笔记即该记录。修的动作全部冻结,含待点的
rebuild mindwtr-taskbar-fix。 - 明确未定位:全屏点击死的根因还没有定论。15:00 前后的全树扫描(InputOnly+IsViewable,8 层递归 + 三屏九宫格落点探针)结果是干净的——扫描时刻没有任何遮挡层。下面“已定位”只含今天早些时候定案的几件事,不要把它们当成全屏死的病因。
今天时间线
- 上午:左屏左上一块点击死区,定案为 Mindwtr Quick Add 残留的 InputOnly 幽灵层(1792x948+0+0,XUnmapWindow 当场恢复),交付一键清理按钮
mindwtr-quickadd-fix(已 switch,gen 生效)。 - 中午:快记三改造(丰富大窗 + 步骤快编 + 描述并入大窗)
rebuild mindwtr-rich-add走完 switch,A 键 desktop 文件 Exec 换成mindwtr-rich-add。 - 13:34 后:A 按下仍出旧小窗 → 查出 plasma-kglobalaccel 老进程缓存(pid 14795),重启服务(新 pid 108282)。Q 无反应同根因;dbus invokeShortcut 反证链路通。
- 14:00 后:左栏 Mindwtr 死图标(点不开)。定位:那不是残留,是应用 10x60 的 InputOnly 组头小窗本尊,被 showOnlyCurrentScreen 的左栏收录显示。备好 KWin 规则(标题正则
^mindwtr$跳过任务栏)+ 清理按钮尺寸下限,build 已过,等 switch(已冻结)。 - 14:16–14:48:用户 kill→Q→关窗实验;Q 链路由 journal 实证(两次合成按键都有
Started Mindwtr 任务列表+mindwtr-show … raised);但窗口在 map 后约 15 秒内又被收回(无人操作,应用自藏嫌疑,journal 无日志,源码待查ui.rs:893 / lib.rs:1703,2050附近三处hide())。 - 14:50 后:用户报“把 hermes 移到任一屏后按 A 或 Q(记不清哪个),该屏显示正常、鼠标可动、点击全无”。三次扫描干净。A 链路 dbus 通(yad 能调起),但合成按键无反应;Hermes 快捷键排查:quick-entry 默认 Ctrl+Shift+Space、HUD 默认 Ctrl+Shift+G,本机无
quick-entry.json(即默认配置),无耦合证据。 - 约 15:00:全屏点击死(本笔记起因)。Hermes 本体有 10x10 InputOnly 隐藏窗(Electron globalShortcut 抓键窗,未映射)+ 200x200 未映射窗,均不在案发态。
破坏行为关键代码(4 段,只摘动窗口/弹窗/写库的行,外围衔接一律不收)
D1 —— 清理按钮:按名字抓窗 + 直接 unmap(源 /etc/nixos/modules/desktop/mindwtr-quickadd-fix.sh 第 6、16–29 行)
tree="$(xwininfo -root -tree)"
for id in $(echo "$tree" | grep -i '"[^"]*mindwtr[^"]*"' | grep -vi 'quick add' | grep -oE '0x[0-9a-f]+'); do
info="$(xwininfo -id "$id" 2>/dev/null)" || continue
echo "$info" | grep -q 'Map State: IsViewable' || continue
echo "$info" | grep -q 'Class: InputOnly' || continue
w="$(echo "$info" | grep -E '^ Width:' | grep -oE '[0-9]+')"
h="$(echo "$info" | grep -E '^ Height:' | grep -oE '[0-9]+')"
if [ -n "$w" ] && [ -n "$h" ] && { [ "$w" -lt 200 ] || [ "$h" -lt 200 ]; }; then
echo "跳过小窗(疑似组头 helper): $id ${w}x${h}"; continue
fi
if xdotool windowunmap "$id" 2>/dev/null; then
echo "已清除残留层: $id"
found=1
fi
done
判语:匹配条件只有“名字含 mindwtr + 可见 + InputOnly”(+200px 下限)。名字对上就 unmap,没有白名单。误伤面 = 未来任何一个合条件的应用窗口。
D2 —— 丰富快记窗:弹 720x600 表单 + POST 写库(源 mindwtr-rich-add.sh 第 33–44、93–96 行;字段定义/API 读数/jq 组包略)
out="$(yad --form --title="快记+" --width=720 --height=600 --separator="$SEP" \
--focus-field=1 \
--field="标题" "" \
--field="归类:CB" "收集箱!下一步!等待!将来!参考!已完成" \
--field="项目:CB" "$proj_names" \
--field="优先级:CB" "无!低!中!高!紧急" \
--field="精力:CB" "无!低!中!高" \
--field="标签:CBE" "${tags_exist:-}" \
--field="场景:CBE" "${ctxs_exist:-}" \
--field="描述:TXT" "" \
--field="步骤:TXT" "" \
--button="记下来:0" --button="算了:1" 2>/dev/null)" || exit 0
resp="$(api -X POST "http://127.0.0.1:$PORT/tasks" -H 'Content-Type: application/json' -d "$payload" 2>&1)" || {
msg="写入失败(应用可能刚关):$resp"; echo "$msg" | head -c 300
notify-send "丰富快记" "写入失败,终端看详情" || true; exit 1
}
判语:本脚本无 X 窗口杀伤行为。风险只有两处:① 按键即弹大窗,无超时、无自动关闭;② 点“记下来”即 POST,无二次确认。
D3 —— 步骤快编:弹列表 + 弹表单 + PATCH(源 mindwtr-steps-edit.sh 第 24–27、37–40、61–65 行;取值/拼装略)
pick="$(yad --list --title="步骤快编:选任务" --width=760 --height=560 --separator="$SEP" \
--search-column=2 --print-column=1 \
--column="id:HD" --column="标题" --column="归类" --column="更新" \
--button="改这个:0" --button="算了:1" < "$list_file" 2>/dev/null)" || exit 0
out="$(yad --form --title="步骤快编:$ttitle" --width=720 --height=560 --separator="$SEP" \
--field="清单([x]开头=已完成,一行一步):TXT" "$cur_cl" \
--field="描述:TXT" "$cur_desc" \
--button="保存:0" --button="算了:1" 2>/dev/null)" || exit 0
resp="$(api -X PATCH "http://127.0.0.1:$PORT/tasks/$tid" -H 'Content-Type: application/json' -d "$payload" 2>&1)" || {
echo "保存失败:$(echo "$resp" | head -c 200)"; notify-send "步骤快编" "保存失败" || true; exit 1
}
判语:同 D2,无 X 杀伤。PATCH 按标题认回清单 id,改标题即视为删旧增新(清单级破坏面,用户已知并接受)。
D4 —— Q 键唤起:找不到就起 flatpak + 藏窗也 map + 双激活抢焦点(源 /home/cat/.local/bin/mindwtr-show 第 96–107、161–201 行;只读扫描函数略)
def request_active(dpy, root, w):
ev = XClientMessageEvent()
ev.type = 33 # ClientMessage
ev.send_event = 1
ev.display = dpy
ev.window = w
ev.message_type = X11.XInternAtom(dpy, b"_NET_ACTIVE_WINDOW", False)
ev.format = 32
ev.d0, ev.d1, ev.d2, ev.d3, ev.d4 = 2, 0, 0, 0, 0
mask = (1 << 20) | (1 << 19) # SubstructureRedirect + Notify
X11.XSendEvent(dpy, root, 0, mask, ctypes.byref(ev))
def main():
dpy = X11.XOpenDisplay(None)
root = X11.XDefaultRootWindow(dpy)
wins = find_mindwtr(dpy, root) # 只读:类名含 mindwtr 的根直属窗(可见与否都要)
if not wins:
subprocess.Popen(
["/run/current-system/sw/bin/flatpak", "run", "--branch=stable",
"--arch=x86_64", "--command=mindwtr",
"tech.dongdongbh.mindwtr", "--file-forwarding"],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
for _ in range(80): # 最多等 8 秒(冷起慢)
wins = find_mindwtr(dpy, root)
if wins:
break
time.sleep(0.1)
X11.XSetErrorHandler(_ignore_xerror)
mains = [(w, v) for w, v, n in wins if n.strip().lower() == "mindwtr"]
targets = mains or [(w, v) for w, v, _ in wins]
for w, viewable in targets:
if not viewable:
X11.XMapRaised(dpy, w) # 隐藏/最小化:先 map 再顶
X11.XSync(dpy, 0)
for _ in range(20):
if is_viewable(dpy, w):
break
time.sleep(0.1)
# 双激活:KWin 焦点防抢有时吞掉第一次,150ms 后再顶一次(2026-11-03 有时不在最上)
for _ in range(2):
X11.XRaiseWindow(dpy, w)
request_active(dpy, root, w) # 走 KWin,不管裸 XSetInputFocus
X11.XSync(dpy, 0)
time.sleep(0.15)
X11.XSync(dpy, 0)
X11.XFlush(dpy)
X11.XCloseDisplay(dpy)
判语:全场唯一敢动别人窗口的脚本。XMapRaised 能把应用自己藏起来的窗硬摊开(与“应用 15 秒自藏”对顶:这边摊开、那边收回);_NET_ACTIVE_WINDOW source=2 伪装任务栏抢焦点 ×2;找不到窗就 Popen 起 flatpak(曾因每次按键都起导致单例交接抖动,案发版已改先找后起)。组头小窗(标题 mindwtr 全小写)平时因 mains 为空不进 targets——但 mains 为空时 fallback 会顶它。
脚本状态清单(只记状态,不贴正文)
| D1 清理按钮 | 源 /etc/nixos/modules/desktop/mindwtr-quickadd-fix.sh;已 switch 生效;案发时生效的是 200px 下限版(sudo 直装,未 rebuild 未提交)。 |
| D2 丰富快记 | 源同目录 mindwtr-rich-add.sh;已 switch;A 键入口(desktop 文件 Exec 已换,备份 .bak-20261103-1325)。 |
| D3 步骤快编 | 源同目录 mindwtr-steps-edit.sh;已 switch;启动器入口。 |
| D4 Q 唤起 | /home/cat/.local/bin/mindwtr-show(非 nix 声明);当天改两次;备份 .bak-20261103-1355。 |
另:/etc/nixos 有未提交改动(KWin 规则 yaml + D1 尺寸下限,build 已过未 switch);看板 nixos 卡 t_3c15ae1c comment 到 42;台账 HEAD 0c7bafb。
待办(修冻结,待用户逐一放行)
- R01:全屏点击死根因:下次复发时先别 kill,做全树 InputOnly 扫描 + 三屏落点探针 + 查指针抓取,30 秒出结论。
- R02:
rebuild mindwtr-taskbar-fix(KWin 规则 + 按钮尺寸下限进声明)仍待点名;点了之后/etc/nixos才能提交(当前有未提交改动)。 - R03:应用 map 后 15 秒自藏:查
ui.rs:893 / lib.rs:1703,2050三处hide()的触发条件。 - R04:A 合成按键无反应 vs dbus 通:查 kglobalacceld 的 A 抓取态(
qdbus … shortcuts对比 Q)。