Skip to content

Commit

Permalink
Simulate tilt multitouch event by pressing Shift
Browse files Browse the repository at this point in the history
PR #4529 <#4529>

Signed-off-by: Romain Vimont <[email protected]>
  • Loading branch information
tillrathmann authored and rom1v committed Dec 15, 2023
1 parent 604dfd7 commit d2ed451
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 13 deletions.
6 changes: 5 additions & 1 deletion app/scrcpy.1
Original file line number Diff line number Diff line change
Expand Up @@ -642,7 +642,11 @@ Enable/disable FPS counter (print frames/second in logs)

.TP
.B Ctrl+click-and-move
Pinch-to-zoom from the center of the screen
Pinch-to-zoom and rotate from the center of the screen

.TP
.B Shift+click-and-move
Tilt (slide vertically with two fingers)

.TP
.B Drag & drop APK file
Expand Down
6 changes: 5 additions & 1 deletion app/src/cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -947,7 +947,11 @@ static const struct sc_shortcut shortcuts[] = {
},
{
.shortcuts = { "Ctrl+click-and-move" },
.text = "Pinch-to-zoom from the center of the screen",
.text = "Pinch-to-zoom and rotate from the center of the screen",
},
{
.shortcuts = { "Shift+click-and-move" },
.text = "Tilt (slide vertically with two fingers)",
},
{
.shortcuts = { "Drag & drop APK file" },
Expand Down
40 changes: 32 additions & 8 deletions app/src/input_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ sc_input_manager_init(struct sc_input_manager *im,
im->sdl_shortcut_mods.count = shortcut_mods->count;

im->vfinger_down = false;
im->vfinger_invert_x = false;
im->vfinger_invert_y = false;

im->last_keycode = SDLK_UNKNOWN;
im->last_mod = 0;
Expand Down Expand Up @@ -347,9 +349,14 @@ simulate_virtual_finger(struct sc_input_manager *im,
}

static struct sc_point
inverse_point(struct sc_point point, struct sc_size size) {
point.x = size.width - point.x;
point.y = size.height - point.y;
inverse_point(struct sc_point point, struct sc_size size,
bool invert_x, bool invert_y) {
if (invert_x) {
point.x = size.width - point.x;
}
if (invert_y) {
point.y = size.height - point.y;
}
return point;
}

Expand Down Expand Up @@ -605,7 +612,9 @@ sc_input_manager_process_mouse_motion(struct sc_input_manager *im,
struct sc_point mouse =
sc_screen_convert_window_to_frame_coords(im->screen, event->x,
event->y);
struct sc_point vfinger = inverse_point(mouse, im->screen->frame_size);
struct sc_point vfinger = inverse_point(mouse, im->screen->frame_size,
im->vfinger_invert_x,
im->vfinger_invert_y);
simulate_virtual_finger(im, AMOTION_EVENT_ACTION_MOVE, vfinger);
}
}
Expand Down Expand Up @@ -726,7 +735,7 @@ sc_input_manager_process_mouse_button(struct sc_input_manager *im,
return;
}

// Pinch-to-zoom simulation.
// Pinch-to-zoom, rotate and tilt simulation.
//
// If Ctrl is hold when the left-click button is pressed, then
// pinch-to-zoom mode is enabled: on every mouse event until the left-click
Expand All @@ -735,14 +744,29 @@ sc_input_manager_process_mouse_button(struct sc_input_manager *im,
//
// In other words, the center of the rotation/scaling is the center of the
// screen.
#define CTRL_PRESSED (SDL_GetModState() & (KMOD_LCTRL | KMOD_RCTRL))
//
// To simulate a tilt gesture (a vertical slide with two fingers), Shift
// 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
// the screen.
const SDL_Keymod keymod = SDL_GetModState();
const bool ctrl_pressed = keymod & KMOD_CTRL;
const bool shift_pressed = keymod & KMOD_SHIFT;
if (event->button == SDL_BUTTON_LEFT &&
((down && !im->vfinger_down && CTRL_PRESSED) ||
((down && !im->vfinger_down &&
((ctrl_pressed && !shift_pressed) ||
(!ctrl_pressed && shift_pressed))) ||
(!down && im->vfinger_down))) {
struct sc_point mouse =
sc_screen_convert_window_to_frame_coords(im->screen, event->x,
event->y);
struct sc_point vfinger = inverse_point(mouse, im->screen->frame_size);
if (down) {
im->vfinger_invert_x = ctrl_pressed || shift_pressed;
im->vfinger_invert_y = ctrl_pressed;
}
struct sc_point vfinger = inverse_point(mouse, im->screen->frame_size,
im->vfinger_invert_x,
im->vfinger_invert_y);
enum android_motionevent_action action = down
? AMOTION_EVENT_ACTION_DOWN
: AMOTION_EVENT_ACTION_UP;
Expand Down
2 changes: 2 additions & 0 deletions app/src/input_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ struct sc_input_manager {
} sdl_shortcut_mods;

bool vfinger_down;
bool vfinger_invert_x;
bool vfinger_invert_y;

// Tracks the number of identical consecutive shortcut key down events.
// Not to be confused with event->repeat, which counts the number of
Expand Down
8 changes: 6 additions & 2 deletions doc/control.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,16 +85,20 @@ way as <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>v</kbd>).
To disable automatic clipboard synchronization, use
`--no-clipboard-autosync`.

## Pinch-to-zoom
## Pinch-to-zoom, rotate and tilt simulation

To simulate "pinch-to-zoom": <kbd>Ctrl</kbd>+_click-and-move_.

More precisely, hold down <kbd>Ctrl</kbd> while pressing the left-click button.
Until the left-click button is released, all mouse movements scale and rotate
the content (if supported by the app) relative to the center of the screen.

To simulate a tilt gesture: <kbd>Shift</kbd>+_click-and-move-up-or-down_.

Technically, _scrcpy_ generates additional touch events from a "virtual finger"
at a location inverted through the center of the screen.
at a location inverted through the center of the screen. When pressing
<kbd>Ctrl</kbd> the x and y coordinates are inverted. Using <kbd>Shift</kbd>
only inverts x.


## Key repeat
Expand Down
3 changes: 2 additions & 1 deletion doc/shortcuts.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ _<kbd>[Super]</kbd> is typically the <kbd>Windows</kbd> or <kbd>Cmd</kbd> key._
| Synchronize clipboards and paste⁵ | <kbd>MOD</kbd>+<kbd>v</kbd>
| Inject computer clipboard text | <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>v</kbd>
| Enable/disable FPS counter (on stdout) | <kbd>MOD</kbd>+<kbd>i</kbd>
| Pinch-to-zoom | <kbd>Ctrl</kbd>+_click-and-move_
| Pinch-to-zoom/rotate | <kbd>Ctrl</kbd>+_click-and-move_
| Tilt (slide vertically with 2 fingers) | <kbd>Shift</kbd>+_click-and-move_
| Drag & drop APK file | Install APK from computer
| Drag & drop non-APK file | [Push file to device](control.md#push-file-to-device)

Expand Down

0 comments on commit d2ed451

Please sign in to comment.