mirror of https://github.com/Genymobile/scrcpy
Use finger source when a pointer is simulated
For pinch-to-zoom, rotation and tilt simulation, always use a finger source (instead of a mouse) for both pointers (the real one and the simulated one). A "virtual" mouse does not work on all devices (e.g. on Pixel 8). PR #5076 <https://github.com/Genymobile/scrcpy/pull/5076>
This commit is contained in:
parent
6808288823
commit
51fee79bf5
|
@ -365,7 +365,7 @@ simulate_virtual_finger(struct sc_input_manager *im,
|
||||||
msg.inject_touch_event.action = action;
|
msg.inject_touch_event.action = action;
|
||||||
msg.inject_touch_event.position.screen_size = im->screen->frame_size;
|
msg.inject_touch_event.position.screen_size = im->screen->frame_size;
|
||||||
msg.inject_touch_event.position.point = point;
|
msg.inject_touch_event.position.point = point;
|
||||||
msg.inject_touch_event.pointer_id = SC_POINTER_ID_VIRTUAL_MOUSE;
|
msg.inject_touch_event.pointer_id = SC_POINTER_ID_VIRTUAL_FINGER;
|
||||||
msg.inject_touch_event.pressure = up ? 0.0f : 1.0f;
|
msg.inject_touch_event.pressure = up ? 0.0f : 1.0f;
|
||||||
msg.inject_touch_event.action_button = 0;
|
msg.inject_touch_event.action_button = 0;
|
||||||
msg.inject_touch_event.buttons = 0;
|
msg.inject_touch_event.buttons = 0;
|
||||||
|
@ -650,7 +650,8 @@ sc_input_manager_process_mouse_motion(struct sc_input_manager *im,
|
||||||
|
|
||||||
struct sc_mouse_motion_event evt = {
|
struct sc_mouse_motion_event evt = {
|
||||||
.position = sc_input_manager_get_position(im, event->x, event->y),
|
.position = sc_input_manager_get_position(im, event->x, event->y),
|
||||||
.pointer_id = SC_POINTER_ID_MOUSE,
|
.pointer_id = im->vfinger_down ? SC_POINTER_ID_GENERIC_FINGER
|
||||||
|
: SC_POINTER_ID_MOUSE,
|
||||||
.xrel = event->xrel,
|
.xrel = event->xrel,
|
||||||
.yrel = event->yrel,
|
.yrel = event->yrel,
|
||||||
.buttons_state =
|
.buttons_state =
|
||||||
|
@ -800,11 +801,20 @@ sc_input_manager_process_mouse_button(struct sc_input_manager *im,
|
||||||
|
|
||||||
uint32_t sdl_buttons_state = SDL_GetMouseState(NULL, NULL);
|
uint32_t sdl_buttons_state = SDL_GetMouseState(NULL, NULL);
|
||||||
|
|
||||||
|
SDL_Keymod keymod = SDL_GetModState();
|
||||||
|
bool ctrl_pressed = keymod & KMOD_CTRL;
|
||||||
|
bool shift_pressed = keymod & KMOD_SHIFT;
|
||||||
|
bool change_vfinger = event->button == SDL_BUTTON_LEFT &&
|
||||||
|
((down && !im->vfinger_down && (ctrl_pressed ^ shift_pressed)) ||
|
||||||
|
(!down && im->vfinger_down));
|
||||||
|
bool use_finger = im->vfinger_down || change_vfinger;
|
||||||
|
|
||||||
struct sc_mouse_click_event evt = {
|
struct sc_mouse_click_event evt = {
|
||||||
.position = sc_input_manager_get_position(im, event->x, event->y),
|
.position = sc_input_manager_get_position(im, event->x, event->y),
|
||||||
.action = sc_action_from_sdl_mousebutton_type(event->type),
|
.action = sc_action_from_sdl_mousebutton_type(event->type),
|
||||||
.button = sc_mouse_button_from_sdl(event->button),
|
.button = sc_mouse_button_from_sdl(event->button),
|
||||||
.pointer_id = SC_POINTER_ID_MOUSE,
|
.pointer_id = use_finger ? SC_POINTER_ID_GENERIC_FINGER
|
||||||
|
: SC_POINTER_ID_MOUSE,
|
||||||
.buttons_state = sc_mouse_buttons_state_from_sdl(sdl_buttons_state,
|
.buttons_state = sc_mouse_buttons_state_from_sdl(sdl_buttons_state,
|
||||||
&im->mouse_bindings),
|
&im->mouse_bindings),
|
||||||
};
|
};
|
||||||
|
@ -832,12 +842,7 @@ sc_input_manager_process_mouse_button(struct sc_input_manager *im,
|
||||||
// can be used instead of Ctrl. The "virtual finger" has a position
|
// can be used instead of Ctrl. The "virtual finger" has a position
|
||||||
// inverted with respect to the vertical axis of symmetry in the middle of
|
// inverted with respect to the vertical axis of symmetry in the middle of
|
||||||
// the screen.
|
// the screen.
|
||||||
SDL_Keymod keymod = SDL_GetModState();
|
if (change_vfinger) {
|
||||||
bool ctrl_pressed = keymod & KMOD_CTRL;
|
|
||||||
bool shift_pressed = keymod & KMOD_SHIFT;
|
|
||||||
if (event->button == SDL_BUTTON_LEFT &&
|
|
||||||
((down && !im->vfinger_down && (ctrl_pressed ^ shift_pressed)) ||
|
|
||||||
(!down && im->vfinger_down))) {
|
|
||||||
struct sc_point mouse =
|
struct sc_point mouse =
|
||||||
sc_screen_convert_window_to_frame_coords(im->screen, event->x,
|
sc_screen_convert_window_to_frame_coords(im->screen, event->x,
|
||||||
event->y);
|
event->y);
|
||||||
|
|
Loading…
Reference in New Issue