diff --git a/README.md b/README.md index e8b5446545..a61407ac3a 100644 --- a/README.md +++ b/README.md @@ -595,6 +595,16 @@ scrcpy --no-key-repeat ``` +#### Right-click and middle-click + +By default, right-click triggers BACK (or POWER on) and middle-click triggers +HOME. To disable these shortcuts and forward the clicks to the device instead: + +```bash +scrcpy --forward-all-clicks +``` + + ### File drop #### Install APK diff --git a/app/scrcpy.1 b/app/scrcpy.1 index e957a4d012..e2b999deef 100644 --- a/app/scrcpy.1 +++ b/app/scrcpy.1 @@ -60,6 +60,10 @@ Default is 0. .B \-\-force\-adb\-forward Do not attempt to use "adb reverse" to connect to the device. +.TP +.B \-\-forward\-all\-clicks +By default, right-click triggers BACK (or POWER on) and middle-click triggers HOME. This option disables these shortcuts and forward the clicks to the device instead. + .TP .B \-f, \-\-fullscreen Start in fullscreen. diff --git a/app/src/cli.c b/app/src/cli.c index 41de8ca5dd..ffe3145524 100644 --- a/app/src/cli.c +++ b/app/src/cli.c @@ -57,6 +57,11 @@ scrcpy_print_usage(const char *arg0) { " Do not attempt to use \"adb reverse\" to connect to the\n" " the device.\n" "\n" + " --forward-all-clicks\n" + " By default, right-click triggers BACK (or POWER on) and\n" + " middle-click triggers HOME. This option disables these\n" + " shortcuts and forward the clicks to the device instead.\n" + "\n" " -f, --fullscreen\n" " Start in fullscreen.\n" "\n" @@ -651,6 +656,7 @@ guess_record_format(const char *filename) { #define OPT_DISABLE_SCREENSAVER 1020 #define OPT_SHORTCUT_MOD 1021 #define OPT_NO_KEY_REPEAT 1022 +#define OPT_FORWARD_ALL_CLICKS 1023 bool scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) { @@ -664,6 +670,8 @@ scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) { {"display", required_argument, NULL, OPT_DISPLAY_ID}, {"force-adb-forward", no_argument, NULL, OPT_FORCE_ADB_FORWARD}, + {"forward-all-clicks", no_argument, NULL, + OPT_FORWARD_ALL_CLICKS}, {"fullscreen", no_argument, NULL, 'f'}, {"help", no_argument, NULL, 'h'}, {"lock-video-orientation", required_argument, NULL, @@ -856,6 +864,9 @@ scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) { return false; } break; + case OPT_FORWARD_ALL_CLICKS: + opts->forward_all_clicks = true; + break; default: // getopt prints the error message on stderr return false; diff --git a/app/src/input_manager.c b/app/src/input_manager.c index 962db1d3e7..b03da38349 100644 --- a/app/src/input_manager.c +++ b/app/src/input_manager.c @@ -60,6 +60,7 @@ input_manager_init(struct input_manager *im, im->control = options->control; im->forward_key_repeat = options->forward_key_repeat; im->prefer_text = options->prefer_text; + im->forward_all_clicks = options->forward_all_clicks; const struct sc_shortcut_mods *shortcut_mods = &options->shortcut_mods; assert(shortcut_mods->count); @@ -629,7 +630,7 @@ input_manager_process_mouse_button(struct input_manager *im, } bool down = event->type == SDL_MOUSEBUTTONDOWN; - if (down) { + if (!im->forward_all_clicks && down) { if (control && event->button == SDL_BUTTON_RIGHT) { press_back_or_turn_screen_on(im->controller); return; diff --git a/app/src/input_manager.h b/app/src/input_manager.h index c3756e40cf..157c28329d 100644 --- a/app/src/input_manager.h +++ b/app/src/input_manager.h @@ -25,6 +25,7 @@ struct input_manager { bool control; bool forward_key_repeat; bool prefer_text; + bool forward_all_clicks; struct { unsigned data[SC_MAX_SHORTCUT_MODS]; diff --git a/app/src/scrcpy.h b/app/src/scrcpy.h index 86a2b57bc6..8ab05a9dd6 100644 --- a/app/src/scrcpy.h +++ b/app/src/scrcpy.h @@ -79,6 +79,7 @@ struct scrcpy_options { bool force_adb_forward; bool disable_screensaver; bool forward_key_repeat; + bool forward_all_clicks; }; #define SCRCPY_OPTIONS_DEFAULT { \ @@ -123,6 +124,7 @@ struct scrcpy_options { .force_adb_forward = false, \ .disable_screensaver = false, \ .forward_key_repeat = true, \ + .forward_all_clicks = false, \ } bool diff --git a/server/src/main/java/com/genymobile/scrcpy/Controller.java b/server/src/main/java/com/genymobile/scrcpy/Controller.java index 79feefc118..84780239d7 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Controller.java +++ b/server/src/main/java/com/genymobile/scrcpy/Controller.java @@ -205,9 +205,13 @@ private boolean injectTouch(int action, long pointerId, Position position, float } } + // Right-click and middle-click only work if the source is a mouse + boolean nonPrimaryButtonPressed = (buttons & ~MotionEvent.BUTTON_PRIMARY) != 0; + int source = nonPrimaryButtonPressed ? InputDevice.SOURCE_MOUSE : InputDevice.SOURCE_TOUCHSCREEN; + MotionEvent event = MotionEvent - .obtain(lastTouchDown, now, action, pointerCount, pointerProperties, pointerCoords, 0, buttons, 1f, 1f, DEVICE_ID_VIRTUAL, 0, - InputDevice.SOURCE_TOUCHSCREEN, 0); + .obtain(lastTouchDown, now, action, pointerCount, pointerProperties, pointerCoords, 0, buttons, 1f, 1f, DEVICE_ID_VIRTUAL, 0, source, + 0); return device.injectEvent(event); }