blob: 790fb001bcae963ba6dd5c0737ae13299ec103b1 [file] [log] [blame] [view]
# input_pipeline > How mouse movement scale
Reviewed on: 2022-12-16
Currently, in input pipeline, we support [2 type of mouse]:
- Relative: most common mouse in the market
- Absolute: the mouse on FEMU
## Relative Mouse
Relative Mouse reports how far the mouse moved in counts / dots. Depends on
sensor, mouse will report different [CPI (counts per inch)]. Sensors can
report more counts per inch means OS or applications can have more precise
data of movement in physical distance. Currently, "standard" mouse is 1000 CPI,
but it can be up to 25000 CPI.
`mouse_binding`
[converts counts to millimeters of the mouse's physical movement] based on the
CPI database once `mouse_binding` receives the event report from the mouse
driver. Inside input pipeline all movement is represented in millimeters.
[`PointerSensorScaleHandler`] scales the motion based on the speed. For
example, it may scale 10mm motion to 20mm. Currently, we have 3 speed class
to apply 3 different scaling curves.
[`PointerDisplayScaleHandler`] scales the motion based on the
[Device-Pixel-Ratio]. This helps cursor motion appear identical across
displays, with the same distance in display logical pixels (given different DPR
but identical physical size). For example, PointerDisplayScaleHandler will keep
10mm movement as 10mm movement on DPR=1.0 display (1080 monitor in 1080 logical
resolution); and scales 10mm movement to 20mm movement on DPR=2.0 display (4k
monitor in 1080 logical resolution).
Before the event is sent to to scenic, the movement will be converted to physical
pixel in [`MouseInjectorHandler`]. To convert physical distance in mm to physical
pixels, input pipeline need to compute `mm * logical_pixels_per_mm * DPR`.
Because DPR is applied in `PointerDisplayScaleHandler`, MouseInjectorHandler only
apply the logical_pixels_per_mm. Currently, we use a fixed number as mm to
logical pixel ratio, we may need to revisit to allow users to adjust the speed
of mouse move or allow different ratio per monitor model.
## Absolute Mouse
Currently, Absolute Mouses are only used for FEMU.
Absolute Mouse reports an absolute position of cursor in device coordinates,
device description will include the x y range. Input pipeline bypass
`PointerSensorScaleHandler` and `PointerDisplayScaleHandler`, then
[`MouseInjectorHandler::scale_absolute_position`] map the absolute position
to display coordinates based on the range of mouse movement from mouse
description.
<!-- xrefs -->
[2 type of mouse]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/ui/lib/input_pipeline/src/mouse_binding.rs?q=MouseLocation
[CPI (counts per inch)]: https://en.wikipedia.org/wiki/Computer_mouse#Mouse_speed
[to millimeters of the mouse's physical movement]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/ui/lib/input_pipeline/src/mouse_binding.rs?q=q="fn%20process_reports("
[`PointerSensorScaleHandler`]: /src/ui/lib/input_pipeline/docs/stages/pointer_motion_sensor_scale_handler.md
[`PointerDisplayScaleHandler`]: /src/ui/lib/input_pipeline/docs/stages/pointer_motion_display_scale_handler.md
[Device-Pixel-Ratio]: https://fuchsia.dev/fuchsia-src/contribute/governance/rfcs/0174_scale_in_flatland?hl=en#device_pixel_ratio
[`MouseInjectorHandler`]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/ui/lib/input_pipeline/src/mouse_injector_handler.rs?q="fn%20relative_movement_mm_to_phyical_pixel("
[`MouseInjectorHandler::scale_absolute_position`]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/ui/lib/input_pipeline/src/mouse_injector_handler.rs?q="fn%20scale_absolute_position("