Skip to content

宿主侧点击:modavd_touch_* 走模拟器控制台 - #15

Merged
qiyinxi merged 3 commits into
ModAVD:mainfrom
qiyinxi:feat/host-touch
Nov 13, 2026
Merged

qiyinxi merged 3 commits into
ModAVD:mainfrom
qiyinxi:feat/host-touch

Conversation

@qiyinxi

@qiyinxi qiyinxi commented Nov 13, 2026

Copy link
Copy Markdown
Member

这是什么

库加上宿主侧点击:modavd_touch_down / modavd_touch_move / modavd_touch_up / modavd_touch_release_all 从「已声明、返回不支持」变成能用,接口版本升到 2,能力位多了 MODAVD_CAP_TOUCH。下一步给 MaaCore 加对应的触控模式。

怎么做的

  • 走模拟器控制台的 event send,发标准的多点触控事件(协议 B:槽位、跟踪编号、坐标、压力、接触面积)。模拟器把这类事件原样交给显示 0 的虚拟触屏(android_virtio_send_event_as_mt),安卓看到的是屏幕上的手指,和在模拟器窗口里点一样,客体里不用装东西。
  • 坐标是显示像素,按共享画面头里的宽高换算到 0–32767,和模拟器处理 event mouse 的换算一样;默认压力 0x400、接触面积 0x500 也照 event mouse 取。
  • 每个句柄一条控制台长连接:第一次点击时连上,断了(模拟器重启等)重连一次再发;关闭句柄时先抬起还按着的手指。点击各自加锁,和截图互不影响。
  • 最多 10 根手指。已经按下的手指再按下当移动(和 MuMu 的库一样);移动没按下的手指报 MODAVD_E_INVALID;抬起没按下的手指什么也不发。
  • 按键和文字仍返回 MODAVD_E_UNSUPPORTED:控制台 event send 发的按键会被送进触屏设备、被丢掉;event text 会悄悄丢掉键盘映射里没有的字。
  • 控制台客户端拆成打开、发送、关闭三步;一次性命令(开共享画面)的行为和返回值不变。

测试

  • Windows(MSVC /W4 /WX):test_core、新的 test_input、test_shim 都过。test_input 起一个假控制台,核对每个动作发出的命令、坐标换算和截断、认证、会话断开后重连重发、关闭句柄时抬起手指。Linux、macOS 交给 CI。
  • 实机(ModAVD 0.40,720p,flow-a):用编出来的 modavd_extras.dll 点击、20 步滑动、双指按住再全部抬起。
    • 每次调用中位数 0.18 ms,第一次(连控制台)2.4 ms;
    • getevent 里事件来自 virtio_input_multi_touch_1,单指点击的字段和值与 event mouse 产生的逐个相同;
    • 打开「指针位置」后双指按住时截图,系统显示两指分别在 (300, 200) 和 (900, 500),和发送的坐标一致。

Refs #1

- 每个句柄一条控制台长连接,第一次点击时连上,断了重连一次;关闭句柄时先抬起还按着的手指。
- 按多点触控协议 B 拼 event send(槽位、跟踪编号、坐标、压力、接触面积),坐标按共享画面的宽高换算到 0–32767,和 event mouse 的换算、默认压力一致。最多 10 根手指;已按下的再按下当移动。
- 接口版本 2,能力位加 MODAVD_CAP_TOUCH;按键、文字仍是 MODAVD_E_UNSUPPORTED。
- 控制台客户端拆成打开、发送、关闭三步,一次性命令照旧。
- 新增 test_input:假控制台核对每条命令、坐标换算、重连、关闭时抬起和认证。
@qiyinxi qiyinxi added the enhancement New feature or request label Nov 13, 2026
- test_open_posix 自己定义 mx_console_command 顶替库里的;点击用到 console.c 的会话函数后,console.c 会被链接进来,两份定义冲突(macOS 链接失败)。一次性命令单独成文件,顶替照旧有效。
- gcc 的 -Wformat-truncation 把 test_input 里按 %s 拷进固定缓冲判为可能截断,改成按长度拷贝。
Linux 上 PATH_MAX 是 4096,加固过的 glibc 对 1024 字节的缓冲区直接中止进程;macOS 的 PATH_MAX 正好是 1024,所以只在 Linux 上挂。
@qiyinxi
qiyinxi added this pull request to the merge queue Nov 13, 2026
Merged via the queue into ModAVD:main with commit 7e6a779 Nov 13, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant