Skip to content

fix: 外接显示器模式下物理鼠标指针捕获失败#252

Open
qiin2333 wants to merge 1 commit intomasterfrom
fix/external-display-physical-mouse
Open

fix: 外接显示器模式下物理鼠标指针捕获失败#252
qiin2333 wants to merge 1 commit intomasterfrom
fix/external-display-physical-mouse

Conversation

@qiin2333
Copy link
Copy Markdown
Owner

@qiin2333 qiin2333 commented Apr 4, 2026

问题

关联 #228

外接显示器连接时,USB/蓝牙物理鼠标在非「本地指针」模式下无法移动光标。本地指针模式正常(用户 @To0nyZ 确认)。

根因

ExternalDisplayManagersurfaceView 设为 View.GONE,视频画面改在外接屏的 Presentation 上显示。

InputCaptureManager.getInputCaptureProviderForExternalDisplay() 在 Evdev 不可用时回退到 getInputCaptureProvider(),该方法创建 AndroidNativePointerCaptureProvider 仍然绑定到被隐藏的 surfaceView

Android 对 GONE 的 View 调用 requestPointerCapture() 不会生效,物理鼠标事件因此无法获取 SOURCE_MOUSE_RELATIVE 相对轴数据。

修复

getInputCaptureProviderForExternalDisplay() 的非 Evdev 回退路径中,使用仍然可见的 backgroundTouchView 作为指针捕获目标:

  • backgroundTouchView 在主屏仍然 VISIBLE,requestPointerCapture() 可以成功
  • 捕获成功后 SOURCE_MOUSE_RELATIVE 事件通过 Activity onGenericMotionEvent → 相对轴流程正常处理
  • 仅影响外接显示器的回退路径getInputCaptureProvider() 完全未改动,不影响普通模式
  • Evdev / SHIELD 路径不受影响

根因:外接显示器连接时 surfaceView 被设为 GONE,
AndroidNativePointerCaptureProvider 对隐藏 View 调用
requestPointerCapture() 失败,导致物理鼠标无法被捕获。

修复:getInputCaptureProviderForExternalDisplay() 在 Evdev
不可用时,使用仍然可见的 backgroundTouchView 作为指针捕获
目标,而非被隐藏的 surfaceView。

- 仅影响外接显示器回退路径,getInputCaptureProvider() 未改动
- Evdev 和 SHIELD 路径不受影响
- 指针捕获成功后,SOURCE_MOUSE_RELATIVE 相对轴走原有流程

Ref: #228
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant