Add relative mode flag to mouse processors

The default mouse injection works in absolute mode: it forwards clicks
at a specific position on screen.

To support HID mouse, add a flag to indicate that the mouse processor
works in relative mode: it forwards mouse motion vectors, without any
absolute reference to the screen.
This commit is contained in:
Romain Vimont 2021-12-30 15:46:00 +01:00
parent 924375487e
commit b5855e5deb
3 changed files with 19 additions and 0 deletions

View file

@ -659,7 +659,11 @@ input_manager_process_mouse_motion(struct input_manager *im,
assert(im->mp->ops->process_mouse_motion); assert(im->mp->ops->process_mouse_motion);
im->mp->ops->process_mouse_motion(im->mp, &evt); im->mp->ops->process_mouse_motion(im->mp, &evt);
// vfinger must never be used in relative mode
assert(!im->mp->relative_mode || !im->vfinger_down);
if (im->vfinger_down) { if (im->vfinger_down) {
assert(!im->mp->relative_mode); // assert one more time
struct sc_point mouse = struct sc_point mouse =
screen_convert_window_to_frame_coords(im->screen, event->x, screen_convert_window_to_frame_coords(im->screen, event->x,
event->y); event->y);
@ -772,6 +776,12 @@ input_manager_process_mouse_button(struct input_manager *im,
assert(im->mp->ops->process_mouse_click); assert(im->mp->ops->process_mouse_click);
im->mp->ops->process_mouse_click(im->mp, &evt); im->mp->ops->process_mouse_click(im->mp, &evt);
if (im->mp->relative_mode) {
assert(!im->vfinger_down); // vfinger must not be used in relative mode
// No pinch-to-zoom simulation
return;
}
// Pinch-to-zoom simulation. // Pinch-to-zoom simulation.
// //
// If Ctrl is hold when the left-click button is pressed, then // If Ctrl is hold when the left-click button is pressed, then

View file

@ -151,4 +151,6 @@ sc_mouse_inject_init(struct sc_mouse_inject *mi,
}; };
mi->mouse_processor.ops = &ops; mi->mouse_processor.ops = &ops;
mi->mouse_processor.relative_mode = false;
} }

View file

@ -16,6 +16,13 @@
*/ */
struct sc_mouse_processor { struct sc_mouse_processor {
const struct sc_mouse_processor_ops *ops; const struct sc_mouse_processor_ops *ops;
/**
* If set, the mouse processor works in relative mode (the absolute
* position is irrelevant). In particular, it indicates that the mouse
* pointer must be "captured" by the UI.
*/
bool relative_mode;
}; };
struct sc_mouse_processor_ops { struct sc_mouse_processor_ops {