Skip to content

v2.3.1

Choose a tag to compare

@github-actions github-actions released this 29 Sep 06:17
· 11 commits to master since this release

v2.3.1

会话恢复补两刀:点 X 关窗口也要存盘(v2.3.0 只在退出钩子存,那种走法一次都没写 ⇒ 「没有成功恢复」),以及 快照带上 ANSI 代码(恢复出来是有颜色的终端,不是素色文本)。

# 内容
关窗口 / 注销也存盘 用户:「你这也没有成功恢复啊」。查出来的原因不在读、在写:Windows 的 ctrl_handler 只把 running 置 0 就 return TRUE,而系统在处理器返回之后立刻终止进程 —— 主循环还阻塞在 ReadConsoleInput 里,末尾那句 session_save() 永远到不了 ⇒ 点 X 关窗口时一个字节都没写下去,下次启动自然「没有上次会话」。现在存盘就在处理器里做完(session_flush_now(1)),Linux 的 SIGTERM/SIGHUP 也走同一支;for_exit_path 会记下「这次退出已存过」,退出钩子那一次自动跳过 ⇒ 仍然是一次写盘。另外多一个 POSIX 把手:kill -USR1 <pid> = 立刻存一份但不退出,判据靠它端到端验「有界拿锁 + 落盘 + 进程继续跑」这套机制(Windows 没有信号,那边用的就是同一支函数,运行期只有编译级验证)。拿锁只试 200 次 ≈400ms,等不到就用窗格关闭时采过的那份落盘 —— 死等等于把退出挂在别的线程持有的锁上。仍然救不了 SIGKILL 与崩溃:那不是「存盘晚一点」,是根本没机会。
快照带 ANSI 代码 用户:「恢复要保存 ANSI 代码」。只存文本的话恢复出来是素色一片,看着就不算恢复。一格的颜色有两处来源(cells[].Attributes 的 16 色 + 下划线,和平行的 fg_rgb/bg_rgb/rgb_valid 真彩),存的时候按格比这五元组、只在变化处发 SGR。刻意不借 render.c 的 emit_attr16:那条会把 16 色按 [theme] pane_* 换成真彩,焊进档里就换不了主题了 —— 存程序原本发的索引色(默认前景发 39、默认背景发 49),读回来由当前主题重新上色;默认属性一格一个字节都不发,否则满屏 \e[0;37;40m。文件格式仍是一行一条记录 ⇒ ESC 写成 \e、反斜杠写成 \,版本行升到 s 2;s 1 的老档照旧恢复且不做转义还原(否则用户路径里的 C:\e 会被当成 ESC)。单行 8000 字节的上限现在把颜色码也算进去。
长度口径:估大 == 抄到垃圾 新写的第一版 sess_row_text 返回「转义后的估算长度」(每字节 ×2),调用方拿它当实际长度 sbuf_add ⇒ 多出来的那几个字节是缓冲尾巴上的陈旧内容,实测档里存成 REDMARK77\0DMARK77。改成返回实际追加的字节数;判据 T10 用精确等式钉住(红行 = \e[0;31;49mREDSAVE61\e[m,一个多余字节都不许有)。