TermiNexus
51287eb1a0
perf(explorer): per-frame window double buffering and present-aware FLUSH
2026-10-29 00:57:00 +08:00
TermiNexus
9bfdaecc6b
feat(vpui): support direct and Explorer-managed TTF text
...
vpui.set_text_mode selects:
- TEXT_MODE_DIRECT: vpui imports fonttools, loads /FONTS/FONT.TTF and
builds the 8x16 atlas in-process.
- TEXT_MODE_MANAGED (default): text is queued per frame and drawn by
Explorer through the new DESK_REQ_TEXT request; Explorer uses the same
fonttools atlas.
Remove the fixed VPUI.ATL asset and its loader.
2026-10-27 22:08:16 +08:00
TermiNexus
99c8cea8ee
feat(window): 滚轮事件下传与 Terminal 滚动
...
- desk 协议新增 DESK_MOUSE_WHEEL;window 新增 EVENT_TYPE_WHEEL
- Explorer 汇总一批鼠标包的 wheel 增量,投给光标下的窗口
(窗口内坐标;任务栏区域不投递)
- InputEvent.button 承载滚轮有符号增量(uint8 编码,消费方按 int8 解码)
- vpui.Text 处理 WHEEL:每次滚动 3 行,按“输出行 + 输入行”总行数钳制,
并同步滚动条;输入行仍保持在可视区内
2026-10-27 14:50:04 +08:00
TermiNexus
b9efc30d71
feat(window): 标题栏 hover、最大化图标、边缘缩放与控件光标
...
1) 标题栏按钮 hover:min/max 背景按 alpha 压暗,close 变红、图标变白;
按下态更深。新增 hover_btn_win/kind,仅在变化时重画标题栏。
2) 最大化图标改为单线方框(上边框不再两行加厚);最大化后显示
两个错位重叠方框作为“还原”。
3) 窗口边缘 5px 热区支持拖拽缩放:左/右 ↔、上/下 ↕、四角斜向;
缩放中实时更新几何与内容缓冲(按 1.5 倍扩容,避免 arena 抖动),
并向 app 发 RESIZE。
4) 新增 DESK_REQ_CURSOR / window.set_cursor_type 真正下发光标类型;
explorer 按窗口 cursor + 边缘热区选择箭头 / I 形 / 手指 / 缩放光标。
5) vpui.Tk 在 HOVER 时按最上层控件设置光标:Entry/Text → I 形,
Button → 手指;Entry 自己的光标请求移除,避免与集中逻辑冲突。
2026-10-27 13:14:42 +08:00
TermiNexus
a3c1d221e6
fix(kbd,sched,scene3d): 键盘报告去重;用户线程 return 跳板修正;关窗时序
...
① Enter 洪流:usb_kbd._on_int_complete 的按下沿依赖 kbd_prev_keycodes,而状态提交在函数末尾第三趟循环;kbd_report 是常驻 DMA 缓冲,按键保持/NAK/重复完成都会让回调反复看到同一份报告 ⇒ 每次中断都注入一次 Enter,Terminal 刷出 [cmd] enter,explorer 被拖死。新增 kbd_prev_sig(modifier+6 keycode 的标量签名)整份报告去重;同一趟循环里先提交 prev 再判定;全 0 报告只更新状态;抽出 _rearm() 保证所有出口都重排中断 IN 且 DMA 读取先于重排。② explorer 限流:kb_pend[64] + _deliver_kb,单轮最多投递 64 字节,ring_push 返回 -1 时停在当前字节(不再当成功丢弃),pending 清空才补读;鼠标取包同样 64 包/轮上限。③ 关窗卡死根因:process.vp 的 _tramp_code 是 mov eax,34; int 0x80; jmp \$,而 Syscall.THREAD_EXIT=60 ⇒ 用户线程 return 后走 syscall 34(无匹配分支)返回 Ring3 在 jmp \$ 空转,空转不再产生 syscall,而内核只在 syscall 返回路径消费 needs_reschedule ⇒ 协作式调度彻底停摆,整机冻结。sched.create_user_thread 在跳板映射后把立即数低字节改为 60(幂等)。④ 次生:主线程先退会立即回收自己的用户栈,而 Scene3D 渲染线程还引用其栈上对象。Scene3D 渲染线程退出改为显式 process.thread_exit() 并置 _render_done;主线程 mainloop 返回后先 yield 等渲染线程退出(上限 10000 次)再 exit。⑤ window.flush 在槽位 used==0 时直接返回;vpui.Tk.redraw 入口判 win_id 与 is_active,窗口已回收时不碰 arena 不 flush。
2026-10-17 16:49:37 +08:00
TermiNexus
aab4643dfa
feat(desk): style 透传到 CREATE 请求;任务栏随焦点/窗口集合刷新
...
① style 透传:DeskMsg 增加 style 字段(放在 d 与 title 之间),window._send 增加 style 可选参数(默认 0,其它调用点不受影响),create_window 把 style 一并压进 CREATE 请求,explorer 的 handle_request 用它建窗(原来硬编码 0)—— 这样 vpui 的 set_style 才能真正生效,样式区分与圆角才有意义。DeskMsg 是共享协议结构,app 与 explorer 必须一起重编。② 任务栏刷新:mark_titles 追加标记任务栏条带(焦点切换会调它,任务栏图标配色随之更新),CREATE 与 DESTROY 分支也各调一次(图标数量变化)。
2026-10-16 22:42:58 +08:00
TermiNexus
2f20cf42aa
fix(vpui): 建窗失败改为可见错误上报;Scene3D 加分步诊断打点
...
背景:Tk.mainloop 的循环条件是 window.is_active(win_id),而 is_active 对 win_id < 0 直接返回 0 ⇒ 一旦 create_window 失败,app 一次循环都不进、一句日志都不打就 process.exit(0)(现场:Scene3D spawn 后静默退出,「没有窗口」就是这么来的)。改动:window.vp 的 _attach / _connect / create_window 四个失败返回点补 [win] 错误上报(open 失败 / mmap 失败 / desk 未就绪超时 / 请求环压入失败 / CREATED 超时),这些是错误可见性而非临时噪音,长期保留;Scene3D/main.vp 加 _dbg 分步打点(start / tk ok / canvas ok / scene ok / geometry 后的 win_id 与 buf / 渲染线程 / mainloop 返回),用于定位它到底死在哪一步,定位完成后撤除。
2026-10-16 20:51:07 +08:00
TermiNexus
c4305301fc
fix(vpsdk): 恢复 window.vp 对 vpsdk.stdlib 的 import(app 裸名 malloc 的链接来源)
...
现象:ld.lld 报 undefined symbol: malloc,引用来自 Apps/HelloWorld 的 _start(4 处)。根因:malloc 是 vpsdk/stdlib.vp 的 CExport 裸名,app 侧那些裸名调用要靠 window.vp 的 import vpsdk.stdlib 把 stdlib 拉进链接图;S3d 重写 window.vp 时把它当未使用删掉了 ⇒ stdlib 不再进图 ⇒ malloc 无人定义。
同时删除 main.vp 里上一轮加的两处说明注释(按用户要求不保留)。
2026-10-16 19:20:26 +08:00
TermiNexus
c5e107e361
fix(vpsdk): 修正 desk_open/desk_map 的模块前缀(链接 undefined symbol 根因)
...
现象:ld.lld 报 undefined symbol aeb1805c34e518f8.desk_map / desk_open,引用来自 window.vp 的对象(_attach/_connect)。根因:我在 window.vp 与 Explorer/main.vp 里把这两个函数挂到了 devfs. 前缀上,而它们的定义在 vpsdk/desk.vp(devfs.vp 里只有底层 shm_map)。编译器按名解析到 desk.vp 的声明并发出带 desk 前缀的符号,但调用点的前缀不一致 ⇒ 链接期解析不到。
同时清掉 window.vp 里已不再使用的 import(devfs/stdlib/syscall —— get_winbuf 改用共享区后 stdlib.malloc 与 syscall 都已无引用)。
2026-10-16 19:14:57 +08:00
TermiNexus
a45b9808b0
feat(s3d): vpsdk/window.vp 改走 /dev/desk 共享协议(对外 API 一字未改)
...
window.vp 重写:不再走内核 UI syscall,全部经共享区与用户态 explorer 通信。对外函数名/签名/常量/InputEvent 全部保持原样 ⇒ vpui.vp 与四个 app 零改动。
数据面:get_winbuf 直接返回共享 arena 里本窗口那块像素缓冲的线性地址(app 就地画),flush 只压一条 FLUSH 请求 ⇒ 全程零像素拷贝(旧实现是 app 私有缓冲 + 整块拷给内核)。控制面:请求环 + 按 pid 分的事件环;is_active/get_win_size 直接读共享槽(零 syscall)。create_window 压 CREATE(标题内联在消息里)并等 CREATED 答复拿 win_id。
协议补齐:DeskMsg 增内联 title(CREATE/TITLE 用,ring_push/pop 同步搬运);事件环按 pid 分(不能按 win_id——建窗答复送不到;也不能单环——单消费者结构多 app 会互抢);新增 DESK_MOUSE_PRESS/RELEASE/HOVER 语义常量。
合成器:关闭按钮改为置 active=0(app 的 while is_active() 自然退出)并通知一次 CLOSE;点击只投给窗口**内容区**(标题栏用于拖动)、松手投 RELEASE、移动投 HOVER,坐标均换算成窗口内坐标;拖动改为只在标题栏生效;RESIZE 重新从 arena 切片并更新内容尺寸(与 vpui 的 bh = h - TITLE_H - 2 对齐)。
2026-10-16 19:08:18 +08:00
TermiNexus
ca72ddbbf7
refactor(syscall): 调用号改用 enum 并全面对齐 Linux x86-64 ABI
...
内核 intr/syscall.vp 与 vpsdk/syscall.vp 各一份 1..34 的 define 表改为同名 enum Syscall。编号口径:与 Linux 同名同号;Linux 有而我们未实现的留空不占号(12 brk / 39 getpid / 84 rmdir / 217 getdents64 / 257 openat … 需要时按号补)。
15 个语义重合的调用直接用 Linux 号:READ 0 / WRITE 1 / OPEN 2 / CLOSE 3 / STAT 4 / SEEK 8 / MMAP 9 / MUNMAP 11 / YIELD 24 / THREAD_CREATE 56(≈clone) / SPAWN 59(≈execve) / THREAD_EXIT 60(exit) / MKDIR 83 / REMOVE 87 / EXIT 231(exit_group)。
其余 19 个(UI 11 个 + SERIAL_PUTS/TELL/SIZE/OPENDIR/READDIR/CLOSEDIR/LOAD_SO/SO_CALL1)暂放 0x1000 起的**临时私有段**,每条带迁移标注:私有能力最终不占 syscall 号、改走 devfs 设备文件;UI 11 个待用户态 explorer(图形壳)接管 framebuffer 与输入后删除。
内核派发链改 n == int(Syscall.X)(n 是 int/i64、成员是 i32,显式 int() 规避未证实的混合宽度比较);SDK 全部调用点统一为 syscall.Syscall.X;stdlib 的 SYSCALL_MMAP 别名并入 Syscall.MMAP;Terminal 里硬编码的 uint64(18) 改为常量。
2026-10-16 18:32:33 +08:00
TermiNexus
0886252a08
feat(vpsdk): window/syscall/process/stdio/fs/dynlib 适配 + apps 同步调整
2026-10-16 16:40:41 +08:00
TermiNexus
29e1bc6e34
chore(debug): 移除定位用的 MMAP/get_winbuf/redraw 临时探针(线程模型修复后 PF 与卡死均已消失)
2026-10-15 16:48:19 +08:00
TermiNexus
89a319e1be
chore(debug): 加临时探针定位 MMAP 返回高半污染与 Tk.buf 野指针 - MMAP/get_winbuf/redraw
2026-10-15 16:20:14 +08:00
TermiNexus
11ad0de988
fix(vpsdk): WINBUF_MAX_BYTES 改单字面量 4194304,避免最小宽度算术回绕成 0(三重故障诱因)
...
- `1024 * 1024 * 4` 按最小宽度(i16)做算术:1024×1024 先回绕成 0 ⇒ 缓冲只剩几字节 ⇒ flush 时内核 memcpy(dst, src, 240KB) 从 app 的几字节缓冲后狂读 ⇒ 内核越界读 → 异常路径再出事即三重故障
- 改成单字面量 4194304(不依赖任何算术)。与 V3_POOL 同属“最小宽度算术”坑:静态求值侧已在 61f23d9 按结果值加宽,这处是表达式侧,先按单字面量规避
2026-10-14 19:35:37 +08:00
TermiNexus
c977caec91
fix(vkernel/vpsdk): 窗口缓冲改走“用户缓冲 + WIN_FLUSH 拷贝”,修 app 写内核页 #PF(err=0x7)
...
- 现场:四个 app 一画就用户态 #PF,cr2 全在内核堆区(~0xb7c1000/0x9f81000/0xb851000/0xb881000),err=0x7(present + 用户写),RAX 正是各自颜色常量(0x1E1E32/0xC0C0C/0xF0F19)
- 根因:GET_WINBUF 把 desktop 的**内核**窗口后备缓冲地址直接交给 app(该页 U=0),app 当用户指针写 → 必然 #PF,四个 app 全中(tid=5 那条 cr2=0xffffffff52209000 是同一指针继续走坏)
- 内核:WIN_FLUSH 增加源指针 `WIN_FLUSH(win_id, src)`:先 desktop.get_fb 取窗口缓冲、再 desktop.get_fb_bytes 取字节数(配对取,避免 resize 重建导致尺寸/指针不一致),memcpy 后 desktop.flush;syscall_handler 的 WIN_FLUSH 分支透传 arg2;desktop 新增 get_fb_bytes
- app(vpsdk/window.vp):get_winbuf 改为按窗口分配**用户态**缓冲(stdlib.malloc → MMAP,落在 0x20000000 用户堆)并缓存;flush(win_id) 改为 WIN_FLUSH(win_id, 用户缓冲)
2026-10-14 19:30:29 +08:00
TermiNexus
5b4bab59cc
chore(ViperOS): 合并落库内核侧在途改动并移除 vpsdk wiki 拷贝
...
VKernel / vpsdk / Apps / Libs 共 30 个源文件:内核与 SDK 侧的新语法适配及编译修正(含 bootinfo.vp / main.vp 位宽改 uint64、gfx.vp 前向引用改指针、devfs.vp 指针解引用赋值、elf.vp 跨模块函数取值等)。删除 vpsdk/wiki/*.md(14 文件,约 -8100 行):与仓库根 wiki 重复的拷贝,统一以根 wiki 为唯一来源。
2026-10-07 19:04:33 +08:00
TermiNexus
2a54e2bafb
清理了 t.CVoid
2026-09-16 16:07:04 +08:00
TermiNexus
a518f75b24
chore(vkernel): 重置基线 — 纳入 TPV codegen 修复配合的内核侧调整与既有工作区内容
...
- devfs.vp: string.split 传 PATH_BUFFER_SIZE(配合 split 新增容量参数)
- fat32_types.vp: lfn_extract 越界钳制(base+i > MAX_LFN 返回 -1)
- sheet.vp: gfx.Renderer 实参修正为 (fb, zb, w, h)(原单参导致 w/h=0 渲染空操作)
- 同批包含 VKernel 其余既有移植改动与 vpsdk/Apps/Libs 工作区内容
2026-09-11 14:27:01 +08:00
TermiNexus
20e7289c61
将 .py 和 .pyi 后缀名改为了 .vp 和 .vpi 后缀名
2026-07-30 16:34:26 +08:00